diff options
259 files changed, 3382 insertions, 2063 deletions
diff --git a/apex/permission/service/java/com/android/permission/persistence/IoUtils.java b/apex/permission/service/java/com/android/permission/persistence/IoUtils.java index 0ae44603516e..569a78c0ab41 100644 --- a/apex/permission/service/java/com/android/permission/persistence/IoUtils.java +++ b/apex/permission/service/java/com/android/permission/persistence/IoUtils.java @@ -20,6 +20,8 @@ import android.annotation.NonNull; /** * Utility class for IO. + * + * @hide */ public class IoUtils { diff --git a/apex/statsd/framework/Android.bp b/apex/statsd/framework/Android.bp index 1f479963eaa9..15a2f22e0fea 100644 --- a/apex/statsd/framework/Android.bp +++ b/apex/statsd/framework/Android.bp @@ -20,8 +20,8 @@ genrule { name: "statslog-statsd-java-gen", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --java $(out) --module statsd" + - " --javaPackage com.android.internal.util --javaClass StatsdStatsLog", - out: ["com/android/internal/util/StatsdStatsLog.java"], + " --javaPackage com.android.internal.statsd --javaClass StatsdStatsLog", + out: ["com/android/internal/statsd/StatsdStatsLog.java"], } java_library_static { @@ -60,7 +60,7 @@ java_sdk_library { "android.os", "android.util", // From :statslog-statsd-java-gen - "com.android.internal.util", + "com.android.internal.statsd", ], api_packages: [ diff --git a/apex/statsd/framework/java/android/util/StatsLog.java b/apex/statsd/framework/java/android/util/StatsLog.java index 4eeae57fe195..0a9f4ebabdf0 100644 --- a/apex/statsd/framework/java/android/util/StatsLog.java +++ b/apex/statsd/framework/java/android/util/StatsLog.java @@ -28,7 +28,7 @@ import android.os.IStatsd; import android.os.Process; import android.util.proto.ProtoOutputStream; -import com.android.internal.util.StatsdStatsLog; +import com.android.internal.statsd.StatsdStatsLog; /** * StatsLog provides an API for developers to send events to statsd. The events can be used to diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index ed0ea556dc9d..ac00a042b79e 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -520,6 +520,12 @@ public abstract class AccessibilityService extends Service { */ public static final int GLOBAL_ACTION_ACCESSIBILITY_SHORTCUT = 13; + /** + * Action to show Launcher's all apps. + * @hide + */ + public static final int GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS = 14; + private static final String LOG_TAG = "AccessibilityService"; /** diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 6bd8fd7c6ecf..6f8233d5de9b 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -139,6 +139,10 @@ public class ApplicationPackageManager extends PackageManager { public static final String APP_PERMISSION_BUTTON_ALLOW_ALWAYS = "app_permission_button_allow_always"; + // Name of the package which the permission controller's resources are in. + public static final String PERMISSION_CONTROLLER_RESOURCE_PACKAGE = + "com.android.permissioncontroller"; + private final Object mLock = new Object(); @GuardedBy("mLock") @@ -893,8 +897,7 @@ public class ApplicationPackageManager extends PackageManager { mContext.createPackageContext(permissionController, 0); int textId = context.getResources().getIdentifier(APP_PERMISSION_BUTTON_ALLOW_ALWAYS, - "string", "com.android.permissioncontroller"); -// permissionController); STOPSHIP b/147434671 + "string", PERMISSION_CONTROLLER_RESOURCE_PACKAGE); if (textId != 0) { return context.getText(textId); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index e8ce92db62ad..980fdb87f3fb 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -7625,9 +7625,8 @@ public class Notification implements Parcelable } boolean isConversationLayout = mConversationType != CONVERSATION_TYPE_LEGACY; boolean isImportantConversation = mConversationType == CONVERSATION_TYPE_IMPORTANT; - Icon largeIcon = isConversationLayout && mShortcutIcon != null - ? mShortcutIcon - : mBuilder.mN.mLargeIcon; + Icon conversationIcon = mShortcutIcon; + Icon largeIcon = mBuilder.mN.mLargeIcon; TemplateBindResult bindResult = new TemplateBindResult(); StandardTemplateParams p = mBuilder.mParams.reset() .hasProgress(false) @@ -7671,6 +7670,8 @@ public class Notification implements Parcelable contentView.setCharSequence(R.id.status_bar_latest_event_content, "setConversationTitle", conversationTitle); if (isConversationLayout) { + contentView.setIcon(R.id.status_bar_latest_event_content, + "setConversationIcon", conversationIcon); contentView.setBoolean(R.id.status_bar_latest_event_content, "setIsImportantConversation", isImportantConversation); } diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index ed75504529b9..fc4ccd072e75 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1449,6 +1449,13 @@ public class PackageInstaller { /** {@hide} */ public static final int UID_UNKNOWN = -1; + /** + * This value is derived from the maximum file name length. No package above this limit + * can ever be successfully installed on the device. + * @hide + */ + public static final int MAX_PACKAGE_NAME_LENGTH = 255; + /** {@hide} */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public int mode = MODE_INVALID; @@ -1642,6 +1649,8 @@ public class PackageInstaller { /** * Optionally set a label representing the app being installed. + * + * This value will be trimmed to the first 1000 characters. */ public void setAppLabel(@Nullable CharSequence appLabel) { this.appLabel = (appLabel != null) ? appLabel.toString() : null; @@ -1711,7 +1720,8 @@ public class PackageInstaller { * * <p>Initially, all restricted permissions are whitelisted but you can change * which ones are whitelisted by calling this method or the corresponding ones - * on the {@link PackageManager}. + * on the {@link PackageManager}. Only soft or hard restricted permissions on the current + * Android version are supported and any invalid entries will be removed. * * @see PackageManager#addWhitelistedRestrictedPermission(String, String, int) * @see PackageManager#removeWhitelistedRestrictedPermission(String, String, int) diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index f354bdb5a08b..65ce1e7ef079 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -49,8 +49,16 @@ import java.util.Objects; * in the implementation of Parcelable in subclasses. */ public class PackageItemInfo { - /** The maximum length of a safe label, in characters */ - private static final int MAX_SAFE_LABEL_LENGTH = 50000; + + /** + * The maximum length of a safe label, in characters + * + * TODO(b/157997155): It may make sense to expose this publicly so that apps can check for the + * value and truncate the strings/use a different label, without having to hardcode and make + * assumptions about the value. + * @hide + */ + public static final int MAX_SAFE_LABEL_LENGTH = 1000; /** @hide */ public static final float DEFAULT_MAX_LABEL_SIZE_PX = 500f; diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index 8d472da1fb7c..570cc2c11738 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -116,22 +116,25 @@ public class BiometricManager { /** * Any biometric (e.g. fingerprint, iris, or face) on the device that meets or exceeds the - * requirements for <strong>Strong</strong>, as defined by the Android CDD. + * requirements for <strong>Tier 3</strong> (formerly <strong>Strong</strong>), as defined + * by the Android CDD. */ int BIOMETRIC_STRONG = 0x000F; /** * Any biometric (e.g. fingerprint, iris, or face) on the device that meets or exceeds the - * requirements for <strong>Weak</strong>, as defined by the Android CDD. + * requirements for <strong>Tier 2</strong> (formerly <strong>Weak</strong>), as defined by + * the Android CDD. * * <p>Note that this is a superset of {@link #BIOMETRIC_STRONG} and is defined such that - * <code>BIOMETRIC_STRONG | BIOMETRIC_WEAK == BIOMETRIC_WEAK</code>. + * {@code BIOMETRIC_STRONG | BIOMETRIC_WEAK == BIOMETRIC_WEAK}. */ int BIOMETRIC_WEAK = 0x00FF; /** * Any biometric (e.g. fingerprint, iris, or face) on the device that meets or exceeds the - * requirements for <strong>Convenience</strong>, as defined by the Android CDD. + * requirements for <strong>Tier 1</strong> (formerly <strong>Convenience</strong>), as + * defined by the Android CDD. * * <p>This constant is intended for use by {@link android.provider.DeviceConfig} to adjust * the reported strength of a biometric sensor. It is not a valid parameter for any of the diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 7845200f4bf7..a8391c2b5461 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -4090,13 +4090,6 @@ public class UserManager { public static int getMaxSupportedUsers() { // Don't allow multiple users on certain builds if (android.os.Build.ID.startsWith("JVP")) return 1; - if (ActivityManager.isLowRamDeviceStatic()) { - // Low-ram devices are Svelte. Most of the time they don't get multi-user. - if ((Resources.getSystem().getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK) - != Configuration.UI_MODE_TYPE_TELEVISION) { - return 1; - } - } return SystemProperties.getInt("fw.max_users", Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers)); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1b19e1290121..52764d568f29 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1778,6 +1778,15 @@ public final class Settings { = "android.settings.NOTIFICATION_SETTINGS"; /** + * Activity Action: Show conversation settings. + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_CONVERSATION_SETTINGS + = "android.settings.CONVERSATION_SETTINGS"; + + /** * Activity Action: Show notification history screen. * * @hide diff --git a/core/java/android/service/autofill/InlineSuggestionRoot.java b/core/java/android/service/autofill/InlineSuggestionRoot.java index c879653859d8..16c3f1d4e476 100644 --- a/core/java/android/service/autofill/InlineSuggestionRoot.java +++ b/core/java/android/service/autofill/InlineSuggestionRoot.java @@ -58,7 +58,9 @@ public class InlineSuggestionRoot extends FrameLayout { case MotionEvent.ACTION_DOWN: { mDownX = event.getX(); mDownY = event.getY(); - } break; + } + // Intentionally fall through to the next case so that when the window is obscured + // we transfer the touch to the remote IME window and don't handle it locally. case MotionEvent.ACTION_MOVE: { final float distance = MathUtils.dist(mDownX, mDownY, diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index f6c72c4eefbc..a9af59543c78 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -289,6 +289,11 @@ public class GestureDetector { private VelocityTracker mVelocityTracker; /** + * True if the detector can throw exception when touch steam is unexpected . + */ + private boolean mExceptionForTouchStream; + + /** * Consistency verifier for debugging purposes. */ private final InputEventConsistencyVerifier mInputEventConsistencyVerifier = @@ -467,6 +472,8 @@ public class GestureDetector { mTouchSlopSquare = touchSlop * touchSlop; mDoubleTapTouchSlopSquare = doubleTapTouchSlop * doubleTapTouchSlop; mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop; + mExceptionForTouchStream = context != null + && context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R; } /** @@ -639,6 +646,13 @@ public class GestureDetector { break; case MotionEvent.ACTION_MOVE: + if (mExceptionForTouchStream && !mStillDown) { + throw new IllegalStateException("Incomplete event stream received: " + + "Received ACTION_MOVE before ACTION_DOWN. ACTION_DOWN must precede " + + "ACTION_MOVE following ACTION_UP or ACTION_CANCEL, or when this " + + "GestureDetector has not yet received any events."); + } + if (mInLongPress || mInContextClick) { break; } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index bd811fc1f052..a954f3631a01 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -1200,8 +1200,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } if (mDeferredDestroySurfaceControl != null) { - mTmpTransaction.remove(mDeferredDestroySurfaceControl).apply(); - mDeferredDestroySurfaceControl = null; + synchronized (mSurfaceControlLock) { + mTmpTransaction.remove(mDeferredDestroySurfaceControl).apply(); + mDeferredDestroySurfaceControl = null; + } } runOnUiThread(this::performDrawFinished); diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java index b387a68dd8a3..68943bf2a83a 100644 --- a/core/java/android/view/autofill/AutofillId.java +++ b/core/java/android/view/autofill/AutofillId.java @@ -75,7 +75,10 @@ public final class AutofillId implements Parcelable { /** @hide */ public static AutofillId withoutSession(@NonNull AutofillId id) { final int flags = id.mFlags & ~FLAG_HAS_SESSION; - return new AutofillId(flags, id.mViewId, id.mVirtualLongId, NO_SESSION); + final long virtualChildId = + ((id.mFlags & FLAG_IS_VIRTUAL_LONG) != 0) ? id.mVirtualLongId + : id.mVirtualIntId; + return new AutofillId(flags, id.mViewId, virtualChildId, NO_SESSION); } /** @hide */ diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index 7042f29fc4e4..4a6551176198 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -205,6 +205,8 @@ public class WebChromeClient { * <p>Note that if the {@link WebChromeClient} is set to be {@code null}, * or if {@link WebChromeClient} is not set at all, the default dialog will * be suppressed and Javascript execution will continue immediately. + * <p>Note that the default dialog does not inherit the {@link + * android.view.Display#FLAG_SECURE} flag from the parent window. * * @param view The WebView that initiated the callback. * @param url The url of the page requesting the dialog. @@ -240,6 +242,8 @@ public class WebChromeClient { * or if {@link WebChromeClient} is not set at all, the default dialog will * be suppressed and the default value of {@code false} will be returned to * the JavaScript code immediately. + * <p>Note that the default dialog does not inherit the {@link + * android.view.Display#FLAG_SECURE} flag from the parent window. * * @param view The WebView that initiated the callback. * @param url The url of the page requesting the dialog. @@ -274,6 +278,8 @@ public class WebChromeClient { * or if {@link WebChromeClient} is not set at all, the default dialog will * be suppressed and {@code null} will be returned to the JavaScript code * immediately. + * <p>Note that the default dialog does not inherit the {@link + * android.view.Display#FLAG_SECURE} flag from the parent window. * * @param view The WebView that initiated the callback. * @param url The url of the page requesting the dialog. @@ -308,6 +314,8 @@ public class WebChromeClient { * <p>Note that if the {@link WebChromeClient} is set to be {@code null}, * or if {@link WebChromeClient} is not set at all, the default dialog will * be suppressed and the navigation will be resumed immediately. + * <p>Note that the default dialog does not inherit the {@link + * android.view.Display#FLAG_SECURE} flag from the parent window. * * @param view The WebView that initiated the callback. * @param url The url of the page requesting the dialog. diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index 493865ac563f..b723db287823 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -151,6 +151,13 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { mOnProfileSelectedListener.onProfileSelected(position); } } + + @Override + public void onPageScrollStateChanged(int state) { + if (mOnProfileSelectedListener != null) { + mOnProfileSelectedListener.onProfilePageStateChanged(state); + } + } }); viewPager.setAdapter(this); viewPager.setCurrentItem(mCurrentPage); @@ -606,6 +613,17 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { * {@link #PROFILE_WORK} if the work profile was selected. */ void onProfileSelected(int profileIndex); + + + /** + * Callback for when the scroll state changes. Useful for discovering when the user begins + * dragging, when the pager is automatically settling to the current page, or when it is + * fully stopped/idle. + * @param state {@link ViewPager#SCROLL_STATE_IDLE}, {@link ViewPager#SCROLL_STATE_DRAGGING} + * or {@link ViewPager#SCROLL_STATE_SETTLING} + * @see ViewPager.OnPageChangeListener#onPageScrollStateChanged + */ + void onProfilePageStateChanged(int state); } /** diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index b6fca8072fc4..ff34c86fea0a 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -102,6 +102,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; +import android.view.WindowInsets; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.Button; @@ -129,6 +130,7 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.GridLayoutManager; import com.android.internal.widget.RecyclerView; import com.android.internal.widget.ResolverDrawerLayout; +import com.android.internal.widget.ViewPager; import com.google.android.collect.Lists; @@ -204,6 +206,10 @@ public class ChooserActivity extends ResolverActivity implements public static final int SELECTION_TYPE_STANDARD = 3; public static final int SELECTION_TYPE_COPY = 4; + private static final int SCROLL_STATUS_IDLE = 0; + private static final int SCROLL_STATUS_SCROLLING_VERTICAL = 1; + private static final int SCROLL_STATUS_SCROLLING_HORIZONTAL = 2; + // statsd logger wrapper protected ChooserActivityLogger mChooserActivityLogger; @@ -293,6 +299,7 @@ public class ChooserActivity extends ResolverActivity implements protected MetricsLogger mMetricsLogger; private ContentPreviewCoordinator mPreviewCoord; + private int mScrollStatus = SCROLL_STATUS_IDLE; @VisibleForTesting protected ChooserMultiProfilePagerAdapter mChooserMultiProfilePagerAdapter; @@ -2182,6 +2189,9 @@ public class ChooserActivity extends ResolverActivity implements } void updateModelAndChooserCounts(TargetInfo info) { + if (info != null && info instanceof MultiDisplayResolveInfo) { + info = ((MultiDisplayResolveInfo) info).getSelectedTarget(); + } if (info != null) { sendClickToAppPredictor(info); final ResolveInfo ri = info.getResolveInfo(); @@ -2677,7 +2687,7 @@ public class ChooserActivity extends ResolverActivity implements offset = Math.min(offset, minHeight); } } else { - ViewGroup currentEmptyStateView = getCurrentEmptyStateView(); + ViewGroup currentEmptyStateView = getActiveEmptyStateView(); if (currentEmptyStateView.getVisibility() == View.VISIBLE) { offset += currentEmptyStateView.getHeight(); } @@ -2702,7 +2712,7 @@ public class ChooserActivity extends ResolverActivity implements return -1; } - private ViewGroup getCurrentEmptyStateView() { + private ViewGroup getActiveEmptyStateView() { int currentPage = mChooserMultiProfilePagerAdapter.getCurrentPage(); return mChooserMultiProfilePagerAdapter.getItem(currentPage).getEmptyStateView(); } @@ -2819,10 +2829,20 @@ public class ChooserActivity extends ResolverActivity implements final float defaultElevation = elevatedView.getElevation(); final float chooserHeaderScrollElevation = getResources().getDimensionPixelSize(R.dimen.chooser_header_scroll_elevation); - mChooserMultiProfilePagerAdapter.getActiveAdapterView().addOnScrollListener( new RecyclerView.OnScrollListener() { public void onScrollStateChanged(RecyclerView view, int scrollState) { + if (scrollState == RecyclerView.SCROLL_STATE_IDLE) { + if (mScrollStatus == SCROLL_STATUS_SCROLLING_VERTICAL) { + mScrollStatus = SCROLL_STATUS_IDLE; + setHorizontalScrollingEnabled(true); + } + } else if (scrollState == RecyclerView.SCROLL_STATE_DRAGGING) { + if (mScrollStatus == SCROLL_STATUS_IDLE) { + mScrollStatus = SCROLL_STATUS_SCROLLING_VERTICAL; + setHorizontalScrollingEnabled(false); + } + } } public void onScrolled(RecyclerView view, int dx, int dy) { @@ -3027,6 +3047,44 @@ public class ChooserActivity extends ResolverActivity implements intent.fixUris(UserHandle.myUserId()); } + @Override + protected WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { + if (shouldShowTabs()) { + mChooserMultiProfilePagerAdapter + .setEmptyStateBottomOffset(insets.getSystemWindowInsetBottom()); + mChooserMultiProfilePagerAdapter.setupContainerPadding( + getActiveEmptyStateView().findViewById(R.id.resolver_empty_state_container)); + } + return super.onApplyWindowInsets(v, insets); + } + + private void setHorizontalScrollingEnabled(boolean enabled) { + ResolverViewPager viewPager = findViewById(R.id.profile_pager); + viewPager.setSwipingEnabled(enabled); + } + + private void setVerticalScrollEnabled(boolean enabled) { + ChooserGridLayoutManager layoutManager = + (ChooserGridLayoutManager) mChooserMultiProfilePagerAdapter.getActiveAdapterView() + .getLayoutManager(); + layoutManager.setVerticalScrollEnabled(enabled); + } + + @Override + void onHorizontalSwipeStateChanged(int state) { + if (state == ViewPager.SCROLL_STATE_DRAGGING) { + if (mScrollStatus == SCROLL_STATUS_IDLE) { + mScrollStatus = SCROLL_STATUS_SCROLLING_HORIZONTAL; + setVerticalScrollEnabled(false); + } + } else if (state == ViewPager.SCROLL_STATE_IDLE) { + if (mScrollStatus == SCROLL_STATUS_SCROLLING_VERTICAL) { + mScrollStatus = SCROLL_STATUS_IDLE; + setVerticalScrollEnabled(true); + } + } + } + /** * Adapter for all types of items and targets in ShareSheet. * Note that ranked sections like Direct Share - while appearing grid-like - are handled on the diff --git a/core/java/com/android/internal/app/ChooserGridLayoutManager.java b/core/java/com/android/internal/app/ChooserGridLayoutManager.java index 317a987cf359..c50ebd9562c9 100644 --- a/core/java/com/android/internal/app/ChooserGridLayoutManager.java +++ b/core/java/com/android/internal/app/ChooserGridLayoutManager.java @@ -28,6 +28,8 @@ import com.android.internal.widget.RecyclerView; */ public class ChooserGridLayoutManager extends GridLayoutManager { + private boolean mVerticalScrollEnabled = true; + /** * Constructor used when layout manager is set in XML by RecyclerView attribute * "layoutManager". If spanCount is not specified in the XML, it defaults to a @@ -67,4 +69,13 @@ public class ChooserGridLayoutManager extends GridLayoutManager { // Do not count the footer view in the official count return super.getRowCountForAccessibility(recycler, state) - 1; } + + void setVerticalScrollEnabled(boolean verticalScrollEnabled) { + mVerticalScrollEnabled = verticalScrollEnabled; + } + + @Override + public boolean canScrollVertically() { + return mVerticalScrollEnabled && super.canScrollVertically(); + } } diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java index 774be3c9c4b8..ffa6041721c6 100644 --- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java @@ -38,6 +38,7 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd private final ChooserProfileDescriptor[] mItems; private final boolean mIsSendAction; + private int mBottomOffset; ChooserMultiProfilePagerAdapter(Context context, ChooserActivity.ChooserGridAdapter adapter, @@ -245,6 +246,16 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd } } + void setEmptyStateBottomOffset(int bottomOffset) { + mBottomOffset = bottomOffset; + } + + @Override + protected void setupContainerPadding(View container) { + container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), + container.getPaddingRight(), container.getPaddingBottom() + mBottomOffset); + } + class ChooserProfileDescriptor extends ProfileDescriptor { private ChooserActivity.ChooserGridAdapter chooserGridAdapter; private RecyclerView recyclerView; diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index f96f560fc60f..838d9bc6fa43 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1653,10 +1653,18 @@ public class ResolverActivity extends Activity implements viewPager.setVisibility(View.VISIBLE); tabHost.setCurrentTab(mMultiProfilePagerAdapter.getCurrentPage()); mMultiProfilePagerAdapter.setOnProfileSelectedListener( - index -> { - tabHost.setCurrentTab(index); - resetButtonBar(); - resetCheckedItem(); + new AbstractMultiProfilePagerAdapter.OnProfileSelectedListener() { + @Override + public void onProfileSelected(int index) { + tabHost.setCurrentTab(index); + resetButtonBar(); + resetCheckedItem(); + } + + @Override + public void onProfilePageStateChanged(int state) { + onHorizontalSwipeStateChanged(state); + } }); mMultiProfilePagerAdapter.setOnSwitchOnWorkSelectedListener( () -> { @@ -1668,6 +1676,8 @@ public class ResolverActivity extends Activity implements findViewById(R.id.resolver_tab_divider).setVisibility(View.VISIBLE); } + void onHorizontalSwipeStateChanged(int state) {} + private void maybeHideDivider() { if (!isIntentPicker()) { return; diff --git a/core/java/com/android/internal/app/ResolverViewPager.java b/core/java/com/android/internal/app/ResolverViewPager.java index 4eb6e3bd2071..9cdfc2f5c763 100644 --- a/core/java/com/android/internal/app/ResolverViewPager.java +++ b/core/java/com/android/internal/app/ResolverViewPager.java @@ -18,6 +18,7 @@ package com.android.internal.app; import android.content.Context; import android.util.AttributeSet; +import android.view.MotionEvent; import android.view.View; import com.android.internal.widget.ViewPager; @@ -30,6 +31,8 @@ import com.android.internal.widget.ViewPager; */ public class ResolverViewPager extends ViewPager { + private boolean mSwipingEnabled = true; + public ResolverViewPager(Context context) { super(context); } @@ -70,4 +73,13 @@ public class ResolverViewPager extends ViewPager { heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + + void setSwipingEnabled(boolean swipingEnabled) { + mSwipingEnabled = swipingEnabled; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return mSwipingEnabled && super.onInterceptTouchEvent(ev); + } } diff --git a/core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java b/core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java index e58258352106..cf921d734d48 100644 --- a/core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java +++ b/core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java @@ -70,6 +70,13 @@ public class MultiDisplayResolveInfo extends DisplayResolveInfo { } /** + * Return selected target. + */ + public DisplayResolveInfo getSelectedTarget() { + return hasSelected() ? mTargetInfos.get(mSelected) : null; + } + + /** * Whether or not the user has selected a specific target for this MultiInfo. */ public boolean hasSelected() { diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index 688e00bc5a29..c75f72bdc765 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -480,23 +480,25 @@ public class ConversationLayout extends FrameLayout // (This usually happens for most 1:1 conversations) conversationText = messagingGroup.getSenderName(); } - Icon avatarIcon = messagingGroup.getAvatarIcon(); - if (avatarIcon == null) { - avatarIcon = createAvatarSymbol(conversationText, "", mLayoutColor); + if (mConversationIcon == null) { + Icon avatarIcon = messagingGroup.getAvatarIcon(); + if (avatarIcon == null) { + avatarIcon = createAvatarSymbol(conversationText, "", mLayoutColor); + } + mConversationIcon = avatarIcon; } - mConversationIcon = avatarIcon; - mConversationIconView.setImageIcon(mConversationIcon); break; } } } else { - if (mLargeIcon != null) { + if (mConversationIcon == null && mLargeIcon != null) { mConversationIcon = mLargeIcon; + } + if (mConversationIcon != null) { mConversationIconView.setVisibility(VISIBLE); mConversationFacePile.setVisibility(GONE); - mConversationIconView.setImageIcon(mLargeIcon); + mConversationIconView.setImageIcon(mConversationIcon); } else { - mConversationIcon = null; mConversationIconView.setVisibility(GONE); // This will also inflate it! mConversationFacePile.setVisibility(VISIBLE); @@ -709,6 +711,11 @@ public class ConversationLayout extends FrameLayout mLargeIcon = largeIcon; } + @RemotableViewMethod + public void setConversationIcon(Icon conversationIcon) { + mConversationIcon = conversationIcon; + } + /** * Sets the conversation title of this conversation. * diff --git a/core/jni/android_media_AudioEffectDescriptor.cpp b/core/jni/android_media_AudioEffectDescriptor.cpp index 37d8114052b8..1435e879053c 100644 --- a/core/jni/android_media_AudioEffectDescriptor.cpp +++ b/core/jni/android_media_AudioEffectDescriptor.cpp @@ -102,9 +102,9 @@ void convertAudioEffectDescriptorVectorFromNative(JNIEnv *env, jobjectArray *jDe *jDescriptors = env->NewObjectArray(actualSize, audioEffectDescriptorClass(), NULL); for (size_t i = 0; i < actualSize; i++) { - env->SetObjectArrayElement(*jDescriptors, - i, - env->GetObjectArrayElement(temp, i)); + jobject jdesc = env->GetObjectArrayElement(temp, i); + env->SetObjectArrayElement(*jDescriptors, i, jdesc); + env->DeleteLocalRef(jdesc); } env->DeleteLocalRef(temp); } diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index fc2005a31696..3d8cae8e74d0 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -526,8 +526,16 @@ static void UnsetChldSignalHandler() { // Calls POSIX setgroups() using the int[] object as an argument. // A nullptr argument is tolerated. -static void SetGids(JNIEnv* env, jintArray managed_gids, fail_fn_t fail_fn) { +static void SetGids(JNIEnv* env, jintArray managed_gids, jboolean is_child_zygote, + fail_fn_t fail_fn) { if (managed_gids == nullptr) { + if (is_child_zygote) { + // For child zygotes like webview and app zygote, we want to clear out + // any supplemental groups the parent zygote had. + if (setgroups(0, NULL) == -1) { + fail_fn(CREATE_ERROR("Failed to remove supplementary groups for child zygote")); + } + } return; } @@ -1665,7 +1673,7 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, } } - SetGids(env, gids, fail_fn); + SetGids(env, gids, is_child_zygote, fail_fn); SetRLimits(env, rlimits, fail_fn); if (need_pre_initialize_native_bridge) { diff --git a/core/proto/android/stats/mediametrics/mediametrics.proto b/core/proto/android/stats/mediametrics/mediametrics.proto index e1af9622adb3..9f0ff591a506 100644 --- a/core/proto/android/stats/mediametrics/mediametrics.proto +++ b/core/proto/android/stats/mediametrics/mediametrics.proto @@ -131,7 +131,7 @@ message AudioTrackData { * Logged from: * frameworks/av/media/libstagefright/MediaCodec.cpp * frameworks/av/services/mediaanalytics/statsd_codec.cpp - * Next Tag: 21 + * Next Tag: 26 */ message CodecData { optional string codec = 1; @@ -156,6 +156,9 @@ message CodecData { optional int64 latency_unknown = 20; optional int32 queue_input_buffer_error = 21; optional int32 queue_secure_input_buffer_error = 22; + optional string bitrate_mode = 23; + optional int32 bitrate = 24; + optional int64 lifetime_millis = 25; } /** diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 65872f43f46e..afeceb775524 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1309,7 +1309,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Εντοπίστηκε αναλογικό αξεσουάρ ήχου"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Η συνδεδεμένη συσκευή δεν είναι συμβατή με αυτό το τηλέφωνο. Πατήστε για να μάθετε περισσότερα."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Απενεργοποιήστε τον εντοπισμό/διόρθ. σφαλμάτων USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Πατήστε για απενεργοποίηση εντοπισμού/διόρθ. σφαλμάτων USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Επιλογή για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Συνδέθηκε ο ασύρματος εντοπισμός σφαλμάτων"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Πατήστε, για να απενεργοποιήσετε τον ασύρματο εντοπισμό σφαλμάτων"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 36380b822864..31abd8235bf4 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -202,10 +202,8 @@ <string name="printing_disabled_by" msgid="3517499806528864633">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Turn on your work profile"</string> <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Your personal apps are blocked until you turn on your work profile"</string> - <!-- no translation found for personal_apps_suspension_soon_text (8123898693479590) --> - <skip /> - <!-- no translation found for personal_apps_suspended_turn_profile_on (2758012869627513689) --> - <skip /> + <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Personal apps will be blocked on <xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>. Your IT admin doesn’t allow your work profile to stay off for more than <xliff:g id="NUMBER">%3$d</xliff:g> days."</string> + <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Turn on"</string> <string name="me" msgid="6207584824693813140">"Me"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tablet options"</string> <string name="power_dialog" product="tv" msgid="7792839006640933763">"Android TV options"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 91a8d0585709..bb06173918d7 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -2032,7 +2032,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ficheiro</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Non hai persoas recomendadas coas que compartir contido"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Non hai recomendacións de persoas coas que compartir contido"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicacións"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta aplicación non está autorizada a realizar gravacións, pero pode capturar audio a través deste dispositivo USB."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Inicio"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 3fe076695642..5161fdc65446 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1230,7 +1230,7 @@ <string name="volume_unknown" msgid="4041914008166576293">"កម្រិតសំឡេង"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"កម្រិតសំឡេងប៊្លូធូស"</string> <string name="volume_icon_description_ringer" msgid="2187800636867423459">"កម្រិតសំឡេងរោទ៍"</string> - <string name="volume_icon_description_incall" msgid="4491255105381227919">"កម្រិតសំឡេងហៅ"</string> + <string name="volume_icon_description_incall" msgid="4491255105381227919">"កម្រិតសំឡេងហៅទូរសព្ទ"</string> <string name="volume_icon_description_media" msgid="4997633254078171233">"កម្រិតសំឡេងមេឌៀ"</string> <string name="volume_icon_description_notification" msgid="579091344110747279">"កម្រិតសំឡេងការជូនដំណឹង"</string> <string name="ringtone_default" msgid="9118299121288174597">"សំឡេងរោទ៍លំនាំដើម"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index bc896d61a43b..25aa3b5eaf94 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1308,7 +1308,7 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ. ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"ಅನ್ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"USB ಡೀಬಗಿಂಗ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"ವೈರ್ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string> @@ -2032,7 +2032,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್ಗಳು</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್ಗಳು</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ಹಂಚಿಕೊಳ್ಳಲು, ಯಾವುದೇ ಶಿಫಾರಸು ಮಾಡಲಾದ ಜನರಿಲ್ಲ"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ಹಂಚಿಕೊಳ್ಳಲು ಶಿಫಾರಸು ಮಾಡಲಾದವರು ಯಾರೂ ಇಲ್ಲ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ಈ ಆ್ಯಪ್ಗೆ ರೆಕಾರ್ಡ್ ಅನುಮತಿಯನ್ನು ನೀಡಲಾಗಿಲ್ಲ, ಆದರೆ ಈ USB ಸಾಧನದ ಮೂಲಕ ಆಡಿಯೊವನ್ನು ಸೆರೆಹಿಡಿಯಬಲ್ಲದು."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ಹೋಮ್"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index a7e6f99ba8fd..a5a0f9e587ec 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -2032,7 +2032,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइल</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> फाइल</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"शेअर करण्यासाठी कोणतीही शिफारस केलेले लोक नाहीत"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"शेअर करण्यासाठी शिफारस केलेल्या कोणत्याही व्यक्ती नाहीत"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अॅप्स सूची"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"या अॅपला रेकॉर्ड करण्याची परवानगी दिली गेली नाही पण हे USB डिव्हाइस वापरून ऑडिओ कॅप्चर केला जाऊ शकतो."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"होम"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index cc8137cc244c..64302dab7ce9 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1912,7 +1912,7 @@ <string name="demo_starting_message" msgid="6577581216125805905">"Demo starten…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Apparaat resetten…"</string> <string name="suspended_widget_accessibility" msgid="6331451091851326101">"<xliff:g id="LABEL">%1$s</xliff:g> uitgeschakeld"</string> - <string name="conference_call" msgid="5731633152336490471">"Telefonische vergadering"</string> + <string name="conference_call" msgid="5731633152336490471">"Conferencecall"</string> <string name="tooltip_popup_title" msgid="7863719020269945722">"Knopinfo"</string> <string name="app_category_game" msgid="4534216074910244790">"Games"</string> <string name="app_category_audio" msgid="8296029904794676222">"Muziek en audio"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index f803f02e92bc..4becdaa16ef3 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -60,7 +60,7 @@ <string name="ClirMmi" msgid="4702929460236547156">"ଆଉଟଗୋଇଙ୍ଗ୍ କଲର୍ ଆଇଡି"</string> <string name="ColpMmi" msgid="4736462893284419302">"ସଂଯୁକ୍ତ ଲାଇନ୍ ID"</string> <string name="ColrMmi" msgid="5889782479745764278">"ସଂଯୁକ୍ତ ଲାଇନ୍ ID କଟକଣା"</string> - <string name="CfMmi" msgid="8390012691099787178">"କଲ୍ ଫରୱାର୍ଡିଙ୍ଗ"</string> + <string name="CfMmi" msgid="8390012691099787178">"କଲ୍ ଫରୱାର୍ଡିଂ"</string> <string name="CwMmi" msgid="3164609577675404761">"କଲ୍ ଅପେକ୍ଷାରତ"</string> <string name="BaMmi" msgid="7205614070543372167">"କଲ୍ ବ୍ୟାରିଙ୍ଗ୍"</string> <string name="PwdMmi" msgid="3360991257288638281">"ପାସ୍ୱର୍ଡ ପରିବର୍ତ୍ତନ"</string> @@ -88,7 +88,7 @@ <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ୱାଇ-ଫାଇ ସାହାଯ୍ୟରେ ଜରୁରୀକାଳୀନ କଲ୍ କରାଯାଇପାରିବ ନାହିଁ"</string> <string name="notification_channel_network_alert" msgid="4788053066033851841">"ଆଲର୍ଟ"</string> - <string name="notification_channel_call_forward" msgid="8230490317314272406">"କଲ୍ ଫରୱାର୍ଡିଙ୍ଗ"</string> + <string name="notification_channel_call_forward" msgid="8230490317314272406">"କଲ୍ ଫରୱାର୍ଡିଂ"</string> <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡ୍"</string> <string name="notification_channel_mobile_data_status" msgid="1941911162076442474">"ମୋବାଇଲ୍ ଡାଟା ଷ୍ଟାଟସ୍"</string> <string name="notification_channel_sms" msgid="1243384981025535724">"SMS ମେସେଜ୍"</string> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index dc21e878d132..a1c2450be153 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1613,15 +1613,15 @@ <string name="face_error_no_space">Can\u2019t store new face data. Delete an old one first.</string> <!-- Generic error message shown when the face operation (e.g. enrollment or authentication) is canceled. Generally not shown to the user. [CHAR LIMIT=50] --> <string name="face_error_canceled">Face operation canceled.</string> - <!-- Generic error message shown when the face unlock operation is canceled due to user input. Generally not shown to the user [CHAR LIMIT=54] --> + <!-- Generic error message shown when the face unlock operation is canceled due to user input. Generally not shown to the user [CHAR LIMIT=68] --> <string name="face_error_user_canceled">Face unlock canceled by user.</string> <!-- Generic error message shown when the face operation fails because too many attempts have been made. [CHAR LIMIT=50] --> <string name="face_error_lockout">Too many attempts. Try again later.</string> - <!-- Generic error message shown when the face operation fails because strong authentication is required. [CHAR LIMIT=71] --> + <!-- Generic error message shown when the face operation fails because strong authentication is required. [CHAR LIMIT=77] --> <string name="face_error_lockout_permanent">Too many attempts. Face unlock disabled.</string> <!-- Generic error message shown when the face hardware can't recognize the face. [CHAR LIMIT=50] --> <string name="face_error_unable_to_process">Can\u2019t verify face. Try again.</string> - <!-- Generic error message shown when the user has no enrolled face. [CHAR LIMIT=52] --> + <!-- Generic error message shown when the user has no enrolled face. [CHAR LIMIT=59] --> <string name="face_error_not_enrolled">You haven\u2019t set up face unlock.</string> <!-- Generic error message shown when the app requests face unlock on a device without a sensor. [CHAR LIMIT=61] --> <string name="face_error_hw_not_present">Face unlock is not supported on this device.</string> diff --git a/core/tests/PackageInstallerSessions/Android.bp b/core/tests/PackageInstallerSessions/Android.bp new file mode 100644 index 000000000000..e74f30ee10a4 --- /dev/null +++ b/core/tests/PackageInstallerSessions/Android.bp @@ -0,0 +1,42 @@ +// +// Copyright 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_test { + name: "FrameworksCorePackageInstallerSessionsTests", + + srcs: [ + "src/**/*.kt", + ], + static_libs: [ + "androidx.test.rules", + "compatibility-device-util-axt", + "frameworks-base-testutils", + "platform-test-annotations", + "testng", + "truth-prebuilt", + ], + + libs: [ + "android.test.runner", + "android.test.base", + "framework", + "framework-res", + ], + + platform_apis: true, + sdk_version: "core_platform", + test_suites: ["device-tests"], +} diff --git a/core/tests/PackageInstallerSessions/AndroidManifest.xml b/core/tests/PackageInstallerSessions/AndroidManifest.xml new file mode 100644 index 000000000000..5b22d2b4f3e3 --- /dev/null +++ b/core/tests/PackageInstallerSessions/AndroidManifest.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + --> + +<manifest + xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.frameworks.coretests.package_installer_sessions" + > + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.frameworks.coretests.package_installer_sessions"/> +</manifest> diff --git a/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt b/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt new file mode 100644 index 000000000000..494c92a8aa3f --- /dev/null +++ b/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm + +import android.content.Context +import android.content.pm.PackageInstaller.SessionParams +import android.platform.test.annotations.Presubmit +import androidx.test.InstrumentationRegistry +import androidx.test.filters.LargeTest +import com.android.compatibility.common.util.ShellIdentityUtils +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.testng.Assert.assertThrows +import kotlin.random.Random + +/** + * For verifying public [PackageInstaller] session APIs. This differs from + * [com.android.server.pm.PackageInstallerSessionTest] in services because that mocks the session, + * whereas this test uses the installer on device. + */ +@Presubmit +class PackageSessionTests { + + companion object { + /** + * Permissions marked "hardRestricted" or "softRestricted" in core/res/AndroidManifest.xml. + */ + private val RESTRICTED_PERMISSIONS = listOf( + "android.permission.SEND_SMS", + "android.permission.RECEIVE_SMS", + "android.permission.READ_SMS", + "android.permission.RECEIVE_WAP_PUSH", + "android.permission.RECEIVE_MMS", + "android.permission.READ_CELL_BROADCASTS", + "android.permission.ACCESS_BACKGROUND_LOCATION", + "android.permission.READ_CALL_LOG", + "android.permission.WRITE_CALL_LOG", + "android.permission.PROCESS_OUTGOING_CALLS" + ) + } + + private val context: Context = InstrumentationRegistry.getContext() + + private val installer = context.packageManager.packageInstaller + + @Before + @After + fun abandonAllSessions() { + installer.mySessions.asSequence() + .map { it.sessionId } + .forEach { + try { + installer.abandonSession(it) + } catch (ignored: Exception) { + // Querying for sessions checks by calling package name, but abandoning + // checks by UID, which won't match if this test failed to clean up + // on a previous install + run + uninstall, so ignore these failures. + } + } + } + + @Test + fun truncateAppLabel() { + val longLabel = invalidAppLabel() + val params = SessionParams(SessionParams.MODE_FULL_INSTALL).apply { + setAppLabel(longLabel) + } + + createSession(params) { + assertThat(installer.getSessionInfo(it)?.appLabel) + .isEqualTo(longLabel.take(PackageItemInfo.MAX_SAFE_LABEL_LENGTH)) + } + } + + @Test + fun removeInvalidAppPackageName() { + val longName = invalidPackageName() + val params = SessionParams(SessionParams.MODE_FULL_INSTALL).apply { + setAppPackageName(longName) + } + + createSession(params) { + assertThat(installer.getSessionInfo(it)?.appPackageName) + .isEqualTo(null) + } + } + + @Test + fun removeInvalidInstallerPackageName() { + val longName = invalidPackageName() + val params = SessionParams(SessionParams.MODE_FULL_INSTALL).apply { + setInstallerPackageName(longName) + } + + createSession(params) { + // If a custom installer name is dropped, it defaults to the caller + assertThat(installer.getSessionInfo(it)?.installerPackageName) + .isEqualTo(context.packageName) + } + } + + @Test + fun truncateWhitelistPermissions() { + val params = SessionParams(SessionParams.MODE_FULL_INSTALL).apply { + setWhitelistedRestrictedPermissions(invalidPermissions()) + } + + createSession(params) { + assertThat(installer.getSessionInfo(it)?.whitelistedRestrictedPermissions!!) + .containsExactlyElementsIn(RESTRICTED_PERMISSIONS) + } + } + + @LargeTest + @Test + fun allocateMaxSessionsWithPermission() { + ShellIdentityUtils.invokeWithShellPermissions { + repeat(1024) { createDummySession() } + assertThrows(IllegalStateException::class.java) { createDummySession() } + } + } + + @LargeTest + @Test + fun allocateMaxSessionsNoPermission() { + repeat(50) { createDummySession() } + assertThrows(IllegalStateException::class.java) { createDummySession() } + } + + private fun createDummySession() { + installer.createSession(SessionParams(SessionParams.MODE_FULL_INSTALL) + .apply { + setAppPackageName(invalidPackageName()) + setAppLabel(invalidAppLabel()) + setWhitelistedRestrictedPermissions(invalidPermissions()) + }) + } + + private fun invalidPackageName(maxLength: Int = SessionParams.MAX_PACKAGE_NAME_LENGTH): String { + return (0 until (maxLength + 10)) + .asSequence() + .mapIndexed { index, _ -> + // A package name needs at least one separator + if (index == 2) { + '.' + } else { + Random.nextInt('z' - 'a').toChar() + 'a'.toInt() + } + } + .joinToString(separator = "") + } + + private fun invalidAppLabel() = (0 until PackageItemInfo.MAX_SAFE_LABEL_LENGTH + 10) + .asSequence() + .map { Random.nextInt(Char.MAX_VALUE.toInt()).toChar() } + .joinToString(separator = "") + + private fun invalidPermissions() = RESTRICTED_PERMISSIONS.toMutableSet() + .apply { + // Add some invalid permission names + repeat(10) { add(invalidPackageName(300)) } + } + + private fun createSession(params: SessionParams, block: (Int) -> Unit = {}) { + val sessionId = installer.createSession(params) + try { + block(sessionId) + } finally { + installer.abandonSession(sessionId) + } + } +} diff --git a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java index a8ca6f048a11..b329e55b569f 100644 --- a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java +++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java @@ -126,6 +126,32 @@ public class AutofillIdTest { } @Test + public void testVirtual_Long_withoutSession() { + final AutofillId id = new AutofillId(new AutofillId(42), 108L, 666); + final AutofillId idWithoutSession = AutofillId.withoutSession(id); + assertThat(idWithoutSession.getViewId()).isEqualTo(42); + assertThat(idWithoutSession.isVirtualLong()).isTrue(); + assertThat(idWithoutSession.isVirtualInt()).isFalse(); + assertThat(idWithoutSession.isNonVirtual()).isFalse(); + assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(108L); + assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(View.NO_ID); + assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION); + } + + @Test + public void testVirtual_Int_withoutSession() { + final AutofillId id = new AutofillId(42, 108); + final AutofillId idWithoutSession = AutofillId.withoutSession(id); + assertThat(idWithoutSession.getViewId()).isEqualTo(42); + assertThat(idWithoutSession.isVirtualLong()).isFalse(); + assertThat(idWithoutSession.isVirtualInt()).isTrue(); + assertThat(idWithoutSession.isNonVirtual()).isFalse(); + assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(108); + assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(View.NO_ID); + assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION); + } + + @Test public void testSetResetSession() { final AutofillId id = new AutofillId(42); assertNonVirtual(id, 42, NO_SESSION); diff --git a/media/java/android/media/projection/MediaProjectionManager.java b/media/java/android/media/projection/MediaProjectionManager.java index c4d27eca02f8..e719b2a04720 100644 --- a/media/java/android/media/projection/MediaProjectionManager.java +++ b/media/java/android/media/projection/MediaProjectionManager.java @@ -90,6 +90,17 @@ public final class MediaProjectionManager { * projection is stopped. This allows for user controls to be displayed on top of the screen * being captured. * + * <p> + * Apps targeting SDK version {@link android.os.Build.VERSION_CODES#Q} or later should specify + * the foreground service type using the attribute {@link android.R.attr#foregroundServiceType} + * in the service element of the app's manifest file. + * The {@link android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION} attribute + * should be specified. + * </p> + * + * @see <a href="https://developer.android.com/preview/privacy/foreground-service-types"> + * Foregroud Service Types</a> + * * @param resultCode The result code from {@link android.app.Activity#onActivityResult(int, * int, android.content.Intent)} * @param resultData The resulting data from {@link android.app.Activity#onActivityResult(int, diff --git a/packages/CarSystemUI/Android.bp b/packages/CarSystemUI/Android.bp index 2a8a39a1fe1a..32b33a758535 100644 --- a/packages/CarSystemUI/Android.bp +++ b/packages/CarSystemUI/Android.bp @@ -32,6 +32,7 @@ android_library { "SystemUIPluginLib", "SystemUISharedLib", "SettingsLib", + "car-ui-lib", "android.car.userlib", "androidx.legacy_legacy-support-v4", "androidx.recyclerview_recyclerview", @@ -95,6 +96,7 @@ android_library { "androidx.slice_slice-builders", "androidx.arch.core_core-runtime", "androidx.lifecycle_lifecycle-extensions", + "car-ui-lib", "SystemUI-tags", "SystemUI-proto", "metrics-helper-lib", diff --git a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml index a8c70989253e..94816f81a4c5 100644 --- a/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_left_navigation_bar.xml @@ -79,7 +79,7 @@ android:gravity="bottom" android:orientation="vertical"> - <com.android.keyguard.AlphaOptimizedImageButton + <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/note" android:layout_height="wrap_content" android:layout_width="match_parent" diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_navigation_bar.xml index 2a715d0c3494..93174983b116 100644 --- a/packages/CarSystemUI/res/layout/car_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_navigation_bar.xml @@ -29,9 +29,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:paddingStart="20dp" + android:gravity="center" + android:layoutDirection="ltr" android:paddingEnd="20dp" - android:gravity="center"> + android:paddingStart="20dp"> <com.android.systemui.car.navigationbar.CarNavigationButton android:id="@+id/home" @@ -135,9 +136,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:paddingStart="@dimen/car_keyline_1" - android:paddingEnd="@dimen/car_keyline_1" android:gravity="center" + android:layoutDirection="ltr" + android:paddingEnd="@dimen/car_keyline_1" + android:paddingStart="@dimen/car_keyline_1" android:visibility="gone" /> diff --git a/packages/CarSystemUI/res/layout/car_navigation_button.xml b/packages/CarSystemUI/res/layout/car_navigation_button.xml index ca4e76ee104b..a8f115742023 100644 --- a/packages/CarSystemUI/res/layout/car_navigation_button.xml +++ b/packages/CarSystemUI/res/layout/car_navigation_button.xml @@ -27,7 +27,7 @@ android:animateLayoutChanges="true" android:orientation="vertical"> - <com.android.keyguard.AlphaOptimizedImageButton + <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/car_nav_button_icon_image" android:layout_height="@dimen/car_navigation_button_icon_height" android:layout_width="match_parent" @@ -40,7 +40,7 @@ android:clickable="false" /> - <com.android.keyguard.AlphaOptimizedImageButton + <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/car_nav_button_more_icon" android:layout_height="wrap_content" android:layout_width="match_parent" diff --git a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml index fd75570e759c..dc9583382921 100644 --- a/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_right_navigation_bar.xml @@ -82,7 +82,7 @@ android:gravity="bottom" android:orientation="vertical"> - <com.android.keyguard.AlphaOptimizedImageButton + <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/note" android:layout_height="wrap_content" android:layout_width="match_parent" diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml index 60e0d7e430df..cdc29eec21cd 100644 --- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml @@ -27,7 +27,8 @@ <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_weight="1"> + android:layout_weight="1" + android:layoutDirection="ltr"> <FrameLayout android:id="@+id/left_hvac_container" diff --git a/packages/CarSystemUI/res/layout/headsup_container_bottom.xml b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml index caf1677234d0..1782d2536035 100644 --- a/packages/CarSystemUI/res/layout/headsup_container_bottom.xml +++ b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml @@ -29,6 +29,15 @@ android:orientation="horizontal" app:layout_constraintGuide_begin="@dimen/headsup_scrim_height"/> + <!-- Include a FocusParkingView at the beginning or end. The rotary controller "parks" the + focus here when the user navigates to another window. This is also used to prevent + wrap-around which is why it must be first or last in Tab order. --> + <com.android.car.ui.FocusParkingView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + <View android:id="@+id/scrim" android:layout_width="match_parent" diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml index 371bebdebc86..7fc69e6d5d8f 100644 --- a/packages/CarSystemUI/res/values/styles.xml +++ b/packages/CarSystemUI/res/values/styles.xml @@ -44,6 +44,6 @@ <style name="NavigationBarButton"> <item name="android:layout_height">96dp</item> <item name="android:layout_width">96dp</item> - <item name="android:background">@drawable/nav_button_background</item> + <item name="android:background">@*android:drawable/item_background_material</item> </style> </resources>
\ No newline at end of file diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index ab61b443df97..2dad5f872e73 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -219,6 +219,14 @@ public class CarKeyguardViewController extends OverlayViewController implements } @Override + public void setOccluded(boolean occluded, boolean animate) { + getOverlayViewGlobalStateController().setOccluded(occluded); + if (!occluded) { + reset(/* hideBouncerWhenShowing= */ false); + } + } + + @Override public void onCancelClicked() { if (mBouncer == null) return; @@ -315,11 +323,6 @@ public class CarKeyguardViewController extends OverlayViewController implements } @Override - public void setOccluded(boolean occluded, boolean animate) { - // no-op - } - - @Override public boolean shouldDisableWindowAnimationsForUnlock() { return false; } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java index 20fc1bcd6013..0ced4021ce38 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarView.java @@ -74,8 +74,10 @@ public class CarNavigationBarView extends LinearLayout { mDarkIconManager.setShouldLog(true); Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager); } - // needs to be clickable so that it will receive ACTION_MOVE events + // Needs to be clickable so that it will receive ACTION_MOVE events. setClickable(true); + // Needs to not be focusable so rotary won't highlight the entire nav bar. + setFocusable(false); } @Override diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java index 5e113d6366a1..e7e33a5439f9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationButton.java @@ -32,8 +32,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import com.android.internal.annotations.VisibleForTesting; -import com.android.keyguard.AlphaOptimizedImageButton; import com.android.systemui.R; +import com.android.systemui.statusbar.AlphaOptimizedImageView; import java.net.URISyntaxException; @@ -53,8 +53,8 @@ public class CarNavigationButton extends LinearLayout { private static final String EXTRA_BUTTON_PACKAGES = "packages"; private Context mContext; - private AlphaOptimizedImageButton mIcon; - private AlphaOptimizedImageButton mMoreIcon; + private AlphaOptimizedImageView mIcon; + private AlphaOptimizedImageView mMoreIcon; private ImageView mUnseenIcon; private String mIntent; private String mLongIntent; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java index 3b7b48a77186..d60bc418ece2 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java @@ -24,6 +24,7 @@ import android.view.ViewGroup; import androidx.annotation.LayoutRes; +import com.android.car.ui.FocusParkingView; import com.android.systemui.R; import javax.inject.Inject; @@ -146,6 +147,12 @@ public class NavigationBarViewFactory { CarNavigationBarView view = (CarNavigationBarView) View.inflate(mContext, barLayout, /* root= */ null); + + // Include a FocusParkingView at the end. The rotary controller "parks" the focus here when + // the user navigates to another window. This is also used to prevent wrap-around which is + // why it must be first or last in Tab order. + view.addView(new FocusParkingView(mContext)); + mCachedViewMap.put(type, view); return mCachedViewMap.get(type); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java index aeb1d39599db..d4f720715a69 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java @@ -24,7 +24,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.FrameLayout; import com.android.car.notification.R; import com.android.car.notification.headsup.CarHeadsUpNotificationContainer; @@ -44,7 +43,7 @@ public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotifica private final OverlayViewGlobalStateController mOverlayViewGlobalStateController; private final ViewGroup mWindow; - private final FrameLayout mHeadsUpContentFrame; + private final ViewGroup mHeadsUpContentFrame; @Inject CarHeadsUpNotificationSystemContainer(Context context, diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java index 30e26578bd73..3969f92c690a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java @@ -138,4 +138,11 @@ public class OverlayViewController { protected boolean shouldShowNavigationBar() { return false; } + + /** + * Returns {@code true} if this view should be hidden during the occluded state. + */ + protected boolean shouldShowWhenOccluded() { + return false; + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java index 70260b0d4cef..8e9410964313 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java @@ -24,7 +24,9 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.car.navigationbar.CarNavigationBarController; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -47,11 +49,16 @@ public class OverlayViewGlobalStateController { private static final int UNKNOWN_Z_ORDER = -1; private final SystemUIOverlayWindowController mSystemUIOverlayWindowController; private final CarNavigationBarController mCarNavigationBarController; + + private boolean mIsOccluded; + @VisibleForTesting Map<OverlayViewController, Integer> mZOrderMap; @VisibleForTesting SortedMap<Integer, OverlayViewController> mZOrderVisibleSortedMap; @VisibleForTesting + Set<OverlayViewController> mViewsHiddenForOcclusion; + @VisibleForTesting OverlayViewController mHighestZOrder; @Inject @@ -63,6 +70,7 @@ public class OverlayViewGlobalStateController { mCarNavigationBarController = carNavigationBarController; mZOrderMap = new HashMap<>(); mZOrderVisibleSortedMap = new TreeMap<>(); + mViewsHiddenForOcclusion = new HashSet<>(); } /** @@ -91,6 +99,10 @@ public class OverlayViewGlobalStateController { */ public void showView(OverlayViewController viewController, @Nullable Runnable show) { debugLog(); + if (mIsOccluded && !viewController.shouldShowWhenOccluded()) { + mViewsHiddenForOcclusion.add(viewController); + return; + } if (mZOrderVisibleSortedMap.isEmpty()) { setWindowVisible(true); } @@ -147,6 +159,10 @@ public class OverlayViewGlobalStateController { */ public void hideView(OverlayViewController viewController, @Nullable Runnable hide) { debugLog(); + if (mIsOccluded && mViewsHiddenForOcclusion.contains(viewController)) { + mViewsHiddenForOcclusion.remove(viewController); + return; + } if (!viewController.isInflated()) { Log.d(TAG, "Content cannot be hidden since it isn't inflated: " + viewController.getClass().getName()); @@ -240,6 +256,43 @@ public class OverlayViewGlobalStateController { return mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowHUN(); } + /** + * Set the OverlayViewWindow to be in occluded or unoccluded state. When OverlayViewWindow is + * occluded, all views mounted to it that are not configured to be shown during occlusion will + * be hidden. + */ + public void setOccluded(boolean occluded) { + if (occluded) { + // Hide views before setting mIsOccluded to true so the regular hideView logic is used, + // not the one used during occlusion. + hideViewsForOcclusion(); + mIsOccluded = true; + } else { + mIsOccluded = false; + // show views after setting mIsOccluded to false so the regular showView logic is used, + // not the one used during occlusion. + showViewsHiddenForOcclusion(); + } + } + + private void hideViewsForOcclusion() { + HashSet<OverlayViewController> viewsCurrentlyShowing = new HashSet<>( + mZOrderVisibleSortedMap.values()); + viewsCurrentlyShowing.forEach(overlayController -> { + if (!overlayController.shouldShowWhenOccluded()) { + hideView(overlayController, overlayController::hideInternal); + mViewsHiddenForOcclusion.add(overlayController); + } + }); + } + + private void showViewsHiddenForOcclusion() { + mViewsHiddenForOcclusion.forEach(overlayViewController -> { + showView(overlayViewController, overlayViewController::showInternal); + }); + mViewsHiddenForOcclusion.clear(); + } + private void debugLog() { if (!DEBUG) { return; @@ -250,5 +303,8 @@ public class OverlayViewGlobalStateController { Log.d(TAG, "mZOrderVisibleSortedMap: " + mZOrderVisibleSortedMap); Log.d(TAG, "mZOrderMap.size(): " + mZOrderMap.size()); Log.d(TAG, "mZOrderMap: " + mZOrderMap); + Log.d(TAG, "mIsOccluded: " + mIsOccluded); + Log.d(TAG, "mViewsHiddenForOcclusion: " + mViewsHiddenForOcclusion); + Log.d(TAG, "mViewsHiddenForOcclusion.size(): " + mViewsHiddenForOcclusion.size()); } } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java index 38836d85e8d4..189e240169c3 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -169,6 +170,18 @@ public class CarKeyguardViewControllerTest extends SysuiTestCase { } @Test + public void setOccludedFalse_currentlyOccluded_bouncerReset() { + when(mBouncer.isSecure()).thenReturn(true); + mCarKeyguardViewController.show(/* options= */ null); + mCarKeyguardViewController.setOccluded(/* occluded= */ true, /* animate= */ false); + reset(mBouncer); + + mCarKeyguardViewController.setOccluded(/* occluded= */ false, /* animate= */ false); + + verify(mBouncer).show(/* resetSecuritySelection= */ true); + } + + @Test public void onCancelClicked_callsCancelClickedListener() { when(mBouncer.isSecure()).thenReturn(true); mCarKeyguardViewController.show(/* options= */ null); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java index 54282d39998b..bcaa5e9a03ee 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationButtonTest.java @@ -36,8 +36,8 @@ import android.widget.LinearLayout; import androidx.test.filters.SmallTest; -import com.android.keyguard.AlphaOptimizedImageButton; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.AlphaOptimizedImageView; import com.android.systemui.tests.R; import org.junit.Before; @@ -74,7 +74,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { @Test public void onCreate_iconIsVisible() { - AlphaOptimizedImageButton icon = mDefaultButton.findViewById( + AlphaOptimizedImageView icon = mDefaultButton.findViewById( R.id.car_nav_button_icon_image); assertThat(icon.getDrawable()).isNotNull(); @@ -83,12 +83,12 @@ public class CarNavigationButtonTest extends SysuiTestCase { @Test public void onSelected_selectedIconDefined_togglesIcon() { mDefaultButton.setSelected(true); - Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById( + Drawable selectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); mDefaultButton.setSelected(false); - Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById( + Drawable unselectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); assertThat(selectedIconDrawable).isNotEqualTo(unselectedIconDrawable); @@ -100,12 +100,12 @@ public class CarNavigationButtonTest extends SysuiTestCase { R.id.selected_icon_undefined); selectedIconUndefinedButton.setSelected(true); - Drawable selectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById( + Drawable selectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); selectedIconUndefinedButton.setSelected(false); - Drawable unselectedIconDrawable = ((AlphaOptimizedImageButton) mDefaultButton.findViewById( + Drawable unselectedIconDrawable = ((AlphaOptimizedImageView) mDefaultButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); assertThat(selectedIconDrawable).isEqualTo(unselectedIconDrawable); @@ -150,7 +150,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { @Test public void onSelected_doesNotShowMoreWhenSelected_doesNotShowMoreIcon() { mDefaultButton.setSelected(true); - AlphaOptimizedImageButton moreIcon = mDefaultButton.findViewById( + AlphaOptimizedImageView moreIcon = mDefaultButton.findViewById( R.id.car_nav_button_more_icon); assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE); @@ -161,7 +161,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { CarNavigationButton showMoreWhenSelected = mTestView.findViewById( R.id.not_highlightable_more_button); showMoreWhenSelected.setSelected(true); - AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById( + AlphaOptimizedImageView moreIcon = showMoreWhenSelected.findViewById( R.id.car_nav_button_more_icon); assertThat(moreIcon.getVisibility()).isEqualTo(View.VISIBLE); @@ -173,7 +173,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { R.id.highlightable_no_more_button); showMoreWhenSelected.setSelected(true); showMoreWhenSelected.setSelected(false); - AlphaOptimizedImageButton moreIcon = showMoreWhenSelected.findViewById( + AlphaOptimizedImageView moreIcon = showMoreWhenSelected.findViewById( R.id.car_nav_button_more_icon); assertThat(moreIcon.getVisibility()).isEqualTo(View.GONE); @@ -187,7 +187,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { roleBasedButton.setSelected(false); roleBasedButton.setAppIcon(appIcon); - Drawable currentDrawable = ((AlphaOptimizedImageButton) roleBasedButton.findViewById( + Drawable currentDrawable = ((AlphaOptimizedImageView) roleBasedButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); assertThat(currentDrawable).isEqualTo(appIcon); @@ -212,7 +212,7 @@ public class CarNavigationButtonTest extends SysuiTestCase { roleBasedButton.setSelected(true); roleBasedButton.setAppIcon(appIcon); - Drawable currentDrawable = ((AlphaOptimizedImageButton) roleBasedButton.findViewById( + Drawable currentDrawable = ((AlphaOptimizedImageView) roleBasedButton.findViewById( R.id.car_nav_button_icon_image)).getDrawable(); assertThat(currentDrawable).isEqualTo(appIcon); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java index 9e6e616e3ccf..cba42e5a9be4 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java @@ -491,6 +491,81 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { } @Test + public void setOccludedTrue_viewToHideWhenOccludedVisible_viewHidden() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false); + + mOverlayViewGlobalStateController.setOccluded(true); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isFalse(); + } + + @Test + public void setOccludedTrue_viewToNotHideWhenOccludedVisible_viewShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(true); + + mOverlayViewGlobalStateController.setOccluded(true); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isTrue(); + } + + @Test + public void hideViewAndThenSetOccludedTrue_viewHiddenForOcclusion_viewHiddenAfterOcclusion() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false); + mOverlayViewGlobalStateController.setOccluded(true); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, /* runnable= */ null); + mOverlayViewGlobalStateController.setOccluded(false); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isFalse(); + } + + @Test + public void setOccludedTrueAndThenShowView_viewToNotHideForOcclusion_viewShown() { + setupOverlayViewController1(); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(true); + + mOverlayViewGlobalStateController.setOccluded(true); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isTrue(); + } + + @Test + public void setOccludedTrueAndThenShowView_viewToHideForOcclusion_viewHidden() { + setupOverlayViewController1(); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false); + + mOverlayViewGlobalStateController.setOccluded(true); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isFalse(); + } + + @Test + public void setOccludedFalse_viewShownAfterSetOccludedTrue_viewToHideForOcclusion_viewShown() { + setupOverlayViewController1(); + when(mOverlayViewController1.shouldShowWhenOccluded()).thenReturn(false); + mOverlayViewGlobalStateController.setOccluded(true); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + mOverlayViewGlobalStateController.setOccluded(false); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsValue( + mOverlayViewController1)).isTrue(); + } + + @Test public void inflateView_notInflated_inflates() { when(mOverlayViewController2.isInflated()).thenReturn(false); diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index d039c9f646df..1b5062efa23e 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -140,8 +140,8 @@ <string name="accessibility_wifi_security_type_none" msgid="162352241518066966">"Адкрытая сетка"</string> <string name="accessibility_wifi_security_type_secured" msgid="2399774097343238942">"Бяспечная сетка"</string> <string name="process_kernel_label" msgid="950292573930336765">"АС Android"</string> - <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Выдаленыя прыкладанні"</string> - <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Выдаленыя прыкладанні і карыстальнiкi"</string> + <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Выдаленыя праграмы"</string> + <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Выдаленыя праграмы і карыстальнiкi"</string> <string name="data_usage_ota" msgid="7984667793701597001">"Абнаўленні сістэмы"</string> <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB-мадэм"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Партатыўны хот-спот"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 65f456e20e4e..d003ef0b9c71 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -449,7 +449,7 @@ <string name="power_charging_duration" msgid="5005740040558984057">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> täislaadimiseni"</string> <string name="battery_info_status_unknown" msgid="268625384868401114">"Tundmatu"</string> <string name="battery_info_status_charging" msgid="4279958015430387405">"Laadimine"</string> - <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Kiiresti laadimine"</string> + <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Kiirlaadimine"</string> <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Aeglaselt laadimine"</string> <string name="battery_info_status_discharging" msgid="6962689305413556485">"Ei lae"</string> <string name="battery_info_status_not_charging" msgid="8330015078868707899">"Vooluvõrgus, praegu ei saa laadida"</string> diff --git a/packages/SystemUI/res-product/values-en-rXC/strings.xml b/packages/SystemUI/res-product/values-en-rXC/strings.xml index 33a0e9da8871..022c5b390e7b 100644 --- a/packages/SystemUI/res-product/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-product/values-en-rXC/strings.xml @@ -40,10 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> - <!-- no translation found for global_action_lock_message (7092460751050168771) --> - <skip /> - <!-- no translation found for global_action_lock_message (1024230056230539493) --> - <skip /> - <!-- no translation found for global_action_lock_message (3165224897120346096) --> - <skip /> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Unlock your phone for more options"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Unlock your tablet for more options"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Unlock your device for more options"</string> </resources> diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml index 3bd7e04f2094..49d525fc189a 100644 --- a/packages/SystemUI/res/layout/notification_conversation_info.xml +++ b/packages/SystemUI/res/layout/notification_conversation_info.xml @@ -84,34 +84,21 @@ android:layout_weight="1" style="@style/TextAppearance.NotificationImportanceChannel"/> </LinearLayout> - <LinearLayout + <TextView + android:id="@+id/pkg_name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="start" - android:orientation="horizontal"> - <TextView - android:id="@+id/pkg_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/TextAppearance.NotificationImportanceChannelGroup" - android:ellipsize="end" - android:maxLines="1"/> - <TextView - android:id="@+id/group_divider" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - style="@style/TextAppearance.NotificationImportanceHeader" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:text="@*android:string/notification_header_divider_symbol" /> - <TextView - android:id="@+id/group_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - style="@style/TextAppearance.NotificationImportanceChannelGroup"/> - </LinearLayout> + style="@style/TextAppearance.NotificationImportanceChannelGroup" + android:ellipsize="end" + android:textDirection="locale" + android:maxLines="1"/> + <TextView + android:id="@+id/group_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:textDirection="locale" + style="@style/TextAppearance.NotificationImportanceChannelGroup"/> <TextView android:id="@+id/delegate_name" android:layout_width="match_parent" @@ -121,6 +108,7 @@ android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:ellipsize="end" + android:textDirection="locale" android:text="@string/notification_delegate_header" android:maxLines="1" /> diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index af5a8f4d3c23..870deacd87ae 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -58,35 +58,21 @@ android:layout_height="wrap_content" android:textDirection="locale" style="@style/TextAppearance.NotificationImportanceChannel"/> - <LinearLayout + <TextView + android:id="@+id/pkg_name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="start" - android:orientation="horizontal"> - <TextView - android:id="@+id/pkg_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/TextAppearance.NotificationImportanceChannelGroup" - android:ellipsize="end" - android:maxLines="1"/> - <TextView - android:id="@+id/group_divider" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - style="@style/TextAppearance.NotificationImportanceHeader" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:text="@*android:string/notification_header_divider_symbol" /> - <TextView - android:id="@+id/group_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - android:textDirection="locale" - style="@style/TextAppearance.NotificationImportanceChannelGroup"/> - </LinearLayout> + style="@style/TextAppearance.NotificationImportanceChannelGroup" + android:ellipsize="end" + android:textDirection="locale" + android:maxLines="1"/> + <TextView + android:id="@+id/group_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textDirection="locale" + android:ellipsize="end" + style="@style/TextAppearance.NotificationImportanceChannelGroup"/> <TextView android:id="@+id/delegate_name" android:layout_width="match_parent" @@ -96,6 +82,7 @@ android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:ellipsize="end" + android:textDirection="locale" android:text="@string/notification_delegate_header" android:maxLines="1" /> diff --git a/packages/SystemUI/res/layout/partial_conversation_info.xml b/packages/SystemUI/res/layout/partial_conversation_info.xml index a261114fa0f2..803b0c61e6da 100644 --- a/packages/SystemUI/res/layout/partial_conversation_info.xml +++ b/packages/SystemUI/res/layout/partial_conversation_info.xml @@ -46,66 +46,33 @@ android:layout_weight="1" android:layout_width="0dp" android:orientation="vertical" - android:layout_height="wrap_content" android:minHeight="@dimen/notification_guts_conversation_icon_size" android:layout_centerVertical="true" android:gravity="center_vertical" android:layout_alignEnd="@id/conversation_icon" android:layout_toEndOf="@id/conversation_icon"> - <LinearLayout + <TextView + android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="start" - android:orientation="horizontal"> - <TextView - android:id="@+id/name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/TextAppearance.NotificationImportanceChannel"/> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - style="@style/TextAppearance.NotificationImportanceHeader" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:text="@*android:string/notification_header_divider_symbol" /> - <TextView - android:id="@+id/parent_channel_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/TextAppearance.NotificationImportanceChannel"/> - - </LinearLayout> - <LinearLayout + android:ellipsize="end" + android:textDirection="locale" + style="@style/TextAppearance.NotificationImportanceChannel"/> + <TextView + android:id="@+id/parent_channel_name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="start" - android:orientation="horizontal"> - <TextView - android:id="@+id/pkg_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/TextAppearance.NotificationImportanceChannelGroup" - android:ellipsize="end" - android:maxLines="1"/> - <TextView - android:id="@+id/group_divider" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - style="@style/TextAppearance.NotificationImportanceHeader" - android:layout_marginStart="2dp" - android:layout_marginEnd="2dp" - android:text="@*android:string/notification_header_divider_symbol" /> - <TextView - android:id="@+id/group_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - style="@style/TextAppearance.NotificationImportanceChannelGroup"/> - </LinearLayout> + android:ellipsize="end" + android:textDirection="locale" + style="@style/TextAppearance.NotificationImportanceChannel"/> + <TextView + android:id="@+id/group_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:textDirection="locale" + style="@style/TextAppearance.NotificationImportanceChannelGroup"/> <TextView android:id="@+id/delegate_name" android:layout_width="match_parent" @@ -115,6 +82,7 @@ android:layout_marginStart="2dp" android:layout_marginEnd="2dp" android:ellipsize="end" + android:textDirection="locale" android:text="@string/notification_delegate_header" android:maxLines="1" /> diff --git a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml index c27b3a9b3bf4..bf2eac3c8ff3 100644 --- a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml +++ b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml @@ -38,157 +38,67 @@ android:background="@drawable/rounded_bg_full" > - <!-- We have a known number of rows that can be shown; just design them all here --> - <LinearLayout - android:id="@+id/show_at_top_tip" + <ImageView + android:id="@+id/conversation_icon" + android:layout_width="@dimen/notification_guts_conversation_icon_size" + android:layout_height="@dimen/notification_guts_conversation_icon_size" + android:layout_gravity="center_horizontal" /> + + <TextView + android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:orientation="horizontal" - > - <ImageView - android:id="@+id/bell_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_notifications_alert" - android:tint="?android:attr/colorControlNormal" /> - - <TextView - android:id="@+id/show_at_top_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:gravity="center_vertical|start" - android:textSize="15sp" - android:ellipsize="end" - android:maxLines="2" - android:text="@string/priority_onboarding_show_at_top_text" - style="@style/TextAppearance.NotificationInfo" - /> - - </LinearLayout> - - <LinearLayout - android:id="@+id/show_avatar_tip" + android:gravity="center_horizontal" + android:layout_marginTop="16dp" + android:text="@string/priority_onboarding_title" + style="@style/TextAppearance.NotificationImportanceChannel" + /> + + <View + android:id="@+id/divider" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:orientation="horizontal" - > - <ImageView - android:id="@+id/avatar_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_person" - android:tint="?android:attr/colorControlNormal" /> - - <TextView - android:id="@+id/avatar_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:gravity="center_vertical|start" - android:textSize="15sp" - android:ellipsize="end" - android:maxLines="2" - android:text="@string/priority_onboarding_show_avatar_text" - style="@style/TextAppearance.NotificationInfo" - /> + android:layout_height="0.5dp" + android:layout_marginTop="20dp" + android:layout_marginBottom="20dp" + android:background="@color/material_grey_300" /> - </LinearLayout> - - <!-- These rows show optionally --> - - <LinearLayout - android:id="@+id/floating_bubble_tip" + <TextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:orientation="horizontal" - > - - <ImageView - android:id="@+id/bubble_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_create_bubble" - android:tint="?android:attr/colorControlNormal" /> + android:gravity="start" + android:text="@string/priority_onboarding_behavior" + style="@style/TextAppearance.NotificationImportanceChannelGroup" + /> - <TextView - android:id="@+id/bubble_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:gravity="center_vertical|start" - android:textSize="15sp" - android:ellipsize="end" - android:maxLines="2" - android:text="@string/priority_onboarding_appear_as_bubble_text" - style="@style/TextAppearance.NotificationInfo" - /> - - </LinearLayout> - - <LinearLayout - android:id="@+id/ignore_dnd_tip" + <TextView + android:id="@+id/behaviors" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:orientation="horizontal" - > - - <ImageView - android:id="@+id/dnd_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:src="@drawable/moon" - android:tint="?android:attr/colorControlNormal" /> - - <TextView - android:id="@+id/dnd_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:gravity="center_vertical|start" - android:textSize="15sp" - android:ellipsize="end" - android:maxLines="2" - android:text="@string/priority_onboarding_ignores_dnd_text" - style="@style/TextAppearance.NotificationInfo" - /> - - </LinearLayout> + android:gravity="start" + android:layout_marginTop="8dp" + style="@style/TextAppearance.NotificationImportanceChannelGroup" + /> <!-- Bottom button container --> <RelativeLayout android:id="@+id/button_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="4dp" - android:paddingEnd="4dp" + android:layout_marginTop="32dp" android:orientation="horizontal" > <TextView + android:id="@+id/settings_button" + android:text="@string/priority_onboarding_settings_button_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:gravity="start|center_vertical" + android:minWidth="@dimen/notification_importance_toggle_size" + android:minHeight="@dimen/notification_importance_toggle_size" + android:maxWidth="125dp" + style="@style/TextAppearance.NotificationInfo.Button"/> + <TextView android:id="@+id/done_button" android:text="@string/priority_onboarding_done_button_title" android:layout_width="wrap_content" diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml index 5b7e7e7d59a3..44f52efd175e 100644 --- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml +++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml @@ -21,8 +21,6 @@ android:layout_height="wrap_content" android:paddingTop="@dimen/qs_header_top_padding" android:paddingBottom="@dimen/qs_header_bottom_padding" - android:paddingStart="@dimen/status_bar_padding_start" - android:paddingEnd="@dimen/status_bar_padding_end" android:layout_below="@id/quick_status_bar_system_icons" android:clipChildren="false" android:clipToPadding="false" diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml index 28672241b1b2..12127f529054 100644 --- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml +++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml @@ -18,8 +18,6 @@ android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_gravity="center_vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" style="@style/BrightnessDialogContainer"> <com.android.systemui.settings.ToggleSliderView diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml index 683e86728e91..e6ef9b4b902c 100644 --- a/packages/SystemUI/res/layout/quick_settings_header_info.xml +++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml @@ -19,8 +19,6 @@ android:layout_width="match_parent" android:layout_height="@dimen/qs_header_tooltip_height" android:layout_below="@id/quick_status_bar_system_icons" - android:paddingStart="@dimen/status_bar_padding_start" - android:paddingEnd="@dimen/status_bar_padding_end" android:visibility="invisible" android:theme="@style/QSHeaderTheme"> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 9a7c344baf20..abeb33111c40 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -33,6 +33,7 @@ android:paddingStart="0dp" android:elevation="4dp" > + <!-- The clock --> <include layout="@layout/quick_status_bar_header_system_icons" /> <!-- Status icons within the panel itself (and not in the top-most status bar) --> diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml index b27d096c12b5..be86e5f5abc5 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -25,8 +25,6 @@ android:gravity="center" android:orientation="horizontal" android:clickable="true" - android:paddingStart="@dimen/status_bar_padding_start" - android:paddingEnd="@dimen/status_bar_padding_end" android:paddingTop="@dimen/status_bar_padding_top" > <com.android.systemui.statusbar.policy.Clock diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml index af6f9bb827f6..0c4d5a26f95b 100644 --- a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml +++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml @@ -16,21 +16,20 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" + android:layout_width="250dp" android:layout_height="48dp" android:orientation="vertical" - android:padding="10dp" - android:layout_weight="1"> + android:padding="13dp"> <TextView android:id="@+id/screen_recording_dialog_source_text" - android:layout_width="match_parent" + android:layout_width="250dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary"/> <TextView android:id="@+id/screen_recording_dialog_source_description" - android:layout_width="wrap_content" + android:layout_width="250dp" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index cc1f7a3afead..06fa15494857 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoem om skerm te vul"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Strek om skerm te vul"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skermkiekie"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Ontsluit jou foon vir meer opsies"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Ontsluit jou tablet vir meer opsies"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Ontsluit jou toestel vir meer opsies"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"het \'n prent gestuur"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Stoor tans skermkiekie..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Stoor tans skermkiekie..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wys boaan die gespreksafdeling, verskyn as \'n swewende borrel, wys profielfoto op sluitskerm"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekspesifieke-instellings nie"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen onlangse borrels nie"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index dff3e810ecbc..e8df135c8aea 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ማያ እንዲሞላ አጉላ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ማያ ለመሙለት ሳብ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገጽ እይታ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ለተጨማሪ አማራጮች የእርስዎን ስልክ ይክፈቱ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ለተጨማሪ አማራጮች የእርስዎን ጡባዊ ይክፈቱ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ለተጨማሪ አማራጮች የእርስዎን መሣሪያ ይክፈቱ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ምስል ተልኳል"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"በውይይት ክፍል አናት ላይ ያሳያል፣ እንደ ተንሳፋፊ አረፋ ብቅ ይላል፣ በቆልፍ ማያ ገጽ ላይ የመገለጫ ሥዕልን ያሳያል"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ቅንብሮች"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ውይይት-ተኮር ቅንብሮችን አይደግፍም"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ምንም የቅርብ ጊዜ አረፋዎች የሉም"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"የቅርብ ጊዜ አረፋዎች እና የተሰናበቱ አረፋዎች እዚህ ብቅ ይላሉ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 084081c4748c..38e3c20c48e0 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"تكبير/تصغير لملء الشاشة"</string> <string name="compat_mode_off" msgid="7682459748279487945">"توسيع بملء الشاشة"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"لقطة شاشة"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"يمكنك فتح قفل هاتفك للوصول إلى مزيد من الخيارات."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"يمكنك فتح قفل جهازك اللوحي للوصول إلى مزيد من الخيارات."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"يمكنك فتح قفل جهازك للوصول إلى مزيد من الخيارات."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"أرسَل صورة"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"جارٍ حفظ لقطة الشاشة..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"جارٍ حفظ لقطة الشاشة..."</string> @@ -607,29 +604,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"تفعيل"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"إيقاف"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"تبديل جهاز الاستماع"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"تم تثبيت التطبيق"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"الشاشة الرئيسية\" لإزالة التثبيت."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. مرّر الشاشة بسرعة للأعلى مع الاستمرار لإزالة تثبيت الشاشة."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"نظرة عامة\" لإزالة التثبيت."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"الشاشة الرئيسية\" لإزالة التثبيت."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"يمكن الوصول إلى البيانات الشخصية (مثلاً جهات الاتصال ومحتوى الرسائل الإلكترونية)"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"يمكن للتطبيق المثبَّت فتح تطبيقات أخرى."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"لإزالة تثبيت هذا التطبيق، المس مع الاستمرار زرّي \"رجوع\" و\"نظرة عامة\"."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"لإزالة تثبيت هذا التطبيق، المس مع الاستمرار زرّي \"رجوع\" و\"الشاشة الرئيسية\"."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"مرّر الشاشة بسرعة للأعلى مع الاستمرار لإزالة تثبيت هذا التطبيق."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"حسنًا"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"لا، شكرًا"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"تم تثبيت التطبيق."</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"تمت إزالة تثبيت التطبيق"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"هل تريد إخفاء <xliff:g id="TILE_LABEL">%1$s</xliff:g>؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"سيظهر مرة أخرى عند تمكينه في الإعدادات المرة التالية."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"إخفاء"</string> @@ -742,7 +731,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"تظهر في أعلى قسم المحادثات وتظهر كفقاعة عائمة وتعرض صورة الملف الشخصي على شاشة القفل"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string> - <string name="no_shortcut" msgid="7176375126961212514">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> الإعدادات الخاصة بالمحادثة."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات محادثات"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 697d3753f4dd..9b36f9a1a235 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string> <string name="compat_mode_off" msgid="7682459748279487945">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্ৰীনশ্বট"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"অধিক বিকল্পৰ বাবে আপোনাৰ ফ’নটো আনলক কৰক"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"অধিক বিকল্পৰ বাবে আপোনাৰ টেবলেটটো আনলক কৰক"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"অধিক বিকল্পৰ বাবে আপোনাৰ ডিভাইচটো আনলক কৰক"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"সক্ষম কৰক"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"অক্ষম কৰক"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"আউটপুট ডিভাইচ সলনি কৰক"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"এপ্টো পিন কৰা আছে"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'পিছলৈ যাওক\' আৰু \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'মত স্পৰ্শ কৰি সেঁচি ধৰক।"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ পিছলৈ যাওক আৰু হ\'মত স্পৰ্শ কৰি সেঁচি ধৰক।"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ব্যক্তিগত ডেটা এক্সেছ কৰিব পৰা যাব পাৰে (যেনে সম্পর্কসমূহ আৰু ইমেইলৰ সমল)।"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"পিন কৰি ৰখা এপ্টোৱে হয়তো অন্য এপ্সমূহ খুলিব পাৰে।"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"এই এপ্টো আনপিন কৰিবলৈ, উভতি যাওক আৰু ৰূপৰেখাৰ বুটামসমূহ স্পৰ্শ কৰি ধৰি ৰাখক"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"এই এপ্টো আনপিন কৰিবলৈ, উভতি যাওক আৰু গৃহপৃষ্ঠাৰ বুটামসমূহ স্পৰ্শ কৰি ধৰি ৰাখক"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"এই এপ্টো আনপিন কৰিবলৈ, ওপৰলৈ ছোৱাইপ কৰক আৰু ধৰি ৰাখক"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"বুজি পালোঁ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"নালাগে, ধন্যবাদ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"এপ্টো পিন কৰা হ’ল"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"এপ্টো আনপিন কৰা হ’ল"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"লুকুৱাওক"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায়, ওপঙা বাবল হিচাপে দেখা পোৱা যায়, লক স্ক্ৰীনত প্ৰ’ফাইলৰ চিত্ৰ প্ৰদৰ্শন কৰে"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপ নিৰ্দিষ্ট ছেটিংসমূহ সমৰ্থন নকৰে"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনো শেহতীয়া bubbles নাই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 52c85d1d70e7..502044e3b9d9 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Ekranı doldurmaq üçün yaxınlaşdır"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ekranı doldurmaq üçün uzat"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skrinşot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Daha çox seçim üçün telefonu kiliddən çıxarın"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Daha çox seçim üçün planşeti kiliddən çıxarın"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Daha çox seçim üçün cihazı kiliddən çıxarın"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"şəkil göndərdi"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Skrinşot yadda saxlanılır..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinşot yadda saxlanır..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktiv edin"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiv edin"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Çıxış cihazına keçin"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Tətbiq bərkidilib"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Bu, onu çıxarana qədər görünəcək. Çıxarmaq üçün yuxarı sürüşdürün & basıb saxlayın."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Əsas səhifə düyməsinə basıb saxlayın."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Şəxsi məlumatlar (məsələn, kontaktlar və e-poçt məzmunu) əlçatan ola bilər."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Bərkidilmiş tətbiq digər tətbiqləri aça bilər."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Bu tətbiqi çıxarmaq üçün Geri və İcmal düymələrinə basıb saxlayın"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Bu tətbiqi çıxarmaq üçün Geri və Əsas ekran düymələrinə basıb saxlayın"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Bu tətbiqi çıxarmaq üçün yuxarı sürüşdürüb saxlayın"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Anladım!"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Yox, çox sağ olun"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Tətbiq bərkidildi"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Tətbiq çıxarıldı"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlədilsin?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Ayarlarda onu aktivləşdirəcəyiniz vaxta qədər o, yenidən görünəcək."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Gizlədin"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Söhbət bölməsinin yuxarısında göstərilir, üzən qabarcıq kimi görünür, kilid ekranında profil şəkli göstərir"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbətə aid ayarları dəstəkləmir"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Yumrucuqlar yoxdur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son yumrucuqlar və buraxılmış yumrucuqlar burada görünəcək"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 2057dd2d576c..00e375c70614 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zumiraj na celom ekranu"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Razvuci na ceo ekran"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snimak ekrana"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Otključajte telefon za još opcija"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Otključajte tablet za još opcija"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Otključajte uređaj za još opcija"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslao/la sliku"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Čuvanje snimka ekrana..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Čuvanje snimka ekrana..."</string> @@ -725,7 +722,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se u vrhu odeljka za konverzacije kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Podešavanja"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava podešavanja za konverzacije"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Ovde se prikazuju nedavni i odbačeni oblačići"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 82c2535a7316..cb3aed5fc089 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Павял. на ўвесь экран"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Расцягн. на ўвесь экран"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Здымак экрана"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Каб адкрыць іншыя параметры, разблакіруйце тэлефон"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Каб адкрыць іншыя параметры, разблакіруйце планшэт"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Каб адкрыць іншыя параметры, разблакіруйце прыладу"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"адпраўлены відарыс"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Захаванне скрыншота..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Захаванне скрыншота..."</string> @@ -728,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння, а на экране блакіроўкі – у выглядзе відарыса профілю"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае пэўныя налады размоў"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма нядаўніх усплывальных апавяшчэнняў"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 6dd050fb0735..66613490a073 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Мащаб – запълва екрана"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Разпъване – запълва екрана"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Екранна снимка"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Отключете телефона си за още опции"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Отключете таблета си за още опции"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Отключете устройството си за още опции"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"изпратено изображение"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Екранната снимка се запазва..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Екранната снимка се запазва..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"активиране"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"деактивиране"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Превключване на устройството за възпроизвеждане на звук"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Приложението е фиксирано"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и този за общ преглед."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и „Начало“."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Екранът ще остане на преден план, докато не го освободите. Прекарайте пръст нагоре и задръжте за освобождаване."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за общ преглед."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона „Начало“."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Някои лични данни може да бъдат достъпни (като например контактите и съдържанието от имейлите)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Фиксираните приложения може да отворят други приложения."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"За да освободите това приложение, докоснете и задръжте бутона за връщане назад и този за общ преглед"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"За да освободите това приложение, докоснете и задръжте бутона за връщане назад и „Начало“"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"За да освободите това приложение, прекарайте пръст нагоре и задръжте"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Разбрах"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Не, благодаря"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Приложението е фиксирано"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Приложението е освободено"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Да се скрие ли „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Бързите настройки ще се покажат отново следващия път, когато ги включите от „Настройки“."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Скриване"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори и показва снимката на потребителския профил на заключения екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа свързаните с разговорите настройки"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма скорошни балончета"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Скорошните и отхвърлените балончета ще се показват тук"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index f25890b26bb0..74d903cf61c8 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"স্ক্রীণ পূরণ করতে জুম করুন"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ফুল স্ক্রিন করুন"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্রিনশট"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"আরও বিকল্প দেখতে আপনার ফোন আনলক করুন"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"আরও বিকল্প দেখতে আপনার ট্যাবলেট আনলক করুন"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"আরও বিকল্প দেখতে আপনার ডিভাইস আনলক করুন"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"একটি ছবি পাঠানো হয়েছে"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"স্ক্রিনশট সেভ করা হচ্ছে..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্রিনশট সেভ করা হচ্ছে..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"কথোপকথন বিভাগের উপরে ভাসমান বাবলের মতো দেখা যাবে, লক স্ক্রিনে প্রোফাইল ছবি দেখাবে"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে কথোপকথনের ক্ষেত্রে প্রযোজ্য সেটিংস কাজ করে না"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনও সাম্প্রতিক বাবল নেই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index a25a917b23ae..67515f7aad08 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Uvećaj prikaz na ekran"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Razvuci prikaz na ekran"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snimak ekrana"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Otključajte telefon za više opcija"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Otključajte tablet za više opcija"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Otključajte uređaj za više opcija"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslao/la sliku"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Spašavanje snimka ekrana..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Spašavanje snimka ekrana..."</string> @@ -727,7 +724,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se na vrhu odjeljka za razgovor, pojavljuje se kao plutajući oblačić, prikazuje sliku profila na zaključanom ekranu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetni"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava postavke za određeni razgovor"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 436776f68414..bca1fa21b51e 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom per omplir pantalla"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Estira per omplir pant."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloqueja el teu telèfon per veure més opcions"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloqueja la teva tauleta per veure més opcions"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloqueja el teu dispositiu per veure més opcions"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviat una imatge"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"S\'està desant captura de pantalla..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"S\'està desant la captura de pantalla..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Es mostra com a bombolla flotant a la part superior de la secció de converses i mostra la foto de perfil a la pantalla de bloqueig"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet opcions de configuració específiques de converses"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hi ha bombolles recents"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bombolles recents i les ignorades es mostraran aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 1bd6dec8d7d3..882c3e819a1b 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Přiblížit na celou obrazovku"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Na celou obrazovku"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímek obrazovky"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Chcete-li zobrazit další možnosti, odemkněte telefon"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Chcete-li zobrazit další možnosti, odemkněte tablet"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Chcete-li zobrazit další možnosti, odemkněte zařízení"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odesílá obrázek"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Ukládání snímku obrazovky..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ukládání snímku obrazovky..."</string> @@ -728,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzace a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje nastavení specifická pro konverzaci"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žádné nedávné bubliny"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Zde se budou zobrazovat nedávné bubliny a zavřené bubliny"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a463aac1fb6d..ecaf84f0b033 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom til fuld skærm"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stræk til fuld skærm"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Lås din telefon op for at se flere valgmuligheder"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Lås din tablet op for at se flere valgmuligheder"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Lås din enhed op for at se flere valgmuligheder"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendte et billede"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Gemmer screenshot..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gemmer screenshot..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivér"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Skift enhed til lydudgang"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er fastgjort"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage og Overblik, og hold fingeren nede for at frigøre skærmen."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Dette fastholder skærmen i visningen, indtil du frigør den. Hold Tilbage og Startskærm nede for at frigøre skærmen."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Dette fastholder skærmen i visningen, indtil du frigør den. Stryg opad, og hold fingeren nede for at frigøre den."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage, og hold fingeren nede for at frigøre skærmen."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Dette fastholder skærmen i visningen, indtil du frigør den. Hold Startskærm nede for at frigøre skærmen."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Personoplysninger er muligvis tilgængelige (f.eks. kontakter og mailindhold)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"En fastgjort app kan åbne andre apps."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Du kan frigøre denne app ved at holde knapperne Tilbage og Oversigt nede"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Du kan frigøre denne app ved at holde knapperne Tilbage og Hjem nede"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Du kan frigøre denne app ved at stryge opad og holde fingeren nede"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nej tak"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Appen er fastgjort"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Appen er frigjort"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Den vises igen, næste gang du aktiverer den i indstillingerne."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Skjul"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen, som en svævende boble og med profilbillede på låseskærmen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalespecifikke indstillinger"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen seneste bobler"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nye bobler og afviste bobler vises her"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 1a796e3291f4..0d7197766b6c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom auf Bildschirmgröße"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Auf Bildschirmgröße anpassen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Entsperre dein Smartphone für weitere Optionen"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Entsperre dein Tablet für weitere Optionen"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Entsperre dein Gerät für weitere Optionen"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"Bild gesendet"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Screenshot wird gespeichert..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot wird gespeichert..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktivieren"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktivieren"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Ausgabegerät wechseln"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"App ist auf dem Bildschirm fixiert"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Dazu wischst du nach oben und hältst den Bildschirm gedrückt"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Startbildschirm\"."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Zugriff auf personenbezogene Daten wie beispielsweise Kontakte oder E-Mails ist möglich."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Eine auf dem Bildschirm fixierte App kann ggf. andere Apps öffnen."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Zum Aufheben der Fixierung dieser App \"Zurück\" und \"Übersicht\" halten"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Zum Aufheben der Fixierung dieser App \"Zurück\" und \"Startbildschirm\" halten"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Zum Loslösen der App nach oben wischen und halten"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Ok"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nein danke"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Auf dem Bildschirm fixierte App"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Vom Bildschirm gelöste App"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ausblenden"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wird oben im Bereich \"Unterhaltungen\" als unverankerte Bubble mit einem Profilbild auf dem Sperrbildschirm angezeigt"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine unterhaltungsspezifischen Einstellungen"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Keine kürzlich geschlossenen Bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Hier werden aktuelle und geschlossene Bubbles angezeigt"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 49a4dac968f2..ca8e555a6738 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Ζουμ σε πλήρη οθόνη"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Προβoλή σε πλήρη οθ."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Στιγμιότυπο οθόνης"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Ξεκλειδώστε το τηλέφωνό σας για περισσότερες επιλογές."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Ξεκλειδώστε το tablet για περισσότερες επιλογές."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Ξεκλειδώστε τη συσκευή σας για περισσότερες επιλογές."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"έστειλε μια εικόνα"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Αποθήκ. στιγμιότυπου οθόνης..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Αποθήκευση στιγμιότυπου οθόνης..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται στο επάνω μέρος της ενότητας συζητήσεων, προβάλλεται ως κινούμενο συννεφάκι, εμφανίζει τη φωτογραφία προφίλ στην οθόνη κλειδώματος"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει ρυθμίσεις για συγκεκριμένη συνομιλία"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Δεν υπάρχουν πρόσφατα συννεφάκια"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Τα πρόσφατα συννεφάκια και τα συννεφάκια που παραβλέψατε θα εμφανίζονται εδώ."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 626b06782e4a..eb71c5673ae4 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Unlock your phone for more options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Unlock your tablet for more options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Unlock your device for more options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sent an image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Saving screenshot…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Saving screenshot…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> does not support conversation-specific settings"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index e4646f18709e..fbc603a07451 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Unlock your phone for more options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Unlock your tablet for more options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Unlock your device for more options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sent an image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Saving screenshot…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Saving screenshot…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> does not support conversation-specific settings"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 626b06782e4a..eb71c5673ae4 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Unlock your phone for more options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Unlock your tablet for more options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Unlock your device for more options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sent an image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Saving screenshot…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Saving screenshot…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> does not support conversation-specific settings"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 626b06782e4a..eb71c5673ae4 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Unlock your phone for more options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Unlock your tablet for more options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Unlock your device for more options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sent an image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Saving screenshot…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Saving screenshot…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> does not support conversation-specific settings"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 99ca7806bf11..5e021c51fcca 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -719,7 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shows at top of conversation section, appears as floating bubble, displays profile picture on lock screen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Settings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> does not support conversation specific settings"</string> + <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recent bubbles and dismissed bubbles will appear here"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 31b48d9c8ebd..5b3aada2d74e 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom para ocupar la pantalla"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Estirar p/ ocupar la pantalla"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloquea el teléfono para ver más opciones"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloquea la tablet para ver más opciones"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloquea el dispositivo para ver más opciones"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"envió una imagen"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Guardando captura de pantalla"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando la captura de pantalla..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite opciones de configuración específicas de conversaciones"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index cdfad83af199..4c574c2872f5 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom para ajustar"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Expandir para ajustar"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloquea el teléfono para ver más opciones"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloquea el tablet para ver más opciones"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloquea el dispositivo para ver más opciones"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviado una imagen"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Guardando captura..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando captura..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra en la parte superior de la sección de conversaciones en forma de burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no es compatible con ajustes específicos de conversaciones"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las cerradas aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 2e29befd6189..9e90e5edeec9 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Suumi ekraani täitmiseks"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Venita ekraani täitmiseks"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekraanipilt"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Lisavalikute nägemiseks avage oma telefon"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Lisavalikute nägemiseks avage oma tahvelarvuti"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Lisavalikute nägemiseks avage oma seade"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"saatis kujutise"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Kuvatõmmise salvestamine ..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Kuvatõmmise salvestamine ..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"luba"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"keela"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Väljundseadme vahetamine"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Rakendus on kinnitatud"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avakuva."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks pühkige üles ja hoidke sõrme ekraanil."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Ülevaade."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Avakuva."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Isiklikud andmed (nt kontaktid ja meilide sisu) võivad olla juurdepääsetavad."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Kinnitatud rakendused võivad avada muid rakendusi."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Rakenduse vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Rakenduse vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Rakenduse vabastamiseks pühkige üles ja hoidke sõrme ekraanil"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Selge"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Tänan, ei"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Rakendus on kinnitatud"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Rakendus on vabastatud"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Kas peita <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"See kuvatakse uuesti järgmisel korral, kui selle seadetes sisse lülitate."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Peida"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Kuvatakse vestluste jaotise ülaosas hõljuva mullina ja lukustuskuval kuvatakse profiilipilt"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Seaded"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestluspõhiseid seadeid"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hiljutisi mulle pole"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Siin kuvatakse hiljutised ja suletud mullid."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 8e38736ecbdf..ac3bd8704617 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Handiagotu pantaila betetzeko"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Luzatu pantaila betetzeko"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pantaila-argazkia"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desblokeatu telefonoa aukera gehiago ikusteko"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desblokeatu tableta aukera gehiago ikusteko"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desblokeatu gailua aukera gehiago ikusteko"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"erabiltzaileak irudi bat bidali du"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Pantaila-argazkia gordetzen…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Pantaila-argazkia gordetzen…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Burbuila gisa agertzen da elkarrizketen atalaren goialdean, eta profileko argazkia bistaratzen du pantaila blokeatuta dagoenean"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez du onartzen elkarrizketen berariazko ezarpenik"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ez dago azkenaldiko burbuilarik"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Azken burbuilak eta baztertutakoak agertuko dira hemen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index b9472344f595..207d4a208158 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"بزرگنمایی برای پر کردن صفحه"</string> <string name="compat_mode_off" msgid="7682459748279487945">"گسترده کردن برای پر کردن صفحه"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"نماگرفت"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"برای گزینههای بیشتر، قفل تلفن را باز کنید"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"برای گزینههای بیشتر، قفل رایانه لوحی را باز کنید"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"برای گزینههای بیشتر، قفل دستگاه را باز کنید"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"تصویری ارسال کرد"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"در حال ذخیره نماگرفت..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"درحال ذخیره نماگرفت…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"در بالای بخش مکالمه بهصورت حبابک شناور نشان داده میشود و تصویر نمایه را در صفحه قفل نمایش میدهد"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"تنظیمات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> از تنظیمات خاص مکالمه پشتیبانی نمیکند"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"هیچ ابزارک اعلان جدیدی وجود ندارد"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ابزارک اعلان اخیر و ابزارک اعلان ردشده اینجا ظاهر خواهند شد"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 7a83222754ec..ed6768caf75e 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoomaa koko näyttöön"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Venytä koko näyttöön"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Kuvakaappaus"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Avaa puhelimen lukitus, niin näet enemmän vaihtoehtoja"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Avaa tabletin lukitus, niin näet enemmän vaihtoehtoja"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Avaa laitteen lukitus, niin näet enemmän vaihtoehtoja"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"lähetti kuvan"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Tallennetaan kuvakaappausta..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Tallennetaan kuvakaappausta..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ota käyttöön"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"poista käytöstä"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Vaihda toistolaitetta"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Sovellus on kiinnitetty"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Aloitusnäyttö."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Pysyy näkyvissä, kunnes irrotat sen. Irrota pyyhkäisemällä ylös ja painamalla pitkään."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Viimeisimmät."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Aloitusnäyttö."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Henkilökohtaisiin tietoihin (esim. yhteystietoihin ja sähköpostin sisältöön) voi saada pääsyn."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Kiinnitetty sovellus voi avata muita sovelluksia."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Irrota sovellus koskettamalla pitkään Takaisin- ja Viimeisimmät-painikkeita"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Irrota sovellus koskettamalla pitkään Takaisin- ja Aloitusnäyttö-painikkeita"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Irrota sovellus pyyhkäisemällä ylös ja painamalla pitkään"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Selvä"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Ei kiitos"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Sovellus kiinnitetty"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Sovellus irrotettu"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Piilotetaanko <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Se tulee takaisin näkyviin, kun seuraavan kerran otat sen käyttöön asetuksissa."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Piilota"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Näkyy keskusteluosion yläosassa kelluvana kuplana, profiilikuva näkyy lukitusnäytöllä"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskustelukohtaisia asetuksia"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ei viimeaikaisia kuplia"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viimeaikaiset ja äskettäin ohitetut kuplat näkyvät täällä"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 901d1e687004..e1d5cca477e5 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Étirer pour remplir l\'écran"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Déverrouillez votre téléphone pour afficher davantage d\'options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Déverrouillez votre tablette pour afficher davantage d\'options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Déverrouillez votre appareil pour afficher davantage d\'options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Enregistrement capture écran…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement capture écran…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activer"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"désactiver"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Changer d\'appareil de sortie"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"L\'application est épinglée"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour » et « Aperçu »."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur les touches Retour et Accueil."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'épinglage. Pour annuler l\'épinglage, balayez l\'écran vers le haut et gardez le doigt dessus."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Aperçu »."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur la touche Accueil."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Certaines données personnelles pourraient être accessibles (comme les contacts et le contenu des courriels)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"L\'application épinglée peut ouvrir d\'autres applications."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Pour annuler l\'épinglage de cette application, maintenez un doigt sur les touches Retour et Aperçu"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Pour annuler l\'épinglage de cette application, maintenez un doigt sur les touches Retour et Accueil"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Pour annuler l\'épinglage de cette application, balayez-la vers le haut et gardez le doigt dessus"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Non, merci"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Application épinglée"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"L\'épinglage de l\'application a été annulé"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Masquer"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations sous forme de bulle flottante et affiche la photo du profil sur l\'écran de verrouillage"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorité"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les paramètres propres aux conversations"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et les bulles ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 0145ce9113e7..faaccc6c113d 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Étirer pour remplir l\'écran"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Déverrouillez votre téléphone pour obtenir plus d\'options"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Déverrouillez votre tablette pour obtenir plus d\'options"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Déverrouillez votre appareil pour obtenir plus d\'options"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Enregistrement capture écran…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement de la capture d\'écran…"</string> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"S\'affiche en haut de la section des conversations, apparaît sous forme de bulle flottante, affiche la photo de profil sur l\'écran de verrouillage"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les paramètres de conversation"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 59537e218582..ef8223059404 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Ampliar ata ocupar todo"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Estirar ata ocupar todo"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Facer captura"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloquea o teléfono para ver máis opcións"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloquea a tableta para ver máis opcións"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloquea o dispositivo para ver máis opcións"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou unha imaxe"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Gardando captura de pantalla…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gardando captura de pantalla…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstrase na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite opcións de configuración específicas para conversas"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Non hai burbullas recentes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"As burbullas recentes e ignoradas aparecerán aquí."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 28d55b7df177..cb1e26e44500 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"સ્ક્રીન ભરવા માટે ઝૂમ કરો"</string> <string name="compat_mode_off" msgid="7682459748279487945">"સ્ક્રીન ભરવા માટે ખેંચો"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"સ્ક્રીનશૉટ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"વધુ વિકલ્પો માટે તમારા ફોનને અનલૉક કરો"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"વધુ વિકલ્પો માટે તમારા ટૅબ્લેટને અનલૉક કરો"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"વધુ વિકલ્પો માટે તમારા ડિવાઇસને અનલૉક કરો"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"છબી મોકલી"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"એને વાતચીત વિભાગની ટોચ પર બતાવે છે, તરતા બબલ તરીકે દેખાય છે, લૉક સ્ક્રીન પર પ્રોફાઇલ ફોટા તરીકે બતાવે છે"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીત માટેના ચોક્કસ સેટિંગને સપોર્ટ કરતી નથી"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index ba84d090287f..5e4d8df089da 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"स्क्रीन भरने के लिए ज़ूम करें"</string> <string name="compat_mode_off" msgid="7682459748279487945">"स्क्रीन भरने के लिए खींचें"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रीनशॉट"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ज़्यादा विकल्प देखने के लिए, अपना फ़ोन अनलॉक करें"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ज़्यादा विकल्प देखने के लिए, अपना टैबलेट अनलॉक करें"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ज़्यादा विकल्प देखने के लिए, अपना डिवाइस अनलॉक करें"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"एक इमेज भेजी गई"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"स्क्रीनशॉट सहेजा जा रहा है..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रीनशॉट सहेजा जा रहा है..."</string> @@ -597,29 +594,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"चालू करें"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"बंद करें"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"आउटपुट डिवाइस बदलें"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ऐप्लिकेशन पिन किया गया है"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"इससे ऐप्लिकेशन की स्क्रीन तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं करते. अनपिन करने के लिए ऊपर स्वाइप करें और स्क्रीन दबाकर रखें."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'खास जानकारी\' को दबाकर रखें."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम बटन को दबाकर रखें."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"निजी डेटा ऐक्सेस किया जा सकता है. जैसे कि संपर्क और ईमेल का कॉन्टेंट."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"पिन किए गए ऐप्लिकेशन से दूसरे ऐप्लिकेशन भी खोले जा सकते हैं."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"इस ऐप्लिकेशन को अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' बटन को साथ-साथ दबाकर रखें"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"इस ऐप्लिकेशन को अनपिन करने के लिए, \'होम\' और \'वापस जाएं\' बटन को साथ-साथ दबाकर रखें"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"इस ऐप्लिकेशन को अनपिन करने के लिए, ऊपर की ओर स्वाइप करें और स्क्रीन को दबाकर रखें"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"ठीक है"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"नहीं, रहने दें"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ऐप्लिकेशन पिन किया गया"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ऐप्लिकेशन अनपिन किया गया"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> को छिपाएं?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"जब आप उसे अगली बार सेटिंग में चालू करेंगे तो वह फिर से दिखाई देगी."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"छिपाएं"</string> @@ -732,7 +721,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे बातचीत की सुविधा, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> में हर बातचीत के लिए अलग सेटिंग तय नहीं की जा सकती"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हाल ही के बबल्स मौजूद नहीं हैं"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 003f05c2ad84..46ed282f6c27 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zumiraj i ispuni zaslon"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Rastegni i ispuni zaslon"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snimka zaslona"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Za više opcija otključajte telefon"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Za više opcija otključajte tablet"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Za više opcija otključajte uređaj"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"šalje sliku"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Spremanje snimke zaslona..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Spremanje snimke zaslona..."</string> @@ -725,7 +722,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikazuje se pri vrhu odjeljka razgovora kao pomični oblačić i prikazuje profilnu sliku na zaključanom zaslonu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava postavke koje se odnose na razgovor"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Ovdje će se prikazivati nedavni i odbačeni oblačići"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 8e3a833289a3..924eed0835a0 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Nagyítás a kitöltéshez"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Nyújtás kitöltéshez"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Képernyőkép"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"További lehetőségekért oldja fel a telefont"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"További lehetőségekért oldja fel a táblagépet"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"További lehetőségekért oldja fel az eszközt"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"képet küldött"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Képernyőkép mentése..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Képernyőkép mentése..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"A beszélgetések szakaszának tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string> - <string name="no_shortcut" msgid="7176375126961212514">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás nem támogatja a beszélgetésspecifikus beállításokat"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nincsenek buborékok a közelmúltból"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"A legutóbbi és az elvetett buborékok itt jelennek majd meg"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index dc84c41e7246..640f6cfb31c6 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Խոշորացնել` էկրանը լցնելու համար"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ձգել` էկրանը լցնելու համար"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Սքրինշոթ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Ապակողպեք ձեր հեռախոսը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Ապակողպեք ձեր պլանշետը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Ապակողպեք ձեր սարքը՝ լրացուցիչ կարգավորումները տեսնելու համար"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"պատկեր է ուղարկվել"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Սքրինշոթը պահվում է…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Սքրինշոթը պահվում է..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"միացնել"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"անջատել"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Փոխել արտածման սարքը"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Հավելվածն ամրացված է"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Հետ և Համատեսք կոճակները:"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Էկրանը կցուցադրվի այնքան ժամանակ, մինչև չապամրացնեք այն: Ապամրացնելու համար հպեք և պահեք «Հետ» և «Գլխավոր էկրան» կոճակները"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Էկրանը կցուցադրվի այնքան ժամանակ, մինչև որ չապամրացնեք այն: Ապամրացնելու համար մատը սահեցրեք վեր և պահեք։"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Համատեսք կոճակը:"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Էկրանը կցուցադրվի այնքան ժամանակ, մինչև որ չապամրացնեք այն: Ապամրացնելու համար հպեք և պահեք գլխավոր էկրանի կոճակը:"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Ձեր անձնական տվյալները (օր․՝ կոնտակտները և նամակների բովանդակությունը) կարող են հասանելի դառնալ։"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Ամրացված հավելվածը կարող է այլ հավելվածներ գործարկել։"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Հավելվածն ապամրացնելու համար հպեք և պահեք «Հետ» և «Համատեսք» կոճակները"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Հավելվածն ապամրացնելու համար հպեք և պահեք «Հետ» և «Գլխավոր էկրան» կոճակները"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Հավելվածն ապամրացնելու համար մատը սահեցրեք վերև և պահեք"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Եղավ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Ոչ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Հավելվածն ամրացվեց"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Հավելվածն ապամրացվեց"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Թաքցնե՞լ <xliff:g id="TILE_LABEL">%1$s</xliff:g>-ը:"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Այն դարձյալ կհայտնվի, երբ նորից միացնեք կարգավորումներում:"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Թաքցնել"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ցուցադրվում է զրույցների ցանկի վերևում, հայտնվում է լողացող ամպիկի տեսքով, ցուցադրում է պրոֆիլի նկարը կողպէկրանին"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը չի աջակցում զրույցի կարգավորումները"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Վերջին ամպիկներ չկան"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index afb96b3b520b..c101829211f6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Perbesar utk mengisi layar"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Rentangkn utk mngisi layar"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Buka kunci ponsel untuk melihat opsi lainnya"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Buka kunci tablet untuk opsi lainnya"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Buka kunci perangkat untuk melihat opsi lainnya"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"mengirim gambar"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Menyimpan screenshot..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan screenshot..."</string> @@ -604,7 +601,7 @@ <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Data pribadi dapat diakses (seperti kontak dan konten email)."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Aplikasi yang dipasangi pin dapat membuka aplikasi lain."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Ringkasan"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Untuk melepas pin layar ini, sentuh & lama tombol Kembali dan Layar utama"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Layar utama"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Untuk melepas pin aplikasi ini, geser ke atas & tahan"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Mengerti"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Lain kali"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Muncul di atas bagian percakapan, ditampilkan sebagai balon yang mengambang, menampilkan gambar profil di layar kunci"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setelan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung setelan khusus percakapan"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tidak ada balon baru-baru ini"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Balon yang baru dipakai dan balon yang telah ditutup akan muncul di sini"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 66db202feed5..29c145f0d635 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Fylla skjá með aðdrætti"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Teygja yfir allan skjáinn"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjámynd"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Taktu símann úr lás til að fá fleiri valkosti"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Taktu spjaldtölvuna úr lás til að fá fleiri valkosti"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Taktu tækið úr lás til að fá fleiri valkosti"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendi mynd"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Vistar skjámynd…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Vistar skjámynd…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Birtist efst í samtalshluta, birtist sem fljótandi blaðra, birtir prófílmynd á lásskjánum"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki stillingar fyrir einstök samtöl"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Engar nýlegar blöðrur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nýlegar blöðrur og blöðrur sem þú hefur lokað birtast hér"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 629b850b799e..ff1fb6794b59 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom per riempire schermo"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Estendi per riemp. schermo"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Sblocca il telefono per visualizzare altre opzioni"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Sblocca il tablet per visualizzare altre opzioni"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Sblocca il dispositivo per visualizzare altre opzioni"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"è stata inviata un\'immagine"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Salvataggio screenshot..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvataggio screenshot..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Viene mostrata in cima alla sezione delle conversazioni, appare sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta impostazioni specifiche per le conversazioni"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nessuna bolla recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Le bolle recenti e ignorate verranno visualizzate qui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 566baf143760..20006e5ed618 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"הגדל תצוגה כדי למלא את המסך"</string> <string name="compat_mode_off" msgid="7682459748279487945">"מתח כדי למלא את המסך"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"צילום מסך"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"לאפשרויות נוספות, יש לבטל את נעילת הטלפון"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"לאפשרויות נוספות, יש לבטל את נעילת הטאבלט"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"לאפשרויות נוספות, יש לבטל את נעילת המכשיר"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"נשלחה תמונה"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"שומר צילום מסך..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"שומר צילום מסך..."</string> @@ -601,29 +598,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"הפעלה"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"השבתה"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"החלפת מכשיר פלט"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"האפליקציה מוצמדת"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'סקירה\' כדי לבטל את ההצמדה."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\' כדי לבטל את ההצמדה."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"נשאר בתצוגה עד לביטול ההצמדה. יש להחליק למעלה ולהחזיק כדי לבטל הצמדה."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצן \'סקירה\' כדי לבטל את ההצמדה."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצן \'דף הבית\' כדי לבטל את ההצמדה."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ייתכן שתתאפשר גישה למידע אישי (כמו אנשי קשר ותוכן מהאימייל)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"האפליקציה שהוצמדה עשויה לפתוח אפליקציות אחרות."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"כדי לבטל את ההצמדה של האפליקציה הזו, יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'סקירה\'"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"כדי לבטל את ההצמדה של האפליקציה הזו, יש ללחוץ לחיצה ארוכה על הלחצן \'הקודם\' והלחצן הראשי"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"לביטול ההצמדה של האפליקציה הזו, יש להחליק למעלה ולהחזיק"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"הבנתי"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"לא, תודה"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"האפליקציה הוצמדה"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"הצמדת האפליקציה בוטלה"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"להסתיר<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"הסתר"</string> @@ -736,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"מוצגת בחלק העליון של קטע התראות השיחה, מופיעה בבועה צפה, תוצג תמונת פרופיל במסך הנעילה"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string> <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string> - <string name="no_shortcut" msgid="7176375126961212514">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בהגדרות ספציפיות לשיחות"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"אין בועות מהזמן האחרון"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"בועות אחרונות ובועות שנסגרו יופיעו כאן"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 7567a224e863..1aa40327ee4e 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"画面サイズに合わせて拡大"</string> <string name="compat_mode_off" msgid="7682459748279487945">"画面サイズに合わせて拡大"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"スクリーンショット"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"スマートフォンのロックを解除してその他のオプションを表示する"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"タブレットのロックを解除してその他のオプションを表示する"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"デバイスのロックを解除してその他のオプションを表示する"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"画像を送信しました"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"スクリーンショットを保存中..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"スクリーンショットを保存しています..."</string> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"会話セクションの一番上にふきだしとして表示され、プロフィール写真がロック画面に表示されます"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先度"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> は会話専用の設定をサポートしていません"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近閉じたバブルはありません"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近表示されたバブルや閉じたバブルが、ここに表示されます"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string> @@ -759,7 +757,7 @@ <string name="notification_conversation_unfavorite" msgid="181383708304763807">"重要でない会話"</string> <string name="notification_conversation_mute" msgid="268951550222925548">"マナーモード"</string> <string name="notification_conversation_unmute" msgid="2692255619510896710">"アラートを受け取る"</string> - <string name="notification_conversation_bubble" msgid="2242180995373949022">"バブルを表示"</string> + <string name="notification_conversation_bubble" msgid="2242180995373949022">"バブルで表示"</string> <string name="notification_conversation_unbubble" msgid="6908427185031099868">"バブルを削除"</string> <string name="notification_conversation_home_screen" msgid="8347136037958438935">"ホーム画面に追加"</string> <string name="notification_menu_accessibility" msgid="8984166825879886773">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string> @@ -1014,7 +1012,7 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"左下に移動"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"右下に移動"</string> <string name="bubble_dismiss_text" msgid="7071770411580452911">"閉じる"</string> - <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"会話をバブルにしない"</string> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"会話をバブルで表示しない"</string> <string name="bubbles_user_education_title" msgid="5547017089271445797">"チャットでのバブルの使用"</string> <string name="bubbles_user_education_description" msgid="1160281719576715211">"新しい会話はフローティング アイコン(バブル)として表示されます。タップするとバブルが開きます。ドラッグしてバブルを移動できます。"</string> <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"いつでもバブルを管理"</string> @@ -1024,7 +1022,7 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"システム ナビゲーションを更新しました。変更するには [設定] に移動してください。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"システム ナビゲーションを更新するには [設定] に移動してください"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"会話セクションの一番上にバブル表示"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"会話セクションの一番上にバブルで表示"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ロック画面にプロフィール写真を表示"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"他のアプリに重ねてフローティング バブルとして表示"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"サイレント モードに割り込み"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 4def42554e11..e8795eeffa17 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"მასშტაბი შეცვალეთ ეკრანის შესავსებად."</string> <string name="compat_mode_off" msgid="7682459748279487945">"გაწიეთ ეკრანის შესავსებად."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ეკრანის ანაბეჭდი"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი ტელეფონი"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი ტაბლეტი"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"მეტი ვარიანტის სანახავად განბლოკეთ თქვენი მოწყობილობა"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"გაიგზავნა სურათი"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"სკრინშოტის შენახვა…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ეკრანის სურათის შენახვა…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ჩართვა"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"გამორთვა"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"გამოტანის მოწყობილობის გადართვა"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"აპი ჩამაგრებულია"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან და მიმოხილვა“-ს."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან მთავარ გვერდზე“-ს."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. აუსვით ზემოთ და დააყოვნეთ ჩამაგრების მოსახსნელად."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მიმოხილვა“-ს."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მთავარ გვერდს“."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"შეიძლება მისაწვდომი გახდეს პერსონალური მონაცემები (მაგალითად, კონტაქტები და ელფოსტის კონტენტი)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"ჩამაგრებულმა აპმა შეიძლება სხვა აპები გახსნას."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"ამ აპის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მიმოხილვა“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ამ აპის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მთავარი გვერდი“"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ამ აპის ჩამაგრების მოსახსნელად გადაფურცლეთ ზემოთ და არ აუშვათ"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"გასაგებია"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"არა, გმადლობთ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"აპი ჩამაგრდა"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"აპის ჩამაგრება გაუქმდა"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"დაიმალოს <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"ის კვლავ გამოჩნდება, როდესაც პარამეტრებში ჩართავთ"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"დამალვა"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების სექციის ზედა ნაწილში მოლივლივე ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string> <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს სპეციალურად მიმოწერისთვის განკუთვნილი პარამეტრების მხარდაჭერა"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ბოლო დროს გამოყენებული ბუშტები არ არის"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"აქ გამოჩნდება ბოლოდროინდელი ბუშტები და უარყოფილი ბუშტები"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b7b1ac49b467..27308e84def0 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Экранды толтыру үшін ұлғайту"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Экранды толтыру үшін созу"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Басқа опцияларды көру үшін телефон құлпын ашыңыз."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Басқа опцияларды көру үшін планшет құлпын ашыңыз."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Басқа опцияларды көру үшін құрылғы құлпын ашыңыз."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"сурет жіберілді"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Скриншотты сақтауда…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншотты сақтауда…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"қосу"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өшіру"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Шығыс құрылғыны ауыстыру"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Қолданба бекітілді"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Шолу\" түймелерін басып тұрыңыз."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Экран босатылғанға дейін көрсетіліп тұрады. Экранды босату үшін жоғары сырғытып, ұстап тұрыңыз."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Кері\" түймесін басып тұрыңыз."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Негізгі бет\" түймесін түртіп, ұстап тұрыңыз."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Жеке деректер (мысалы, байланыс ақпараты және электрондық пошта мазмұны) ашық болуы мүмкін."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Бекітілген қолданба басқа қолданбаларды ашуы мүмкін."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Бұл қолданбаны босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Бұл қолданбаны босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Бұл қолданбасы босату үшін жоғары сырғытып, ұстап тұрыңыз."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Түсінікті"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Жоқ, рақмет"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Қолданба бекітілді."</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Қолданба босатылды."</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жасыру керек пе?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Ол сіз оны параметрлерде келесі қосқанда қайта пайда болады."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Жасыру"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Әңгімелер бөлімінің жоғарғы жағында тұрады, қалқыма хабар түрінде шығады, құлыптаулы экранда профиль суретін көрсетеді"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маңыздылығы"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасында чаттың арнайы параметрлеріне қолдау көрсетілмейді."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқыма хабарлар жоқ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Жақында ашылған және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 15a022b4103b..3d6cfa16366e 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ពង្រីកដើម្បីឲ្យពេញអេក្រង់"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ទាញដើម្បីឲ្យពេញអេក្រង់"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"រូបថតអេក្រង់"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ដោះសោទូរសព្ទរបស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ដោះសោថេប្លេតរបស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ដោះសោឧបករណ៍របស់អ្នកសម្រាប់ជម្រើសច្រើនទៀត"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"បានផ្ញើរូបភាព"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"កំពុងរក្សាទុករូបថតអេក្រង់…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"បើក"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"បិទ"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"ប្ដូរឧបករណ៍បញ្ចេញសំឡេង"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"កម្មវិធីត្រូវបានខ្ទាស់"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ អូសឡើងលើឱ្យជាប់ ដើម្បីដកការដៅ។"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"អាចចូលប្រើទិន្នន័យផ្ទាល់ខ្លួនបាន (ដូចជា ទំនាក់ទំនង និងខ្លឹមសារអ៊ីមែលជាដើម)។"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"កម្មវិធីដែលបានខ្ទាស់អាចបើកកម្មវិធីផ្សេងទៀតបាន។"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"ដើម្បីដកខ្ទាស់កម្មវិធីនេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឱ្យជាប់"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ដើម្បីដកខ្ទាស់កម្មវិធីនេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ដើម្បីដកខ្ទាស់កម្មវិធីនេះ សូមអូសឡើងលើឱ្យជាប់"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"យល់ហើយ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"ទេ អរគុណ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"បានខ្ទាស់កម្មវិធី"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"បានដកខ្ទាស់កម្មវិធី"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"លាក់ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"វានឹងបង្ហាញពេលក្រោយ ពេលដែលអ្នកបើកក្នុងការកំណត់។"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"លាក់"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"បង្ហាញនៅខាងលើផ្នែកសន្ទនា បង្ហាញជាពពុះអណ្ដែត បង្ហាញរូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ការកំណត់"</string> <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនអាចប្រើការកំណត់ជាក់លាក់ចំពោះការសន្ទនាបានទេ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"មិនមានពពុះថ្មីៗទេ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ពពុះថ្មីៗ និងពពុះដែលបានបិទនឹងបង្ហាញនៅទីនេះ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 7d77fc144680..b21d50394a32 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ಪರದೆ ತುಂಬಿಸಲು ಝೂಮ್ ಮಾಡು"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ಪರದೆ ತುಂಬಿಸಲು ವಿಸ್ತಾರಗೊಳಿಸು"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಉಳಿಸಲಾಗುತ್ತಿದೆ…"</string> @@ -252,7 +249,7 @@ <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS ಸಕ್ರಿಯವಾಗಿದೆ."</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"GPS ಸ್ವಾಧೀನ."</string> <string name="accessibility_tty_enabled" msgid="1123180388823381118">"ಟೆಲಿಟೈಪ್ರೈಟರ್ ಸಕ್ರಿಯವಾಗಿದೆ."</string> - <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"ರಿಂಗರ್ ಕಂಪನ."</string> + <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"ರಿಂಗರ್ ವೈಬ್ರೇಟ್."</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"ರಿಂಗರ್ ಶಾಂತ."</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> <skip /> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಭಾಗದಲ್ಲಿ ತೇಲುವ ಬಬಲ್ ಆಗಿ ಗೋಚರಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಲಾಕ್ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುತ್ತದೆ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಸಂಭಾಷಣೆ ನಿರ್ದಿಷ್ಟ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index a015afee2faa..91c58b03693f 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"전체화면 모드로 확대"</string> <string name="compat_mode_off" msgid="7682459748279487945">"전체화면 모드로 확대"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"스크린샷"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"더 많은 옵션을 확인하려면 휴대전화를 잠금 해제하세요."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"더 많은 옵션을 확인하려면 태블릿을 잠금 해제하세요."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"더 많은 옵션을 확인하려면 기기를 잠금 해제하세요."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"이미지 보냄"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"캡쳐화면 저장 중..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"캡쳐화면 저장 중..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"사용"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"사용 중지"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"출력 기기 전환"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"앱 고정됨"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 최근 사용을 길게 터치하세요."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 홈을 길게 터치하세요."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 위로 스와이프한 다음 탭한 상태를 유지하세요."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 최근 사용을 길게 터치하세요."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 홈을 길게 터치하세요."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"개인 정보가 표시될 수 있습니다(연락처, 이메일 내용 등)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"고정된 앱을 통해 다른 앱이 열릴 수 있습니다."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"이 앱을 고정 해제하려면 뒤로 및 최근 사용 버튼을 길게 터치하세요."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"이 앱을 고정 해제하려면 뒤로 및 홈 버튼을 길게 터치하세요."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"이 앱을 고정 해제하려면 위로 스와이프하고 유지하세요."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"확인"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"거부"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"앱 고정됨"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"앱 고정 해제됨"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>을(를) 숨기시겠습니까?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"다음번에 설정에서 사용 설정하면 다시 표시됩니다."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"숨기기"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단의 플로팅 대화창 또는 잠금 화면의 프로필 사진으로 표시됩니다."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string> <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서는 대화 관련 설정을 지원하지 않습니다."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"최근에 닫은 대화창 없음"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"최근 대화창과 내가 닫은 대화창이 여기에 표시됩니다."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index fbf3dc05fc7b..1b046764f4a0 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Экрнд тлтр ү. чен өлч өзг"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Экранды толтуруу ү-н чоюу"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Дагы башка параметрлерди көрүү үчүн телефонуңуздун кулпусун ачыңыз"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Дагы башка параметрлерди көрүү үчүн планшетиңиздин кулпусун ачыңыз"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Дагы башка параметрлерди көрүү үчүн түзмөгүңүздүн кулпусун ачыңыз"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"сүрөт жөнөттү"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Скриншот сакталууда…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншот сакталууда..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"иштетүү"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"өчүрүү"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Аудио түзмөктү которуштуруу"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Колдонмо кадалды"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Карап чыгуу\" баскычтарын басып, кармап туруңуз."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн өйдө сүрүп, коё бербей басып туруңуз."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Карап чыгуу\" баскычын басып, кармап туруңуз."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Башкы бет\" баскычын басып, кармап туруңуз."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Байланыштар жана электрондук почталардын мазмуну сыяктуу жеке дайындар ачык болушу мүмкүн."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Кадалган колдонмо башка колдонмолорду ача алат."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Бул колдонмону бошотуу үчүн \"Артка\" жана \"Назар салуу\" баскычтарын басып, кармап туруңуз"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Бул колдонмону бошотуу үчүн \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Бул колдонмону бошотуу үчүн аны өйдө сүрүп, кармап туруңуз"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Түшүндүм"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Жок, рахмат"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Колдонмо кадалды"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Кадалган колдонмо бошотулду"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жашырылсынбы?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Бул кийинки жолу жөндөөлөрдөн күйгүзүлгөндө кайра көрүнөт."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Жашыруу"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуу бөлүмүнүн жогорку жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунда жазышууга болбойт"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Акыркы калкып чыкма билдирмелер жок"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Кайра жөнөтүлгөн жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index a59716c4be06..62649f5550bd 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ຊູມໃຫ້ເຕັມໜ້າຈໍ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ປັບໃຫ້ເຕັມໜ້າຈໍ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ພາບໜ້າຈໍ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ປົດລັອກໂທລະສັບຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ປົດລັອກແທັບເລັດຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ປົດລັອກອຸປະກອນຂອງທ່ານເພື່ອໃຊ້ຕົວເລືອກເພີ່ມເຕີມ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ສົ່ງຮູບແລ້ວ"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ກຳລັງບັນທຶກຮູບໜ້າຈໍ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ກຳລັງບັນທຶກພາບໜ້າຈໍ..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ສະແດງຢູ່ເທິງສຸດຂອງພາກສ່ວນການສົນທະນາ, ປາກົດເປັນ bubble ແບບລອຍ, ສະແດງຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ຕັ້ງຄ່າ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ຮອງຮັບການຕັ້ງຄ່າສະເພາະຂອງການສົນທະນາ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ບໍ່ມີຟອງຫຼ້າສຸດ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ຟອງຫຼ້າສຸດ ແລະ ຟອງທີ່ປິດໄປຈະປາກົດຢູ່ບ່ອນນີ້"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 1c51b8662fa3..589b011a4651 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Keisti mast., kad atit. ekr."</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ištempti, kad atit. ekr."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekrano kopija"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Atrakinkite telefoną, kad galėtumėte naudoti daugiau parinkčių"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Atrakinkite planšetinį kompiuterį, kad galėtumėte naudoti daugiau parinkčių"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Atrakinkite įrenginį, kad galėtumėte naudoti daugiau parinkčių"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"išsiuntė vaizdą"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Išsaugoma ekrano kopija..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Išsaugoma ekrano kopija..."</string> @@ -601,29 +598,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"įgalinti"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"išjungti"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Perjungti išvesties įrenginį"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Programa prisegta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Tai bus rodoma, kol atsegsite. Perbraukite aukštyn ir palaikykite, kad atsegtumėte."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Apžvalga“, kad atsegtumėte."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Pagrindinis ekranas“, kad atsegtumėte."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Gali būti pasiekiami asmens duomenys (pvz., kontaktai ir el. pašto turinys)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Prisegta programa gali atidaryti kitas programas."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Kad atsegtumėte šią programą, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Kad atsegtumėte šią programą, palieskite ir palaikykite mygtuką „Atgal“ ir pagrindinio ekrano mygtuką"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Kad atsegtumėte šią programą, perbraukite aukštyn ir palaikykite"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Supratau"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Ne, ačiū"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Programa prisegta"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Programa atsegta"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Slėpti „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Tai bus vėl parodyta, kai kitą kartą įjungsite tai nustatymuose."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Slėpti"</string> @@ -736,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Rodoma pokalbių skilties viršuje, rodoma kaip slankusis burbulas, pateikiama profilio nuotrauka užrakinimo ekrane"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetas"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko konkrečių pokalbių nustatymų"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nėra naujausių burbulų"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Naujausi ir atsisakyti burbulus bus rodomi čia"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index db20f065820b..c3d461975eaa 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Tālumm., lai aizp. ekr."</string> <string name="compat_mode_off" msgid="7682459748279487945">"Stiepiet, lai aizp. ekr."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekrānuzņēmums"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Atbloķējiet tālruni, lai skatītu citas opcijas."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Atbloķējiet planšetdatoru, lai skatītu citas opcijas."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Atbloķējiet ierīci, lai skatītu citas opcijas."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"nosūtīts attēls"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Saglabā ekrānuzņēmumu…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Notiek ekrānuzņēmuma saglabāšana..."</string> @@ -725,7 +722,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstīti atsevišķu sarunu iestatījumi."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nav nesen aizvērtu burbuļu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index a897a8f492e3..96266805d127 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Зумирај да се исполни екранот"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Растегни да се исполни екранот"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Слика од екранот"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Отклучето го вашиот телефон за повеќе опции"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Отклучето го вашиот таблет за повеќе опции"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Отклучето го вашиот уред за повеќе опции"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"испрати слика"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Сликата на екранот се зачувува..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Сликата на екранот се зачувува..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"овозможи"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"оневозможи"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Префрлете го излезниот уред"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Апликацијата е прикачена"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Назад“ и „Почетен екран“ за откачување."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Ќе се гледа сѐ додека не го откачите. Лизгајте нагоре и задржете за откачување."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Краток преглед“ за откачување."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Почетен екран“ за откачување."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Личните податоци може да се пристапни (како контакти и содржини од е-пошта)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Прикачените апликации може да отворат други апликации."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"За откачување на апликацијава, допрете и држете на копчињата „Назад“ и „Преглед“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"За откачување на апликацијава, допрете и држете на копчињата „Назад“ и „Почетен екран“"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"За откачување на апликацијава, повлечете нагоре и држете"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Сфатив"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Не, фала"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Апликацијата е прикачена"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Апликацијата е откачена"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Сокриј <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Ќе се појави повторно следниот пат кога ќе го вклучите во поставки."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Сокриј"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Се појавува на горниот дел од секцијата на разговорот во вид на лебдечко меурче, покажувајќи ја профилната слика на заклучениот екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува поставки поврзани со разговорите"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема неодамнешни балончиња"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Неодамнешните и отфрлените балончиња ќе се појавуваат тука"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 43fc1bb0e514..4ac0d4f6e508 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"സ്ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക"</string> <string name="compat_mode_off" msgid="7682459748279487945">"സ്ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"സ്ക്രീൻഷോട്ട്"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ഫോൺ അൺലോക്ക് ചെയ്യുക"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യുക"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് നിങ്ങളുടെ ഉപകരണം അൺലോക്ക് ചെയ്യുക"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ചിത്രം അയച്ചു"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string> <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string> - <string name="no_shortcut" msgid="7176375126961212514">"സംഭാഷണ നിർദ്ദിഷ്ട ക്രമീകരണം <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്ക്കുന്നില്ല"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"അടുത്തിടെയുള്ള ബബിളുകൾ, ഡിസ്മിസ് ചെയ്ത ബബിളുകൾ എന്നിവ ഇവിടെ ദൃശ്യമാവും"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 6d4c8c650ca6..fa8b1a5fd26e 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Дэлгэц дүүргэх бол өсгөнө үү"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Дэлгэц дүүргэх бол татна уу"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Дэлгэцийн зураг дарах"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Бусад сонголтыг харахын тулд утасныхаа түгжээг тайлна уу"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Бусад сонголтыг харахын тулд таблетынхаа түгжээг тайлна уу"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Бусад сонголтыг харахын тулд төхөөрөмжийнхөө түгжээг тайлна уу"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"зураг илгээсэн"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Дэлгэцийн агшинг хадгалж байна…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Дэлгэцийн агшинг хадгалж байна…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"идэвхжүүлэх"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"идэвхгүй болгох"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Гаралтын төхөөрөмжийг солих"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Аппыг бэхэлсэн"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулна. Тогтоосныг болиулахын тулд Буцах, Тоймыг дараад хүлээнэ үү."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Та тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд дээш удаан шударна уу."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Таныг тогтоосныг болиулах хүртэл харагдах болно. Тогтоосныг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Хувийн мэдээлэлд хандах боломжтой байж магадгүй (харилцагчид, имэйлийн контент зэрэг)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Тогтоосон апп бусад аппыг нээж магадгүй."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Энэ аппыг тогтоосныг болиулахын тулд Буцах, Тойм товчлуурыг дараад хүлээнэ үү"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Энэ аппыг тогтоосныг болиулахын тулд Буцах, Нүүр хуудасны товчлуурыг дараад хүлээнэ үү"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Энэ аппыг тогтоосныг болиулахын тулд дээш шудраад хүлээнэ үү"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Ойлголоо"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Үгүй"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Аппыг бэхэлсэн"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Аппыг тогтоосныг болиулсан"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>-ийг нуух уу?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Тохируулгын хэсэгт үүнийг асаахад энэ дахин харагдана."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Нуух"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Харилцан ярианы хэсгийн дээд талд хөвж буй бөмбөлөг хэлбэрээр харагдах бөгөөд профайлын зургийг түгжигдсэн дэлгэцэд үзүүлнэ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Тохиргоо"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Ач холбогдол"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> харилцан ярианы тодорхой тохиргоог дэмждэггүй"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Саяхны бөмбөлөг алга байна"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Саяхны бөмбөлгүүд болон үл хэрэгссэн бөмбөлгүүд энд харагдана"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 12acadeb1d61..0a8360bb2b7e 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"स्क्रीन भरण्यासाठी झूम करा"</string> <string name="compat_mode_off" msgid="7682459748279487945">"स्क्रीन भरण्यासाठी ताणा"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रीनशॉट"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"आणखी पर्यायांसाठी तुमचा फोन अनलॉक करा"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"आणखी पर्यायांसाठी तुमचा टॅबलेट अनलॉक करा"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"आणखी पर्यायांसाठी तुमचे डिव्हाइस अनलॉक करा"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"इमेज पाठवली आहे"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"स्क्रीनशॉट सेव्ह करत आहे…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रीनशॉट सेव्ह करत आहे…"</string> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"संभाषण विभागात सर्वात वरती फ्लोटिंग बबल म्हणून दिसते, लॉक स्क्रीनवर प्रोफाइल पिक्चर दाखवते"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> संभाषण विशिष्ट सेटिंग्जना सपोर्ट करत नाही"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 63b6f1cb4b79..ef8198a3f378 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zum untuk memenuhi skrin"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Regang utk memenuhi skrin"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Tangkapan skrin"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Buka kunci telefon anda untuk mendapatkan lagi pilihan"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Buka kunci tablet anda untuk mendapatkan lagi pilihan"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Buka kunci peranti anda untuk mendapatkan lagi pilihan"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"menghantar imej"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Menyimpan tangkapan skrin..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan tangkapan skrin..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"dayakan"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"lumpuhkan"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Tukar peranti output"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Apl telah disemat"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Ikhtisar untuk menyahsemat."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Skrin Utama untuk menyahsemat."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Leret ke atas & tahan untuk menyahsemat."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Ikhtisar untuk menyahsemat."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Skrin Utama untuk menyahsemat."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Data peribadi mungkin boleh diakses (seperti kenalan dan kandungan e-mel)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Apl yang disematkan boleh membuka aplikasi lain."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Untuk menyahsemat apl ini, sentuh & tahan butang Kembali dan Ikhtisar"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Untuk menyahsemat apl ini, sentuh & tahan butang Kembali dan Skrin Utama"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Untuk menyahsemat apl ini, leret ke atas & tahan"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Faham"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Tidak"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Apl disemat"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Apl dinyahsemat"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Mesej itu akan terpapar semula pada kali seterusnya anda menghidupkan apl dalam tetapan."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Sembunyikan"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Ditunjukkan di sebelah atas bahagian perbualan, muncul sebagai gelembung terapung, memaparkan gambar profil pada skrin kunci"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong tetapan khusus perbualan"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tiada gelembung terbaharu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 991e774ac4c2..96c35781204e 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -42,7 +42,7 @@ <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"AUTO"</string> - <string name="status_bar_settings_notifications" msgid="5285316949980621438">"သတိပေးချက်များ"</string> + <string name="status_bar_settings_notifications" msgid="5285316949980621438">"အကြောင်းကြားချက်များ"</string> <string name="bluetooth_tethered" msgid="4171071193052799041">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"ထည့်သွင်းနည်းများ သတ်မှတ်ခြင်း"</string> <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"ခလုတ်ပါဝင်သော ကီးဘုတ်"</string> @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ဇူးမ်အပြည့်ဆွဲခြင်း"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ဖန်သားပြင်ဓာတ်ပုံ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်ဖုန်းကို လော့ခ်ဖွင့်ပါ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်တက်ဘလက်ကို လော့ခ်ဖွင့်ပါ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"နောက်ထပ် ထိန်းချုပ်မှုများအတွက် သင့်စက်ကို လော့ခ်ဖွင့်ပါ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ပုံပို့ထားသည်"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ဖန်သားပြင်ဓါတ်ပုံသိမ်းစဉ်.."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string> @@ -595,7 +592,7 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ဖွင့်ရန်"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ပိတ်ရန်"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"အထွက် စက်ပစ္စည်းကို ပြောင်းပါ"</string> - <string name="screen_pinning_title" msgid="9058007390337841305">"အက်ပ်ကို ပင်ထိုးလိုက်သည်"</string> + <string name="screen_pinning_title" msgid="9058007390337841305">"အက်ပ်ကို ပင်ထိုးထားသည်"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"သင်က ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ။"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"သင်က ပင်မဖြုတ်မချင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ။"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"စကားဝိုင်းကဏ္ဍ၏ ထိပ်ပိုင်းတွင် ပြပြီး ပူဖောင်းကွက်အဖြစ် မြင်ရသည်၊ လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံကို ပြသည်"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ဆက်တင်များ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းအလိုက် ဆက်တင်များကို မပံ့ပိုးပါ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"လတ်တလော ပူဖောင်းကွက်များ မရှိပါ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များကို ဤနေရာတွင် မြင်ရပါမည်"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 22a7ff88cd55..241b6c383bb0 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom for å fylle skjermen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Strekk for å fylle skjerm"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjermdump"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Lås opp telefonen din for å få flere alternativer"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Lås opp nettbrettet ditt for å få flere alternativer"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Lås opp enheten din for å få flere alternativer"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har sendt et bilde"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Lagrer skjermdumpen …"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Lagrer skjermdumpen …"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"slå på"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"slå av"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Bytt enhet for lydutgang"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Appen er festet"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Startside for å løsne den."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"På denne måten blir skjermen synlig frem til du løsner den. Sveip opp og hold for å løsne."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Oversikt for å løsne den."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Startside for å løsne den."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Personlige data kan være tilgjengelige (for eksempel kontakter og e-postinnhold)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Den festede appen kan åpne andre apper."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"For å løsne denne appen, trykk og hold inne tilbakeknappen og oversiktsknappen"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"For å løsne denne appen, trykk og hold inne tilbakeknappen og hjemknappen"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"For å løsne denne appen, sveip opp og hold"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Skjønner"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nei takk"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Appen er festet"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Appen er løsnet"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Den vises igjen neste gang du slår den på i innstillingene."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Skjul"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtaledelen, vises som en flytende boble, viser profilbildet på låseskjermen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Innstillinger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalespesifikke innstillinger"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen nylige bobler"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nylige bobler og avviste bobler vises her"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8f703f9d0098..ccce091745b0 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"स्क्रिन भर्न जुम गर्नुहोस्"</string> <string name="compat_mode_off" msgid="7682459748279487945">"स्क्रिन भर्न तन्काउनुहोस्"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रिनसट"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"थप विकल्पहरू हेर्न आफ्नो फोन अनलक गर्नुहोस्"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"थप विकल्पहरू हेर्न आफ्नो ट्याब्लेट अनलक गर्नुहोस्"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"थप विकल्पहरू हेर्न आफ्नो यन्त्र अनलक गर्नुहोस्"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"कुनै छवि पठाइयो"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"स्क्रिनसट बचत गर्दै…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रिनसट बचत गर्दै…"</string> @@ -730,7 +727,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल तस्बिर देखाइन्छ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापविशेषका लागि सेटिङ उपलब्ध छैन"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालैका बबलहरू छैनन्"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index bcf9c6189482..3b70c39eb5f5 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom om scherm te vullen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Rek uit v. schermvulling"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Ontgrendel je telefoon voor meer opties"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Ontgrendel je tablet voor meer opties"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Ontgrendel je apparaat voor meer opties"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"heeft een afbeelding gestuurd"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Screenshot opslaan..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Screenshot opslaan..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wordt bovenaan het gedeelte met gesprekken weergegeven, verschijnt als zwevende bubbel, geeft de profielfoto weer op het vergrendelingsscherm"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksspecifieke instellingen"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen recente bubbels"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Recente bubbels en gesloten bubbels worden hier weergegeven"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 73c36907ed8e..cd24e358ba31 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ସ୍କ୍ରୀନ୍କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଫୋନ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଟାବଲେଟ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ଅଧିକ ବିକଳ୍ପ ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଅନଲକ୍ କରନ୍ତୁ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ଏକ ଛବି ପଠାଯାଇଛି"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ସକ୍ଷମ କରନ୍ତୁ"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ଅକ୍ଷମ କରନ୍ତୁ"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"ଆଉଟପୁଟ୍ ଡିଭାଇସ୍କୁ ଯାଆନ୍ତୁ"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ଆପକୁ ପିନ୍ କରାଯାଇଛି"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବାକୁ ସ୍ପର୍ଶ କରି ଧରିରଖନ୍ତୁ ଓ ଦେଖନ୍ତୁ।"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବା ପାଇଁ ହୋମ୍ ଓ ବ୍ୟାକ୍ ବଟନ୍କୁ ଧରିରଖନ୍ତୁ।"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"ଆପଣ ଅନ୍ପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଯାଉଥିବ। ଅନ୍ପିନ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବାକୁ ସ୍ପର୍ଶ କରନ୍ତୁ ଏବଂ ଓଭରଭ୍ୟୁକୁ ଧରିରଖନ୍ତୁ।"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"ଆପଣ ଅନପିନ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଦେଖାଉଥିବ। ଅନପିନ୍ କରିବା ପର୍ଯ୍ୟନ୍ତ ହୋମ୍କୁ ଦାବିଧରନ୍ତୁ।"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ଆକ୍ସେସ୍ କରାଯାଇପାରେ (ଯେପରିକି ଯୋଗାଯୋଗଗୁଡ଼ିକ ଏବଂ ଇମେଲ୍ ବିଷୟବସ୍ତୁ)।"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"ପିନ୍ କରାଯାଇଥିବା ଆପଟି ଅନ୍ୟ ଆପଗୁଡ଼ିକୁ ଖୋଲିପାରେ।"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"ଏହି ଆପକୁ ଅନପିନ୍ କରିବା ପାଇଁ, \"ବ୍ୟାକ୍\" ଏବଂ \"ଓଭରଭିଉ\" ବଟନକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ଏହି ଆପକୁ ଅନପିନ୍ କରିବାକୁ, \"ବ୍ୟାକ୍\" ଏବଂ \"ହୋମ୍\" ବଟନକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ଏହି ଆପକୁ ଅନପିନ୍ କରିବାକୁ, ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"ବୁଝିଗଲି"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"ନାହିଁ, ଥାଉ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ଆପ୍ ପିନ୍ କରାଯାଇଛି"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ଆପ୍ ଅନପିନ୍ କରାଯାଇଛି"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"ଲୁଚାନ୍ତୁ"</string> @@ -715,7 +704,7 @@ <string name="inline_minimize_button" msgid="1474436209299333445">"ଛୋଟ କରନ୍ତୁ"</string> <string name="inline_silent_button_silent" msgid="525243786649275816">"ନୀରବ"</string> <string name="inline_silent_button_stay_silent" msgid="2129254868305468743">"ନୀରବ ରହନ୍ତୁ"</string> - <string name="inline_silent_button_alert" msgid="5705343216858250354">"ଆଲର୍ଟ କରିବା"</string> + <string name="inline_silent_button_alert" msgid="5705343216858250354">"ଆଲର୍ଟିଂ"</string> <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"ବିଜ୍ଞପ୍ତି ବନ୍ଦ କରନ୍ତୁ"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"ଏହି ଆପ୍ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଭାସମାନ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ସମ୍ବନ୍ଧିତ ନିର୍ଦ୍ଦିଷ୍ଟ ସେଟିଂସକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> @@ -758,7 +748,7 @@ <string name="notification_conversation_favorite" msgid="1905240206975921907">"ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବାର୍ତ୍ତାଳାପ"</string> <string name="notification_conversation_unfavorite" msgid="181383708304763807">"କୌଣସି ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବାର୍ତ୍ତାଳାପ ନାହିଁ"</string> <string name="notification_conversation_mute" msgid="268951550222925548">"ନିରବ କରାଯାଇଛି"</string> - <string name="notification_conversation_unmute" msgid="2692255619510896710">"ଆଲର୍ଟ କରୁଛି"</string> + <string name="notification_conversation_unmute" msgid="2692255619510896710">"ଆଲର୍ଟିଂ"</string> <string name="notification_conversation_bubble" msgid="2242180995373949022">"ବବଲ୍ ଦେଖାନ୍ତୁ"</string> <string name="notification_conversation_unbubble" msgid="6908427185031099868">"ବବଲଗୁଡ଼ିକ କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="notification_conversation_home_screen" msgid="8347136037958438935">"ମୂଳ ସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 59009a1f94b0..22b1029ea26a 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਫ਼ੋਨ ਅਣਲਾਕ ਕਰੋ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਟੈਬਲੈੱਟ ਅਣਲਾਕ ਕਰੋ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਆਪਣਾ ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰੋ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ਚਿੱਤਰ ਭੇਜਿਆ ਗਿਆ"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ, ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਈ ਜਾਂਦੀ ਹੈ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਗੱਲਬਾਤ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ ਸੈਟਿੰਗਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 59fa13cad8f1..cea8ece68e94 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Powiększ, aby wypełnić ekran"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Rozciągnij, aby wypełnić ekran"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Zrzut ekranu"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Odblokuj telefon, by wyświetlić więcej opcji"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Odblokuj tablet, by wyświetlić więcej opcji"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Odblokuj urządzenie, by wyświetlić więcej opcji"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"wysłano obraz"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Zapisywanie zrzutu ekranu..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Zapisywanie zrzutu ekranu..."</string> @@ -601,29 +598,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"włącz"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"wyłącz"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Przełącz urządzenie wyjściowe"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacja jest przypięta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Wstecz oraz Ekran główny."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Ekran będzie widoczny, dopóki go nie odepniesz. Przesuń palcem w górę i przytrzymaj, by odpiąć."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Przegląd."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Ekran główny."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Dane osobowe mogą być dostępne (np. kontakty czy treść e-maili)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Przypięta aplikacja może otwierać inne aplikacje."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Aby odpiąć tę aplikację, naciśnij i przytrzymaj przyciski Wstecz oraz Przegląd"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Aby odpiąć tę aplikację, naciśnij i przytrzymaj przyciski Wstecz oraz Ekran główny"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Aby odpiąć tę aplikację, przesuń w górę i przytrzymaj"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nie, dziękuję"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Aplikacja przypięta"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Aplikacja odpięta"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Ukryć <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Pojawi się ponownie, gdy następnym włączysz go w ustawieniach."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ukryj"</string> @@ -736,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wyświetla się jako pływający dymek u góry sekcji rozmów, pokazuje zdjęcie profilowe na ekranie blokady"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje ustawień rozmowy"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tutaj będą pojawiać się ostatnie i odrzucone dymki"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index ef3770c4be73..00a33d26e173 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom p/ preencher a tela"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ampliar p/ preencher tela"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capturar tela"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloqueie seu smartphone para ver mais opções"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloqueie seu tablet para ver mais opções"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloqueie seu dispositivo para ver mais opções"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Salvando captura de tela..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com configurações específicas de conversa"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index e343c2f0bfcc..fadd23478789 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom para preencher o ecrã"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Esticar p. caber em ec. int."</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de ecrã"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloqueie o telemóvel para obter mais opções."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloqueie o tablet para obter mais opções."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloqueie o dispositivo para obter mais opções."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"A guardar captura de ecrã..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"A guardar captura de ecrã..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior da secção de conversas, surge como um balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <string name="no_shortcut" msgid="7176375126961212514">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta definições específicas de conversas."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e ignorados vão aparecer aqui."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index ef3770c4be73..00a33d26e173 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom p/ preencher a tela"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ampliar p/ preencher tela"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capturar tela"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Desbloqueie seu smartphone para ver mais opções"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Desbloqueie seu tablet para ver mais opções"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Desbloqueie seu dispositivo para ver mais opções"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Salvando captura de tela..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com configurações específicas de conversa"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index ef37cfe52002..0ee2593cbc5b 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zoom pt. a umple ecranul"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Înt. pt. a umple ecranul"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captură de ecran"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Deblocați telefonul pentru mai multe opțiuni"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Deblocați tableta pentru mai multe opțiuni"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Deblocați dispozitivul pentru mai multe opțiuni"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a trimis o imagine"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Se salv. captura de ecran..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Se salvează captura de ecran..."</string> @@ -598,29 +595,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activați"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"dezactivați"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Comutați dispozitivul de ieșire"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Aplicația este fixată"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Astfel rămâne afișat până anulați fixarea. Glisați în sus și țineți apăsat pentru a anula fixarea."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Pot fi accesate date cu caracter personal (cum ar fi agenda și conținutul e-mailurilor)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Aplicațiile fixate pot deschide alte aplicații."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Recente"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Pentru a anula fixarea acestei aplicații, atingeți lung butoanele Înapoi și Acasă"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Pentru a anula fixarea acestei aplicații, glisați în sus și mențineți"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Am înțeles"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Nu, mulțumesc"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Aplicație fixată"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Aplicație nefixată"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Ascundeți <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Va reapărea la următoarea activare în setări."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ascundeți"</string> @@ -733,7 +722,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se afișează în partea de sus a secțiunii de conversație, apare ca un balon flotant, afișează fotografia de profil pe ecranul de blocare"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Setări"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă setările pentru conversații"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nu există baloane recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Baloanele recente și baloanele respinse vor apărea aici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 6adc37939b8a..b7cb75a092c1 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Подогнать по размерам экрана"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Растянуть на весь экран"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Чтобы посмотреть дополнительные параметры, разблокируйте телефон."</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Чтобы посмотреть дополнительные параметры, разблокируйте планшет."</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Чтобы посмотреть дополнительные параметры, разблокируйте устройство."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"отправлено изображение"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Сохранение..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Сохранение..."</string> @@ -728,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, а также показывает фото профиля на заблокированном экране"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает настройки разговора."</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нет недавних всплывающих чатов"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Здесь будут появляться недавние и закрытые всплывающие чаты."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 2ace6ed664eb..3843754c2d7d 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"තිරය පිරවීමට විශාලනය කරන්න"</string> <string name="compat_mode_off" msgid="7682459748279487945">"තිරය පිරවීමට අදින්න"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"තිර රුව"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"තව විකල්ප සඳහා ඔබේ දුරකථනය අගුලු හරින්න"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"තව විකල්ප සඳහා ඔබේ ටැබ්ලට් පරිගණකය අගුලු හරින්න"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"තව විකල්ප සඳහා ඔබේ උපාංගය අගුලු හරින්න"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"රූපයක් එවන ලදී"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"තිර රුව සුරකිමින්…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"තිර රුව සුරැකෙමින් පවතී…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"සංවාද කොටසේ ඉහළම පෙන්වයි, බුබුළක් ලෙස දිස් වේ, අගුලු තිරයේ පැතිකඩ පින්තූරය සංදර්ශනය වේ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"සැකසීම්"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ප්රමුඛතාව"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> සංවාදය නිශ්චිත සැකසීම්වලට සහාය නොදක්වයි"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"මෑත බුබුලු නැත"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"මෑත බුබුලු සහ ඉවත ලූ බුබුලු මෙහි දිස් වනු ඇත"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index c5b615a04b40..20dd9006b3ee 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Priblížiť na celú obrazovku"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Na celú obrazovku"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímka obrazovky"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Odomknite svoj telefón pre ďalšie možnosti"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Odomknite svoj tablet pre ďalšie možnosti"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Odomknite svoje zariadenie pre ďalšie možnosti"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odoslal(a) obrázok"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Prebieha ukladanie snímky obrazovky..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Prebieha ukladanie snímky obrazovky..."</string> @@ -728,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Nájdete ju v hornej sekcii konverzácie ako plávajúcu bublinu a zobrazuje profilovú fotku na uzamknutej obrazovke"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje nastavenia konkrétnych konverzácií"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tu sa budú zobrazovať nedávne a zavreté bubliny"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index a3995ac4db24..42f1151d6a2c 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Povečava čez cel zaslon"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Raztegnitev čez zaslon"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Posnetek zaslona"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Za več možnosti odklenite telefon"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Za več možnosti odklenite tablični računalnik"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Za več možnosti odklenite napravo"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslal(-a) sliko"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Shranjev. posnetka zaslona ..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Shranjevanje posnetka zaslona ..."</string> @@ -601,29 +598,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"omogoči"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"onemogoči"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Izbira druge izhodne naprave"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Aplikacija je pripeta"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in pregled."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in za začetni zaslon."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, povlecite navzgor in pridržite."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za pregled."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za začetni zaslon."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Dostopni so lahko osebni podatki (na primer stiki in vsebina e-poštnih sporočil)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Pripeta aplikacija lahko odpre druge aplikacije."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Če želite odpeti to aplikacijo, hkrati pridržite gumba za nazaj in za pregled."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Če želite odpeti to aplikacijo, hkrati pridržite gumba za nazaj in za začetni zaslon."</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Če želite odpeti to aplikacijo, povlecite navzgor in pridržite."</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Razumem"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Ne, hvala"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Aplikacija je pripeta"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Aplikacija je odpeta"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Želite skriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Znova se bo pojavila, ko jo naslednjič vklopite v nastavitvah."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Skrij"</string> @@ -736,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Prikaz na vrhu razdelka s pogovorom in v plavajočem oblačku, prikaz profilne slike na zaklenjenem zaslonu"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prednost"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira posebnih nastavitev za pogovore"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ni nedavnih oblačkov"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tukaj bodo prikazani tako nedavni kot tudi opuščeni oblački"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 87c39d6f1447..b2d23c12fa65 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zmadho për të mbushur ekranin"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Shtrije për të mbushur ekranin"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pamja e ekranit"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Shkyçe telefonin për më shumë opsione"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Shkyçe tabletin për më shumë opsione"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Shkyçe pajisjen për më shumë opsione"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"dërgoi një imazh"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Po ruan pamjen e ekranit..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Po ruan pamjen e ekranit…"</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë pluskuese, shfaq fotografinë e profilit në ekranin e kyçjes"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk i mbështet cilësimet specifike të bisedës"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nuk ka flluska të fundit"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index ad4161017c17..070ca211b04a 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Зумирај на целом екрану"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Развуци на цео екран"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Снимак екрана"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Откључајте телефон за још опција"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Откључајте таблет за још опција"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Откључајте уређај за још опција"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"је послао/ла слику"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Чување снимка екрана..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Чување снимка екрана..."</string> @@ -725,7 +722,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Приказује се у врху одељка за конверзације као плутајући облачић, приказује слику профила на закључаном екрану"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Подешавања"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не подржава подешавања за конверзације"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема недавних облачића"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Овде се приказују недавни и одбачени облачићи"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 35fff9fd3f89..9eb2ead0725f 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Zooma för att fylla skärm"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Dra för att fylla skärmen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skärmdump"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Lås upp telefonen för fler alternativ"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Lås upp surfplattan för fler alternativ"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Lås upp enheten för fler alternativ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har skickat en bild"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Skärmdumpen sparas ..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skärmdumpen sparas ..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Visas högst upp bland konversationerna som en flytande bubbla, visar profilbilden på låsskärmen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsspecifika inställningar"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Inga nya bubblor"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"De senaste bubblorna och ignorerade bubblor visas här"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 47e208358168..8ebf50771dcf 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Kuza ili kujaza skrini"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Tanua ili kujaza skrini"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Picha ya skrini"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Fungua simu yako ili upate chaguo zaidi"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Fungua kompyuta yako kibao ili upate chaguo zaidi"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Fungua kifaa chako ili upate chaguo zaidi"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"imetuma picha"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Inahifadhi picha ya skrini..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Inahifadhi picha ya skrini..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"washa"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"zima"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Badilisha kifaa cha kutoa sauti"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Programu imebandikwa"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha kurudisha Nyuma na cha Mwanzo kwa pamoja ili ubandue."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Hali hii huifanya ionekane hadi utakapoibandua. Telezesha kidole juu na ushikilie ili uibandue."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Muhtasari ili ubandue."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha Mwanzo ili ubandue."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Data binafsi inaweza kufikiwa (kama vile maudhui ya barua pepe na anwani)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Programu iliyobandikwa inaweza kufungua programu zingine."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Ili ubandue programu hii, gusa na ushikilie kitufe cha Nyuma na Muhtasari"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Ili ubandue programu hii, gusa na ushikilie kitufe cha Nyuma na Ukurasa wa Mwanzo"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Ili ubandue programu hii, telezesha kidole juu na ushikilie"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Nimeelewa"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Hapana"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Programu imebandikwa"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Programu imebanduliwa"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Ungependa kuficha <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Itaonekana tena wakati mwingine utakapoiwasha katika mipangilio."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ficha"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Huonyeshwa kwenye sehemu ya juu ya mazungumzo, huonekana kama kiputo, huonyesha picha ya wasifu kwenye skrini iliyofungwa"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii mipangilio mahususi ya mazungumzo"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hakuna viputo vya hivi majuzi"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viputo vya hivi karibuni na vile vilivyoondolewa vitaonekana hapa"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string> diff --git a/packages/SystemUI/res/values-sw372dp/dimens.xml b/packages/SystemUI/res/values-sw372dp/dimens.xml index e64662ec7bea..d3fff0c059f9 100644 --- a/packages/SystemUI/res/values-sw372dp/dimens.xml +++ b/packages/SystemUI/res/values-sw372dp/dimens.xml @@ -17,5 +17,4 @@ --> <resources> <dimen name="nav_content_padding">8dp</dimen> - <dimen name="qs_header_tile_margin_horizontal">13dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 32c6792d7354..8824b9b346cc 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"திரையை நிரப்ப அளவை மாற்று"</string> <string name="compat_mode_off" msgid="7682459748279487945">"திரையை நிரப்ப இழு"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ஸ்கிரீன்ஷாட்"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"மேலும் விருப்பங்களுக்கு மொபைலை அன்லாக் செய்யவும்"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"மேலும் விருப்பங்களுக்கு டேப்லெட்டை அன்லாக் செய்யவும்"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"மேலும் விருப்பங்களுக்குச் சாதனத்தை அன்லாக் செய்யவும்"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"படம் அனுப்பப்பட்டது"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"இயக்கும்"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"முடக்கும்"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"வெளியீட்டுச் சாதனத்தை மாற்றுதல்"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ஆப்ஸ் பின் செய்யப்பட்டது"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"பின் செய்திருப்பதை அகற்றும் வரை இதைச் செயல்பாட்டில் வைத்திருக்கும். அதை அகற்றுவதற்கு மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முகப்புப் பொத்தானைத் தொட்டுப் பிடிக்கவும்."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"(தொடர்புகள், மின்னஞ்சலின் உள்ளடக்கம் போன்ற) தனிப்பட்ட தரவு அணுகப்படக்கூடும்."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"பின் செய்யப்பட்டிருக்கும் ஆப்ஸ் பிற ஆப்ஸைத் திறக்கக்கூடும்."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"இந்த ஆப்ஸை அகற்ற, பின்செல் மற்றும் மேலோட்டப் பார்வை பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"இந்த ஆப்ஸை அகற்ற, பின்செல் மற்றும் முகப்பு பட்டன்களைத் தொட்டுப் பிடித்திருக்கவும்"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"இந்த ஆப்ஸை அகற்ற, மேல்நோக்கி ஸ்வைப் செய்தவாறு பிடித்திருக்கவும்"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"புரிந்தது"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"வேண்டாம்"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ஆப்ஸ் பின் செய்யப்பட்டது"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ஆப்ஸ் அகற்றப்பட்டது"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"மறை"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"உரையாடல் பிரிவின் மேற்பகுதியில் மிதக்கும் குமிழாகத் தோன்றும். பூட்டுத் திரையின் மேல் சுயவிவரப் படத்தைக் காட்டும்"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string> <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string> - <string name="no_shortcut" msgid="7176375126961212514">"உரையாடல் சார்ந்த குறிப்பிட்ட அமைப்புகளை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"சமீபத்திய குமிழ்கள் இல்லை"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"சமீபத்திய குமிழ்களும் நிராகரிக்கப்பட்ட குமிழ்களும் இங்கே தோன்றும்"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 75f308affe0a..bc9519402db5 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"స్క్రీన్కు నింపేలా జూమ్ చేయండి"</string> <string name="compat_mode_off" msgid="7682459748279487945">"స్క్రీన్కు నింపేలా విస్తరించండి"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"స్క్రీన్షాట్"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"మరిన్ని ఆప్షన్ల కోసం మీ ఫోన్ను అన్లాక్ చేయండి"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"మరిన్ని ఆప్షన్ల కోసం మీ టాబ్లెట్ను అన్లాక్ చేయండి"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"మరిన్ని ఆప్షన్ల కోసం మీ పరికరాన్ని అన్లాక్ చేయండి"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ఇమేజ్ను పంపారు"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ప్రారంభించు"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"నిలిపివేయండి"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"పరికరం అవుట్పుట్ని మార్చండి"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"యాప్ పిన్ చేయబడి ఉంది"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు హోమ్ని తాకి & అలాగే పట్టుకోండి."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి, పైకి స్వైప్ చేసి & పట్టుకోండి."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి స్థూలదృష్టిని తాకి & అలాగే పట్టుకోండి."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి హోమ్ని తాకి & అలాగే పట్టుకోండి."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"వ్యక్తిగత డేటా (కాంటాక్ట్లు, ఇంకా ఇమెయిల్ కంటెంట్ లాంటివి) యాక్సెస్ చేయబడవచ్చు."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"పిన్ చేయబడిన యాప్ ఇతర యాప్లను తెరవవచ్చు."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"ఈ యాప్ను అన్పిన్ చేయడానికి, \'వెనుకకు\', \'ఓవర్వ్యూ\' బటన్లను తాకి & అలాగే పట్టుకోండి"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"ఈ యాప్ను అన్పిన్ చేయడానికి, వెనుకకు, హోమ్ బటన్లను తాకి & అలాగే పట్టుకోండి"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"ఈ యాప్ను అన్పిన్ చేయడానికి, పైకి స్వైప్ చేసి & అలాగే పట్టుకోండి"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"అర్థమైంది"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"వద్దు, ధన్యవాదాలు"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"యాప్ పిన్ చేయబడింది"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"యాప్ అన్పిన్ చేయబడింది"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ని దాచాలా?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"మీరు సెట్టింగ్ల్లో దీన్ని ఆన్ చేసిన తదుపరిసారి ఇది కనిపిస్తుంది."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"దాచు"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"సంభాషణ విభాగం ఎగువన ఉంటుంది, తేలుతున్న బబుల్లాగా కనిపిస్తుంది, లాక్ స్క్రీన్పై ప్రొఫైల్ ఫోటోను ప్రదర్శిస్తుంది"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్లు"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string> - <string name="no_shortcut" msgid="7176375126961212514">"\'సంభాషణ నిర్దిష్ట సెట్టింగ్\'లకు <xliff:g id="APP_NAME">%1$s</xliff:g> సపోర్ట్ చేయదు"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ఇటీవలి బబుల్స్, తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 37ac4dcd54ed..ae40e83d3985 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"ขยายจนเต็มหน้าจอ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ยืดจนเต็มหน้าจอ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ภาพหน้าจอ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"ปลดล็อกโทรศัพท์เพื่อดูตัวเลือกเพิ่มเติม"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"ปลดล็อกแท็บเล็ตเพื่อดูตัวเลือกเพิ่มเติม"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"ปลดล็อกอุปกรณ์เพื่อดูตัวเลือกเพิ่มเติม"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ส่งรูปภาพ"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"กำลังบันทึกภาพหน้าจอ..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"กำลังบันทึกภาพหน้าจอ..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"เปิดใช้"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"ปิดใช้"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"เปลี่ยนอุปกรณ์เอาต์พุต"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ตรึงแอปอยู่"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"วิธีนี้ช่วยให้เห็นหน้าจอตลอดจนกว่าจะเลิกตรึง เลื่อนขึ้นค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"อาจมีการเข้าถึงข้อมูลส่วนตัว (เช่น รายชื่อติดต่อและเนื้อหาในอีเมล)"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"แอปที่ตรึงไว้อาจเปิดแอปอื่นๆ"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"หากต้องการเลิกตรึงแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"หากต้องการเลิกตรึงแอปนี้ ให้แตะปุ่ม \"กลับ\" และ \"หน้าแรก\" ค้างไว้"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"หากต้องการเลิกตรึงแอปนี้ ให้เลื่อนขึ้นค้างไว้"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"รับทราบ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"ไม่เป็นไร ขอบคุณ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ตรึงแอปแล้ว"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"เลิกตรึงแอปแล้ว"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"ซ่อน <xliff:g id="TILE_LABEL">%1$s</xliff:g> ไหม"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"จะปรากฏอีกครั้งเมื่อคุณเปิดใช้ในการตั้งค่าครั้งถัดไป"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"ซ่อน"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"แสดงที่ด้านบนของส่วนการสนทนา ปรากฏเป็นบับเบิลแบบลอย แสดงรูปโปรไฟล์บนหน้าจอล็อก"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"การตั้งค่า"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ลำดับความสำคัญ"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่รองรับการตั้งค่าเฉพาะสำหรับการสนทนา"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 09199dda93ae..b7ff2b6d12ca 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"I-zoom upang punan screen"</string> <string name="compat_mode_off" msgid="7682459748279487945">"I-stretch upang mapuno screen"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"I-unlock ang iyong telepono para sa higit pang opsyon"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"I-unlock ang iyong tablet para sa higit pang opsyon"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"I-unlock ang iyong device para sa higit pang opsyon"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"nagpadala ng larawan"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Sine-save ang screenshot…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Sine-save ang screenshot…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"i-enable"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"i-disable"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Lumipat ng output device"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Naka-pin ang app"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Home upang mag-unpin."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Mag-swipe pataas at i-hold para i-unpin."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Overview upang mag-unpin."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Home upang mag-unpin."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Puwedeng ma-access ang personal na data (tulad ng mga contact at content ng email)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Puwedeng magbukas ng ibang app ang naka-pin na app."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Para i-unpin ang app na ito, pindutin nang matagal ang mga button na Bumalik at Overview"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para i-unpin ang app na ito, pindutin nang matagal ang mga button na Bumalik at Home"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para i-unpin ang app na ito, mag-swipe pataas at pumindot nang matagal"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Nakuha ko"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Hindi, salamat na lang"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Na-pin ang app"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Na-unpin ang app"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Itago ang <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Lalabas itong muli sa susunod na pagkakataon na i-on mo ito sa mga setting."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Itago"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Makikita sa itaas ng seksyon ng pag-uusap, lumalabas bilang floating bubble, ipinapakita sa lock screen ang larawan sa profile"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mga Setting"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga setting na partikular sa pag-uusap"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Walang kamakailang bubble"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Lalabas dito ang mga kamakailang bubble at na-dismiss na bubble"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 63f336b61a1b..4cf3bcf62d8a 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Yakınlaştır (ekranı kaplasın)"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Genişlet (ekran kapansın)"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekran görüntüsü"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Diğer seçenekler için telefonunuzun kilidini açın"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Diğer seçenekler için tabletinizin kilidini açın"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Diğer seçenekler için cihazınızın kilidini açın"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"bir resim gönderildi"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Ekran görüntüsü kaydediliyor..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ekran görüntüsü kaydediliyor..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"etkinleştir"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"devre dışı bırak"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Çıkış cihazını değiştir"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Uygulama sabitlenmiştir"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Ana sayfaya dokunup basılı tutun."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Bu, sabitleme kaldırılana kadar öğenin görünmesini sağlar. Sabitlemeyi kaldırmak için yukarı kaydırıp basılı tutun."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Genel bakış\'a dokunup basılı tutun."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Ana sayfaya dokunup basılı tutun."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Kişisel verilere erişilebilir (ör. kişiler ve e-posta içerikleri)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Sabitlenmiş uygulama diğer uygulamaları açabilir."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Bu uygulamanın sabitlemesini kaldırmak için Geri ve Genel Bakış düğmelerine dokunup basılı tutun"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Bu ekranın sabitlemesini kaldırmak için Geri ve Ana sayfa düğmelerine dokunup basılı tutun"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Bu ekranın sabitlemesini kaldırmak için hızlıca yukarı kaydırıp tutun"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Anladım"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Hayır, teşekkürler"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Uygulama sabitlendi"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Uygulamanın sabitlemesi kaldırıldı"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlensin mi?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Ayarlardan etkinleştirdiğiniz bir sonraki sefer tekrar görünür."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Gizle"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Görüşme bölümünün üstünde gösterilir, kayan baloncuk olarak görünür, kilit ekranında profil resmini görüntüler"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>, görüşmeye özgü ayarları desteklemiyor"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Son kapatılan baloncuk yok"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son baloncuklar ve kapattığınız baloncuklar burada görünür"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 0aa3f7a259ab..49e35d2e27d4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Масштабув. на весь екран"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Розтягнути на весь екран"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Знімок екрана"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Розблокуйте телефон, щоб переглянути інші параметри"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Розблокуйте планшет, щоб переглянути інші параметри"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Розблокуйте пристрій, щоб переглянути інші параметри"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"надіслане зображення"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Збереження знімка екрана..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Збереження знімка екрана..."</string> @@ -601,29 +598,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"увімкнути"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"вимкнути"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Увімкніть пристрій виведення"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Додаток закріплено"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\"."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Ви бачитимете цей екран, доки не відкріпите його. Для цього проведіть пальцем угору й утримуйте екран."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопку \"Огляд\"."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопку \"Головний екран\"."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Закріплений додаток може отримувати доступ до персональних даних (наприклад, до контактів або електронних листів)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Закріплений додаток може відкривати інші додатки."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Щоб відкріпити цей додаток, натисніть і утримуйте кнопки \"Назад\" та \"Огляд\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Щоб відкріпити цей додаток, натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\""</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Щоб відкріпити цей додаток, проведіть пальцем вгору й утримуйте його на екрані"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Зрозуміло"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Ні, дякую"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Додаток закріплено"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Додаток відкріплено"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Сховати <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"З’явиться знову, коли ви ввімкнете його в налаштуваннях."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Сховати"</string> @@ -736,7 +725,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"З\'являється вгорі розділу розмов у спливаючому сповіщенні та показує зображення профілю на заблокованому екрані"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує налаштування для чату"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Немає нещодавніх спливаючих чатів"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Тут з\'являтимуться нещодавні й закриті спливаючі чати"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 47eebc7e3fe2..fb91b52354be 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"پوری سکرین پر زوم کریں"</string> <string name="compat_mode_off" msgid="7682459748279487945">"پوری سکرین پر پھیلائیں"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"اسکرین شاٹ"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"مزید اختیارات کے لیے اپنا فون غیر مقفل کریں"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"مزید اختیارات کے لیے اپنا ٹیبلیٹ غیر مقفل کریں"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"مزید اختیارات کے لیے اپنا آلہ غیر مقفل کریں"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ایک تصویر بھیجی"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"اسکرین شاٹ محفوظ ہو رہا ہے…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"اسکرین شاٹ محفوظ ہو رہا ہے…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"فعال کریں"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"غیر فعال کریں"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"آؤٹ پٹ آلہ سوئچ کریں"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"ایپ کو پن کر دیا گیا ہے"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کے لیے سوائپ کریں اور پکڑ کر رکھیں۔"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے مجموعی جائزہ بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"ہوم\" بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"ذاتی ڈیٹا قابل رسائی ہو سکتا ہے (جیسے رابطے اور ای میل کا مواد)۔"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"پن کردہ ایپ دیگر ایپس کو کھول سکتی ہے۔"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"اس ایپ سے پن ہٹانے کے لیے، \"واپس جائیں\" اور \"مجموعی جائزہ\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"اس ایپ سے پن ہٹانے کے لیے، \"واپس جائیں\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"اس ایپ سے پن ہٹانے کے لیے، اوپر کی طرف سوائپ کریں اور دبائے رکھیں"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"سمجھ آ گئی"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"نہیں شکریہ"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"ایپ کو پن کر دیا گیا"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"ایپ کا پن ہٹا دیا گیا"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> کو چھپائیں؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"اگلی بار جب آپ اسے ترتیبات میں آن کریں گے تو یہ ظاہر ہوگی۔"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"چھپائیں"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"گفتگو کے سیکشن کے اوپری حصے پر دکھاتا ہے، تیرتے بلبلے کی طرح ظاہر ہوتا ہے، لاک اسکرین پر پروفائل تصویر دکھاتا ہے"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> گفتگو سے متعلق مخصوص ترتیبات کو سپورٹ نہیں کرتی"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"کوئی حالیہ بلبلہ نہیں"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"حالیہ بلبلے اور برخاست شدہ بلبلے یہاں ظاہر ہوں گے"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index be7c62632a4b..0aeb3271deb0 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -592,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"faollashtirish"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"faolsizlantirish"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Audiochiqish qurilmasini almashtirish"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Ilova mahkamlandi"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Ekran yechib olinmagunicha u mahkamlangan holatda qoladi. Uni yechish uchun Orqaga va Asosiy tugmalarni birga bosib turing."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Yechilmaguncha chiqib turadi. Yechish uchun tepaga suring va qoʻlingizni kerakli holatda tutib turing."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Umumiy ma’lumot” tugmasini bosib turing."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ekran yechib olinmagunicha u mahkamlangan holatda qoladi. Uni yechish uchun Orqaga va Asosiy tugmlarni birga bosib turing."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Shaxsiy maʼlumotlarga kira oladi (masalan, kontaktlar va email ichidagilarga)"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Mahkamlangan ilova boshqa ilovalarni ochishi mumkin."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Bu ilovadan chiqish uchun Orqaga va Menyu tugmalarini bosib turing"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Bu ilovani olib tashlash uchun Orqaga va Bosh ekran tugmalarini bosib turing"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Bu ilovani olib tashlash uchun tepaga surib, bosib turing"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Yo‘q, kerakmas"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Ilova mahkamlandi"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Ilova olib tashlandi"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> berkitilsinmi?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Keyingi safar sozlamalardan yoqilgan paydo bo‘ladi."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Berkitish"</string> @@ -727,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Suhbatlar ruknining tepasida qalqib chiquvchi bulutcha shaklida chiqadi, ekran qulfida profil rasmi chiqadi"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Sozlamalar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat sozlamalari ishlamaydi"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Avvalgi bulutchalar topilmadi"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bu yerda oxirgi va yopilgan bulutcha shaklidagi bildirishnomalar chiqadi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index bd483b8b1c5e..8000686a8fb1 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"T.phóng để lấp đầy m.hình"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Giãn ra để lấp đầy m.hình"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Chụp ảnh màn hình"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Mở khóa điện thoại của bạn để xem thêm tùy chọn"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Mở khóa máy tính bảng của bạn để xem thêm tùy chọn"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Mở khóa thiết bị của bạn để xem thêm tùy chọn"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"đã gửi hình ảnh"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Đang lưu ảnh chụp màn hình..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Đang lưu ảnh chụp màn hình..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"bật"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"tắt"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Chuyển đổi thiết bị đầu ra"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"Đã ghim ứng dụng"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim."</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Quay lại và nút Màn hình chính để bỏ ghim."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Màn hình tiếp tục hiển thị cho tới khi bạn bỏ ghim. Hãy vuốt lên và giữ để bỏ ghim."</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Tổng quan để bỏ ghim."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Màn hình chính để bỏ ghim."</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Bạn có thể truy cập được vào dữ liệu cá nhân (chẳng hạn như danh bạ và nội dung email)."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Ứng dụng đã ghim có thể mở ứng dụng khác."</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"Để bỏ ghim ứng dụng này, hãy chạm và giữ nút Quay lại và nút Tổng quan"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Để bỏ ghim ứng dụng này, hãy chạm và giữ nút Quay lại và nút Màn hình chính"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Để bỏ ghim ứng dụng này, hãy vuốt lên và giữ"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Ok"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Không, cảm ơn"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"Đã ghim ứng dụng"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"Đã bỏ ghim ứng dụng"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"Ẩn <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"Thông báo này sẽ xuất hiện lại vào lần tiếp theo bạn bật thông báo trong cài đặt."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"Ẩn"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Hiển thị cuộc trò chuyện ở đầu phần cuộc trò chuyện và dưới dạng bong bóng nổi, hiển thị ảnh hồ sơ trên màn hình khóa"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ tùy chọn cài đặt dành riêng cho cuộc trò chuyện"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng trò chuyện nào gần đây"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 970d21843616..1d5a73dd54c6 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"缩放以填满屏幕"</string> <string name="compat_mode_off" msgid="7682459748279487945">"拉伸以填满屏幕"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"屏幕截图"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"解锁手机即可查看更多选项"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"解锁平板电脑即可查看更多选项"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"解锁设备即可查看更多选项"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"发送了一张图片"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"正在保存屏幕截图..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在保存屏幕截图..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"启用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"切换输出设备"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"应用已固定"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“概览”即可取消固定屏幕。"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“主屏幕”即可取消固定屏幕。"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"这会使此屏幕固定显示,直到您取消固定为止。向上滑动并按住即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“概览”即可取消固定屏幕。"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“主屏幕”即可取消固定屏幕。"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"可访问个人数据(例如通讯录和电子邮件内容)。"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"固定的应用可打开其他应用。"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"如需取消固定此应用,请轻触并按住“返回”按钮和“概览”按钮"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"如需取消固定此应用,请轻触并按住“返回”按钮和主屏幕按钮"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"如需取消固定此应用,请向上滑动并按住"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"知道了"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"不用了"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"已固定应用"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"已取消固定应用"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"要隐藏“<xliff:g id="TILE_LABEL">%1$s</xliff:g>”吗?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"下次在设置中将其开启后,此快捷设置条目将会重新显示。"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"隐藏"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以悬浮对话泡形式显示在对话部分顶部,如果设备处于锁定状态,在锁定屏幕上显示个人资料照片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"设置"</string> <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string> - <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话专用设置"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有对话泡"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"此处会显示最近的对话泡和已关闭的对话泡"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 909336451d95..53479842563c 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="7682459748279487945">"放大為全螢幕"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"螢幕截圖"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"解鎖手機以存取更多選項"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"解鎖平板電腦以存取更多選項"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"解鎖裝置以存取更多選項"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"已傳送圖片"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"正在儲存螢幕擷取畫面..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在儲存螢幕擷取畫面..."</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"啟用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"切換輸出裝置"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"已固定應用程式"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"畫面將會繼續顯示,直至您取消固定。按住 [返回] 和 [概覽] 即可取消固定。"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"畫面將會繼續顯示,直至您取消固定為止。按住 [返回] 按鈕和主按鈕即可取消固定。"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"畫面將會繼續顯示,直至您取消固定為止。向上滑動並按住即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"畫面將會繼續顯示,直至您取消固定。按住 [概覽] 即可取消固定。"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"畫面將會繼續顯示,直至您取消固定為止。按住主按鈕即可取消固定。"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"該應用程式可存取個人資料 (例如聯絡人和電郵內容)。"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"固定的應用程式可開啟其他應用程式。"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"如要取消固定此應用程式,請按住「返回」按鈕和「概覽」按鈕"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"如要取消固定此應用程式,請按住「返回」按鈕和主按鈕"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"如要取消固定此應用程式,請向上滑動並按住"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"知道了"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"不用了,謝謝"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"已固定應用程式"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"已取消固定應用程式"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"隱藏 <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"下一次您在設定開啟它時,它將再次出現。"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"隱藏"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"在對話部分的頂部以浮動對話氣泡顯示,並在上鎖畫面顯示個人檔案相片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"重要"</string> - <string name="no_shortcut" msgid="7176375126961212514">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話專用設定"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"沒有最近曾使用的小視窗"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近使用和關閉的小視窗會在這裡顯示"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index f93464c71c00..104aaa4d9b03 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="7682459748279487945">"放大為全螢幕"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"擷取螢幕畫面"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"解鎖手機可查看更多選項"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"解鎖平板電腦可查看更多選項"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"解鎖裝置可查看更多選項"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"傳送了一張圖片"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"正在儲存螢幕截圖…"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"正在儲存螢幕截圖…"</string> @@ -595,29 +592,21 @@ <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"啟用"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"停用"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"切換輸出裝置"</string> - <!-- no translation found for screen_pinning_title (9058007390337841305) --> - <skip /> + <string name="screen_pinning_title" msgid="9058007390337841305">"應用程式已固定"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。"</string> <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住 [返回] 按鈕和主螢幕按鈕即可取消固定。"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。向上滑動並按住即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。"</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住主螢幕按鈕即可取消固定。"</string> - <!-- no translation found for screen_pinning_exposes_personal_data (8189852022981524789) --> - <skip /> - <!-- no translation found for screen_pinning_can_open_other_apps (7529756813231421455) --> - <skip /> - <!-- no translation found for screen_pinning_toast (8177286912533744328) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (6850978077443052594) --> - <skip /> - <!-- no translation found for screen_pinning_toast_gesture_nav (170699893395336705) --> - <skip /> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"該應用程式或許可存取個人資料 (例如聯絡人和電子郵件內容)。"</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"已設為固定的應用程式或許可以開啟其他應用程式。"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"如要取消固定這個應用程式,請輕觸並按住「返回」按鈕和「總覽」按鈕"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"如要取消固定這個應用程式,請輕觸並按住「返回」按鈕和主畫面按鈕"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"如要取消固定這個應用程式,請向上滑動並按住"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"知道了"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"不用了,謝謝"</string> - <!-- no translation found for screen_pinning_start (7483998671383371313) --> - <skip /> - <!-- no translation found for screen_pinning_exit (4553787518387346893) --> - <skip /> + <string name="screen_pinning_start" msgid="7483998671383371313">"已固定應用程式"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"已取消固定應用程式"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"隱藏"</string> @@ -730,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話框的形式顯示在對話部分的頂端。如果裝置處於鎖定狀態,則在螢幕鎖定畫面上顯示個人資料相片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string> - <string name="no_shortcut" msgid="7176375126961212514">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話專用設定"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近沒有任何對話框"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"最近的對話框和已關閉的對話框會顯示在這裡"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index e8be37d0060d..292d6db3b7a2 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -77,9 +77,6 @@ <string name="compat_mode_on" msgid="4963711187149440884">"Sondeza ukugcwalisa isikrini"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Nweba ukugcwalisa isikrini"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Isithombe-skrini"</string> - <string name="global_action_lock_message" product="default" msgid="4466026255205186456">"Vula ifoni yakho ukuthola izinketho ezengeziwe"</string> - <string name="global_action_lock_message" product="tablet" msgid="7621167597240332986">"Vula ithebulethi yakho ukuthola izinketho ezengeziwe"</string> - <string name="global_action_lock_message" product="device" msgid="538790401275363781">"Vula idivayisi yakho ukuthola izinketho ezengeziwe"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"uthumele isithombe"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Ilondoloz umfanekiso weskrini..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ilondoloz umfanekiso weskrini..."</string> @@ -722,7 +719,8 @@ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Iboniswa ngenhla kwesigaba sengxoxo, ivela njengebhamuza elintantayo, ibonisa isithombe sephrofayela kukukhiya isikrini"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Izilungiselelo"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string> - <string name="no_shortcut" msgid="7176375126961212514">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli amasethingi athile engxoxo"</string> + <!-- no translation found for no_shortcut (8257177117568230126) --> + <skip /> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Awekho amabhamuza akamuva"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Amabhamuza akamuva namabhamuza asusiwe azobonakala lapha."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index a7d176443c55..d32ac6a0b372 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -224,6 +224,7 @@ <dimen name="notification_guts_conversation_icon_size">56dp</dimen> <dimen name="notification_guts_conversation_action_height">56dp</dimen> <dimen name="notification_guts_conversation_action_text_padding_start">32dp</dimen> + <dimen name="conversation_onboarding_bullet_gap_width">6dp</dimen> <!-- The height of the header in inline settings --> <dimen name="notification_guts_header_height">24dp</dimen> @@ -482,7 +483,8 @@ <dimen name="pull_span_min">25dp</dimen> <dimen name="qs_tile_height">106dp</dimen> - <dimen name="qs_tile_layout_margin_side">6dp</dimen> + <!--notification_side_paddings + notification_content_margin_start - (qs_quick_tile_size - qs_tile_background_size) / 2 --> + <dimen name="qs_tile_layout_margin_side">18dp</dimen> <dimen name="qs_tile_margin_horizontal">18dp</dimen> <dimen name="qs_tile_margin_horizontal_two_line">2dp</dimen> <dimen name="qs_tile_margin_vertical">24dp</dimen> @@ -498,7 +500,6 @@ <dimen name="qs_quick_tile_size">48dp</dimen> <dimen name="qs_quick_tile_padding">12dp</dimen> <dimen name="qs_header_gear_translation">16dp</dimen> - <dimen name="qs_header_tile_margin_horizontal">4dp</dimen> <dimen name="qs_header_tile_margin_bottom">18dp</dimen> <dimen name="qs_page_indicator_width">16dp</dimen> <dimen name="qs_page_indicator_height">8dp</dimen> @@ -1057,9 +1058,8 @@ <dimen name="edge_margin">8dp</dimen> <!-- The absolute side margins of quick settings --> - <dimen name="quick_settings_side_margins">16dp</dimen> <dimen name="quick_settings_expanded_bottom_margin">16dp</dimen> - <dimen name="quick_settings_media_extra_bottom_margin">4dp</dimen> + <dimen name="quick_settings_media_extra_bottom_margin">6dp</dimen> <dimen name="rounded_corner_content_padding">0dp</dimen> <dimen name="nav_content_padding">0dp</dimen> <dimen name="nav_quick_scrub_track_edge_padding">24dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 97a0d032c4a7..39237ac246eb 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2667,6 +2667,11 @@ <string name="inattentive_sleep_warning_title">Standby</string> <!-- Priority conversation onboarding screen --> + <!-- title of priority onboarding [CHAR LIMIT=75] --> + <string name="priority_onboarding_title">Conversation set to priority</string> + <!-- Text explaining that the following actions are the behaviors of priority conversations. + E.g. priority conversations will show at the top of the conversation section [CHAR LIMIT=75] --> + <string name="priority_onboarding_behavior">Priority conversations will:</string> <!-- Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=75] --> <string name="priority_onboarding_show_at_top_text">Show at top of conversation section</string> <!-- Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=75] --> @@ -2677,6 +2682,8 @@ <string name="priority_onboarding_ignores_dnd_text">Interrupt Do Not Disturb</string> <!-- Title for the affirmative button [CHAR LIMIT=50] --> <string name="priority_onboarding_done_button_title">Got it</string> + <!-- Title for the settings button button [CHAR LIMIT=50] --> + <string name="priority_onboarding_settings_button_title">Settings</string> <!-- Window Magnification strings --> <!-- Title for Magnification Overlay Window [CHAR LIMIT=NONE] --> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java new file mode 100644 index 000000000000..b79fcbd43972 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/BitmapUtil.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shared.recents.utilities; + +import android.graphics.Bitmap; +import android.graphics.ColorSpace; +import android.graphics.ParcelableColorSpace; +import android.hardware.HardwareBuffer; +import android.os.Bundle; + +import java.util.Objects; + +/** + * Utils for working with Bitmaps. + */ +public final class BitmapUtil { + private static final String KEY_BUFFER = "bitmap_util_buffer"; + private static final String KEY_COLOR_SPACE = "bitmap_util_color_space"; + + private BitmapUtil(){ } + + /** + * Creates a Bundle that represents the given Bitmap. + * <p>The Bundle will contain a wrapped version of the Bitmaps HardwareBuffer, so will avoid + * copies when passing across processes, only pass to processes you trust. + * + * <p>Returns a new Bundle rather than modifying an exiting one to avoid key collisions, the + * returned Bundle should be treated as a standalone object. + * + * @param bitmap to convert to bundle + * @return a Bundle representing the bitmap, should only be parsed by + * {@link #bundleToHardwareBitmap(Bundle)} + */ + public static Bundle hardwareBitmapToBundle(Bitmap bitmap) { + if (bitmap.getConfig() != Bitmap.Config.HARDWARE) { + throw new IllegalArgumentException( + "Passed bitmap must have hardware config, found: " + bitmap.getConfig()); + } + + // Bitmap assumes SRGB for null color space + ParcelableColorSpace colorSpace = + bitmap.getColorSpace() == null + ? new ParcelableColorSpace(ColorSpace.get(ColorSpace.Named.SRGB)) + : new ParcelableColorSpace(bitmap.getColorSpace()); + + Bundle bundle = new Bundle(); + bundle.putParcelable(KEY_BUFFER, bitmap.getHardwareBuffer()); + bundle.putParcelable(KEY_COLOR_SPACE, colorSpace); + + return bundle; + } + + /** + * Extracts the Bitmap added to a Bundle with {@link #hardwareBitmapToBundle(Bitmap)} .} + * + * <p>This Bitmap contains the HardwareBuffer from the original caller, be careful passing this + * Bitmap on to any other source. + * + * @param bundle containing the bitmap + * @return a hardware Bitmap + */ + public static Bitmap bundleToHardwareBitmap(Bundle bundle) { + if (!bundle.containsKey(KEY_BUFFER) || !bundle.containsKey(KEY_COLOR_SPACE)) { + throw new IllegalArgumentException("Bundle does not contain a hardware bitmap"); + } + + HardwareBuffer buffer = bundle.getParcelable(KEY_BUFFER); + ParcelableColorSpace colorSpace = bundle.getParcelable(KEY_COLOR_SPACE); + + return Bitmap.wrapHardwareBuffer(Objects.requireNonNull(buffer), colorSpace); + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt new file mode 100644 index 000000000000..8cd68ef8acbc --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt @@ -0,0 +1,26 @@ +package com.android.keyguard + +import android.annotation.CurrentTimeMillisLong + +/** + * Data class for tracking information associated with [KeyguardUpdateMonitor.shouldListenForFace] + * method calls. + */ +data class KeyguardFaceListenModel( + @CurrentTimeMillisLong val timeMillis: Long, + val userId: Int, + val isListeningForFace: Boolean, + val isBouncer: Boolean, + val isAuthInterruptActive: Boolean, + val isKeyguardAwake: Boolean, + val isListeningForFaceAssistant: Boolean, + val isSwitchingUser: Boolean, + val isFaceDisabled: Boolean, + val isBecauseCannotSkipBouncer: Boolean, + val isKeyguardGoingAway: Boolean, + val isFaceSettingEnabledForUser: Boolean, + val isLockIconPressed: Boolean, + val isScanningAllowedByStrongAuth: Boolean, + val isPrimaryUser: Boolean, + val isSecureCameraLaunched: Boolean +) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 0db713e9c276..ee31706c0b94 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -58,6 +58,7 @@ import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.os.Build; import android.os.CancellationSignal; import android.os.Handler; import android.os.IRemoteCallback; @@ -108,9 +109,13 @@ import com.google.android.collect.Lists; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; +import java.text.SimpleDateFormat; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.TimeZone; @@ -131,7 +136,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private static final String TAG = "KeyguardUpdateMonitor"; private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; - private static final boolean DEBUG_FACE = true; + private static final boolean DEBUG_FACE = Build.IS_DEBUGGABLE; private static final boolean DEBUG_SPEW = false; private static final int LOW_BATTERY_THRESHOLD = 20; @@ -362,6 +367,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @VisibleForTesting SparseArray<BiometricAuthenticated> mUserFaceAuthenticated = new SparseArray<>(); + // Keep track of recent calls to shouldListenForFace() for debugging. + private static final int FACE_LISTEN_CALLS_QUEUE_SIZE = 20; + private ArrayDeque<KeyguardFaceListenModel> mFaceListenModels; + private static int sCurrentUser; private Runnable mUpdateBiometricListeningState = this::updateBiometricListeningState; @@ -1945,25 +1954,48 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab && strongAuthAllowsScanning && mIsPrimaryUser && !mSecureCameraLaunched; + // Aggregate relevant fields for debug logging. + if (DEBUG_FACE || DEBUG_SPEW) { + final KeyguardFaceListenModel model = new KeyguardFaceListenModel( + System.currentTimeMillis(), + user, + shouldListen, + mBouncer, + mAuthInterruptActive, + awakeKeyguard, + shouldListenForFaceAssistant(), + mSwitchingUser, + isFaceDisabled(user), + becauseCannotSkipBouncer, + mKeyguardGoingAway, + mFaceSettingEnabledForUser.get(user), + mLockIconPressed, + strongAuthAllowsScanning, + mIsPrimaryUser, + mSecureCameraLaunched); + maybeLogFaceListenerModelData(model); + } + + return shouldListen; + } + + private void maybeLogFaceListenerModelData(KeyguardFaceListenModel model) { // Too chatty, but very useful when debugging issues. if (DEBUG_SPEW) { - Log.v(TAG, "shouldListenForFace(" + user + ")=" + shouldListen + "... " - + ", mBouncer: " + mBouncer - + ", mAuthInterruptActive: " + mAuthInterruptActive - + ", awakeKeyguard: " + awakeKeyguard - + ", shouldListenForFaceAssistant: " + shouldListenForFaceAssistant() - + ", mSwitchingUser: " + mSwitchingUser - + ", isFaceDisabled(" + user + "): " + isFaceDisabled(user) - + ", becauseCannotSkipBouncer: " + becauseCannotSkipBouncer - + ", mKeyguardGoingAway: " + mKeyguardGoingAway - + ", mFaceSettingEnabledForUser(" + user + "): " - + mFaceSettingEnabledForUser.get(user) - + ", mLockIconPressed: " + mLockIconPressed - + ", strongAuthAllowsScanning: " + strongAuthAllowsScanning - + ", isPrimaryUser: " + mIsPrimaryUser - + ", mSecureCameraLaunched: " + mSecureCameraLaunched); + Log.v(TAG, model.toString()); + } + + // Add model data to the historical buffer. + if (DEBUG_FACE && mFaceRunningState != BIOMETRIC_STATE_RUNNING + && model.isListeningForFace()) { + if (mFaceListenModels == null) { + mFaceListenModels = new ArrayDeque<>(FACE_LISTEN_CALLS_QUEUE_SIZE); + } + if (mFaceListenModels.size() >= FACE_LISTEN_CALLS_QUEUE_SIZE) { + mFaceListenModels.remove(); + } + mFaceListenModels.add(model); } - return shouldListen; } /** @@ -2919,5 +2951,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab pw.println(" enabledByUser=" + mFaceSettingEnabledForUser.get(userId)); pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } + if (mFaceListenModels != null && !mFaceListenModels.isEmpty()) { + final SimpleDateFormat dateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); + pw.println(" Face listen results (last " + FACE_LISTEN_CALLS_QUEUE_SIZE + " calls):"); + for (final KeyguardFaceListenModel model : mFaceListenModels) { + final String time = dateFormat.format(new Date(model.getTimeMillis())); + pw.println(" " + time + " " + model.toString()); + } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index 87990cd3bffa..ccb506de6d8b 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -124,7 +124,7 @@ public final class Prefs { String HAS_SEEN_BUBBLES_MANAGE_EDUCATION = "HasSeenBubblesManageOnboarding"; String CONTROLS_STRUCTURE_SWIPE_TOOLTIP_COUNT = "ControlsStructureSwipeTooltipCount"; /** Tracks whether the user has seen the onboarding screen for priority conversations */ - String HAS_SEEN_PRIORITY_ONBOARDING = "HasSeenPriorityOnboarding"; + String HAS_SEEN_PRIORITY_ONBOARDING = "HaveShownPriorityOnboarding"; } public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index f05d547edd0c..8a2c101f7057 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -212,6 +212,13 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final List<NotifCallback> mCallbacks = new ArrayList<>(); /** + * Whether the IME is visible, as reported by the BubbleStackView. If it is, we'll make the + * Bubbles window NOT_FOCUSABLE so that touches on the Bubbles UI doesn't steal focus from the + * ActivityView and hide the IME. + */ + private boolean mImeVisible = false; + + /** * Listener to find out about stack expansion / collapse events. */ public interface BubbleExpandListener { @@ -598,7 +605,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (mStackView == null) { mStackView = new BubbleStackView( mContext, mBubbleData, mSurfaceSynchronizer, mFloatingContentCoordinator, - mSysUiState, mNotificationShadeWindowController, this::onAllBubblesAnimatedOut); + mSysUiState, mNotificationShadeWindowController, this::onAllBubblesAnimatedOut, + this::onImeVisibilityChanged); mStackView.addView(mBubbleScrim); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); @@ -649,6 +657,11 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } } + private void onImeVisibilityChanged(boolean imeVisible) { + mImeVisible = imeVisible; + updateWmFlags(); + } + /** Removes the BubbleStackView from the WindowManager if it's there. */ private void removeFromWindowManagerMaybe() { if (!mAddedToWindowManager) { @@ -676,13 +689,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * the new params if the stack has been added. */ private void updateWmFlags() { - if (isStackExpanded()) { - // If we're expanded, we want to be focusable so that the ActivityView can receive focus - // and show the IME. + if (isStackExpanded() && !mImeVisible) { + // If we're expanded, and the IME isn't visible, we want to be focusable. This ensures + // that any taps within Bubbles (including on the ActivityView) results in Bubbles + // receiving focus and clearing it from any other windows that might have it. mWmLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } else { - // If we're collapsed, we don't want to be able to receive focus. Doing so would - // preclude applications from using the IME since we are always above them. + // If we're collapsed, we don't want to be focusable since tapping on the stack would + // steal focus from apps. We also don't want to be focusable if the IME is visible, mWmLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } @@ -784,6 +798,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mBubbleIconFactory = new BubbleIconFactory(mContext); mStackView.onDisplaySizeChanged(); } + + mStackView.onLayoutDirectionChanged(); } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 64dc2ccc8b52..790d6a2070a2 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -34,6 +34,7 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.ActivityView; @@ -239,6 +240,7 @@ public class BubbleExpandedView extends LinearLayout { mPointerMargin = res.getDimensionPixelSize(R.dimen.bubble_pointer_margin); } + @SuppressLint("ClickableViewAccessibility") @Override protected void onFinishInflate() { super.onFinishInflate(); @@ -290,6 +292,34 @@ public class BubbleExpandedView extends LinearLayout { } return view.onApplyWindowInsets(insets); }); + + final int expandedViewPadding = + res.getDimensionPixelSize(R.dimen.bubble_expanded_view_padding); + + setPadding( + expandedViewPadding, expandedViewPadding, expandedViewPadding, expandedViewPadding); + setOnTouchListener((view, motionEvent) -> { + if (!usingActivityView()) { + return false; + } + + final Rect avBounds = new Rect(); + mActivityView.getBoundsOnScreen(avBounds); + + // Consume and ignore events on the expanded view padding that are within the + // ActivityView's vertical bounds. These events are part of a back gesture, and so they + // should not collapse the stack (which all other touches on areas around the AV would + // do). + if (motionEvent.getRawY() >= avBounds.top && motionEvent.getRawY() <= avBounds.bottom) { + return true; + } + + return false; + }); + + // BubbleStackView is forced LTR, but we want to respect the locale for expanded view layout + // so the Manage button appears on the right. + setLayoutDirection(LAYOUT_DIRECTION_LOCALE); } private String getBubbleKey() { @@ -323,9 +353,19 @@ public class BubbleExpandedView extends LinearLayout { } } + /** + * Hides the IME if it's showing. This is currently done by dispatching a back press to the AV. + */ + void hideImeIfVisible() { + if (mKeyboardVisible) { + performBackPressIfNeeded(); + } + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + hideImeIfVisible(); mKeyboardVisible = false; mNeedsNewHeight = false; if (mActivityView != null) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java index e12b325f5d05..8c76cda3290f 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java @@ -186,6 +186,9 @@ public class BubbleFlyoutView extends FrameLayout { } }); + // Use locale direction so the text is aligned correctly. + setLayoutDirection(LAYOUT_DIRECTION_LOCALE); + mBgPaint.setColor(mFloatingBackgroundColor); mLeftTriangleShape = diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java index bea4ba776beb..3e694b9f5d2a 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java @@ -22,6 +22,7 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME import android.app.Activity; import android.content.Context; +import android.content.pm.ShortcutInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; @@ -204,6 +205,8 @@ public class BubbleOverflowActivity extends Activity { } class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.ViewHolder> { + private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleOverflowAdapter" : TAG_BUBBLES; + private Context mContext; private Consumer<Bubble> mPromoteBubbleFromOverflow; private List<Bubble> mBubbles; @@ -282,11 +285,19 @@ class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.V } }); - Bubble.FlyoutMessage message = b.getFlyoutMessage(); - if (message != null && message.senderName != null) { - vh.textView.setText(message.senderName.toString()); + // If the bubble was persisted, the entry is null but it should have shortcut info + ShortcutInfo info = b.getEntry() == null + ? b.getShortcutInfo() + : b.getEntry().getRanking().getShortcutInfo(); + if (info == null) { + Log.d(TAG, "ShortcutInfo required to bubble but none found for " + b); } else { - vh.textView.setText(b.getAppName()); + CharSequence label = info.getLabel(); + if (label == null) { + vh.textView.setText(b.getAppName()); + } else { + vh.textView.setText(label.toString()); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 239132ea292b..dfa71baddb93 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -342,6 +342,12 @@ public class BubbleStackView extends FrameLayout private final NotificationShadeWindowController mNotificationShadeWindowController; /** + * Callback to run when the IME visibility changes - BubbleController uses this to update the + * Bubbles window focusability flags with the WindowManager. + */ + public final Consumer<Boolean> mOnImeVisibilityChanged; + + /** * The currently magnetized object, which is being dragged and will be attracted to the magnetic * dismiss target. * @@ -667,7 +673,8 @@ public class BubbleStackView extends FrameLayout FloatingContentCoordinator floatingContentCoordinator, SysUiState sysUiState, NotificationShadeWindowController notificationShadeWindowController, - Runnable allBubblesAnimatedOutAction) { + Runnable allBubblesAnimatedOutAction, + Consumer<Boolean> onImeVisibilityChanged) { super(context); mBubbleData = data; @@ -716,6 +723,12 @@ public class BubbleStackView extends FrameLayout setUpUserEducation(); + // Force LTR by default since most of the Bubbles UI is positioned manually by the user, or + // is centered. It greatly simplifies translation positioning/animations. Views that will + // actually lay out differently in RTL, such as the flyout and expanded view, will set their + // layout direction to LOCALE. + setLayoutDirection(LAYOUT_DIRECTION_LTR); + mBubbleContainer = new PhysicsAnimationLayout(context); mBubbleContainer.setActiveController(mStackAnimationController); mBubbleContainer.setElevation(elevation); @@ -724,8 +737,6 @@ public class BubbleStackView extends FrameLayout mExpandedViewContainer = new FrameLayout(context); mExpandedViewContainer.setElevation(elevation); - mExpandedViewContainer.setPadding(mExpandedViewPadding, mExpandedViewPadding, - mExpandedViewPadding, mExpandedViewPadding); mExpandedViewContainer.setClipChildren(false); addView(mExpandedViewContainer); @@ -793,7 +804,11 @@ public class BubbleStackView extends FrameLayout setUpOverflow(); + mOnImeVisibilityChanged = onImeVisibilityChanged; + setOnApplyWindowInsetsListener((View view, WindowInsets insets) -> { + onImeVisibilityChanged.accept(insets.getInsets(WindowInsets.Type.ime()).bottom > 0); + if (!mIsExpanded || mIsExpansionAnimating) { return view.onApplyWindowInsets(insets); } @@ -952,6 +967,9 @@ public class BubbleStackView extends FrameLayout mManageSettingsIcon = mManageMenu.findViewById(R.id.bubble_manage_menu_settings_icon); mManageSettingsText = mManageMenu.findViewById(R.id.bubble_manage_menu_settings_name); + + // The menu itself should respect locale direction so the icons are on the correct side. + mManageMenu.setLayoutDirection(LAYOUT_DIRECTION_LOCALE); addView(mManageMenu); } @@ -1075,6 +1093,16 @@ public class BubbleStackView extends FrameLayout mShowingManage = false; } + /** Tells the views with locale-dependent layout direction to resolve the new direction. */ + public void onLayoutDirectionChanged() { + mManageMenu.resolveLayoutDirection(); + mFlyout.resolveLayoutDirection(); + + if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) { + mExpandedBubble.getExpandedView().resolveLayoutDirection(); + } + } + /** Respond to the display size change by recalculating view size and location. */ public void onDisplaySizeChanged() { setUpOverflow(); @@ -2086,16 +2114,21 @@ public class BubbleStackView extends FrameLayout mExpandedBubble.getExpandedView().getManageButtonBoundsOnScreen(mTempRect); - // When the menu is open, it should be at these coordinates. This will make the menu's - // bottom left corner match up with the button's bottom left corner. - final float targetX = mTempRect.left; + final boolean isLtr = + getResources().getConfiguration().getLayoutDirection() == LAYOUT_DIRECTION_LTR; + + // When the menu is open, it should be at these coordinates. The menu pops out to the right + // in LTR and to the left in RTL. + final float targetX = isLtr ? mTempRect.left : mTempRect.right - mManageMenu.getWidth(); final float targetY = mTempRect.bottom - mManageMenu.getHeight(); + final float xOffsetForAnimation = (isLtr ? 1 : -1) * mManageMenu.getWidth() / 4f; + if (show) { mManageMenu.setScaleX(0.5f); mManageMenu.setScaleY(0.5f); - mManageMenu.setTranslationX(targetX - mManageMenu.getWidth() / 4); - mManageMenu.setTranslationY(targetY + mManageMenu.getHeight() / 4); + mManageMenu.setTranslationX(targetX - xOffsetForAnimation); + mManageMenu.setTranslationY(targetY + mManageMenu.getHeight() / 4f); mManageMenu.setAlpha(0f); PhysicsAnimator.getInstance(mManageMenu) @@ -2112,8 +2145,8 @@ public class BubbleStackView extends FrameLayout .spring(DynamicAnimation.ALPHA, 0f) .spring(DynamicAnimation.SCALE_X, 0.5f) .spring(DynamicAnimation.SCALE_Y, 0.5f) - .spring(DynamicAnimation.TRANSLATION_X, targetX - mManageMenu.getWidth() / 4) - .spring(DynamicAnimation.TRANSLATION_Y, targetY + mManageMenu.getHeight() / 4) + .spring(DynamicAnimation.TRANSLATION_X, targetX - xOffsetForAnimation) + .spring(DynamicAnimation.TRANSLATION_Y, targetY + mManageMenu.getHeight() / 4f) .withEndActions(() -> mManageMenu.setVisibility(View.INVISIBLE)) .start(); } @@ -2126,6 +2159,13 @@ public class BubbleStackView extends FrameLayout if (DEBUG_BUBBLE_STACK_VIEW) { Log.d(TAG, "updateExpandedBubble()"); } + + if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) { + // Hide the currently expanded bubble's IME if it's visible before switching to a new + // bubble. + mExpandedBubble.getExpandedView().hideImeIfVisible(); + } + mExpandedViewContainer.removeAllViews(); if (mIsExpanded && mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) { diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt index fd9fda3662a3..93f0c7f41ce3 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -44,6 +44,7 @@ import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dump.DumpManager +import com.android.systemui.globalactions.GlobalActionsDialog import com.android.systemui.util.concurrency.DelayableExecutor import java.io.FileDescriptor import java.io.PrintWriter @@ -79,6 +80,7 @@ class ControlsControllerImpl @Inject constructor ( } private var userChanging: Boolean = true + private var userStructure: UserStructure private var seedingInProgress = false private val seedingCallbacks = mutableListOf<Consumer<Boolean>>() @@ -97,7 +99,7 @@ class ControlsControllerImpl @Inject constructor ( internal var auxiliaryPersistenceWrapper: AuxiliaryPersistenceWrapper init { - val userStructure = UserStructure(context, currentUser) + userStructure = UserStructure(context, currentUser) persistenceWrapper = optionalWrapper.orElseGet { ControlsFavoritePersistenceWrapper( @@ -116,7 +118,7 @@ class ControlsControllerImpl @Inject constructor ( private fun setValuesForUser(newUser: UserHandle) { Log.d(TAG, "Changing to user: $newUser") currentUser = newUser - val userStructure = UserStructure(context, currentUser) + userStructure = UserStructure(context, currentUser) persistenceWrapper.changeFileAndBackupManager( userStructure.file, BackupManager(userStructure.userContext) @@ -192,6 +194,16 @@ class ControlsControllerImpl @Inject constructor ( it.componentName }.toSet() + // When a component is uninstalled, allow seeding to happen again if the user + // reinstalls the app + val prefs = userStructure.userContext.getSharedPreferences( + GlobalActionsDialog.PREFS_CONTROLS_FILE, Context.MODE_PRIVATE) + val completedSeedingPackageSet = prefs.getStringSet( + GlobalActionsDialog.PREFS_CONTROLS_SEEDING_COMPLETED, mutableSetOf<String>()) + val favoritePackageSet = favoriteComponentSet.map { it.packageName } + prefs.edit().putStringSet(GlobalActionsDialog.PREFS_CONTROLS_SEEDING_COMPLETED, + completedSeedingPackageSet.intersect(favoritePackageSet)).apply() + var changed = false favoriteComponentSet.subtract(serviceInfoSet).forEach { changed = true diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index 10e913743224..2a40b76eb326 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -58,16 +58,14 @@ class ControlActionCoordinatorImpl @Inject constructor( override fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) { bouncerOrRun { - val effect = if (!isChecked) Vibrations.toggleOnEffect else Vibrations.toggleOffEffect - vibrate(effect) + cvh.layout.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) cvh.action(BooleanAction(templateId, !isChecked)) } } override fun touch(cvh: ControlViewHolder, templateId: String, control: Control) { - vibrate(Vibrations.toggleOnEffect) - bouncerOrRun { + cvh.layout.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) if (cvh.usePanel()) { showDialog(cvh, control.getAppIntent().getIntent()) } else { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 35ebac5b1ed5..d31b6eb9d857 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -129,7 +129,10 @@ class ControlsUiControllerImpl @Inject constructor ( SelectionItem(it.loadLabel(), "", it.loadIcon(), it.componentName) } uiExecutor.execute { - onResult(lastItems) + parent.removeAllViews() + if (lastItems.size > 0) { + onResult(lastItems) + } } } } @@ -189,8 +192,6 @@ class ControlsUiControllerImpl @Inject constructor ( } private fun showSeedingView(items: List<SelectionItem>) { - parent.removeAllViews() - val inflater = LayoutInflater.from(context) inflater.inflate(R.layout.controls_no_favorites, parent, true) val subtitle = parent.requireViewById<TextView>(R.id.controls_subtitle) @@ -198,8 +199,6 @@ class ControlsUiControllerImpl @Inject constructor ( } private fun showInitialSetupView(items: List<SelectionItem>) { - parent.removeAllViews() - val inflater = LayoutInflater.from(context) inflater.inflate(R.layout.controls_no_favorites, parent, true) @@ -263,7 +262,6 @@ class ControlsUiControllerImpl @Inject constructor ( } private fun showControlsView(items: List<SelectionItem>) { - parent.removeAllViews() controlViewsById.clear() createListView() diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index 1f0ca9be2ecc..4003f41b33dc 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -231,9 +231,11 @@ class ToggleRangeBehavior : Behavior { rangeAnimator?.cancel() if (isDragging) { - clipLayer.level = newLevel val isEdge = newLevel == MIN_LEVEL || newLevel == MAX_LEVEL - cvh.controlActionCoordinator.drag(isEdge) + if (clipLayer.level != newLevel) { + cvh.controlActionCoordinator.drag(isEdge) + clipLayer.level = newLevel + } } else if (newLevel != clipLayer.level) { rangeAnimator = ValueAnimator.ofInt(cvh.clipLayer.level, newLevel).apply { addUpdateListener { @@ -266,7 +268,7 @@ class ToggleRangeBehavior : Behavior { private fun format(primaryFormat: String, backupFormat: String, value: Float): String { return try { - String.format(primaryFormat, value) + String.format(primaryFormat, findNearestStep(value)) } catch (e: IllegalFormatException) { Log.w(ControlsUiController.TAG, "Illegal format in range template", e) if (backupFormat == "") { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt index c0f6aabe2427..29b7e985fabc 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt @@ -20,35 +20,9 @@ import android.os.VibrationEffect import android.os.VibrationEffect.Composition.PRIMITIVE_TICK object Vibrations { - private const val TOGGLE_TICK_COUNT = 40 - - val toggleOnEffect = initToggleOnEffect() - val toggleOffEffect = initToggleOffEffect() val rangeEdgeEffect = initRangeEdgeEffect() val rangeMiddleEffect = initRangeMiddleEffect() - private fun initToggleOnEffect(): VibrationEffect { - val composition = VibrationEffect.startComposition() - composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 200) - var i = 0 - while (i++ < TOGGLE_TICK_COUNT) { - composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 0) - } - composition.addPrimitive(PRIMITIVE_TICK, 0.5f, 100) - return composition.compose() - } - - private fun initToggleOffEffect(): VibrationEffect { - val composition = VibrationEffect.startComposition() - composition.addPrimitive(PRIMITIVE_TICK, 0.5f, 0) - composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 100) - var i = 0 - while (i++ < TOGGLE_TICK_COUNT) { - composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 0) - } - return composition.compose() - } - private fun initRangeEdgeEffect(): VibrationEffect { val composition = VibrationEffect.startComposition() composition.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f) diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index eeb35d4015c9..7e009b459ede 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -183,8 +183,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency"; static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot"; - private static final String PREFS_CONTROLS_SEEDING_COMPLETED = "SeedingCompleted"; - private static final String PREFS_CONTROLS_FILE = "controls_prefs"; + public static final String PREFS_CONTROLS_SEEDING_COMPLETED = "SeedingCompleted"; + public static final String PREFS_CONTROLS_FILE = "controls_prefs"; private static final int SEEDING_MAX = 2; private final Context mContext; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt index cce9838bb8e2..67cf21ae10b9 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt @@ -65,7 +65,8 @@ class MediaDataCombineLatest @Inject constructor( val (entry, device) = entries[key] ?: null to null if (entry != null && device != null) { val data = entry.copy(device = device) - listeners.forEach { + val listenersCopy = listeners.toSet() + listenersCopy.forEach { it.onMediaDataLoaded(key, data) } } @@ -73,7 +74,8 @@ class MediaDataCombineLatest @Inject constructor( private fun remove(key: String) { entries.remove(key)?.let { - listeners.forEach { + val listenersCopy = listeners.toSet() + listenersCopy.forEach { it.onMediaDataRemoved(key) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 6b0775f6c2d7..1c3b6850afc1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -50,6 +50,8 @@ public class QSContainerImpl extends FrameLayout { private int mSideMargins; private boolean mQsDisabled; + private int mContentPaddingStart = -1; + private int mContentPaddingEnd = -1; public QSContainerImpl(Context context, AttributeSet attrs) { super(context, attrs); @@ -66,10 +68,9 @@ public class QSContainerImpl extends FrameLayout { mBackground = findViewById(R.id.quick_settings_background); mStatusBarBackground = findViewById(R.id.quick_settings_status_bar_background); mBackgroundGradient = findViewById(R.id.quick_settings_gradient_view); - mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings); + updateResources(); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); - setMargins(); } @Override @@ -103,10 +104,15 @@ public class QSContainerImpl extends FrameLayout { if (navBelow) { maxQs -= getResources().getDimensionPixelSize(R.dimen.navigation_bar_height); } + + int padding = mPaddingLeft + mPaddingRight + layoutParams.leftMargin + + layoutParams.rightMargin; + final int qsPanelWidthSpec = getChildMeasureSpec(widthMeasureSpec, padding, + layoutParams.width); // Measure with EXACTLY. That way, PagedTileLayout will only use excess height and will be // measured last, after other views and padding is accounted for. - mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(maxQs, MeasureSpec.EXACTLY)); - int width = mQSPanel.getMeasuredWidth(); + mQSPanel.measure(qsPanelWidthSpec, MeasureSpec.makeMeasureSpec(maxQs, MeasureSpec.EXACTLY)); + int width = mQSPanel.getMeasuredWidth() + padding; int height = layoutParams.topMargin + layoutParams.bottomMargin + mQSPanel.getMeasuredHeight() + getPaddingBottom(); super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), @@ -148,8 +154,18 @@ public class QSContainerImpl extends FrameLayout { LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams(); layoutParams.topMargin = mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.quick_qs_offset_height); - mQSPanel.setLayoutParams(layoutParams); + + mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings); + mContentPaddingStart = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin_start); + int newPaddingEnd = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin_end); + boolean marginsChanged = newPaddingEnd != mContentPaddingEnd; + mContentPaddingEnd = newPaddingEnd; + if (marginsChanged) { + updatePaddingsAndMargins(); + } } /** @@ -196,17 +212,32 @@ public class QSContainerImpl extends FrameLayout { updateExpansion(); } - private void setMargins() { - setMargins(mQSDetail); - setMargins(mBackground); - mQSPanel.setMargins(mSideMargins); - mHeader.setMargins(mSideMargins); - } - - private void setMargins(View view) { - FrameLayout.LayoutParams lp = (LayoutParams) view.getLayoutParams(); - lp.rightMargin = mSideMargins; - lp.leftMargin = mSideMargins; + private void updatePaddingsAndMargins() { + for (int i = 0; i < getChildCount(); i++) { + View view = getChildAt(i); + if (view == mStatusBarBackground || view == mBackgroundGradient + || view == mQSCustomizer) { + // Some views are always full width + continue; + } + LayoutParams lp = (LayoutParams) view.getLayoutParams(); + lp.rightMargin = mSideMargins; + lp.leftMargin = mSideMargins; + if (view == mQSPanel) { + // QS panel lays out some of its content full width + mQSPanel.setContentMargins(mContentPaddingStart, mContentPaddingEnd); + } else if (view == mHeader) { + // The header contains the QQS panel which needs to have special padding, to + // visually align them. + mHeader.setContentMargins(mContentPaddingStart, mContentPaddingEnd); + } else { + view.setPaddingRelative( + mContentPaddingStart, + view.getPaddingTop(), + mContentPaddingEnd, + view.getPaddingBottom()); + } + } } private int getDisplayHeight() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 48ba1b99d714..78448785fe2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -88,6 +88,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne private final H mHandler = new H(); private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private final QSTileRevealController mQsTileRevealController; + /** Whether or not the QS media player feature is enabled. */ + protected boolean mUsingMediaPlayer; protected boolean mExpanded; protected boolean mListening; @@ -102,6 +104,9 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne protected QSSecurityFooter mFooter; private PageIndicator mFooterPageIndicator; private boolean mGridContentVisible = true; + private int mContentMarginStart; + private int mContentMarginEnd; + private int mVisualTilePadding; protected QSTileLayout mTileLayout; @@ -122,6 +127,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne UiEventLogger uiEventLogger ) { super(context, attrs); + mUsingMediaPlayer = useQsMediaPlayer(context); mMediaHost = mediaHost; mContext = context; mQSLogger = qsLogger; @@ -170,8 +176,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne mMediaHost.init(MediaHierarchyManager.LOCATION_QS); ViewGroup hostView = mMediaHost.getHostView(); addView(hostView); - int sidePaddings = getResources().getDimensionPixelSize( - R.dimen.quick_settings_side_margins); int bottomPadding = getResources().getDimensionPixelSize( R.dimen.quick_settings_expanded_bottom_margin); MarginLayoutParams layoutParams = (MarginLayoutParams) hostView.getLayoutParams(); @@ -179,8 +183,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.bottomMargin = bottomPadding; hostView.setLayoutParams(layoutParams); - hostView.setPadding(sidePaddings, hostView.getPaddingTop(), sidePaddings, - hostView.getPaddingBottom()); + updateMediaHostContentMargins(); } protected void addDivider() { @@ -359,8 +362,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } public void updateResources() { - final Resources res = mContext.getResources(); - setPadding(0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_top), 0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); + int tileSize = getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size); + int tileBg = getResources().getDimensionPixelSize(R.dimen.qs_tile_background_size); + mVisualTilePadding = (int) ((tileSize - tileBg) / 2.0f); + updatePadding(); updatePageIndicator(); @@ -372,6 +377,14 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } + protected void updatePadding() { + final Resources res = mContext.getResources(); + setPaddingRelative(getPaddingStart(), + res.getDimensionPixelSize(R.dimen.qs_panel_padding_top), + getPaddingEnd(), + res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -723,17 +736,51 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne mFooter.showDeviceMonitoringDialog(); } - public void setMargins(int sideMargins) { - for (int i = 0; i < getChildCount(); i++) { - View view = getChildAt(i); - if (view != mTileLayout) { - LayoutParams lp = (LayoutParams) view.getLayoutParams(); - lp.leftMargin = sideMargins; - lp.rightMargin = sideMargins; - } + public void setContentMargins(int startMargin, int endMargin) { + // Only some views actually want this content padding, others want to go all the way + // to the edge like the brightness slider + mContentMarginStart = startMargin; + mContentMarginEnd = endMargin; + updateTileLayoutMargins(mContentMarginStart - mVisualTilePadding, + mContentMarginEnd - mVisualTilePadding); + updateMediaHostContentMargins(); + } + + /** + * Update the margins of all tile Layouts. + * + * @param visualMarginStart the visual start margin of the tile, adjusted for local insets + * to the tile. This can be set on a tileLayout + * @param visualMarginEnd the visual end margin of the tile, adjusted for local insets + * to the tile. This can be set on a tileLayout + */ + protected void updateTileLayoutMargins(int visualMarginStart, int visualMarginEnd) { + updateMargins((View) mTileLayout, visualMarginStart, visualMarginEnd); + } + + /** + * Update the margins of the media hosts + */ + protected void updateMediaHostContentMargins() { + if (mUsingMediaPlayer && mMediaHost != null) { + updateMargins(mMediaHost.getHostView(), mContentMarginStart, mContentMarginEnd); } } + /** + * Update the margins of a view. + * + * @param view the view to adjust + * @param start the start margin to set + * @param end the end margin to set + */ + protected void updateMargins(View view, int start, int end) { + LayoutParams lp = (LayoutParams) view.getLayoutParams(); + lp.setMarginStart(start); + lp.setMarginEnd(end); + view.setLayoutParams(lp); + } + public MediaHost getMediaHost() { return mMediaHost; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 75507beba7ae..191d4757258d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -62,8 +62,6 @@ public class QuickQSPanel extends QSPanel { private boolean mDisabledByPolicy; private int mMaxTiles; protected QSPanel mFullPanel; - /** Whether or not the QS media player feature is enabled. */ - private boolean mUsingMediaPlayer; /** Whether or not the QuickQSPanel currently contains a media player. */ private boolean mShowHorizontalTileLayout; private LinearLayout mHorizontalLinearLayout; @@ -97,8 +95,6 @@ public class QuickQSPanel extends QSPanel { } mMediaBottomMargin = getResources().getDimensionPixelSize( R.dimen.quick_settings_media_extra_bottom_margin); - - mUsingMediaPlayer = Utils.useQsMediaPlayer(context); if (mUsingMediaPlayer) { mHorizontalLinearLayout = new LinearLayout(mContext); mHorizontalLinearLayout.setOrientation(LinearLayout.HORIZONTAL); @@ -132,7 +128,6 @@ public class QuickQSPanel extends QSPanel { mHorizontalLinearLayout.setVisibility(useHorizontal ? View.VISIBLE : View.GONE); addView((View) mRegularTileLayout, 0); super.setPadding(0, 0, 0, 0); - applySideMargins(mHorizontalLinearLayout); applyBottomMargin((View) mRegularTileLayout); } else { sDefaultMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns); @@ -151,14 +146,6 @@ public class QuickQSPanel extends QSPanel { view.setLayoutParams(layoutParams); } - private void applySideMargins(View view) { - int margin = getResources().getDimensionPixelSize(R.dimen.qs_header_tile_margin_horizontal); - MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams(); - layoutParams.setMarginStart(margin); - layoutParams.setMarginEnd(margin); - view.setLayoutParams(layoutParams); - } - private void reAttachMediaHost() { if (mMediaHost == null) { return; @@ -177,10 +164,6 @@ public class QuickQSPanel extends QSPanel { layoutParams.width = horizontal ? 0 : ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.weight = horizontal ? 1.5f : 0; layoutParams.bottomMargin = mMediaBottomMargin; - int marginStart = horizontal - ? getResources().getDimensionPixelSize(R.dimen.qs_header_tile_margin_horizontal) - : 0; - layoutParams.setMarginStart(marginStart); } } @@ -194,11 +177,22 @@ public class QuickQSPanel extends QSPanel { mMediaHost.setShowsOnlyActiveMedia(true); mMediaHost.init(MediaHierarchyManager.LOCATION_QQS); reAttachMediaHost(); + updateMediaHostContentMargins(); + } + + @Override + protected void updateTileLayoutMargins(int visualMarginStart, int visualMarginEnd) { + if (mUsingMediaPlayer) { + updateMargins((View) mRegularTileLayout, visualMarginStart, visualMarginEnd); + updateMargins((View) mHorizontalTileLayout, visualMarginStart, 0); + } else { + updateMargins((View) mTileLayout, visualMarginStart, visualMarginEnd); + } } @Override - public void setPadding(int left, int top, int right, int bottom) { - // Always have no padding. + protected void updatePadding() { + // QS Panel is setting a top padding by default, which we don't need. } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 29b3436c0b72..20e47b2f2fa9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -42,6 +42,7 @@ import android.view.DisplayCutout; import android.view.View; import android.view.WindowInsets; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -143,6 +144,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements private boolean mHasTopCutout = false; private int mRoundedCornerPadding = 0; + private int mContentMarginStart; + private int mContentMarginEnd; + private int mWaterfallTopInset; + private int mCutOutPaddingLeft; + private int mCutOutPaddingRight; @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, @@ -422,33 +428,42 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { - // Handle padding of QuickStatusBarHeader - setPadding(mRoundedCornerPadding, getPaddingTop(), mRoundedCornerPadding, - getPaddingBottom()); - - // Handle padding of SystemIconsView + // Handle padding of the clock DisplayCutout cutout = insets.getDisplayCutout(); Pair<Integer, Integer> cornerCutoutPadding = StatusBarWindowView.cornerCutoutMargins( cutout, getDisplay()); Pair<Integer, Integer> padding = StatusBarWindowView.paddingNeededForCutoutAndRoundedCorner( - cutout, cornerCutoutPadding, mRoundedCornerPadding); - final int waterfallTopInset = cutout == null ? 0 : cutout.getWaterfallInsets().top; - int statusBarPaddingLeft = isLayoutRtl() - ? getResources().getDimensionPixelSize(R.dimen.status_bar_padding_end) - : getResources().getDimensionPixelSize(R.dimen.status_bar_padding_start); - int statusBarPaddingRight = isLayoutRtl() - ? getResources().getDimensionPixelSize(R.dimen.status_bar_padding_start) - : getResources().getDimensionPixelSize(R.dimen.status_bar_padding_end); - mSystemIconsView.setPadding( - Math.max(padding.first + statusBarPaddingLeft - mRoundedCornerPadding, 0), - waterfallTopInset, - Math.max(padding.second + statusBarPaddingRight - mRoundedCornerPadding, 0), - 0); - + cutout, cornerCutoutPadding, -1); + mCutOutPaddingLeft = padding.first; + mCutOutPaddingRight = padding.second; + mWaterfallTopInset = cutout == null ? 0 : cutout.getWaterfallInsets().top; + updateClockPadding(); return super.onApplyWindowInsets(insets); } + private void updateClockPadding() { + int clockPaddingLeft = 0; + int clockPaddingRight = 0; + // The clock might collide with cutouts, let's shift it out of the way. + // We only do that if the inset is bigger than our own padding, since it's nicer to + // align with + if (mCutOutPaddingLeft > 0) { + // if there's a cutout, let's use at least the rounded corner inset + int cutoutPadding = Math.max(mCutOutPaddingLeft, mRoundedCornerPadding); + int contentMarginLeft = isLayoutRtl() ? mContentMarginEnd : mContentMarginStart; + clockPaddingLeft = Math.max(cutoutPadding - contentMarginLeft, 0); + } + if (mCutOutPaddingRight > 0) { + // if there's a cutout, let's use at least the rounded corner inset + int cutoutPadding = Math.max(mCutOutPaddingRight, mRoundedCornerPadding); + int contentMarginRight = isLayoutRtl() ? mContentMarginStart : mContentMarginEnd; + clockPaddingRight = Math.max(cutoutPadding - contentMarginRight, 0); + } + + mSystemIconsView.setPadding(clockPaddingLeft, mWaterfallTopInset, clockPaddingRight, 0); + } + @Override @VisibleForTesting public void onDetachedFromWindow() { @@ -558,24 +573,27 @@ public class QuickStatusBarHeader extends RelativeLayout implements return color == Color.WHITE ? 0 : 1; } - public void setMargins(int sideMargins) { - for (int i = 0; i < getChildCount(); i++) { - View v = getChildAt(i); - // Prevents these views from getting set a margin. - // The Icon views all have the same padding set in XML to be aligned. - if (v == mSystemIconsView || v == mQuickQsStatusIcons || v == mHeaderQsPanel - || v == mHeaderTextContainerView) { - continue; - } - RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) v.getLayoutParams(); - lp.leftMargin = sideMargins; - lp.rightMargin = sideMargins; - } - } - @NonNull @Override public Lifecycle getLifecycle() { return mLifecycle; } + + public void setContentMargins(int marginStart, int marginEnd) { + mContentMarginStart = marginStart; + mContentMarginEnd = marginEnd; + for (int i = 0; i < getChildCount(); i++) { + View view = getChildAt(i); + if (view == mHeaderQsPanel) { + // QS panel doesn't lays out some of its content full width + mHeaderQsPanel.setContentMargins(marginStart, marginEnd); + } else { + MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams(); + lp.setMarginStart(marginStart); + lp.setMarginEnd(marginEnd); + view.setLayoutParams(lp); + } + } + updateClockPadding(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 098431658e6a..383c29d90a22 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -96,7 +96,6 @@ public class TileLayout extends ViewGroup implements QSTileLayout { mCellMarginHorizontal = res.getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal); mCellMarginVertical= res.getDimensionPixelSize(R.dimen.qs_tile_margin_vertical); mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top); - mSidePadding = res.getDimensionPixelOffset(R.dimen.qs_tile_layout_margin_side); mMaxAllowedRows = Math.max(1, getResources().getInteger(R.integer.quick_settings_max_rows)); if (mLessRows) mMaxAllowedRows = Math.max(1, mMaxAllowedRows - 1); if (mColumns != columns) { @@ -120,7 +119,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { mRows = (numTiles + mColumns - 1) / mColumns; } mCellWidth = - (availableWidth - mSidePadding * 2 - (mCellMarginHorizontal * mColumns)) / mColumns; + (availableWidth - (mCellMarginHorizontal * mColumns)) / mColumns; // Measure each QS tile. View previousView = this; @@ -204,7 +203,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { } protected int getColumnStart(int column) { - return getPaddingStart() + mSidePadding + mCellMarginHorizontal / 2 + + return getPaddingStart() + mCellMarginHorizontal / 2 + column * (mCellWidth + mCellMarginHorizontal); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index db7c6ad69d23..2863d08a75dc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -69,10 +69,14 @@ public class TileServices extends IQSService.Stub { mHost = host; mContext = mHost.getContext(); mBroadcastDispatcher = broadcastDispatcher; - mBroadcastDispatcher.registerReceiver(mRequestListeningReceiver, - new IntentFilter(TileService.ACTION_REQUEST_LISTENING)); mHandler = new Handler(looper); mMainHandler = new Handler(Looper.getMainLooper()); + mBroadcastDispatcher.registerReceiver( + mRequestListeningReceiver, + new IntentFilter(TileService.ACTION_REQUEST_LISTENING), + null, // Use the default Executor + UserHandle.ALL + ); } public Context getContext() { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 960c50129a56..3e268f63d65e 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -225,8 +225,8 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis res.getString(R.string.screenrecord_name)); String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE - ? res.getString(R.string.screenrecord_ongoing_screen_and_audio) - : res.getString(R.string.screenrecord_ongoing_screen_only); + ? res.getString(R.string.screenrecord_ongoing_screen_only) + : res.getString(R.string.screenrecord_ongoing_screen_and_audio); mRecordingNotificationBuilder = new Notification.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_screenrecord) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java index 752f4fddf24b..edbc3cfdece5 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java @@ -38,6 +38,7 @@ import java.nio.ByteBuffer; public class ScreenInternalAudioRecorder { private static String TAG = "ScreenAudioRecorder"; private static final int TIMEOUT = 500; + private static final float MIC_VOLUME_SCALE = 1.4f; private final Context mContext; private AudioRecord mAudioRecord; private AudioRecord mAudioRecordMic; @@ -148,6 +149,10 @@ public class ScreenInternalAudioRecorder { readShortsInternal = mAudioRecord.read(bufferInternal, 0, bufferInternal.length); readShortsMic = mAudioRecordMic.read(bufferMic, 0, bufferMic.length); + + // modify the volume + bufferMic = scaleValues(bufferMic, + readShortsMic, MIC_VOLUME_SCALE); readBytes = Math.min(readShortsInternal, readShortsMic) * 2; buffer = addAndConvertBuffers(bufferInternal, readShortsInternal, bufferMic, readShortsMic); @@ -168,6 +173,19 @@ public class ScreenInternalAudioRecorder { }); } + private short[] scaleValues(short[] buff, int len, float scale) { + for (int i = 0; i < len; i++) { + int oldValue = buff[i]; + int newValue = (int) (buff[i] * scale); + if (newValue > Short.MAX_VALUE) { + newValue = Short.MAX_VALUE; + } else if (newValue < Short.MIN_VALUE) { + newValue = Short.MIN_VALUE; + } + buff[i] = (short) (newValue); + } + return buff; + } private byte[] addAndConvertBuffers(short[] a1, int a1Limit, short[] a2, int a2Limit) { int size = Math.max(a1Limit, a2Limit); if (size < 0) return new byte[0]; diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java index c967648c544e..8551c88d133a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java @@ -55,9 +55,9 @@ import java.util.Date; */ public class ScreenMediaRecorder { private static final int TOTAL_NUM_TRACKS = 1; - private static final int VIDEO_BIT_RATE = 10000000; private static final int VIDEO_FRAME_RATE = 30; - private static final int AUDIO_BIT_RATE = 16; + private static final int VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO = 6; + private static final int AUDIO_BIT_RATE = 196000; private static final int AUDIO_SAMPLE_RATE = 44100; private static final int MAX_DURATION_MS = 60 * 60 * 1000; private static final long MAX_FILESIZE_BYTES = 5000000000L; @@ -108,7 +108,7 @@ public class ScreenMediaRecorder { // Set up audio source if (mAudioSource == MIC) { - mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); + mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); } mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); @@ -121,10 +121,13 @@ public class ScreenMediaRecorder { wm.getDefaultDisplay().getRealMetrics(metrics); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; + int refereshRate = (int) wm.getDefaultDisplay().getRefreshRate(); + int vidBitRate = screenHeight * screenWidth * refereshRate / VIDEO_FRAME_RATE + * VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoSize(screenWidth, screenHeight); - mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); - mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE); + mMediaRecorder.setVideoFrameRate(refereshRate); + mMediaRecorder.setVideoEncodingBitRate(vidBitRate); mMediaRecorder.setMaxDuration(MAX_DURATION_MS); mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java index abd7e7159260..d057a8a43c43 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java @@ -24,12 +24,9 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.NONE; import android.app.Activity; import android.app.PendingIntent; import android.os.Bundle; -import android.util.Log; import android.view.Gravity; -import android.view.View; import android.view.ViewGroup; import android.view.Window; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; @@ -88,8 +85,8 @@ public class ScreenRecordDialog extends Activity { }); mModes = new ArrayList<>(); - mModes.add(INTERNAL); mModes.add(MIC); + mModes.add(INTERNAL); mModes.add(MIC_AND_INTERNAL); mAudioSwitch = findViewById(R.id.screenrecord_audio_switch); diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java index 2e0e746594b4..3e78489e5707 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java @@ -88,12 +88,6 @@ public class ScreenRecordingAdapter extends ArrayAdapter<ScreenRecordingAudioSou return layout; } - private void setDescription(LinearLayout layout, int description) { - if (description != Resources.ID_NULL) { - ((TextView) layout.getChildAt(1)).setText(description); - } - } - @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { switch (getItem(position)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java index 9dcc187cb0ef..87612f15ed3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java @@ -52,7 +52,7 @@ public class AppOpsInfo extends LinearLayout implements NotificationGuts.GutsCon private NotificationGuts mGutsContainer; private OnClickListener mOnOk = v -> { - closeControls(v); + mGutsContainer.closeControls(v, false); }; public AppOpsInfo(Context context, AttributeSet attrs) { @@ -117,6 +117,7 @@ public class AppOpsInfo extends LinearLayout implements NotificationGuts.GutsCon }); TextView ok = findViewById(R.id.ok); ok.setOnClickListener(mOnOk); + ok.setAccessibilityDelegate(mGutsContainer.getAccessibilityDelegate()); } private String getPrompt() { @@ -160,19 +161,6 @@ public class AppOpsInfo extends LinearLayout implements NotificationGuts.GutsCon } } - private void closeControls(View v) { - mMetricsLogger.visibility(MetricsEvent.APP_OPS_GUTS, false); - int[] parentLoc = new int[2]; - int[] targetLoc = new int[2]; - mGutsContainer.getLocationOnScreen(parentLoc); - v.getLocationOnScreen(targetLoc); - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - final int x = targetLoc[0] - parentLoc[0] + centerX; - final int y = targetLoc[1] - parentLoc[1] + centerY; - mGutsContainer.closeControls(x, y, false, false); - } - @Override public void setGutsParent(NotificationGuts guts) { mGutsContainer = guts; @@ -200,6 +188,7 @@ public class AppOpsInfo extends LinearLayout implements NotificationGuts.GutsCon @Override public boolean handleCloseControls(boolean save, boolean force) { + mMetricsLogger.visibility(MetricsEvent.APP_OPS_GUTS, false); return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index f7ad50edb2f6..94e12e82f850 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1122,9 +1122,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } public void setGutsView(MenuItem item) { - if (mGuts != null && item.getGutsView() instanceof NotificationGuts.GutsContent) { - ((NotificationGuts.GutsContent) item.getGutsView()).setGutsParent(mGuts); - mGuts.setGutsContent((NotificationGuts.GutsContent) item.getGutsView()); + if (getGuts() != null && item.getGutsView() instanceof NotificationGuts.GutsContent) { + getGuts().setGutsContent((NotificationGuts.GutsContent) item.getGutsView()); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 9befa313edd8..e9d89589172e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -53,6 +53,7 @@ import android.transition.TransitionManager; import android.transition.TransitionSet; import android.util.AttributeSet; import android.util.Log; +import android.util.Slog; import android.view.LayoutInflater; import android.view.View; import android.view.accessibility.AccessibilityEvent; @@ -115,6 +116,7 @@ public class NotificationConversationInfo extends LinearLayout implements private OnSnoozeClickListener mOnSnoozeClickListener; private OnSettingsClickListener mOnSettingsClickListener; private NotificationGuts mGutsContainer; + private OnConversationSettingsClickListener mOnConversationSettingsClickListener; @VisibleForTesting boolean mSkipPost = false; @@ -137,13 +139,13 @@ public class NotificationConversationInfo extends LinearLayout implements mSelectedAction = ACTION_HOME; mShortcutManager.requestPinShortcut(mShortcutInfo, null); mShadeController.animateCollapsePanels(); - closeControls(v, true); + mGutsContainer.closeControls(v, true); }; private OnClickListener mOnSnoozeClick = v -> { mSelectedAction = ACTION_SNOOZE; mOnSnoozeClickListener.onClick(v, 1); - closeControls(v, true); + mGutsContainer.closeControls(v, true); }; */ @@ -164,7 +166,11 @@ public class NotificationConversationInfo extends LinearLayout implements private OnClickListener mOnDone = v -> { mPressedApply = true; - closeControls(v, true); + // If the user selected Priority, maybe show the priority onboarding + if (mSelectedAction == ACTION_FAVORITE && shouldShowPriorityOnboarding()) { + showPriorityOnboarding(); + } + mGutsContainer.closeControls(v, true); }; public NotificationConversationInfo(Context context, AttributeSet attrs) { @@ -175,6 +181,10 @@ public class NotificationConversationInfo extends LinearLayout implements void onClick(View v, NotificationChannel channel, int appUid); } + public interface OnConversationSettingsClickListener { + void onClick(); + } + public interface OnAppSettingsClickListener { void onClick(View v, Intent intent); } @@ -190,14 +200,6 @@ public class NotificationConversationInfo extends LinearLayout implements } mSelectedAction = selectedAction; - onSelectedActionChanged(); - } - - private void onSelectedActionChanged() { - // If the user selected Priority, maybe show the priority onboarding - if (mSelectedAction == ACTION_FAVORITE && shouldShowPriorityOnboarding()) { - showPriorityOnboarding(); - } } public void bindNotification( @@ -216,7 +218,8 @@ public class NotificationConversationInfo extends LinearLayout implements Provider<PriorityOnboardingDialogController.Builder> builderProvider, boolean isDeviceProvisioned, @Main Handler mainHandler, - @Background Handler bgHandler) { + @Background Handler bgHandler, + OnConversationSettingsClickListener onConversationSettingsClickListener) { mSelectedAction = -1; mINotificationManager = iNotificationManager; mVisualStabilityManager = visualStabilityManager; @@ -231,6 +234,7 @@ public class NotificationConversationInfo extends LinearLayout implements mDelegatePkg = mSbn.getOpPkg(); mIsDeviceProvisioned = isDeviceProvisioned; mOnSnoozeClickListener = onSnoozeClickListener; + mOnConversationSettingsClickListener = onConversationSettingsClickListener; mIconFactory = conversationIconFactory; mUserContext = userContext; mBubbleMetadata = bubbleMetadata; @@ -258,6 +262,7 @@ public class NotificationConversationInfo extends LinearLayout implements View done = findViewById(R.id.done); done.setOnClickListener(mOnDone); + done.setAccessibilityDelegate(mGutsContainer.getAccessibilityDelegate()); } private void bindActions() { @@ -322,7 +327,6 @@ public class NotificationConversationInfo extends LinearLayout implements ImageView image = findViewById(R.id.conversation_icon); image.setImageDrawable(mIconFactory.getConversationDrawable( mShortcutInfo, mPackageName, mAppUid, important)); - } private void bindPackage() { @@ -368,14 +372,11 @@ public class NotificationConversationInfo extends LinearLayout implements } } TextView groupNameView = findViewById(R.id.group_name); - View groupDivider = findViewById(R.id.group_divider); if (groupName != null) { groupNameView.setText(groupName); groupNameView.setVisibility(VISIBLE); - groupDivider.setVisibility(VISIBLE); } else { groupNameView.setVisibility(GONE); - groupDivider.setVisibility(GONE); } } @@ -523,9 +524,9 @@ public class NotificationConversationInfo extends LinearLayout implements boolean ignoreDnd = false; try { - ignoreDnd = (mINotificationManager - .getConsolidatedNotificationPolicy().priorityConversationSenders - & NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT) != 0; + ignoreDnd = mINotificationManager + .getConsolidatedNotificationPolicy().priorityConversationSenders == + NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT; } catch (RemoteException e) { Log.e(TAG, "Could not check conversation senders", e); } @@ -540,31 +541,14 @@ public class NotificationConversationInfo extends LinearLayout implements .setView(onboardingView) .setIgnoresDnd(ignoreDnd) .setShowsAsBubble(showAsBubble) + .setIcon(((ImageView) findViewById(R.id.conversation_icon)).getDrawable()) + .setOnSettingsClick(mOnConversationSettingsClickListener) .build(); controller.init(); controller.show(); } - /** - * Closes the controls and commits the updated importance values (indirectly). - * - * <p><b>Note,</b> this will only get called once the view is dismissing. This means that the - * user does not have the ability to undo the action anymore. - */ - @VisibleForTesting - void closeControls(View v, boolean save) { - int[] parentLoc = new int[2]; - int[] targetLoc = new int[2]; - mGutsContainer.getLocationOnScreen(parentLoc); - v.getLocationOnScreen(targetLoc); - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - final int x = targetLoc[0] - parentLoc[0] + centerX; - final int y = targetLoc[1] - parentLoc[1] + centerY; - mGutsContainer.closeControls(x, y, save, false /* force */); - } - @Override public void setGutsParent(NotificationGuts guts) { mGutsContainer = guts; @@ -634,8 +618,7 @@ public class NotificationConversationInfo extends LinearLayout implements try { switch (mAction) { case ACTION_FAVORITE: - mChannelToUpdate.setImportantConversation( - !mChannelToUpdate.isImportantConversation()); + mChannelToUpdate.setImportantConversation(true); if (mChannelToUpdate.isImportantConversation()) { mChannelToUpdate.setAllowBubbles(true); if (mAppBubble == BUBBLE_PREFERENCE_NONE) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java index c762b73a1648..eeac46a60ac8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java @@ -22,12 +22,14 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewAnimationUtils; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -59,6 +61,31 @@ public class NotificationGuts extends FrameLayout { private GutsContent mGutsContent; + private View.AccessibilityDelegate mGutsContentAccessibilityDelegate = + new View.AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo( + View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (super.performAccessibilityAction(host, action, args)) { + return true; + } + + switch (action) { + case AccessibilityNodeInfo.ACTION_LONG_CLICK: + closeControls(host, false); + return true; + } + + return false; + } + }; + public interface GutsContent { public void setGutsParent(NotificationGuts listener); @@ -110,6 +137,11 @@ public class NotificationGuts extends FrameLayout { * view on the lockscreen */ boolean needsFalsingProtection(); + + /** + * Equivalent to {@link View#setAccessibilityDelegate(AccessibilityDelegate)} + */ + void setAccessibilityDelegate(AccessibilityDelegate gutsContentAccessibilityDelegate); } public interface OnGutsClosedListener { @@ -146,6 +178,8 @@ public class NotificationGuts extends FrameLayout { } public void setGutsContent(GutsContent content) { + content.setGutsParent(this); + content.setAccessibilityDelegate(mGutsContentAccessibilityDelegate); mGutsContent = content; removeAllViews(); addView(mGutsContent.getContentView()); @@ -237,13 +271,29 @@ public class NotificationGuts extends FrameLayout { /** * Closes any exposed guts/views. + */ + public void closeControls(View eventSource, boolean save) { + int[] parentLoc = new int[2]; + int[] targetLoc = new int[2]; + getLocationOnScreen(parentLoc); + eventSource.getLocationOnScreen(targetLoc); + final int centerX = eventSource.getWidth() / 2; + final int centerY = eventSource.getHeight() / 2; + final int x = targetLoc[0] - parentLoc[0] + centerX; + final int y = targetLoc[1] - parentLoc[1] + centerY; + + closeControls(x, y, save, false); + } + + /** + * Closes any exposed guts/views. * * @param x x coordinate to animate the close circular reveal with * @param y y coordinate to animate the close circular reveal with * @param save whether the state should be saved * @param force whether the guts should be force-closed regardless of state. */ - public void closeControls(int x, int y, boolean save, boolean force) { + private void closeControls(int x, int y, boolean save, boolean force) { // First try to dismiss any blocking helper. boolean wasBlockingHelperDismissed = Dependency.get(NotificationBlockingHelperManager.class) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index a64dcdffff1e..1074adc3383d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -216,6 +216,11 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } } + private void startConversationSettingsActivity(int uid, ExpandableNotificationRow row) { + final Intent intent = new Intent(Settings.ACTION_CONVERSATION_SETTINGS); + mNotificationActivityStarter.startNotificationGutsIntent(intent, uid, row); + } + private boolean bindGuts(final ExpandableNotificationRow row) { row.ensureGutsInflated(); return bindGuts(row, mGutsMenuItem); @@ -438,6 +443,12 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx mListContainer.getSwipeActionHelper().snooze(sbn, hours); }; + final NotificationConversationInfo.OnConversationSettingsClickListener + onConversationSettingsListener = + () -> { + startConversationSettingsActivity(sbn.getUid(), row); + }; + if (!userHandle.equals(UserHandle.ALL) || mLockscreenUserManager.getCurrentUserId() == UserHandle.USER_SYSTEM) { onSettingsClick = (View v, NotificationChannel channel, int appUid) -> { @@ -468,7 +479,8 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx mBuilderProvider, mDeviceProvisionedController.isDeviceProvisioned(), mMainHandler, - mBgHandler); + mBgHandler, + onConversationSettingsListener); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 334599930b63..a131ebef77db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -141,7 +141,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G // used by standard ui private OnClickListener mOnDismissSettings = v -> { mPressedApply = true; - closeControls(v, true); + mGutsContainer.closeControls(v, true); }; public NotificationInfo(Context context, AttributeSet attrs) { @@ -250,7 +250,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G View done = findViewById(R.id.done); done.setOnClickListener(mOnDismissSettings); - + done.setAccessibilityDelegate(mGutsContainer.getAccessibilityDelegate()); View silent = findViewById(R.id.silence); View alert = findViewById(R.id.alert); @@ -330,7 +330,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mUniqueChannelsInRow, mPkgIcon, mOnSettingsClickListener); mChannelEditorDialogController.setOnFinishListener(() -> { mPresentingChannelEditorDialog = false; - closeControls(this, false); + mGutsContainer.closeControls(this, false); }); mChannelEditorDialogController.show(); } @@ -375,14 +375,11 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } TextView groupNameView = findViewById(R.id.group_name); - View divider = findViewById(R.id.group_divider); if (groupName != null) { groupNameView.setText(groupName); groupNameView.setVisibility(VISIBLE); - divider.setVisibility(VISIBLE); } else { groupNameView.setVisibility(GONE); - divider.setVisibility(GONE); } } @@ -531,25 +528,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G return intent; } - /** - * Closes the controls and commits the updated importance values (indirectly). - * - * <p><b>Note,</b> this will only get called once the view is dismissing. This means that the - * user does not have the ability to undo the action anymore. - */ - @VisibleForTesting - void closeControls(View v, boolean save) { - int[] parentLoc = new int[2]; - int[] targetLoc = new int[2]; - mGutsContainer.getLocationOnScreen(parentLoc); - v.getLocationOnScreen(targetLoc); - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - final int x = targetLoc[0] - parentLoc[0] + centerX; - final int y = targetLoc[1] - parentLoc[1] + centerY; - mGutsContainer.closeControls(x, y, save, false /* force */); - } - @Override public void setGutsParent(NotificationGuts guts) { mGutsContainer = guts; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java index cde3dfd66aaf..1ffb244b51c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java @@ -380,16 +380,8 @@ public class NotificationSnooze extends LinearLayout private void undoSnooze(View v) { mSelectedOption = null; - int[] parentLoc = new int[2]; - int[] targetLoc = new int[2]; - mGutsContainer.getLocationOnScreen(parentLoc); - v.getLocationOnScreen(targetLoc); - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - final int x = targetLoc[0] - parentLoc[0] + centerX; - final int y = targetLoc[1] - parentLoc[1] + centerY; showSnoozeOptions(false); - mGutsContainer.closeControls(x, y, false /* save */, false /* force */); + mGutsContainer.closeControls(v, false); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java index ea059cbcf3e1..f1fe54ad4024 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java @@ -89,7 +89,7 @@ public class PartialConversationInfo extends LinearLayout implements private OnClickListener mOnDone = v -> { mPressedApply = true; - closeControls(v, true); + mGutsContainer.closeControls(v, true); }; public PartialConversationInfo(Context context, AttributeSet attrs) { @@ -132,6 +132,7 @@ public class PartialConversationInfo extends LinearLayout implements View done = findViewById(R.id.done); done.setOnClickListener(mOnDone); + done.setAccessibilityDelegate(mGutsContainer.getAccessibilityDelegate()); } private void bindActions() { @@ -172,7 +173,7 @@ public class PartialConversationInfo extends LinearLayout implements mUniqueChannelsInRow, mPkgIcon, mOnSettingsClickListener); mChannelEditorDialogController.setOnFinishListener(() -> { mPresentingChannelEditorDialog = false; - closeControls(this, false); + mGutsContainer.closeControls(this, false); }); mChannelEditorDialogController.show(); } @@ -240,7 +241,6 @@ public class PartialConversationInfo extends LinearLayout implements } catch (PackageManager.NameNotFoundException e) { mPkgIcon = mPm.getDefaultActivityIcon(); } - ((TextView) findViewById(R.id.pkg_name)).setText(mAppName); } private void bindDelegate() { @@ -269,14 +269,11 @@ public class PartialConversationInfo extends LinearLayout implements } } TextView groupNameView = findViewById(R.id.group_name); - View groupDivider = findViewById(R.id.group_divider); if (groupName != null) { groupNameView.setText(groupName); groupNameView.setVisibility(VISIBLE); - groupDivider.setVisibility(VISIBLE); } else { groupNameView.setVisibility(GONE); - groupDivider.setVisibility(GONE); } } @@ -320,25 +317,6 @@ public class PartialConversationInfo extends LinearLayout implements } } - /** - * Closes the controls and commits the updated importance values (indirectly). - * - * <p><b>Note,</b> this will only get called once the view is dismissing. This means that the - * user does not have the ability to undo the action anymore. - */ - @VisibleForTesting - void closeControls(View v, boolean save) { - int[] parentLoc = new int[2]; - int[] targetLoc = new int[2]; - mGutsContainer.getLocationOnScreen(parentLoc); - v.getLocationOnScreen(targetLoc); - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - final int x = targetLoc[0] - parentLoc[0] + centerX; - final int y = targetLoc[1] - parentLoc[1] + centerY; - mGutsContainer.closeControls(x, y, save, false /* force */); - } - @Override public void setGutsParent(NotificationGuts guts) { mGutsContainer = guts; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt index d1b405256f39..88c325880241 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PriorityOnboardingDialogController.kt @@ -21,19 +21,21 @@ import android.content.Context import android.graphics.Color import android.graphics.PixelFormat import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.text.SpannableStringBuilder +import android.text.style.BulletSpan import android.view.Gravity import android.view.View -import android.view.View.GONE import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.Window import android.view.WindowInsets.Type.statusBars import android.view.WindowManager -import android.widget.LinearLayout +import android.widget.ImageView import android.widget.TextView import com.android.systemui.Prefs import com.android.systemui.R -import java.lang.IllegalStateException +import com.android.systemui.statusbar.notification.row.NotificationConversationInfo.OnConversationSettingsClickListener import javax.inject.Inject /** @@ -43,7 +45,9 @@ class PriorityOnboardingDialogController @Inject constructor( val view: View, val context: Context, val ignoresDnd: Boolean, - val showsAsBubble: Boolean + val showsAsBubble: Boolean, + val icon : Drawable, + val onConversationSettingsClickListener : OnConversationSettingsClickListener ) { private lateinit var dialog: Dialog @@ -62,11 +66,21 @@ class PriorityOnboardingDialogController @Inject constructor( dialog.dismiss() } + private fun settings() { + // Log that the user has seen the onboarding + Prefs.putBoolean(context, Prefs.Key.HAS_SEEN_PRIORITY_ONBOARDING, true) + dialog.dismiss() + onConversationSettingsClickListener?.onClick() + } + class Builder @Inject constructor() { private lateinit var view: View private lateinit var context: Context private var ignoresDnd = false private var showAsBubble = false + private lateinit var icon: Drawable + private lateinit var onConversationSettingsClickListener + : OnConversationSettingsClickListener fun setView(v: View): Builder { view = v @@ -88,9 +102,20 @@ class PriorityOnboardingDialogController @Inject constructor( return this } + fun setIcon(draw : Drawable) : Builder { + icon = draw + return this + } + + fun setOnSettingsClick(onClick : OnConversationSettingsClickListener) : Builder { + onConversationSettingsClickListener = onClick + return this + } + fun build(): PriorityOnboardingDialogController { val controller = PriorityOnboardingDialogController( - view, context, ignoresDnd, showAsBubble) + view, context, ignoresDnd, showAsBubble, icon, + onConversationSettingsClickListener) return controller } } @@ -113,13 +138,32 @@ class PriorityOnboardingDialogController @Inject constructor( done() } - if (!ignoresDnd) { - findViewById<LinearLayout>(R.id.ignore_dnd_tip).visibility = GONE + findViewById<TextView>(R.id.settings_button)?.setOnClickListener { + settings() } - if (!showsAsBubble) { - findViewById<LinearLayout>(R.id.floating_bubble_tip).visibility = GONE + findViewById<ImageView>(R.id.conversation_icon)?.setImageDrawable(icon) + + val gapWidth = dialog.context.getResources().getDimensionPixelSize( + R.dimen.conversation_onboarding_bullet_gap_width) + val description = SpannableStringBuilder() + description.append(context.getText(R.string.priority_onboarding_show_at_top_text), + BulletSpan(gapWidth), /* flags */0) + description.append(System.lineSeparator()) + description.append(context.getText(R.string.priority_onboarding_show_avatar_text), + BulletSpan(gapWidth), /* flags */0) + if (showsAsBubble) { + description.append(System.lineSeparator()) + description.append(context.getText( + R.string.priority_onboarding_appear_as_bubble_text), + BulletSpan(gapWidth), /* flags */0) + } + if (ignoresDnd) { + description.append(System.lineSeparator()) + description.append(context.getText(R.string.priority_onboarding_ignores_dnd_text), + BulletSpan(gapWidth), /* flags */0) } + findViewById<TextView>(R.id.behaviors).setText(description) window?.apply { setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) @@ -129,7 +173,7 @@ class PriorityOnboardingDialogController @Inject constructor( attributes = attributes.apply { format = PixelFormat.TRANSLUCENT - title = ChannelEditorDialogController::class.java.simpleName + title = PriorityOnboardingDialogController::class.java.simpleName gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL fitInsetsTypes = attributes.fitInsetsTypes and statusBars().inv() width = MATCH_PARENT diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 46c873db8a08..4337e20c0a39 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -40,6 +40,7 @@ import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.ReverseLinearLayout.ReverseRelativeLayout; import com.android.systemui.statusbar.policy.KeyButtonView; +import java.io.PrintWriter; import java.util.Objects; public class NavigationBarInflaterView extends FrameLayout @@ -469,4 +470,10 @@ public class NavigationBarInflaterView extends FrameLayout private static float convertDpToPx(Context context, float dp) { return dp * context.getResources().getDisplayMetrics().density; } + + public void dump(PrintWriter pw) { + pw.println("NavigationBarInflaterView {"); + pw.println(" mCurrentLayout: " + mCurrentLayout); + pw.println(" }"); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 2978772cac5e..6b37ac317cdd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -1198,6 +1198,9 @@ public class NavigationBarView extends FrameLayout implements pw.println(" }"); + if (mNavigationInflaterView != null) { + mNavigationInflaterView.dump(pw); + } mContextualButtonGroup.dump(pw); mRecentsOnboarding.dump(pw); mRegionSamplingHelper.dump(pw); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index 2fc3d72c2672..53ed4cf12b2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -18,13 +18,22 @@ package com.android.systemui.qs.external; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.ComponentName; +import android.content.IntentFilter; import android.os.Handler; import android.os.Looper; +import android.os.UserHandle; import android.service.quicksettings.Tile; +import android.service.quicksettings.TileService; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -50,7 +59,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -99,7 +107,7 @@ public class TileServicesTest extends SysuiTestCase { mTunerService, () -> mAutoTileManager, mDumpManager, - mBroadcastDispatcher, + mock(BroadcastDispatcher.class), Optional.of(mStatusBar), mQSLogger, mUiEventLogger); @@ -113,6 +121,14 @@ public class TileServicesTest extends SysuiTestCase { } @Test + public void testActiveTileListenerRegisteredOnAllUsers() { + ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class); + verify(mBroadcastDispatcher).registerReceiver(any(), captor.capture(), any(), eq( + UserHandle.ALL)); + assertTrue(captor.getValue().hasAction(TileService.ACTION_REQUEST_LISTENING)); + } + + @Test public void testRecalculateBindAllowance() { // Add some fake tiles. for (int i = 0; i < NUM_FAKES; i++) { @@ -125,10 +141,9 @@ public class TileServicesTest extends SysuiTestCase { } mTileService.recalculateBindAllowance(); for (int i = 0; i < NUM_FAKES; i++) { - Mockito.verify(mManagers.get(i), Mockito.times(1)).calculateBindPriority( - Mockito.anyLong()); + verify(mManagers.get(i), times(1)).calculateBindPriority(anyLong()); ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class); - Mockito.verify(mManagers.get(i), Mockito.times(1)).setBindAllowed(captor.capture()); + verify(mManagers.get(i), times(1)).setBindAllowed(captor.capture()); assertEquals("" + i + "th service", i >= (NUM_FAKES - TileServices.DEFAULT_MAX_BOUND), (boolean) captor.getValue()); @@ -142,7 +157,7 @@ public class TileServicesTest extends SysuiTestCase { for (int i = 0; i < NUM_FAKES; i++) { ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class); - Mockito.verify(mManagers.get(i), Mockito.times(2)).setBindAllowed(captor.capture()); + verify(mManagers.get(i), times(2)).setBindAllowed(captor.capture()); assertEquals("" + i + "th service", i >= (NUM_FAKES - TileServices.REDUCED_MAX_BOUND), (boolean) captor.getValue()); @@ -158,12 +173,12 @@ public class TileServicesTest extends SysuiTestCase { for (int i = 0; i < TileServices.DEFAULT_MAX_BOUND - 1; i++) { // Shouldn't get bind prioirities calculated when there are less than the max services. - Mockito.verify(mManagers.get(i), Mockito.never()).calculateBindPriority( - Mockito.anyLong()); + verify(mManagers.get(i), never()).calculateBindPriority( + anyLong()); // All should be bound since there are less than the max services. ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class); - Mockito.verify(mManagers.get(i), Mockito.times(1)).setBindAllowed(captor.capture()); + verify(mManagers.get(i), times(1)).setBindAllowed(captor.capture()); assertTrue(captor.getValue()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/AppOpsInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/AppOpsInfoTest.java index dd5cb585d0aa..ec73a7571969 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/AppOpsInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/AppOpsInfoTest.java @@ -144,7 +144,7 @@ public class AppOpsInfoTest extends SysuiTestCase { final View okButton = mAppOpsInfo.findViewById(R.id.ok); okButton.performClick(); assertEquals(1, latch.getCount()); - verify(mGutsParent, times(1)).closeControls(anyInt(), anyInt(), anyBoolean(), anyBoolean()); + verify(mGutsParent, times(1)).closeControls(eq(okButton), anyBoolean()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java index 0272028e62fc..4122cf5466e2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java @@ -173,7 +173,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { doAnswer((Answer<Object>) invocation -> { mNotificationInfo.handleCloseControls(true, false); return null; - }).when(mNotificationGuts).closeControls(anyInt(), anyInt(), eq(true), eq(false)); + }).when(mNotificationGuts).closeControls(any(View.class), eq(true)); // Our view is never attached to a window so the View#post methods in NotificationInfo never // get called. Setting this will skip the post and do the action immediately. mNotificationInfo.mSkipPost = true; @@ -256,7 +256,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final ImageView view = mNotificationInfo.findViewById(R.id.conversation_icon); assertEquals(mIconDrawable, view.getDrawable()); } @@ -280,7 +280,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final TextView textView = mNotificationInfo.findViewById(R.id.pkg_name); assertTrue(textView.getText().toString().contains("App Name")); assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility()); @@ -331,12 +331,11 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final TextView textView = mNotificationInfo.findViewById(R.id.group_name); assertTrue(textView.getText().toString().contains(group.getName())); assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility()); assertEquals(VISIBLE, textView.getVisibility()); - assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.group_divider).getVisibility()); } @Test @@ -357,11 +356,10 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final TextView textView = mNotificationInfo.findViewById(R.id.group_name); assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility()); assertEquals(GONE, textView.getVisibility()); - assertEquals(GONE, mNotificationInfo.findViewById(R.id.group_divider).getVisibility()); } @Test @@ -382,7 +380,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name); assertEquals(GONE, nameView.getVisibility()); } @@ -417,7 +415,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name); assertEquals(VISIBLE, nameView.getVisibility()); assertTrue(nameView.getText().toString().contains("Proxied")); @@ -445,7 +443,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final View settingsButton = mNotificationInfo.findViewById(R.id.info); settingsButton.performClick(); @@ -471,7 +469,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); final View settingsButton = mNotificationInfo.findViewById(R.id.info); assertTrue(settingsButton.getVisibility() != View.VISIBLE); } @@ -498,7 +496,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, false, mTestHandler, - mTestHandler); + mTestHandler, null); final View settingsButton = mNotificationInfo.findViewById(R.id.info); assertTrue(settingsButton.getVisibility() != View.VISIBLE); } @@ -523,7 +521,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View view = mNotificationInfo.findViewById(R.id.silence); assertThat(view.isSelected()).isTrue(); } @@ -551,7 +549,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View view = mNotificationInfo.findViewById(R.id.default_behavior); assertThat(view.isSelected()).isTrue(); assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo( @@ -582,7 +580,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View view = mNotificationInfo.findViewById(R.id.default_behavior); assertThat(view.isSelected()).isTrue(); assertThat(((TextView) view.findViewById(R.id.default_summary)).getText()).isEqualTo( @@ -612,7 +610,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View fave = mNotificationInfo.findViewById(R.id.priority); fave.performClick(); @@ -656,7 +654,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); mNotificationInfo.findViewById(R.id.default_behavior).performClick(); mTestableLooper.processAllMessages(); @@ -699,7 +697,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View silence = mNotificationInfo.findViewById(R.id.silence); @@ -743,7 +741,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View fave = mNotificationInfo.findViewById(R.id.priority); fave.performClick(); @@ -780,7 +778,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View fave = mNotificationInfo.findViewById(R.id.priority); fave.performClick(); @@ -795,6 +793,45 @@ public class NotificationConversationInfoTest extends SysuiTestCase { } @Test + public void testFavorite_thenDefaultThenFavorite_andSave_nothingChanged() throws Exception { + mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH); + mConversationChannel.setImportance(IMPORTANCE_HIGH); + mConversationChannel.setImportantConversation(true); + + mNotificationInfo.bindNotification( + mShortcutManager, + mMockPackageManager, + mMockINotificationManager, + mVisualStabilityManager, + TEST_PACKAGE_NAME, + mNotificationChannel, + mEntry, + mBubbleMetadata, + null, + null, + mIconFactory, + mContext, + mBuilderProvider, + true, + mTestHandler, + mTestHandler, null); + + View fave = mNotificationInfo.findViewById(R.id.priority); + fave.performClick(); + mNotificationInfo.findViewById(R.id.default_behavior).performClick(); + fave.performClick(); + mNotificationInfo.findViewById(R.id.done).performClick(); + mTestableLooper.processAllMessages(); + + ArgumentCaptor<NotificationChannel> captor = + ArgumentCaptor.forClass(NotificationChannel.class); + verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage( + anyString(), anyInt(), captor.capture()); + assertEquals(IMPORTANCE_HIGH, captor.getValue().getImportance()); + assertTrue(captor.getValue().isImportantConversation()); + } + + @Test public void testDefault_andSave() throws Exception { mConversationChannel.setAllowBubbles(true); mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH); @@ -815,7 +852,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); mNotificationInfo.findViewById(R.id.default_behavior).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); @@ -851,7 +888,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); mNotificationInfo.findViewById(R.id.default_behavior).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); @@ -887,7 +924,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); mNotificationInfo.findViewById(R.id.default_behavior).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); @@ -922,7 +959,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); View silence = mNotificationInfo.findViewById(R.id.silence); silence.performClick(); @@ -956,7 +993,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); verify(mMockINotificationManager, times(1)).createConversationNotificationChannelForPackage( anyString(), anyInt(), anyString(), any(), eq(CONVERSATION_ID)); @@ -981,7 +1018,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { mBuilderProvider, true, mTestHandler, - mTestHandler); + mTestHandler, null); verify(mMockINotificationManager, never()).createConversationNotificationChannelForPackage( anyString(), anyInt(), anyString(), any(), eq(CONVERSATION_ID)); @@ -1016,10 +1053,14 @@ public class NotificationConversationInfoTest extends SysuiTestCase { () -> b, true, mTestHandler, - mTestHandler); + mTestHandler, null); // WHEN user clicks "priority" mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE); + verify(controller, never()).show(); + + // and then done + mNotificationInfo.findViewById(R.id.done).performClick(); // THEN the user is presented with the priority onboarding screen verify(controller, atLeastOnce()).show(); @@ -1052,7 +1093,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { () -> b, true, mTestHandler, - mTestHandler); + mTestHandler, null); // WHEN user clicks "priority" mNotificationInfo.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java index 8ee86a237e32..6bf60721cd8e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java @@ -236,8 +236,6 @@ public class NotificationInfoTest extends SysuiTestCase { true); final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name); assertEquals(GONE, nameView.getVisibility()); - final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider); - assertEquals(GONE, dividerView.getVisibility()); } @Test @@ -288,8 +286,6 @@ public class NotificationInfoTest extends SysuiTestCase { true); final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name); assertEquals(GONE, groupNameView.getVisibility()); - final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider); - assertEquals(GONE, dividerView.getVisibility()); } @Test @@ -317,8 +313,6 @@ public class NotificationInfoTest extends SysuiTestCase { final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name); assertEquals(View.VISIBLE, groupNameView.getVisibility()); assertEquals("Test Group Name", groupNameView.getText()); - final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider); - assertEquals(View.VISIBLE, dividerView.getVisibility()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java index 545b59a4556a..f327967ebd73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java @@ -161,25 +161,6 @@ public class PartialConversationInfoTest extends SysuiTestCase { } @Test - public void testBindNotification_SetsTextApplicationName() throws Exception { - when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); - mInfo.bindNotification( - mMockPackageManager, - mMockINotificationManager, - mChannelEditorDialogController, - TEST_PACKAGE_NAME, - mNotificationChannel, - mNotificationChannelSet, - mEntry, - null, - true, - false); - final TextView textView = mInfo.findViewById(R.id.pkg_name); - assertTrue(textView.getText().toString().contains("App Name")); - assertEquals(VISIBLE, mInfo.findViewById(R.id.header).getVisibility()); - } - - @Test public void testBindNotification_SetsName() { mInfo.bindNotification( mMockPackageManager, @@ -259,8 +240,6 @@ public class PartialConversationInfoTest extends SysuiTestCase { false); final TextView nameView = mInfo.findViewById(R.id.delegate_name); assertEquals(GONE, nameView.getVisibility()); - final TextView dividerView = mInfo.findViewById(R.id.group_divider); - assertEquals(GONE, dividerView.getVisibility()); } @Test @@ -305,8 +284,6 @@ public class PartialConversationInfoTest extends SysuiTestCase { false); final TextView groupNameView = mInfo.findViewById(R.id.group_name); assertEquals(GONE, groupNameView.getVisibility()); - final TextView dividerView = mInfo.findViewById(R.id.group_divider); - assertEquals(GONE, dividerView.getVisibility()); } @Test @@ -331,8 +308,6 @@ public class PartialConversationInfoTest extends SysuiTestCase { final TextView groupNameView = mInfo.findViewById(R.id.group_name); assertEquals(View.VISIBLE, groupNameView.getVisibility()); assertEquals("Test Group Name", groupNameView.getText()); - final TextView dividerView = mInfo.findViewById(R.id.group_divider); - assertEquals(View.VISIBLE, dividerView.getVisibility()); } @Test diff --git a/packages/Tethering/src/android/net/ip/IpServer.java b/packages/Tethering/src/android/net/ip/IpServer.java index f08429bb0696..3fd9ee9a330b 100644 --- a/packages/Tethering/src/android/net/ip/IpServer.java +++ b/packages/Tethering/src/android/net/ip/IpServer.java @@ -730,12 +730,7 @@ public class IpServer extends StateMachine { final String upstreamIface = v6only.getInterfaceName(); params = new RaParams(); - // When BPF offload is enabled, we advertise an mtu lower by 16, which is the closest - // multiple of 8 >= 14, the ethernet header size. This makes kernel ebpf tethering - // offload happy. This hack should be reverted once we have the kernel fixed up. - // Note: this will automatically clamp to at least 1280 (ipv6 minimum mtu) - // see RouterAdvertisementDaemon.java putMtu() - params.mtu = mUsingBpfOffload ? v6only.getMtu() - 16 : v6only.getMtu(); + params.mtu = v6only.getMtu(); params.hasDefaultRoute = v6only.hasIpv6DefaultRoute(); if (params.hasDefaultRoute) params.hopLimit = getHopLimit(upstreamIface, ttlAdjustment); diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java index e095afea52ca..d084ca0966e8 100644 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java +++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java @@ -17,8 +17,10 @@ package com.android.networkstack.tethering; import static android.Manifest.permission.ACCESS_NETWORK_STATE; +import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.TETHER_PRIVILEGED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION; import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION; import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; @@ -240,15 +242,26 @@ public class TetheringService extends Service { return false; } + private boolean hasNetworkStackPermission() { + return checkCallingOrSelfPermission(NETWORK_STACK) + || checkCallingOrSelfPermission(PERMISSION_MAINLINE_NETWORK_STACK); + } + private boolean hasTetherPrivilegedPermission() { - return mService.checkCallingOrSelfPermission(TETHER_PRIVILEGED) == PERMISSION_GRANTED; + return checkCallingOrSelfPermission(TETHER_PRIVILEGED); + } + + private boolean checkCallingOrSelfPermission(final String permission) { + return mService.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED; } private boolean hasTetherChangePermission(final String callerPkg, final boolean onlyAllowPrivileged) { + if (onlyAllowPrivileged && !hasNetworkStackPermission()) return false; + if (hasTetherPrivilegedPermission()) return true; - if (onlyAllowPrivileged || mTethering.isTetherProvisioningRequired()) return false; + if (mTethering.isTetherProvisioningRequired()) return false; int uid = Binder.getCallingUid(); // If callerPkg's uid is not same as Binder.getCallingUid(), diff --git a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java index 2fb7e607d0af..74df11370e50 100644 --- a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java +++ b/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java @@ -339,7 +339,7 @@ public class EthernetTetheringTest { private MyTetheringEventCallback enableEthernetTethering(String iface) throws Exception { return enableEthernetTethering(iface, new TetheringRequest.Builder(TETHERING_ETHERNET) - .setExemptFromEntitlementCheck(true).build()); + .setShouldShowEntitlementUi(false).build()); } private int getMTU(TestNetworkInterface iface) throws SocketException { @@ -510,7 +510,7 @@ public class EthernetTetheringTest { LinkAddress clientAddr = client == null ? null : new LinkAddress(client); return new TetheringRequest.Builder(TETHERING_ETHERNET) .setStaticIpv4Addresses(localAddr, clientAddr) - .setExemptFromEntitlementCheck(true).build(); + .setShouldShowEntitlementUi(false).build(); } private void assertInvalidStaticIpv4Request(String iface, String local, String client) diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java index f4a566659896..22d894bf471e 100644 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java +++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java @@ -274,21 +274,32 @@ public final class TetheringServiceTest { }); } + private void runStartTetheringAndVerifyNoPermission(final TestTetheringResult result) + throws Exception { + final TetheringRequestParcel request = new TetheringRequestParcel(); + request.tetheringType = TETHERING_WIFI; + request.exemptFromEntitlementCheck = true; + mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result); + result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); + verifyNoMoreInteractionsForTethering(); + } + @Test - public void testStartTetheringWithExemptFromEntitlementCheck() throws Exception { + public void testFailToBypassEntitlementWithoutNeworkStackPermission() throws Exception { final TetheringRequestParcel request = new TetheringRequestParcel(); request.tetheringType = TETHERING_WIFI; request.exemptFromEntitlementCheck = true; + runAsNoPermission((result) -> { + runStartTetheringAndVerifyNoPermission(result); + }); + runAsTetherPrivileged((result) -> { - runStartTethering(result, request); - verifyNoMoreInteractionsForTethering(); + runStartTetheringAndVerifyNoPermission(result); }); runAsWriteSettings((result) -> { - mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); + runStartTetheringAndVerifyNoPermission(result); }); } diff --git a/samples/demo/haptic-assessment/Android.bp b/samples/demo/haptic-assessment/Android.bp new file mode 100644 index 000000000000..1c006091a755 --- /dev/null +++ b/samples/demo/haptic-assessment/Android.bp @@ -0,0 +1,34 @@ +// +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +android_app { + name: "HapticAssessment", + manifest: "AndroidManifest.xml", + sdk_version: "current", + min_sdk_version: "29", + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], + static_libs: [ + "androidx.appcompat_appcompat", + "androidx-constraintlayout_constraintlayout", + ], + resource_dirs: [ + "res", + ], + dxflags: ["--multi-dex"], +}
\ No newline at end of file diff --git a/samples/demo/haptic-assessment/AndroidManifest.xml b/samples/demo/haptic-assessment/AndroidManifest.xml new file mode 100644 index 000000000000..251646eb975e --- /dev/null +++ b/samples/demo/haptic-assessment/AndroidManifest.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.hapticassessment"> + + <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="30"/> + + <uses-permission android:name="android.permission.VIBRATE" /> + + <application + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:theme="@style/AppTheme"> + <activity android:name=".MainActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + +</manifest>
\ No newline at end of file diff --git a/samples/demo/haptic-assessment/README.txt b/samples/demo/haptic-assessment/README.txt new file mode 100644 index 000000000000..8b84cd8c6807 --- /dev/null +++ b/samples/demo/haptic-assessment/README.txt @@ -0,0 +1,13 @@ +README +====== + +This haptic assessment sample app allows the user to play with three different +types of VibrationEffects: + +1) Predefined click effect with default strength. + +2) One shot vibration with 20ms duration at max amplitude. + +3) Waveform vibration with 500ms duration at half amplitude, then 500ms duration + at max amplitude. This will pass if the device supports vibration amplitude + control, and visibly fail otherwise. diff --git a/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml b/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000000..134813eb4d68 --- /dev/null +++ b/samples/demo/haptic-assessment/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,46 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> + <aapt:attr name="android:fillColor"> + <gradient + android:endX="85.84757" + android:endY="92.4963" + android:startX="42.9492" + android:startY="49.59793" + android:type="linear"> + <item + android:color="#44000000" + android:offset="0.0" /> + <item + android:color="#00000000" + android:offset="1.0" /> + </gradient> + </aapt:attr> + </path> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector>
\ No newline at end of file diff --git a/samples/demo/haptic-assessment/res/drawable/bluebar.png b/samples/demo/haptic-assessment/res/drawable/bluebar.png Binary files differnew file mode 100644 index 000000000000..ae163df4295a --- /dev/null +++ b/samples/demo/haptic-assessment/res/drawable/bluebar.png diff --git a/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif b/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif Binary files differnew file mode 100644 index 000000000000..cf3561757e38 --- /dev/null +++ b/samples/demo/haptic-assessment/res/drawable/cross_60x60.gif diff --git a/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml b/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000000..5634f725f245 --- /dev/null +++ b/samples/demo/haptic-assessment/res/drawable/ic_launcher_background.xml @@ -0,0 +1,185 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillColor="#3DDC84" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> +</vector> diff --git a/samples/demo/haptic-assessment/res/layout/activity_main.xml b/samples/demo/haptic-assessment/res/layout/activity_main.xml new file mode 100644 index 000000000000..47d45a60a6a4 --- /dev/null +++ b/samples/demo/haptic-assessment/res/layout/activity_main.xml @@ -0,0 +1,93 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MainActivity"> + + <Button + android:id="@+id/click_effect_button" + android:layout_width="@dimen/button_width" + android:layout_height="@dimen/button_height" + android:layout_marginHorizontal="@dimen/button_horizontal_margin" + android:layout_marginTop="@dimen/button_vertical_margin" + android:text="@string/click_effect_button" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + + <Button + android:id="@+id/oneshot_effect_button" + android:layout_width="@dimen/button_width" + android:layout_height="@dimen/button_height" + android:layout_marginHorizontal="@dimen/button_horizontal_margin" + android:layout_marginTop="@dimen/button_vertical_margin" + android:text="@string/oneshot_effect_button" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/click_effect_button"/> + + <Button + android:id="@+id/waveform_effect_button" + android:layout_width="@dimen/button_width" + android:layout_height="@dimen/button_height" + android:layout_marginHorizontal="@dimen/button_horizontal_margin" + android:layout_marginTop="@dimen/button_vertical_margin" + android:text="@string/waveform_effect_button" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/oneshot_effect_button"/> + + <View + android:id="@+id/divider" + android:layout_width="363dp" + android:layout_height="1dp" + android:layout_marginHorizontal="@dimen/button_horizontal_margin" + android:layout_marginTop="10dp" + android:background="?android:attr/listDivider" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/waveform_effect_button"/> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="363dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/divider"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:adjustViewBounds="true" + android:scaleType="fitXY" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/bluebar"/> + + </androidx.constraintlayout.widget.ConstraintLayout> + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/drawable/nav_button_background.xml b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher.xml index 376347cdf4a9..47606a49580f 100644 --- a/packages/CarSystemUI/res/drawable/nav_button_background.xml +++ b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ -<?xml version="1.0" encoding="utf-8"?> <!-- - ~ Copyright (C) 2018 The Android Open Source Project + ~ Copyright (C) 2020 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. @@ -12,15 +11,10 @@ ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and - ~ limitations under the License + ~ limitations under the License. --> -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/nav_bar_ripple_background_color"> - <item android:id="@android:id/mask"> - <shape android:shape="rectangle"> - <solid android:color="?android:colorAccent"/> - <corners android:radius="6dp"/> - </shape> - </item> -</ripple> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000000..47606a49580f --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,20 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..a571e60098c9 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher.png diff --git a/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..61da551c5594 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-hdpi/ic_launcher_round.png diff --git a/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..c41dd2853190 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher.png diff --git a/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..db5080a75273 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-mdpi/ic_launcher_round.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..6dba46dab192 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..da31a871c8dc --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..15ac681720f3 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..b216f2d313cc --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..f25a41974472 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..e96783ccce84 --- /dev/null +++ b/samples/demo/haptic-assessment/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/samples/demo/haptic-assessment/res/values/colors.xml b/samples/demo/haptic-assessment/res/values/colors.xml new file mode 100644 index 000000000000..2883b95397a2 --- /dev/null +++ b/samples/demo/haptic-assessment/res/values/colors.xml @@ -0,0 +1,21 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <color name="colorPrimary">#009688</color> + <color name="colorPrimaryDark">#673AB7</color> + <color name="colorAccent">#03DAC5</color> +</resources> diff --git a/samples/demo/haptic-assessment/res/values/dimen.xml b/samples/demo/haptic-assessment/res/values/dimen.xml new file mode 100644 index 000000000000..f9090ed39568 --- /dev/null +++ b/samples/demo/haptic-assessment/res/values/dimen.xml @@ -0,0 +1,25 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + <dimen name="button_width">350dp</dimen> + <dimen name="button_height">60dp</dimen> + <dimen name="button_horizontal_margin">32dp</dimen> + <dimen name="button_vertical_margin">5dp</dimen> + <dimen name="fab_margin">16dp</dimen> +</resources> diff --git a/samples/demo/haptic-assessment/res/values/strings.xml b/samples/demo/haptic-assessment/res/values/strings.xml new file mode 100644 index 000000000000..a22d8dbe0580 --- /dev/null +++ b/samples/demo/haptic-assessment/res/values/strings.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <string name="app_name">Haptic Hardware Assessment 2020</string> + <string name="click_effect_button">Effect 1</string> + <string name="oneshot_effect_button">Effect 2</string> + <string name="waveform_effect_button">Effect 3</string> + <string name="button_3_pass">Effect 3: PASS</string> + <string name="button_3_fail">Effect 3: FAIL</string> +</resources> diff --git a/samples/demo/haptic-assessment/res/values/styles.xml b/samples/demo/haptic-assessment/res/values/styles.xml new file mode 100644 index 000000000000..1abcab1d2dc9 --- /dev/null +++ b/samples/demo/haptic-assessment/res/values/styles.xml @@ -0,0 +1,28 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <item name="android:buttonStyle">@style/AppButton</item> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + + <style name="AppButton" parent="@android:style/Widget.Button"> + <item name="android:textSize">18sp</item> + </style> +</resources> diff --git a/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt b/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt new file mode 100644 index 000000000000..d198b51b935c --- /dev/null +++ b/samples/demo/haptic-assessment/src/com/example/android/hapticassessment/MainActivity.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.hapticassessment + +import android.graphics.Color +import android.os.Bundle +import android.os.VibrationEffect +import android.os.VibrationEffect.EFFECT_CLICK +import android.os.Vibrator +import android.view.View +import android.widget.Button + +import androidx.appcompat.app.AppCompatActivity + +/** App main screen. */ +class MainActivity : AppCompatActivity() { + + companion object { + + private const val ONE_SHOT_TIMING = 20L + private const val ONE_SHOT_AMPLITUDE = 255 + + private val WAVEFORM_TIMINGS = longArrayOf(500, 500) + private val WAVEFORM_AMPLITUDES = intArrayOf(128, 255) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val vibrator = getSystemService(Vibrator::class.java) + + findViewById<Button>(R.id.click_effect_button).setOnClickListener { + vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK)) + } + + findViewById<Button>(R.id.oneshot_effect_button).setOnClickListener { + vibrator.vibrate(VibrationEffect.createOneShot(ONE_SHOT_TIMING, ONE_SHOT_AMPLITUDE)) + } + + findViewById<Button>(R.id.waveform_effect_button).setOnClickListener { view: View -> + vibrator.vibrate( + VibrationEffect.createWaveform(WAVEFORM_TIMINGS, WAVEFORM_AMPLITUDES, -1)) + + val button = view as Button + if (vibrator.hasAmplitudeControl()) { + button.text = getString(R.string.button_3_pass) + button.setBackgroundColor(Color.GREEN) + button.setTextColor(Color.BLACK) + } else { + button.text = getString(R.string.button_3_fail) + button.setBackgroundColor(Color.RED) + button.setTextColor(Color.WHITE) + } + } + } +} diff --git a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java index e2330ca6ffe9..0ec8654f2a20 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java +++ b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java @@ -75,9 +75,7 @@ final class AutofillInlineSessionController { @NonNull Consumer<InlineSuggestionsRequest> requestConsumer, @NonNull Bundle uiExtras) { // TODO(b/151123764): rename the method to better reflect what it does. if (mSession != null) { - // Send an empty response to IME and destroy the existing session. - mSession.onInlineSuggestionsResponseLocked( - InlineFillUi.emptyUi(mSession.getAutofillIdLocked())); + // Destroy the existing session. mSession.destroySessionLocked(); mInlineFillUi = null; } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 3c0d880916ee..0d4efed25da3 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -954,7 +954,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } /** - * Call IBluetooth.onLeServiceUp() to continue if Bluetooth should be on. + * Call IBluetooth.onLeServiceUp() to continue if Bluetooth should be on, + * call IBluetooth.onBrEdrDown() to disable if Bluetooth should be off. */ private void continueFromBleOnState() { if (DBG) { @@ -966,11 +967,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { Slog.e(TAG, "onBluetoothServiceUp: mBluetooth is null!"); return; } - if (!mEnableExternal && !isBleAppPresent() && isAirplaneModeOn()) { - // Airplane mode is turned on while enabling BLE only mode, disable - // BLE now. - disableBleScanMode(); - sendBrEdrDownCallback(); + if (!mEnableExternal && !isBleAppPresent()) { + Slog.i(TAG, "Bluetooth was disabled while enabling BLE, disable BLE now"); + mEnable = false; + mBluetooth.onBrEdrDown(); return; } if (isBluetoothPersistedStateOnBluetooth() || !isBleAppPresent()) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 1634f6e62897..0ab571854c72 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1374,10 +1374,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nri == null || net == null || !LOGD_BLOCKED_NETWORKINFO) { return; } - String action = blocked ? "BLOCKED" : "UNBLOCKED"; - log(String.format("Blocked status changed to %s for %d(%d) on netId %d", blocked, - nri.mUid, nri.request.requestId, net.netId)); - mNetworkInfoBlockingLogs.log(action + " " + nri.mUid); + final String action = blocked ? "BLOCKED" : "UNBLOCKED"; + mNetworkInfoBlockingLogs.log(String.format( + "%s %d(%d) on netId %d", action, nri.mUid, nri.request.requestId, net.netId)); } /** diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index e77458cc955a..fd7abfa65c86 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -239,7 +239,10 @@ public class PackageWatchdog { mIsPackagesReady = true; mHealthCheckController.setCallbacks(packageName -> onHealthCheckPassed(packageName), packages -> onSupportedPackages(packages), - () -> syncRequestsAsync()); + () -> { + syncRequestsAsync(); + mSyncRequired = true; + }); setPropertyChangedListenerLocked(); updateConfigs(); registerConnectivityModuleHealthListener(); @@ -255,7 +258,6 @@ public class PackageWatchdog { */ public void registerHealthObserver(PackageHealthObserver observer) { synchronized (mLock) { - mSyncRequired = true; ObserverInternal internalObserver = mAllObservers.get(observer.getName()); if (internalObserver != null) { internalObserver.registeredObserver = observer; @@ -642,7 +644,8 @@ public class PackageWatchdog { synchronized (mLock) { if (mIsPackagesReady) { Set<String> packages = getPackagesPendingHealthChecksLocked(); - if (!packages.equals(mRequestedHealthCheckPackages) || mSyncRequired) { + if (mSyncRequired || !packages.equals(mRequestedHealthCheckPackages) + || packages.isEmpty()) { syncRequired = true; mRequestedHealthCheckPackages = packages; } diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index e066d99147ba..a153d4191a5c 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -1894,6 +1894,8 @@ public class VibratorService extends IVibratorService.Stub return runWaveform(); } else if ("prebaked".equals(cmd)) { return runPrebaked(); + } else if ("capabilities".equals(cmd)) { + return runCapabilities(); } else if ("cancel".equals(cmd)) { cancelVibrate(mToken); return 0; @@ -2016,10 +2018,15 @@ public class VibratorService extends IVibratorService.Stub Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runPrebaked"); try { CommonOptions commonOptions = new CommonOptions(); + boolean shouldFallback = false; String opt; while ((opt = getNextOption()) != null) { - commonOptions.check(opt); + if ("-b".equals(opt)) { + shouldFallback = true; + } else { + commonOptions.check(opt); + } } if (checkDoNotDisturb(commonOptions)) { @@ -2033,8 +2040,7 @@ public class VibratorService extends IVibratorService.Stub description = "Shell command"; } - VibrationEffect effect = - VibrationEffect.get(id, false); + VibrationEffect effect = VibrationEffect.get(id, shouldFallback); VibrationAttributes attrs = createVibrationAttributes(commonOptions); vibrate(Binder.getCallingUid(), description, effect, attrs, "Shell Command", mToken); @@ -2044,12 +2050,39 @@ public class VibratorService extends IVibratorService.Stub } } + private int runCapabilities() { + Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runCapabilities"); + try (PrintWriter pw = getOutPrintWriter();) { + pw.println("Vibrator capabilities:"); + if (hasCapability(IVibrator.CAP_ALWAYS_ON_CONTROL)) { + pw.println(" Always on effects"); + } + if (hasCapability(IVibrator.CAP_COMPOSE_EFFECTS)) { + pw.println(" Compose effects"); + } + if (mSupportsAmplitudeControl || hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL)) { + pw.println(" Amplitude control"); + } + if (mSupportsExternalControl || hasCapability(IVibrator.CAP_EXTERNAL_CONTROL)) { + pw.println(" External control"); + } + if (hasCapability(IVibrator.CAP_EXTERNAL_AMPLITUDE_CONTROL)) { + pw.println(" External amplitude control"); + } + pw.println(""); + return 0; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); + } + } + private VibrationAttributes createVibrationAttributes(CommonOptions commonOptions) { final int flags = commonOptions.force ? VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY : 0; return new VibrationAttributes.Builder() - .setUsage(VibrationAttributes.USAGE_UNKNOWN) + // Used to apply Settings.System.HAPTIC_FEEDBACK_INTENSITY to scale effects. + .setUsage(VibrationAttributes.USAGE_TOUCH) .replaceFlags(flags) .build(); } @@ -2062,19 +2095,26 @@ public class VibratorService extends IVibratorService.Stub pw.println(" Prints this help text."); pw.println(""); pw.println(" vibrate duration [description]"); - pw.println(" Vibrates for duration milliseconds; ignored when device is on DND "); - pw.println(" (Do Not Disturb) mode."); + pw.println(" Vibrates for duration milliseconds; ignored when device is on "); + pw.println(" DND (Do Not Disturb) mode; touch feedback strength user setting "); + pw.println(" will be used to scale amplitude."); pw.println(" waveform [-d description] [-r index] [-a] duration [amplitude] ..."); - pw.println(" Vibrates for durations and amplitudes in list;"); - pw.println(" ignored when device is on DND (Do Not Disturb) mode."); + pw.println(" Vibrates for durations and amplitudes in list; ignored when "); + pw.println(" device is on DND (Do Not Disturb) mode; touch feedback strength "); + pw.println(" user setting will be used to scale amplitude."); pw.println(" If -r is provided, the waveform loops back to the specified"); pw.println(" index (e.g. 0 loops from the beginning)"); pw.println(" If -a is provided, the command accepts duration-amplitude pairs;"); pw.println(" otherwise, it accepts durations only and alternates off/on"); pw.println(" Duration is in milliseconds; amplitude is a scale of 1-255."); - pw.println(" prebaked effect-id [description]"); + pw.println(" prebaked [-b] effect-id [description]"); pw.println(" Vibrates with prebaked effect; ignored when device is on DND "); - pw.println(" (Do Not Disturb) mode."); + pw.println(" (Do Not Disturb) mode; touch feedback strength user setting "); + pw.println(" will be used to scale amplitude."); + pw.println(" If -b is provided, the prebaked fallback effect will be played if"); + pw.println(" the device doesn't support the given effect-id."); + pw.println(" capabilities"); + pw.println(" Prints capabilities of this device."); pw.println(" cancel"); pw.println(" Cancels any active vibration"); pw.println("Common Options:"); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 5427dd2328a6..efd3c3e9bfc1 100755 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1908,31 +1908,8 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#adjustVolume(int, int) */ public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags, String callingPackage, String caller) { - final IAudioPolicyCallback extVolCtlr; - synchronized (mExtVolumeControllerLock) { - extVolCtlr = mExtVolumeController; - } - new MediaMetrics.Item(mMetricsId + "adjustSuggestedStreamVolume") - .setUid(Binder.getCallingUid()) - .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackage) - .set(MediaMetrics.Property.CLIENT_NAME, caller) - .set(MediaMetrics.Property.DIRECTION, direction > 0 - ? MediaMetrics.Value.UP : MediaMetrics.Value.DOWN) - .set(MediaMetrics.Property.EXTERNAL, extVolCtlr != null - ? MediaMetrics.Value.YES : MediaMetrics.Value.NO) - .set(MediaMetrics.Property.FLAGS, flags) - .record(); - if (extVolCtlr != null) { - sendMsg(mAudioHandler, MSG_NOTIFY_VOL_EVENT, SENDMSG_QUEUE, - direction, 0 /*ignored*/, - extVolCtlr, 0 /*delay*/); - } else { - final boolean hasModifyAudioSettings = - mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) - == PackageManager.PERMISSION_GRANTED; - adjustSuggestedStreamVolume(direction, suggestedStreamType, flags, callingPackage, - caller, Binder.getCallingUid(), hasModifyAudioSettings, VOL_ADJUST_NORMAL); - } + adjustSuggestedStreamVolume(direction, suggestedStreamType, flags, callingPackage, + caller, Binder.getCallingUid(), hasModifyAudioSettings(), VOL_ADJUST_NORMAL); } private void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags, @@ -1947,6 +1924,24 @@ public class AudioService extends IAudioService.Stub direction/*val1*/, flags/*val2*/, new StringBuilder(callingPackage) .append("/").append(caller).append(" uid:").append(uid).toString())); } + + boolean hasExternalVolumeController = notifyExternalVolumeController(direction); + + new MediaMetrics.Item(mMetricsId + "adjustSuggestedStreamVolume") + .setUid(Binder.getCallingUid()) + .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackage) + .set(MediaMetrics.Property.CLIENT_NAME, caller) + .set(MediaMetrics.Property.DIRECTION, direction > 0 + ? MediaMetrics.Value.UP : MediaMetrics.Value.DOWN) + .set(MediaMetrics.Property.EXTERNAL, hasExternalVolumeController + ? MediaMetrics.Value.YES : MediaMetrics.Value.NO) + .set(MediaMetrics.Property.FLAGS, flags) + .record(); + + if (hasExternalVolumeController) { + return; + } + final int streamType; synchronized (mForceControlStreamLock) { // Request lock in case mVolumeControlStream is changed by other thread. @@ -1995,6 +1990,21 @@ public class AudioService extends IAudioService.Stub hasModifyAudioSettings, keyEventMode); } + private boolean notifyExternalVolumeController(int direction) { + final IAudioPolicyCallback externalVolumeController; + synchronized (mExtVolumeControllerLock) { + externalVolumeController = mExtVolumeController; + } + if (externalVolumeController == null) { + return false; + } + + sendMsg(mAudioHandler, MSG_NOTIFY_VOL_EVENT, SENDMSG_QUEUE, + direction, 0 /*ignored*/, + externalVolumeController, 0 /*delay*/); + return true; + } + /** @see AudioManager#adjustStreamVolume(int, int, int) * Part of service interface, check permissions here */ public void adjustStreamVolume(int streamType, int direction, int flags, @@ -2004,13 +2014,10 @@ public class AudioService extends IAudioService.Stub + "CHANGE_ACCESSIBILITY_VOLUME / callingPackage=" + callingPackage); return; } - final boolean hasModifyAudioSettings = - mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) - == PackageManager.PERMISSION_GRANTED; sVolumeLogger.log(new VolumeEvent(VolumeEvent.VOL_ADJUST_STREAM_VOL, streamType, direction/*val1*/, flags/*val2*/, callingPackage)); adjustStreamVolume(streamType, direction, flags, callingPackage, callingPackage, - Binder.getCallingUid(), hasModifyAudioSettings, VOL_ADJUST_NORMAL); + Binder.getCallingUid(), hasModifyAudioSettings(), VOL_ADJUST_NORMAL); } protected void adjustStreamVolume(int streamType, int direction, int flags, @@ -2521,13 +2528,10 @@ public class AudioService extends IAudioService.Stub + " MODIFY_AUDIO_ROUTING callingPackage=" + callingPackage); return; } - final boolean hasModifyAudioSettings = - mContext.checkCallingOrSelfPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) - == PackageManager.PERMISSION_GRANTED; sVolumeLogger.log(new VolumeEvent(VolumeEvent.VOL_SET_STREAM_VOL, streamType, index/*val1*/, flags/*val2*/, callingPackage)); setStreamVolume(streamType, index, flags, callingPackage, callingPackage, - Binder.getCallingUid(), hasModifyAudioSettings); + Binder.getCallingUid(), hasModifyAudioSettings()); } private boolean canChangeAccessibilityVolume() { @@ -3193,8 +3197,7 @@ public class AudioService extends IAudioService.Stub ensureValidStreamType(streamType); final boolean isPrivileged = Binder.getCallingUid() == Process.SYSTEM_UID - || (mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) - == PackageManager.PERMISSION_GRANTED) + || (hasModifyAudioSettings()) || (mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) == PackageManager.PERMISSION_GRANTED); return (mStreamStates[streamType].getMinIndex(isPrivileged) + 5) / 10; @@ -4752,9 +4755,18 @@ public class AudioService extends IAudioService.Stub handler.sendMessageAtTime(handler.obtainMessage(msg, arg1, arg2, obj), time); } + private boolean hasModifyAudioSettings() { + return mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasModifyAudioSettings(int pid, int uid) { + return mContext.checkPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS, pid, uid) + == PackageManager.PERMISSION_GRANTED; + } + boolean checkAudioSettingsPermission(String method) { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS) - == PackageManager.PERMISSION_GRANTED) { + if (hasModifyAudioSettings()) { return true; } String msg = "Audio Settings Permission Denial: " + method + " from pid=" @@ -7370,6 +7382,7 @@ public class AudioService extends IAudioService.Stub pw.print(" mIsSingleVolume="); pw.println(mIsSingleVolume); pw.print(" mUseFixedVolume="); pw.println(mUseFixedVolume); pw.print(" mFixedVolumeDevices="); pw.println(dumpDeviceTypes(mFixedVolumeDevices)); + pw.print(" mExtVolumeController="); pw.println(mExtVolumeController); pw.print(" mHdmiCecSink="); pw.println(mHdmiCecSink); pw.print(" mHdmiAudioSystemClient="); pw.println(mHdmiAudioSystemClient); pw.print(" mHdmiPlaybackClient="); pw.println(mHdmiPlaybackClient); @@ -7675,13 +7688,10 @@ public class AudioService extends IAudioService.Stub @Override public void adjustSuggestedStreamVolumeForUid(int streamType, int direction, int flags, String callingPackage, int uid, int pid) { - final boolean hasModifyAudioSettings = - mContext.checkPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS, pid, uid) - == PackageManager.PERMISSION_GRANTED; // direction and stream type swap here because the public // adjustSuggested has a different order than the other methods. adjustSuggestedStreamVolume(direction, streamType, flags, callingPackage, - callingPackage, uid, hasModifyAudioSettings, VOL_ADJUST_NORMAL); + callingPackage, uid, hasModifyAudioSettings(pid, uid), VOL_ADJUST_NORMAL); } @Override @@ -7692,21 +7702,15 @@ public class AudioService extends IAudioService.Stub direction/*val1*/, flags/*val2*/, new StringBuilder(callingPackage) .append(" uid:").append(uid).toString())); } - final boolean hasModifyAudioSettings = - mContext.checkPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS, pid, uid) - == PackageManager.PERMISSION_GRANTED; adjustStreamVolume(streamType, direction, flags, callingPackage, - callingPackage, uid, hasModifyAudioSettings, VOL_ADJUST_NORMAL); + callingPackage, uid, hasModifyAudioSettings(pid, uid), VOL_ADJUST_NORMAL); } @Override public void setStreamVolumeForUid(int streamType, int direction, int flags, String callingPackage, int uid, int pid) { - final boolean hasModifyAudioSettings = - mContext.checkPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS, pid, uid) - == PackageManager.PERMISSION_GRANTED; setStreamVolume(streamType, direction, flags, callingPackage, callingPackage, uid, - hasModifyAudioSettings); + hasModifyAudioSettings(pid, uid)); } @Override diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 236a6816b3e3..f827721be3b7 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -40,6 +40,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageInstaller.SessionParams; +import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.VersionedPackage; @@ -126,8 +127,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS; /** Automatically destroy staged sessions that have not changed state in this time */ private static final long MAX_TIME_SINCE_UPDATE_MILLIS = 7 * DateUtils.DAY_IN_MILLIS; - /** Upper bound on number of active sessions for a UID */ - private static final long MAX_ACTIVE_SESSIONS = 1024; + /** Upper bound on number of active sessions for a UID that has INSTALL_PACKAGES */ + private static final long MAX_ACTIVE_SESSIONS_WITH_PERMISSION = 1024; + /** Upper bound on number of active sessions for a UID without INSTALL_PACKAGES */ + private static final long MAX_ACTIVE_SESSIONS_NO_PERMISSION = 50; /** Upper bound on number of historical sessions for a UID */ private static final long MAX_HISTORICAL_SESSIONS = 1048576; @@ -503,7 +506,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements + "to use a data loader"); } - String requestedInstallerPackageName = params.installerPackageName != null + // App package name and label length is restricted so that really long strings aren't + // written to disk. + if (params.appPackageName != null + && params.appPackageName.length() > SessionParams.MAX_PACKAGE_NAME_LENGTH) { + params.appPackageName = null; + } + + params.appLabel = TextUtils.trimToSize(params.appLabel, + PackageItemInfo.MAX_SAFE_LABEL_LENGTH); + + String requestedInstallerPackageName = (params.installerPackageName != null + && params.installerPackageName.length() < SessionParams.MAX_PACKAGE_NAME_LENGTH) ? params.installerPackageName : installerPackageName; if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) { @@ -635,12 +649,23 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } + if (params.whitelistedRestrictedPermissions != null) { + mPermissionManager.retainHardAndSoftRestrictedPermissions( + params.whitelistedRestrictedPermissions); + } + final int sessionId; final PackageInstallerSession session; synchronized (mSessions) { // Sanity check that installer isn't going crazy final int activeCount = getSessionCount(mSessions, callingUid); - if (activeCount >= MAX_ACTIVE_SESSIONS) { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGES) + == PackageManager.PERMISSION_GRANTED) { + if (activeCount >= MAX_ACTIVE_SESSIONS_WITH_PERMISSION) { + throw new IllegalStateException( + "Too many active sessions for UID " + callingUid); + } + } else if (activeCount >= MAX_ACTIVE_SESSIONS_NO_PERMISSION) { throw new IllegalStateException( "Too many active sessions for UID " + callingUid); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6bb10c79d382..64d30158b260 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5264,15 +5264,17 @@ public class PackageManagerService extends IPackageManager.Stub * </ul> */ int updateFlagsForResolve(int flags, int userId, int callingUid, boolean wantInstantApps, - boolean matchSystemOnly) { + boolean isImplicitImageCaptureIntentAndNotSetByDpc) { return updateFlagsForResolve(flags, userId, callingUid, - wantInstantApps, matchSystemOnly, false /*onlyExposedExplicitly*/); + wantInstantApps, false /*onlyExposedExplicitly*/, + isImplicitImageCaptureIntentAndNotSetByDpc); } int updateFlagsForResolve(int flags, int userId, int callingUid, - boolean wantInstantApps, boolean onlyExposedExplicitly, boolean matchSystemOnly) { + boolean wantInstantApps, boolean onlyExposedExplicitly, + boolean isImplicitImageCaptureIntentAndNotSetByDpc) { // Safe mode means we shouldn't match any third-party components - if (mSafeMode || matchSystemOnly) { + if (mSafeMode || isImplicitImageCaptureIntentAndNotSetByDpc) { flags |= PackageManager.MATCH_SYSTEM_ONLY; } if (getInstantAppPackageName(callingUid) != null) { @@ -6400,7 +6402,8 @@ public class PackageManagerService extends IPackageManager.Stub if (!mUserManager.exists(userId)) return null; final int callingUid = Binder.getCallingUid(); flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + flags)); mPermissionManager.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "resolve intent"); @@ -6438,7 +6441,7 @@ public class PackageManagerService extends IPackageManager.Stub final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver()); final int flags = updateFlagsForResolve( 0, userId, callingUid, false /*includeInstantApps*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, 0)); final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags, userId); synchronized (mLock) { @@ -6684,6 +6687,40 @@ public class PackageManagerService extends IPackageManager.Stub return true; } + /** + * From Android R, camera intents have to match system apps. The only exception to this is if + * the DPC has set the camera persistent preferred activity. This case was introduced + * because it is important that the DPC has the ability to set both system and non-system + * camera persistent preferred activities. + * + * @return {@code true} if the intent is a camera intent and the persistent preferred + * activity was not set by the DPC. + */ + @GuardedBy("mLock") + private boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, + String resolvedType, int flags) { + return intent.isImplicitImageCaptureIntent() && !isPersistentPreferredActivitySetByDpm( + intent, userId, resolvedType, flags); + } + + private boolean isPersistentPreferredActivitySetByDpm(Intent intent, int userId, + String resolvedType, int flags) { + PersistentPreferredIntentResolver ppir = mSettings.mPersistentPreferredActivities + .get(userId); + //TODO(b/158003772): Remove double query + List<PersistentPreferredActivity> pprefs = ppir != null + ? ppir.queryIntent(intent, resolvedType, + (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, + userId) + : new ArrayList<>(); + for (PersistentPreferredActivity ppa : pprefs) { + if (ppa.mIsSetByDpm) { + return true; + } + } + return false; + } + @GuardedBy("mLock") private ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean debug, int userId) { @@ -6767,7 +6804,8 @@ public class PackageManagerService extends IPackageManager.Stub android.provider.Settings.Global.DEVICE_PROVISIONED, 0) == 1; flags = updateFlagsForResolve( flags, userId, callingUid, false /*includeInstantApps*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + flags)); intent = updateIntentForResolve(intent); // writer synchronized (mLock) { @@ -6980,7 +7018,8 @@ public class PackageManagerService extends IPackageManager.Stub synchronized (mLock) { int flags = updateFlagsForResolve(0, parent.id, callingUid, false /*includeInstantApps*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, parent.id, + resolvedType, 0)); CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr( intent, resolvedType, flags, sourceUserId, parent.id); return xpDomainInfo != null; @@ -7067,7 +7106,8 @@ public class PackageManagerService extends IPackageManager.Stub flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, comp != null || pkgName != null /*onlyExposedExplicitly*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + flags)); if (comp != null) { final List<ResolveInfo> list = new ArrayList<>(1); final ActivityInfo ai = getActivityInfo(comp, flags, userId); @@ -7856,7 +7896,8 @@ public class PackageManagerService extends IPackageManager.Stub if (!mUserManager.exists(userId)) return Collections.emptyList(); final int callingUid = Binder.getCallingUid(); flags = updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + flags)); mPermissionManager.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "query intent activity options"); @@ -8043,7 +8084,8 @@ public class PackageManagerService extends IPackageManager.Stub "query intent receivers"); final String instantAppPkgName = getInstantAppPackageName(callingUid); flags = updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - intent.isImplicitImageCaptureIntent() /*matchSystemOnly*/); + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, + flags)); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { @@ -8134,7 +8176,7 @@ public class PackageManagerService extends IPackageManager.Stub int userId, int callingUid) { if (!mUserManager.exists(userId)) return null; flags = updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - false /* matchSystemOnly */); + false /* isImplicitImageCaptureIntentAndNotSetByDpc */); List<ResolveInfo> query = queryIntentServicesInternal( intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/); if (query != null) { @@ -8166,7 +8208,7 @@ public class PackageManagerService extends IPackageManager.Stub "query intent receivers"); final String instantAppPkgName = getInstantAppPackageName(callingUid); flags = updateFlagsForResolve(flags, userId, callingUid, includeInstantApps, - false /* matchSystemOnly */); + false /* isImplicitImageCaptureIntentAndNotSetByDpc */); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { @@ -8304,7 +8346,7 @@ public class PackageManagerService extends IPackageManager.Stub final int callingUid = Binder.getCallingUid(); final String instantAppPkgName = getInstantAppPackageName(callingUid); flags = updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - false /* matchSystemOnly */); + false /* isImplicitImageCaptureIntentAndNotSetByDpc */); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { @@ -19840,7 +19882,7 @@ public class PackageManagerService extends IPackageManager.Stub } synchronized (mLock) { mSettings.editPersistentPreferredActivitiesLPw(userId).addFilter( - new PersistentPreferredActivity(filter, activity)); + new PersistentPreferredActivity(filter, activity, true)); scheduleWritePackageRestrictionsLocked(userId); } updateDefaultHomeNotLocked(userId); diff --git a/services/core/java/com/android/server/pm/PersistentPreferredActivity.java b/services/core/java/com/android/server/pm/PersistentPreferredActivity.java index 0d4cdf9dee53..5a6fd0923f53 100644 --- a/services/core/java/com/android/server/pm/PersistentPreferredActivity.java +++ b/services/core/java/com/android/server/pm/PersistentPreferredActivity.java @@ -16,31 +16,34 @@ package com.android.server.pm; +import android.content.ComponentName; +import android.content.IntentFilter; +import android.util.Log; + import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; -import android.content.ComponentName; -import android.content.IntentFilter; -import android.util.Log; - import java.io.IOException; class PersistentPreferredActivity extends IntentFilter { private static final String ATTR_NAME = "name"; // component name private static final String ATTR_FILTER = "filter"; // filter + private static final String ATTR_SET_BY_DPM = "set-by-dpm"; // set by DPM private static final String TAG = "PersistentPreferredActivity"; private static final boolean DEBUG_FILTERS = false; final ComponentName mComponent; + final boolean mIsSetByDpm; - PersistentPreferredActivity(IntentFilter filter, ComponentName activity) { + PersistentPreferredActivity(IntentFilter filter, ComponentName activity, boolean isSetByDpm) { super(filter); mComponent = activity; + mIsSetByDpm = isSetByDpm; } PersistentPreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { @@ -52,6 +55,8 @@ class PersistentPreferredActivity extends IntentFilter { "Bad activity name " + shortComponent + " at " + parser.getPositionDescription()); } + mIsSetByDpm = Boolean.parseBoolean(parser.getAttributeValue(null, ATTR_SET_BY_DPM)); + int outerDepth = parser.getDepth(); String tagName = parser.getName(); int type; @@ -83,6 +88,7 @@ class PersistentPreferredActivity extends IntentFilter { public void writeToXml(XmlSerializer serializer) throws IOException { serializer.attribute(null, ATTR_NAME, mComponent.flattenToShortString()); + serializer.attribute(null, ATTR_SET_BY_DPM, Boolean.toString(mIsSetByDpm)); serializer.startTag(null, ATTR_FILTER); super.writeToXml(serializer); serializer.endTag(null, ATTR_FILTER); @@ -91,6 +97,7 @@ class PersistentPreferredActivity extends IntentFilter { @Override public String toString() { return "PersistentPreferredActivity{0x" + Integer.toHexString(System.identityHashCode(this)) - + " " + mComponent.flattenToShortString() + "}"; + + " " + mComponent.flattenToShortString() + + ", mIsSetByDpm=" + mIsSetByDpm + "}"; } } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 3ec139763e80..0c42ff6be520 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -2419,6 +2419,9 @@ public class ShortcutService extends IShortcutService.Stub { @Override public ParceledListSlice<ShortcutManager.ShareShortcutInfo> getShareTargets(String packageName, IntentFilter filter, @UserIdInt int userId) { + Preconditions.checkStringNotEmpty(packageName, "packageName"); + Objects.requireNonNull(filter, "intentFilter"); + verifyCaller(packageName, userId); enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APP_PREDICTIONS, "getShareTargets"); diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 79805e3b42ae..8ccf837f64dc 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -77,7 +77,11 @@ import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.rollback.WatchdogRollbackLogger; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -102,6 +106,9 @@ public class StagingManager { private final PreRebootVerificationHandler mPreRebootVerificationHandler; private final Supplier<PackageParser2> mPackageParserSupplier; + private final File mFailureReasonFile = new File("/metadata/staged-install/failure_reason.txt"); + private String mFailureReason; + @GuardedBy("mStagedSessions") private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>(); @@ -125,6 +132,12 @@ public class StagingManager { mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mPreRebootVerificationHandler = new PreRebootVerificationHandler( BackgroundThread.get().getLooper()); + + if (mFailureReasonFile.exists()) { + try (BufferedReader reader = new BufferedReader(new FileReader(mFailureReasonFile))) { + mFailureReason = reader.readLine(); + } catch (Exception ignore) { } + } } /** @@ -383,10 +396,19 @@ public class StagingManager { } // Reverts apex sessions and user data (if checkpoint is supported). Also reboots the device. - private void abortCheckpoint(String errorMsg) { - Slog.e(TAG, "Aborting checkpoint: " + errorMsg); + private void abortCheckpoint(int sessionId, String errorMsg) { + String failureReason = "Failed to install sessionId: " + sessionId + " Error: " + errorMsg; + Slog.e(TAG, failureReason); try { if (supportsCheckpoint() && needsCheckpoint()) { + // Store failure reason for next reboot + try (BufferedWriter writer = + new BufferedWriter(new FileWriter(mFailureReasonFile))) { + writer.write(failureReason); + } catch (Exception e) { + Slog.w(TAG, "Failed to save failure reason: ", e); + } + // Only revert apex sessions if device supports updating apex if (mApexManager.isApexSupported()) { mApexManager.revertActiveSessions(); @@ -592,14 +614,12 @@ public class StagingManager { // If checkpoint is supported, then we only resume sessions if we are in checkpointing // mode. If not, we fail all sessions. if (supportsCheckpoint() && !needsCheckpoint()) { - // TODO(b/146343545): Persist failure reason across checkpoint reboot - Slog.d(TAG, "Reverting back to safe state. Marking " + session.sessionId - + " as failed."); - String errorMsg = "Reverting back to safe state"; - if (!TextUtils.isEmpty(mNativeFailureReason)) { - errorMsg = "Entered fs-rollback mode and reverted session due to crashing " - + "native process: " + mNativeFailureReason; + String errorMsg = "Reverting back to safe state. Marking " + session.sessionId + + " as failed"; + if (!TextUtils.isEmpty(mFailureReason)) { + errorMsg = errorMsg + ": " + mFailureReason; } + Slog.d(TAG, errorMsg); session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, errorMsg); return; } @@ -624,7 +644,7 @@ public class StagingManager { + "supposed to be activated"; session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, errorMsg); - abortCheckpoint(errorMsg); + abortCheckpoint(session.sessionId, errorMsg); return; } if (isApexSessionFailed(apexSessionInfo)) { @@ -636,7 +656,7 @@ public class StagingManager { } session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, errorMsg); - abortCheckpoint(errorMsg); + abortCheckpoint(session.sessionId, errorMsg); return; } if (!apexSessionInfo.isActivated && !apexSessionInfo.isSuccess) { @@ -647,7 +667,7 @@ public class StagingManager { + "didn't activate nor fail. Marking it as failed anyway."; session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED, errorMsg); - abortCheckpoint(errorMsg); + abortCheckpoint(session.sessionId, errorMsg); return; } } @@ -664,7 +684,7 @@ public class StagingManager { installApksInSession(session); } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage()); - abortCheckpoint(e.getMessage()); + abortCheckpoint(session.sessionId, e.getMessage()); // If checkpoint is not supported, we have to handle failure for one staged session. if (!hasApex) { @@ -1189,6 +1209,8 @@ public class StagingManager { ctx.unregisterReceiver(this); } }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); + + mFailureReasonFile.delete(); } private static class LocalIntentReceiverAsync { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index d5c9424528bd..40fa798309c1 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2250,9 +2250,6 @@ public class UserManagerService extends IUserManager.Stub { // Managed profiles have their own specific rules. final boolean isManagedProfile = type.isManagedProfile(); if (isManagedProfile) { - if (ActivityManager.isLowRamDeviceStatic()) { - return false; - } if (!mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_MANAGED_USERS)) { return false; diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 8f3bf39d4fc5..cd53fb9ba52f 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -816,7 +816,7 @@ public final class DefaultPermissionGrantPolicy { if (!TextUtils.isEmpty(contentCapturePackageName)) { grantPermissionsToSystemPackage(pm, contentCapturePackageName, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, - CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS); + CONTACTS_PERMISSIONS); } // Atthention Service diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index b0d4d957fc21..d3f3ba1dc6bb 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -26,6 +26,7 @@ import static android.content.pm.ApplicationInfo.AUTO_REVOKE_DISCOURAGED; import static android.content.pm.PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT; import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; +import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE; import static android.content.pm.PackageManager.FLAG_PERMISSION_ONE_TIME; import static android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; @@ -1804,8 +1805,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { continue; } - // If this permission was granted by default, make sure it is. - if ((oldFlags & FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0) { + // If this permission was granted by default or role, make sure it is. + if ((oldFlags & FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0 + || (oldFlags & FLAG_PERMISSION_GRANTED_BY_ROLE) != 0) { // PermissionPolicyService will handle the app op for runtime permissions later. grantRuntimePermissionInternal(permName, packageName, false, Process.SYSTEM_UID, userId, delayingPermCallback); @@ -4948,6 +4950,20 @@ public class PermissionManagerService extends IPermissionManager.Stub { StorageManager.UUID_PRIVATE_INTERNAL, true, mDefaultPermissionCallback); } } + + @Override + public void retainHardAndSoftRestrictedPermissions(@NonNull List<String> permissions) { + synchronized (mLock) { + Iterator<String> iterator = permissions.iterator(); + while (iterator.hasNext()) { + String permission = iterator.next(); + BasePermission basePermission = mSettings.mPermissions.get(permission); + if (basePermission == null || !basePermission.isHardOrSoftRestricted()) { + iterator.remove(); + } + } + } + } } private static final class OnPermissionChangeListeners extends Handler { diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 57a25eddf7ce..4412162a5cc8 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -36,6 +36,7 @@ import java.util.function.Consumer; * TODO: Should be merged into PermissionManagerInternal, but currently uses internal classes. */ public abstract class PermissionManagerServiceInternal extends PermissionManagerInternal { + /** * Provider for package names. */ @@ -455,4 +456,10 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager /** Called when a new user has been created. */ public abstract void onNewUserCreated(@UserIdInt int userId); + + /** + * Removes invalid permissions which are not {@link PermissionInfo#FLAG_HARD_RESTRICTED} or + * {@link PermissionInfo#FLAG_SOFT_RESTRICTED} from the input. + */ + public abstract void retainHardAndSoftRestrictedPermissions(@NonNull List<String> permissions); } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 6c1ff728e6b9..ab459fdadd21 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -3319,8 +3319,8 @@ public class StatsPullAtomService extends SystemService { public void run() { try { estimateAppOpsSamplingRate(); - } catch (Exception e) { - Slog.e(TAG, "AppOps sampling ratio estimation failed"); + } catch (Throwable e) { + Slog.e(TAG, "AppOps sampling ratio estimation failed: ", e); synchronized (mAppOpsSamplingRateLock) { mAppOpsSamplingRate = min(mAppOpsSamplingRate, 10); } @@ -3361,7 +3361,7 @@ public class StatsPullAtomService extends SystemService { Instant.now().minus(1, ChronoUnit.DAYS).toEpochMilli(), Long.MAX_VALUE).setFlags( OP_FLAGS_PULLED).build(); - appOps.getHistoricalOps(histOpsRequest, mContext.getMainExecutor(), ops::complete); + appOps.getHistoricalOps(histOpsRequest, AsyncTask.THREAD_POOL_EXECUTOR, ops::complete); HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); List<AppOpEntry> opsList = diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 3796c5fda411..c38d649ada9b 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -77,6 +77,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.Xml; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; @@ -114,7 +115,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { private static final String TAG = "UriGrantsManagerService"; // Maximum number of persisted Uri grants a package is allowed private static final int MAX_PERSISTED_URI_GRANTS = 128; - private static final boolean ENABLE_DYNAMIC_PERMISSIONS = true; + private static final boolean ENABLE_DYNAMIC_PERMISSIONS = false; private final Object mLock = new Object(); private final H mH; @@ -122,6 +123,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { PackageManagerInternal mPmInternal; /** File storing persisted {@link #mGrantedUriPermissions}. */ + @GuardedBy("mLock") private final AtomicFile mGrantFile; /** XML constants used in {@link #mGrantFile} */ @@ -142,6 +144,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { * This optimized lookup structure maps from {@link UriPermission#targetUid} * to {@link UriPermission#uri} to {@link UriPermission}. */ + @GuardedBy("mLock") private final SparseArray<ArrayMap<GrantUri, UriPermission>> mGrantedUriPermissions = new SparseArray<>(); @@ -206,39 +209,44 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } } + @Override + public void grantUriPermissionFromOwner(IBinder token, int fromUid, String targetPkg, + Uri uri, final int modeFlags, int sourceUserId, int targetUserId) { + grantUriPermissionFromOwnerUnlocked(token, fromUid, targetPkg, uri, modeFlags, sourceUserId, + targetUserId); + } + /** * @param uri This uri must NOT contain an embedded userId. * @param sourceUserId The userId in which the uri is to be resolved. * @param targetUserId The userId of the app that receives the grant. */ - @Override - public void grantUriPermissionFromOwner(IBinder token, int fromUid, String targetPkg, Uri uri, - final int modeFlags, int sourceUserId, int targetUserId) { + private void grantUriPermissionFromOwnerUnlocked(IBinder token, int fromUid, String targetPkg, + Uri uri, final int modeFlags, int sourceUserId, int targetUserId) { targetUserId = mAmInternal.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), targetUserId, false, ALLOW_FULL_ONLY, "grantUriPermissionFromOwner", null); - synchronized(mLock) { - UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); - if (owner == null) { - throw new IllegalArgumentException("Unknown owner: " + token); - } - if (fromUid != Binder.getCallingUid()) { - if (Binder.getCallingUid() != myUid()) { - // Only system code can grant URI permissions on behalf - // of other users. - throw new SecurityException("nice try"); - } - } - if (targetPkg == null) { - throw new IllegalArgumentException("null target"); - } - if (uri == null) { - throw new IllegalArgumentException("null uri"); - } - grantUriPermission(fromUid, targetPkg, new GrantUri(sourceUserId, uri, modeFlags), - modeFlags, owner, targetUserId); + UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); + if (owner == null) { + throw new IllegalArgumentException("Unknown owner: " + token); } + if (fromUid != Binder.getCallingUid()) { + if (Binder.getCallingUid() != myUid()) { + // Only system code can grant URI permissions on behalf + // of other users. + throw new SecurityException("nice try"); + } + } + if (targetPkg == null) { + throw new IllegalArgumentException("null target"); + } + if (uri == null) { + throw new IllegalArgumentException("null uri"); + } + + grantUriPermissionUnlocked(fromUid, targetPkg, new GrantUri(sourceUserId, uri, modeFlags), + modeFlags, owner, targetUserId); } @Override @@ -362,7 +370,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { persistChanged |= prefixPerm.takePersistableModes(modeFlags); } - persistChanged |= maybePrunePersistedUriGrants(uid); + persistChanged |= maybePrunePersistedUriGrantsLocked(uid); if (persistChanged) { schedulePersistUriGrants(); @@ -374,8 +382,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { public void clearGrantedUriPermissions(String packageName, int userId) { mAmInternal.enforceCallingPermission( CLEAR_APP_GRANTED_URI_PERMISSIONS, "clearGrantedUriPermissions"); - synchronized(mLock) { - removeUriPermissionsForPackage(packageName, userId, true, true); + synchronized (mLock) { + removeUriPermissionsForPackageLocked(packageName, userId, true, true); } } @@ -416,11 +424,11 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { if (exactPerm != null) { persistChanged |= exactPerm.releasePersistableModes(modeFlags); - removeUriPermissionIfNeeded(exactPerm); + removeUriPermissionIfNeededLocked(exactPerm); } if (prefixPerm != null) { persistChanged |= prefixPerm.releasePersistableModes(modeFlags); - removeUriPermissionIfNeeded(prefixPerm); + removeUriPermissionIfNeededLocked(prefixPerm); } if (persistChanged) { @@ -441,8 +449,9 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { * @param targetOnly When {@code true}, only remove permissions where the app is the target, * not source. */ - void removeUriPermissionsForPackage( - String packageName, int userHandle, boolean persistable, boolean targetOnly) { + @GuardedBy("mLock") + private void removeUriPermissionsForPackageLocked(String packageName, int userHandle, + boolean persistable, boolean targetOnly) { if (userHandle == UserHandle.USER_ALL && packageName == null) { throw new IllegalArgumentException("Must narrow by either package or user"); } @@ -494,7 +503,9 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } /** Returns if the ContentProvider has granted a uri to callingUid */ - boolean checkAuthorityGrants(int callingUid, ProviderInfo cpi, int userId, boolean checkUser) { + @GuardedBy("mLock") + private boolean checkAuthorityGrantsLocked(int callingUid, ProviderInfo cpi, int userId, + boolean checkUser) { final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(callingUid); if (perms != null) { for (int i = perms.size() - 1; i >= 0; i--) { @@ -530,7 +541,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { * * @return if any mutations occured that require persisting. */ - private boolean maybePrunePersistedUriGrants(int uid) { + @GuardedBy("mLock") + private boolean maybePrunePersistedUriGrantsLocked(int uid) { final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(uid); if (perms == null) return false; if (perms.size() < MAX_PERSISTED_URI_GRANTS) return false; @@ -552,14 +564,14 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { if (DEBUG) Slog.v(TAG, "Trimming grant created at " + perm.persistedCreateTime); perm.releasePersistableModes(~0); - removeUriPermissionIfNeeded(perm); + removeUriPermissionIfNeededLocked(perm); } return true; } /** Like checkGrantUriPermission, but takes an Intent. */ - NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid, + private NeededUriGrants checkGrantUriPermissionFromIntentUnlocked(int callingUid, String targetPkg, Intent intent, int mode, NeededUriGrants needed, int targetUserId) { if (DEBUG) Slog.v(TAG, "Checking URI perm to data=" + (intent != null ? intent.getData() : null) @@ -598,7 +610,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } if (data != null) { GrantUri grantUri = GrantUri.resolve(contentUserHint, data, mode); - targetUid = checkGrantUriPermission(callingUid, targetPkg, grantUri, mode, targetUid); + targetUid = checkGrantUriPermissionUnlocked(callingUid, targetPkg, grantUri, mode, + targetUid); if (targetUid > 0) { if (needed == null) { needed = new NeededUriGrants(targetPkg, targetUid, mode); @@ -611,7 +624,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { Uri uri = clip.getItemAt(i).getUri(); if (uri != null) { GrantUri grantUri = GrantUri.resolve(contentUserHint, uri, mode); - targetUid = checkGrantUriPermission(callingUid, targetPkg, + targetUid = checkGrantUriPermissionUnlocked(callingUid, targetPkg, grantUri, mode, targetUid); if (targetUid > 0) { if (needed == null) { @@ -622,7 +635,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } else { Intent clipIntent = clip.getItemAt(i).getIntent(); if (clipIntent != null) { - NeededUriGrants newNeeded = checkGrantUriPermissionFromIntent( + NeededUriGrants newNeeded = checkGrantUriPermissionFromIntentUnlocked( callingUid, targetPkg, clipIntent, mode, needed, targetUserId); if (newNeeded != null) { needed = newNeeded; @@ -635,7 +648,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return needed; } - void readGrantedUriPermissions() { + @GuardedBy("mLock") + private void readGrantedUriPermissionsLocked() { if (DEBUG) Slog.v(TAG, "readGrantedUriPermissions()"); final long now = System.currentTimeMillis(); @@ -681,7 +695,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { if (targetUid != -1) { final GrantUri grantUri = new GrantUri(sourceUserId, uri, prefix ? Intent.FLAG_GRANT_PREFIX_URI_PERMISSION : 0); - final UriPermission perm = findOrCreateUriPermission( + final UriPermission perm = findOrCreateUriPermissionLocked( sourcePkg, targetPkg, targetUid, grantUri); perm.initPersistedModes(modeFlags, createdTime); } @@ -703,7 +717,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } } - private UriPermission findOrCreateUriPermission(String sourcePkg, + @GuardedBy("mLock") + private UriPermission findOrCreateUriPermissionLocked(String sourcePkg, String targetPkg, int targetUid, GrantUri grantUri) { ArrayMap<GrantUri, UriPermission> targetUris = mGrantedUriPermissions.get(targetUid); if (targetUris == null) { @@ -740,15 +755,18 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return; } - final UriPermission perm = findOrCreateUriPermission( - pi.packageName, targetPkg, targetUid, grantUri); + final UriPermission perm; + synchronized (mLock) { + perm = findOrCreateUriPermissionLocked(pi.packageName, targetPkg, targetUid, grantUri); + } perm.grantModes(modeFlags, owner); mPmInternal.grantImplicitAccess(UserHandle.getUserId(targetUid), null, UserHandle.getAppId(targetUid), pi.applicationInfo.uid, false /*direct*/); } /** Like grantUriPermissionUnchecked, but takes an Intent. */ - void grantUriPermissionUncheckedFromIntent(NeededUriGrants needed, UriPermissionOwner owner) { + private void grantUriPermissionUncheckedFromIntent(NeededUriGrants needed, + UriPermissionOwner owner) { if (needed == null) { return; } @@ -759,7 +777,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } } - void grantUriPermission(int callingUid, String targetPkg, GrantUri grantUri, + private void grantUriPermissionUnlocked(int callingUid, String targetPkg, GrantUri grantUri, final int modeFlags, UriPermissionOwner owner, int targetUserId) { if (targetPkg == null) { throw new NullPointerException("targetPkg"); @@ -767,7 +785,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { int targetUid = mPmInternal.getPackageUidInternal(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, targetUserId); - targetUid = checkGrantUriPermission(callingUid, targetPkg, grantUri, modeFlags, targetUid); + targetUid = checkGrantUriPermissionUnlocked(callingUid, targetPkg, grantUri, modeFlags, + targetUid); if (targetUid < 0) { return; } @@ -775,7 +794,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { grantUriPermissionUnchecked(targetUid, targetPkg, grantUri, modeFlags, owner); } - void revokeUriPermission(String targetPackage, int callingUid, GrantUri grantUri, + private void revokeUriPermission(String targetPackage, int callingUid, GrantUri grantUri, final int modeFlags) { if (DEBUG) Slog.v(TAG, "Revoking all granted permissions to " + grantUri); @@ -788,8 +807,19 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return; } + final boolean callerHoldsPermissions = checkHoldingPermissionsUnlocked(pi, grantUri, + callingUid, modeFlags); + synchronized (mLock) { + revokeUriPermissionLocked(targetPackage, callingUid, grantUri, modeFlags, + callerHoldsPermissions); + } + } + + @GuardedBy("mLock") + private void revokeUriPermissionLocked(String targetPackage, int callingUid, GrantUri grantUri, + final int modeFlags, final boolean callerHoldsPermissions) { // Does the caller have this permission on the URI? - if (!checkHoldingPermissions(pi, grantUri, callingUid, modeFlags)) { + if (!callerHoldsPermissions) { // If they don't have direct access to the URI, then revoke any // ownerless URI permissions that have been granted to them. final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(callingUid); @@ -861,7 +891,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { * the given {@link ProviderInfo}. Final permission checking is always done * in {@link ContentProvider}. */ - private boolean checkHoldingPermissions( + private boolean checkHoldingPermissionsUnlocked( ProviderInfo pi, GrantUri grantUri, int uid, final int modeFlags) { if (DEBUG) Slog.v(TAG, "checkHoldingPermissions: uri=" + grantUri + " uid=" + uid); if (UserHandle.getUserId(uid) != grantUri.sourceUserId) { @@ -870,11 +900,17 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return false; } } - return checkHoldingPermissionsInternal(pi, grantUri, uid, modeFlags, true); + return checkHoldingPermissionsInternalUnlocked(pi, grantUri, uid, modeFlags, true); } - private boolean checkHoldingPermissionsInternal(ProviderInfo pi, + private boolean checkHoldingPermissionsInternalUnlocked(ProviderInfo pi, GrantUri grantUri, int uid, final int modeFlags, boolean considerUidPermissions) { + // We must never hold our local mLock in this method, since we may need + // to call into ActivityManager for dynamic permission checks + if (Thread.holdsLock(mLock)) { + throw new IllegalStateException("Must never hold local mLock"); + } + if (pi.applicationInfo.uid == uid) { return true; } else if (!pi.exported) { @@ -968,7 +1004,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return readMet && writeMet && forceMet; } - private void removeUriPermissionIfNeeded(UriPermission perm) { + @GuardedBy("mLock") + private void removeUriPermissionIfNeededLocked(UriPermission perm) { if (perm.modeFlags != 0) { return; } @@ -985,6 +1022,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } } + @GuardedBy("mLock") private UriPermission findUriPermissionLocked(int targetUid, GrantUri grantUri) { final ArrayMap<GrantUri, UriPermission> targetUris = mGrantedUriPermissions.get(targetUid); if (targetUris != null) { @@ -1020,7 +1058,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { * If you already know the uid of the target, you can supply it in * lastTargetUid else set that to -1. */ - int checkGrantUriPermission(int callingUid, String targetPkg, GrantUri grantUri, + private int checkGrantUriPermissionUnlocked(int callingUid, String targetPkg, GrantUri grantUri, int modeFlags, int lastTargetUid) { if (!Intent.isAccessUriMode(modeFlags)) { return -1; @@ -1076,7 +1114,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { boolean targetHoldsPermission = false; if (targetUid >= 0) { // First... does the target actually need this permission? - if (checkHoldingPermissions(pi, grantUri, targetUid, modeFlags)) { + if (checkHoldingPermissionsUnlocked(pi, grantUri, targetUid, modeFlags)) { // No need to grant the target this permission. if (DEBUG) Slog.v(TAG, "Target " + targetPkg + " already has full permission to " + grantUri); @@ -1144,7 +1182,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { */ boolean specialCrossUserGrant = targetUid >= 0 && UserHandle.getUserId(targetUid) != grantUri.sourceUserId - && checkHoldingPermissionsInternal(pi, grantUri, callingUid, + && checkHoldingPermissionsInternalUnlocked(pi, grantUri, callingUid, modeFlags, false /*without considering the uid permissions*/); // Second... is the provider allowing granting of URI permissions? @@ -1179,9 +1217,13 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } // Third... does the caller itself have permission to access this uri? - if (!checkHoldingPermissions(pi, grantUri, callingUid, modeFlags)) { + if (!checkHoldingPermissionsUnlocked(pi, grantUri, callingUid, modeFlags)) { // Require they hold a strong enough Uri permission - if (!checkUriPermission(grantUri, callingUid, modeFlags)) { + final boolean res; + synchronized (mLock) { + res = checkUriPermissionLocked(grantUri, callingUid, modeFlags); + } + if (!res) { if (android.Manifest.permission.MANAGE_DOCUMENTS.equals(pi.readPermission)) { throw new SecurityException( "UID " + callingUid + " does not have permission to " + grantUri @@ -1200,13 +1242,14 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { /** * @param userId The userId in which the uri is to be resolved. */ - int checkGrantUriPermission(int callingUid, String targetPkg, Uri uri, int modeFlags, - int userId) { - return checkGrantUriPermission(callingUid, targetPkg, + private int checkGrantUriPermissionUnlocked(int callingUid, String targetPkg, Uri uri, + int modeFlags, int userId) { + return checkGrantUriPermissionUnlocked(callingUid, targetPkg, new GrantUri(userId, uri, modeFlags), modeFlags, -1); } - boolean checkUriPermission(GrantUri grantUri, int uid, final int modeFlags) { + @GuardedBy("mLock") + private boolean checkUriPermissionLocked(GrantUri grantUri, int uid, final int modeFlags) { final boolean persistable = (modeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0; final int minStrength = persistable ? UriPermission.STRENGTH_PERSISTABLE : UriPermission.STRENGTH_OWNED; @@ -1238,7 +1281,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return false; } - private void writeGrantedUriPermissions() { + @GuardedBy("mLock") + private void writeGrantedUriPermissionsLocked() { if (DEBUG) Slog.v(TAG, "writeGrantedUriPermissions()"); final long startTime = SystemClock.uptimeMillis(); @@ -1299,34 +1343,35 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { public void handleMessage(Message msg) { switch (msg.what) { case PERSIST_URI_GRANTS_MSG: { - writeGrantedUriPermissions(); + synchronized (mLock) { + writeGrantedUriPermissionsLocked(); + } break; } } } } - final class LocalService implements UriGrantsManagerInternal { + private final class LocalService implements UriGrantsManagerInternal { @Override public void removeUriPermissionIfNeeded(UriPermission perm) { synchronized (mLock) { - UriGrantsManagerService.this.removeUriPermissionIfNeeded(perm); + UriGrantsManagerService.this.removeUriPermissionIfNeededLocked(perm); } } @Override public void revokeUriPermission(String targetPackage, int callingUid, GrantUri grantUri, int modeFlags) { - synchronized (mLock) { - UriGrantsManagerService.this.revokeUriPermission( - targetPackage, callingUid, grantUri, modeFlags); - } + UriGrantsManagerService.this.revokeUriPermission( + targetPackage, callingUid, grantUri, modeFlags); } @Override public boolean checkUriPermission(GrantUri grantUri, int uid, int modeFlags) { synchronized (mLock) { - return UriGrantsManagerService.this.checkUriPermission(grantUri, uid, modeFlags); + return UriGrantsManagerService.this.checkUriPermissionLocked(grantUri, uid, + modeFlags); } } @@ -1334,83 +1379,73 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { public int checkGrantUriPermission(int callingUid, String targetPkg, Uri uri, int modeFlags, int userId) { enforceNotIsolatedCaller("checkGrantUriPermission"); - synchronized (mLock) { - return UriGrantsManagerService.this.checkGrantUriPermission( - callingUid, targetPkg, uri, modeFlags, userId); - } + return UriGrantsManagerService.this.checkGrantUriPermissionUnlocked( + callingUid, targetPkg, uri, modeFlags, userId); } @Override public NeededUriGrants checkGrantUriPermissionFromIntent(Intent intent, int callingUid, String targetPkg, int targetUserId) { - synchronized (mLock) { - final int mode = (intent != null) ? intent.getFlags() : 0; - return UriGrantsManagerService.this.checkGrantUriPermissionFromIntent( - callingUid, targetPkg, intent, mode, null, targetUserId); - } + final int mode = (intent != null) ? intent.getFlags() : 0; + return UriGrantsManagerService.this.checkGrantUriPermissionFromIntentUnlocked( + callingUid, targetPkg, intent, mode, null, targetUserId); } @Override public void grantUriPermissionUncheckedFromIntent(NeededUriGrants needed, UriPermissionOwner owner) { - synchronized (mLock) { - UriGrantsManagerService.this.grantUriPermissionUncheckedFromIntent(needed, owner); - } + UriGrantsManagerService.this.grantUriPermissionUncheckedFromIntent(needed, owner); } @Override public void onSystemReady() { synchronized (mLock) { - UriGrantsManagerService.this.readGrantedUriPermissions(); + UriGrantsManagerService.this.readGrantedUriPermissionsLocked(); } } @Override public IBinder newUriPermissionOwner(String name) { enforceNotIsolatedCaller("newUriPermissionOwner"); - synchronized(mLock) { - UriPermissionOwner owner = new UriPermissionOwner(this, name); - return owner.getExternalToken(); - } + UriPermissionOwner owner = new UriPermissionOwner(this, name); + return owner.getExternalToken(); } @Override public void removeUriPermissionsForPackage(String packageName, int userHandle, boolean persistable, boolean targetOnly) { - synchronized(mLock) { - UriGrantsManagerService.this.removeUriPermissionsForPackage( + synchronized (mLock) { + UriGrantsManagerService.this.removeUriPermissionsForPackageLocked( packageName, userHandle, persistable, targetOnly); } } @Override public void revokeUriPermissionFromOwner(IBinder token, Uri uri, int mode, int userId) { - synchronized(mLock) { - final UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); - if (owner == null) { - throw new IllegalArgumentException("Unknown owner: " + token); - } + final UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); + if (owner == null) { + throw new IllegalArgumentException("Unknown owner: " + token); + } - if (uri == null) { - owner.removeUriPermissions(mode); - } else { - owner.removeUriPermission(new GrantUri(userId, uri, mode), mode); - } + if (uri == null) { + owner.removeUriPermissions(mode); + } else { + owner.removeUriPermission(new GrantUri(userId, uri, mode), mode); } } @Override public boolean checkAuthorityGrants(int callingUid, ProviderInfo cpi, int userId, boolean checkUser) { - synchronized(mLock) { - return UriGrantsManagerService.this.checkAuthorityGrants( + synchronized (mLock) { + return UriGrantsManagerService.this.checkAuthorityGrantsLocked( callingUid, cpi, userId, checkUser); } } @Override public void dump(PrintWriter pw, boolean dumpAll, String dumpPackage) { - synchronized(mLock) { + synchronized (mLock) { boolean needSep = false; boolean printedAnything = false; if (mGrantedUriPermissions.size() > 0) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 00b2a58dbe8f..0d5621dc0e4f 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -23,7 +23,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; -import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.activityTypeToString; import static android.app.WindowConfiguration.windowingModeToString; @@ -269,9 +268,6 @@ class ActivityStack extends Task { private final AnimatingActivityRegistry mAnimatingActivityRegistry = new AnimatingActivityRegistry(); - /** Stores the override windowing-mode from before a transient mode change (eg. split) */ - private int mRestoreOverrideWindowingMode = WINDOWING_MODE_UNDEFINED; - private boolean mTopActivityOccludesKeyguard; private ActivityRecord mTopDismissingKeyguardActivity; @@ -662,19 +658,6 @@ class ActivityStack extends Task { } /** - * A transient windowing mode is one which activities enter into temporarily. Examples of this - * are Split window modes and pip. Non-transient modes are modes that displays can adopt. - * - * @param windowingMode the windowingMode to test for transient-ness. - * @return {@code true} if the windowing mode is transient, {@code false} otherwise. - */ - private static boolean isTransientWindowingMode(int windowingMode) { - return windowingMode == WINDOWING_MODE_PINNED - || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; - } - - /** * Specialization of {@link #setWindowingMode(int)} for this subclass. * * @param preferredWindowingMode the preferred windowing mode. This may not be honored depending @@ -698,11 +681,6 @@ class ActivityStack extends Task { final int currentOverrideMode = getRequestedOverrideWindowingMode(); final Task topTask = getTopMostTask(); int windowingMode = preferredWindowingMode; - if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED - && isTransientWindowingMode(currentMode)) { - // Leaving a transient mode. Interpret UNDEFINED as "restore" - windowingMode = mRestoreOverrideWindowingMode; - } // Need to make sure windowing mode is supported. If we in the process of creating the stack // no need to resolve the windowing mode again as it is already resolved to the right mode. @@ -712,29 +690,16 @@ class ActivityStack extends Task { windowingMode = WINDOWING_MODE_UNDEFINED; } } - if (taskDisplayArea.getRootSplitScreenPrimaryTask() == this - && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { - // Resolution to split-screen secondary for the primary split-screen stack means - // we want to leave split-screen mode. - windowingMode = mRestoreOverrideWindowingMode; - } final boolean alreadyInSplitScreenMode = taskDisplayArea.isSplitScreenModeActivated(); - // Take any required action due to us not supporting the preferred windowing mode. - if (alreadyInSplitScreenMode && windowingMode == WINDOWING_MODE_FULLSCREEN + if (creating && alreadyInSplitScreenMode && windowingMode == WINDOWING_MODE_FULLSCREEN && isActivityTypeStandardOrUndefined()) { - final boolean preferredSplitScreen = - preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; - if (preferredSplitScreen || creating) { - // Looks like we can't launch in split screen mode or the stack we are launching - // doesn't support split-screen mode, go ahead an dismiss split-screen and display a - // warning toast about it. - mAtmService.getTaskChangeNotificationController() - .notifyActivityDismissingDockedStack(); - taskDisplayArea.onSplitScreenModeDismissed(this); - } + // If the stack is being created explicitly in fullscreen mode, dismiss split-screen + // and display a warning toast about it. + mAtmService.getTaskChangeNotificationController() + .notifyActivityDismissingDockedStack(); + taskDisplayArea.onSplitScreenModeDismissed(this); } if (currentMode == windowingMode) { @@ -797,9 +762,6 @@ class ActivityStack extends Task { + " while there is already one isn't currently supported"); //return; } - if (isTransientWindowingMode(windowingMode) && !isTransientWindowingMode(currentMode)) { - mRestoreOverrideWindowingMode = currentOverrideMode; - } mTmpRect2.setEmpty(); if (windowingMode != WINDOWING_MODE_FULLSCREEN) { @@ -819,6 +781,22 @@ class ActivityStack extends Task { mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); mRootWindowContainer.resumeFocusedStacksTopActivities(); + + final boolean pinnedToFullscreen = currentMode == WINDOWING_MODE_PINNED + && windowingMode == WINDOWING_MODE_FULLSCREEN; + if (pinnedToFullscreen && topActivity != null && !isForceHidden()) { + mDisplayContent.getPinnedStackController().setPipWindowingModeChanging(true); + try { + // Report orientation as soon as possible so that the display can freeze earlier if + // the display orientation will be changed. Because the surface bounds of activity + // may have been set to fullscreen but the activity hasn't redrawn its content yet, + // the rotation animation needs to capture snapshot earlier to avoid animating from + // an intermediate state. + topActivity.reportDescendantOrientationChangeIfNeeded(); + } finally { + mDisplayContent.getPinnedStackController().setPipWindowingModeChanging(false); + } + } } @Override diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 8903776469db..a5b94b327699 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1481,6 +1481,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // has it own policy for bounds, the activity bounds based on parent is unknown. return false; } + if (mPinnedStackControllerLocked.isPipActiveOrWindowingModeChanging()) { + // Use normal rotation animation because seamless PiP rotation is not supported yet. + return false; + } setFixedRotationLaunchingApp(r, rotation); return true; @@ -4772,6 +4776,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * @param sc The new SurfaceControl, where the DisplayContent's surfaces will be re-parented to. */ void reparentDisplayContent(WindowState win, SurfaceControl sc) { + if (mParentWindow != null) { + mParentWindow.removeEmbeddedDisplayContent(this); + } mParentWindow = win; mParentWindow.addEmbeddedDisplayContent(this); mParentSurfaceControl = sc; diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java index 56312aa1b0b8..52ada472f0aa 100644 --- a/services/core/java/com/android/server/wm/PinnedStackController.java +++ b/services/core/java/com/android/server/wm/PinnedStackController.java @@ -23,7 +23,6 @@ import android.app.RemoteAction; import android.content.ComponentName; import android.content.pm.ParceledListSlice; import android.content.res.Resources; -import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.DisplayMetrics; @@ -33,8 +32,6 @@ import android.view.DisplayInfo; import android.view.IPinnedStackController; import android.view.IPinnedStackListener; -import com.android.server.UiThread; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -61,7 +58,6 @@ class PinnedStackController { private final WindowManagerService mService; private final DisplayContent mDisplayContent; - private final Handler mHandler = UiThread.getHandler(); private IPinnedStackListener mPinnedStackListener; private final PinnedStackListenerDeathHandler mPinnedStackListenerDeathHandler = @@ -69,6 +65,9 @@ class PinnedStackController { private final PinnedStackControllerCallback mCallbacks = new PinnedStackControllerCallback(); + /** Whether the PiP is entering or leaving. */ + private boolean mIsPipWindowingModeChanging; + private boolean mIsImeShowing; private int mImeHeight; @@ -161,6 +160,20 @@ class PinnedStackController { Float.compare(aspectRatio, mMaxAspectRatio) <= 0; } + /** Returns {@code true} if the PiP is on screen or is changing windowing mode. */ + boolean isPipActiveOrWindowingModeChanging() { + if (mIsPipWindowingModeChanging) { + return true; + } + final Task pinnedTask = mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask(); + return pinnedTask != null && pinnedTask.hasChild(); + } + + /** Sets whether a visible stack is changing from or to pinned mode. */ + void setPipWindowingModeChanging(boolean isPipWindowingModeChanging) { + mIsPipWindowingModeChanging = isPipWindowingModeChanging; + } + /** * Activity is hidden (either stopped or removed), resets the last saved snap fraction * so that the default bounds will be returned for the next session. diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 039c0ee11968..31897057e076 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3504,7 +3504,7 @@ class Task extends WindowContainer<WindowContainer> { ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "applyAnimationUnchecked, control: %s, task: %s, transit: %s", control, asTask(), AppTransition.appTransitionToString(transit)); - control.addTaskToTargets(getRootTask(), finishedCallback); + control.addTaskToTargets(this, finishedCallback); } } else { super.applyAnimationUnchecked(lp, enter, transit, isVoiceInteraction, finishedCallback); diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index d1cb2105246a..aee5a1d7838b 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -106,6 +106,8 @@ class WallpaperController { private static final int WALLPAPER_DRAW_TIMEOUT = 2; private int mWallpaperDrawState = WALLPAPER_DRAW_NORMAL; + private boolean mShouldUpdateZoom; + /** * Temporary storage for taking a screenshot of the wallpaper. * @see #screenshotWallpaperLocked() @@ -400,6 +402,7 @@ class WallpaperController { void setWallpaperZoomOut(WindowState window, float zoom) { if (Float.compare(window.mWallpaperZoomOut, zoom) != 0) { window.mWallpaperZoomOut = zoom; + mShouldUpdateZoom = true; updateWallpaperOffsetLocked(window, false); } } @@ -623,9 +626,7 @@ class WallpaperController { mLastWallpaperX = mWallpaperTarget.mWallpaperX; mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep; } - if (mWallpaperTarget.mWallpaperZoomOut >= 0) { - mLastWallpaperZoomOut = mWallpaperTarget.mWallpaperZoomOut; - } + computeLastWallpaperZoomOut(); if (mWallpaperTarget.mWallpaperY >= 0) { mLastWallpaperY = mWallpaperTarget.mWallpaperY; mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep; @@ -804,8 +805,11 @@ class WallpaperController { * we'll have conflicts and break the "depth system" mental model. */ private void computeLastWallpaperZoomOut() { - mLastWallpaperZoomOut = 0; - mDisplayContent.forAllWindows(mComputeMaxZoomOutFunction, true); + if (mShouldUpdateZoom) { + mLastWallpaperZoomOut = 0; + mDisplayContent.forAllWindows(mComputeMaxZoomOutFunction, true); + mShouldUpdateZoom = false; + } } private float zoomOutToScale(float zoom) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 045089082fd8..36232e13fcf1 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5790,10 +5790,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // be invoked and we need to invoke it ourself. if (mLocalSyncId >= 0) { mBLASTSyncEngine.setReady(mLocalSyncId); - } else { - mWaitingListener.onTransactionReady(mWaitingSyncId, mBLASTSyncTransaction); + return mWinAnimator.finishDrawingLocked(null); } + mWaitingListener.onTransactionReady(mWaitingSyncId, mBLASTSyncTransaction); mUsingBLASTSyncTransaction = false; mWaitingSyncId = 0; diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java index e86399e1a631..62b6a65cc6cb 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java @@ -60,14 +60,12 @@ import java.util.Set; public class UriGrantsManagerServiceTest { private UriGrantsMockContext mContext; - private UriGrantsManagerService mService; - private UriGrantsManagerInternal mLocalService; + private UriGrantsManagerInternal mService; @Before public void setUp() throws Exception { mContext = new UriGrantsMockContext(InstrumentationRegistry.getContext()); - mService = UriGrantsManagerService.createForTest(mContext.getFilesDir()); - mLocalService = mService.getLocalService(); + mService = UriGrantsManagerService.createForTest(mContext.getFilesDir()).getLocalService(); } /** @@ -80,8 +78,7 @@ public class UriGrantsManagerServiceTest { final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_PRIMARY); + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY); assertEquals(PKG_SOCIAL, needed.targetPkg); assertEquals(UID_PRIMARY_SOCIAL, needed.targetUid); assertEquals(FLAG_READ, needed.flags); @@ -98,8 +95,7 @@ public class UriGrantsManagerServiceTest { final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_SECONDARY); + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_SECONDARY); assertEquals(PKG_SOCIAL, needed.targetPkg); assertEquals(UID_SECONDARY_SOCIAL, needed.targetUid); assertEquals(FLAG_READ, needed.flags); @@ -113,8 +109,7 @@ public class UriGrantsManagerServiceTest { public void testNeeded_public() { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PUBLIC).addFlags(FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_PUBLIC, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_PRIMARY); + intent, UID_PRIMARY_PUBLIC, PKG_SOCIAL, USER_PRIMARY); assertNull(needed); } @@ -128,7 +123,7 @@ public class UriGrantsManagerServiceTest { final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PUBLIC, FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_PUBLIC, PKG_SOCIAL, intent, intent.getFlags(), null, USER_SECONDARY); + intent, UID_PRIMARY_PUBLIC, PKG_SOCIAL, USER_SECONDARY); assertEquals(PKG_SOCIAL, needed.targetPkg); assertEquals(UID_SECONDARY_SOCIAL, needed.targetUid); assertEquals(FLAG_READ, needed.flags); @@ -143,7 +138,7 @@ public class UriGrantsManagerServiceTest { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PRIVATE).addFlags(FLAG_READ); try { mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_PRIVATE, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY); + intent, UID_PRIMARY_PRIVATE, PKG_SOCIAL, USER_PRIMARY); fail(); } catch (SecurityException expected) { } @@ -158,7 +153,7 @@ public class UriGrantsManagerServiceTest { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_FORCE) .addFlags(FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_FORCE, PKG_FORCE, intent, intent.getFlags(), null, USER_PRIMARY); + intent, UID_PRIMARY_FORCE, PKG_FORCE, USER_PRIMARY); assertEquals(asSet(new GrantUri(USER_PRIMARY, URI_FORCE, 0)), needed.uris); } @@ -172,15 +167,15 @@ public class UriGrantsManagerServiceTest { { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ | Intent.FLAG_ACTIVITY_CLEAR_TASK); - assertNull(mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL, - intent, intent.getFlags(), null, USER_PRIMARY)); + assertNull(mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY)); } { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ | FLAG_PREFIX); try { - mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL, - intent, intent.getFlags(), null, USER_PRIMARY); + mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY); fail(); } catch (SecurityException expected) { } @@ -189,8 +184,8 @@ public class UriGrantsManagerServiceTest { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ | FLAG_PERSISTABLE); try { - mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL, - intent, intent.getFlags(), null, USER_PRIMARY); + mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY); fail(); } catch (SecurityException expected) { } @@ -209,8 +204,7 @@ public class UriGrantsManagerServiceTest { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_SECONDARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_SECONDARY); assertEquals(FLAG_READ, needed.flags); } { @@ -218,8 +212,7 @@ public class UriGrantsManagerServiceTest { .addFlags(FLAG_READ | FLAG_PREFIX); try { mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_SECONDARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_SECONDARY); fail(); } catch (SecurityException expected) { } @@ -229,8 +222,7 @@ public class UriGrantsManagerServiceTest { .addFlags(FLAG_READ | FLAG_PERSISTABLE); try { mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, - USER_SECONDARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_SECONDARY); fail(); } catch (SecurityException expected) { } @@ -248,21 +240,21 @@ public class UriGrantsManagerServiceTest { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY); assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, 0)), needed.uris); } { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ | FLAG_PREFIX); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY); assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, FLAG_PREFIX)), needed.uris); } { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) .addFlags(FLAG_READ | FLAG_PERSISTABLE); final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY); + intent, UID_PRIMARY_COMPLEX, PKG_SOCIAL, USER_PRIMARY); assertEquals(asSet(new GrantUri(USER_PRIMARY, uri, 0)), needed.uris); } } @@ -284,8 +276,8 @@ public class UriGrantsManagerServiceTest { // When granting towards primary, persistable can't be honored so // the entire grant fails try { - mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, - intent.getFlags(), null, USER_PRIMARY); + mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY); fail(); } catch (SecurityException expected) { } @@ -294,8 +286,8 @@ public class UriGrantsManagerServiceTest { // When granting towards secondary, persistable can't be honored so // the entire grant fails try { - mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, - intent.getFlags(), null, USER_SECONDARY); + mService.checkGrantUriPermissionFromIntent( + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_SECONDARY); fail(); } catch (SecurityException expected) { } @@ -310,18 +302,16 @@ public class UriGrantsManagerServiceTest { public void testGrant_overlap() { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ); - final UriPermissionOwner activity = new UriPermissionOwner(mLocalService, "activity"); - final UriPermissionOwner service = new UriPermissionOwner(mLocalService, "service"); + final UriPermissionOwner activity = new UriPermissionOwner(mService, "activity"); + final UriPermissionOwner service = new UriPermissionOwner(mService, "service"); final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ); // Grant read via activity and write via service mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY), - activity); + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY), activity); mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY), - service); + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY), service); // Verify that everything is good with the world assertTrue(mService.checkUriPermission(expectedGrant, UID_PRIMARY_SOCIAL, FLAG_READ)); @@ -338,7 +328,7 @@ public class UriGrantsManagerServiceTest { @Test public void testCheckAuthorityGrants() { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ); - final UriPermissionOwner owner = new UriPermissionOwner(mLocalService, "primary"); + final UriPermissionOwner owner = new UriPermissionOwner(mService, "primary"); final ProviderInfo cameraInfo = mContext.mPmInternal.resolveContentProvider( PKG_CAMERA, 0, USER_PRIMARY); @@ -355,8 +345,7 @@ public class UriGrantsManagerServiceTest { // Granting primary camera to primary social mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent( - UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY), - owner); + intent, UID_PRIMARY_CAMERA, PKG_SOCIAL, USER_PRIMARY), owner); assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL, cameraInfo, USER_PRIMARY, true)); assertFalse(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL, @@ -368,8 +357,7 @@ public class UriGrantsManagerServiceTest { // Granting secondary camera to primary social mService.grantUriPermissionUncheckedFromIntent(mService.checkGrantUriPermissionFromIntent( - UID_SECONDARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY), - owner); + intent, UID_SECONDARY_CAMERA, PKG_SOCIAL, USER_PRIMARY), owner); assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL, cameraInfo, USER_PRIMARY, true)); assertTrue(mService.checkAuthorityGrants(UID_PRIMARY_SOCIAL, diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 7197ce9c22aa..4ad7dff87072 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -16,7 +16,10 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @@ -73,6 +76,8 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import android.annotation.SuppressLint; @@ -1168,6 +1173,57 @@ public class DisplayContentTests extends WindowTestsBase { } @Test + public void testNoFixedRotationWithPip() { + mWm.mIsFixedRotationTransformEnabled = true; + // Make resume-top really update the activity state. + doReturn(false).when(mWm.mAtmService).isBooting(); + doReturn(true).when(mWm.mAtmService).isBooted(); + // Speed up the test by a few seconds. + mWm.mAtmService.deferWindowLayout(); + doNothing().when(mWm).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt()); + + final DisplayContent displayContent = mWm.mRoot.getDefaultDisplay(); + final Configuration displayConfig = displayContent.getConfiguration(); + final ActivityRecord pinnedActivity = createActivityRecord(displayContent, + WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD); + final Task pinnedTask = pinnedActivity.getRootTask(); + final ActivityRecord homeActivity = WindowTestUtils.createTestActivityRecord( + displayContent.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()); + if (displayConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + homeActivity.setOrientation(SCREEN_ORIENTATION_PORTRAIT); + pinnedActivity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + } else { + homeActivity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + pinnedActivity.setOrientation(SCREEN_ORIENTATION_PORTRAIT); + } + final int homeConfigOrientation = homeActivity.getRequestedConfigurationOrientation(); + final int pinnedConfigOrientation = pinnedActivity.getRequestedConfigurationOrientation(); + + assertEquals(homeConfigOrientation, displayConfig.orientation); + + clearInvocations(mWm); + // Leave PiP to fullscreen. The orientation can be updated from + // ActivityRecord#reportDescendantOrientationChangeIfNeeded. + pinnedTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + homeActivity.setState(ActivityStack.ActivityState.STOPPED, "test"); + + assertFalse(displayContent.hasTopFixedRotationLaunchingApp()); + verify(mWm, atLeastOnce()).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt()); + assertEquals(pinnedConfigOrientation, displayConfig.orientation); + assertFalse(displayContent.getPinnedStackController().isPipActiveOrWindowingModeChanging()); + + clearInvocations(mWm); + // Enter PiP from fullscreen. The orientation can be updated from + // ensure-visibility/resume-focused-stack -> ActivityRecord#makeActiveIfNeeded -> resume. + pinnedTask.setWindowingMode(WINDOWING_MODE_PINNED); + + assertFalse(displayContent.hasTopFixedRotationLaunchingApp()); + verify(mWm, atLeastOnce()).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt()); + assertEquals(homeConfigOrientation, displayConfig.orientation); + assertTrue(displayContent.getPinnedStackController().isPipActiveOrWindowingModeChanging()); + } + + @Test public void testRemoteRotation() { DisplayContent dc = createNewDisplay(); diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index d011dbbbe5db..ae93a81f274e 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -1113,6 +1113,7 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); List<Set> expectedSyncRequests = List.of( + Set.of(), Set.of(APP_A), Set.of(APP_A, APP_B), Set.of(APP_A, APP_B, APP_C), diff --git a/wifi/Android.bp b/wifi/Android.bp index 83b35616286a..9c5b7b66f2a3 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -135,7 +135,6 @@ java_sdk_library { permitted_packages: [ "android.hardware.wifi", "android.net.wifi", - "android.x.net.wifi", // Created by jarjar rules. "com.android.wifi.x", ], |