diff options
271 files changed, 3414 insertions, 1648 deletions
diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java index 88acf6507333..c43c832992cf 100644 --- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java @@ -281,6 +281,20 @@ public interface AppStandbyInternal { boolean shouldNoteResponseEventForAllBroadcastSessions(); /** + * Returns the list of roles whose holders are exempted from the requirement of starting + * a response event after receiving a broadcast. + */ + @NonNull + List<String> getBroadcastResponseExemptedRoles(); + + /** + * Returns the list of permissions whose holders are exempted from the requirement of starting + * a response event after receiving a broadcast. + */ + @NonNull + List<String> getBroadcastResponseExemptedPermissions(); + + /** * Return the last known value corresponding to the {@code key} from * {@link android.provider.DeviceConfig#NAMESPACE_APP_STANDBY} in AppStandbyController. */ diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index c1f31e971ec5..9e3e3553c125 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -100,6 +100,7 @@ import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings.Global; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IndentingPrintWriter; @@ -421,6 +422,26 @@ public class AppStandbyController ConstantsObserver.DEFAULT_NOTE_RESPONSE_EVENT_FOR_ALL_BROADCAST_SESSIONS; /** + * List of roles whose holders are exempted from the requirement of starting + * a response event after receiving a broadcast. + * + * The list of roles will be separated by '|' in the string. + */ + volatile String mBroadcastResponseExemptedRoles = + ConstantsObserver.DEFAULT_BROADCAST_RESPONSE_EXEMPTED_ROLES; + volatile List<String> mBroadcastResponseExemptedRolesList = Collections.EMPTY_LIST; + + /** + * List of permissions whose holders are exempted from the requirement of starting + * a response event after receiving a broadcast. + * + * The list of permissions will be separated by '|' in the string. + */ + volatile String mBroadcastResponseExemptedPermissions = + ConstantsObserver.DEFAULT_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS; + volatile List<String> mBroadcastResponseExemptedPermissionsList = Collections.EMPTY_LIST; + + /** * Map of last known values of keys in {@link DeviceConfig#NAMESPACE_APP_STANDBY}. * * Note: We are intentionally not guarding this by any lock since this is only updated on @@ -1960,6 +1981,18 @@ public class AppStandbyController } @Override + @NonNull + public List<String> getBroadcastResponseExemptedRoles() { + return mBroadcastResponseExemptedRolesList; + } + + @Override + @NonNull + public List<String> getBroadcastResponseExemptedPermissions() { + return mBroadcastResponseExemptedPermissionsList; + } + + @Override @Nullable public String getAppStandbyConstant(@NonNull String key) { return mAppStandbyProperties.get(key); @@ -2311,6 +2344,14 @@ public class AppStandbyController pw.print(mNoteResponseEventForAllBroadcastSessions); pw.println(); + pw.print(" mBroadcastResponseExemptedRoles"); + pw.print(mBroadcastResponseExemptedRoles); + pw.println(); + + pw.print(" mBroadcastResponseExemptedPermissions"); + pw.print(mBroadcastResponseExemptedPermissions); + pw.println(); + pw.println(); pw.print("mAppIdleEnabled="); pw.print(mAppIdleEnabled); pw.print(" mAllowRestrictedBucket="); @@ -2795,6 +2836,10 @@ public class AppStandbyController "broadcast_sessions_with_response_duration_ms"; private static final String KEY_NOTE_RESPONSE_EVENT_FOR_ALL_BROADCAST_SESSIONS = "note_response_event_for_all_broadcast_sessions"; + private static final String KEY_BROADCAST_RESPONSE_EXEMPTED_ROLES = + "brodacast_response_exempted_roles"; + private static final String KEY_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS = + "brodacast_response_exempted_permissions"; public static final long DEFAULT_CHECK_IDLE_INTERVAL_MS = COMPRESS_TIME ? ONE_MINUTE : 4 * ONE_HOUR; @@ -2837,6 +2882,11 @@ public class AppStandbyController 2 * ONE_MINUTE; public static final boolean DEFAULT_NOTE_RESPONSE_EVENT_FOR_ALL_BROADCAST_SESSIONS = true; + private static final String DEFAULT_BROADCAST_RESPONSE_EXEMPTED_ROLES = ""; + private static final String DEFAULT_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS = ""; + + private final TextUtils.SimpleStringSplitter mStringPipeSplitter = + new TextUtils.SimpleStringSplitter('|'); ConstantsObserver(Handler handler) { super(handler); @@ -2989,6 +3039,20 @@ public class AppStandbyController KEY_NOTE_RESPONSE_EVENT_FOR_ALL_BROADCAST_SESSIONS, DEFAULT_NOTE_RESPONSE_EVENT_FOR_ALL_BROADCAST_SESSIONS); break; + case KEY_BROADCAST_RESPONSE_EXEMPTED_ROLES: + mBroadcastResponseExemptedRoles = properties.getString( + KEY_BROADCAST_RESPONSE_EXEMPTED_ROLES, + DEFAULT_BROADCAST_RESPONSE_EXEMPTED_ROLES); + mBroadcastResponseExemptedRolesList = splitPipeSeparatedString( + mBroadcastResponseExemptedRoles); + break; + case KEY_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS: + mBroadcastResponseExemptedPermissions = properties.getString( + KEY_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS, + DEFAULT_BROADCAST_RESPONSE_EXEMPTED_PERMISSIONS); + mBroadcastResponseExemptedPermissionsList = splitPipeSeparatedString( + mBroadcastResponseExemptedPermissions); + break; default: if (!timeThresholdsUpdated && (name.startsWith(KEY_PREFIX_SCREEN_TIME_THRESHOLD) @@ -3003,6 +3067,15 @@ public class AppStandbyController } } + private List<String> splitPipeSeparatedString(String string) { + final List<String> values = new ArrayList<>(); + mStringPipeSplitter.setString(string); + while (mStringPipeSplitter.hasNext()) { + values.add(mStringPipeSplitter.next()); + } + return values; + } + private void updateTimeThresholds() { // Query the values as an atomic set. final DeviceConfig.Properties screenThresholdProperties = diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index c6f59208c450..1d1743f56ff7 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -298,6 +298,11 @@ public final class ActivityThread extends ClientTransactionHandler /** Use background GC policy and default JIT threshold. */ private static final int VM_PROCESS_STATE_JANK_IMPERCEPTIBLE = 1; + /** The delay time for retrying to request DirectActions. */ + private static final long REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS = 200; + /** The max count for retrying to request DirectActions. */ + private static final int REQUEST_DIRECT_ACTIONS_RETRY_MAX_COUNT = 7; + /** * Denotes an invalid sequence number corresponding to a process state change. */ @@ -1864,7 +1869,8 @@ public final class ActivityThread extends ClientTransactionHandler cancellationCallback.sendResult(cancellationResult); } mH.sendMessage(PooledLambda.obtainMessage(ActivityThread::handleRequestDirectActions, - ActivityThread.this, activityToken, interactor, cancellationSignal, callback)); + ActivityThread.this, activityToken, interactor, cancellationSignal, callback, + REQUEST_DIRECT_ACTIONS_RETRY_MAX_COUNT)); } @Override @@ -3970,7 +3976,7 @@ public final class ActivityThread extends ClientTransactionHandler /** Fetches the user actions for the corresponding activity */ private void handleRequestDirectActions(@NonNull IBinder activityToken, @NonNull IVoiceInteractor interactor, @NonNull CancellationSignal cancellationSignal, - @NonNull RemoteCallback callback) { + @NonNull RemoteCallback callback, int retryCount) { final ActivityClientRecord r = mActivities.get(activityToken); if (r == null) { Log.w(TAG, "requestDirectActions(): no activity for " + activityToken); @@ -3978,7 +3984,20 @@ public final class ActivityThread extends ClientTransactionHandler return; } final int lifecycleState = r.getLifecycleState(); - if (lifecycleState < ON_START || lifecycleState >= ON_STOP) { + if (lifecycleState < ON_START) { + // TODO(b/234173463): requestDirectActions callback should indicate errors + if (retryCount > 0) { + mH.sendMessageDelayed( + PooledLambda.obtainMessage(ActivityThread::handleRequestDirectActions, + ActivityThread.this, activityToken, interactor, cancellationSignal, + callback, retryCount - 1), REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS); + return; + } + Log.w(TAG, "requestDirectActions(" + r + "): wrong lifecycle: " + lifecycleState); + callback.sendResult(null); + return; + } + if (lifecycleState >= ON_STOP) { Log.w(TAG, "requestDirectActions(" + r + "): wrong lifecycle: " + lifecycleState); callback.sendResult(null); return; diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java index ef4662412b62..067a4c3c047e 100644 --- a/core/java/android/app/WallpaperColors.java +++ b/core/java/android/app/WallpaperColors.java @@ -36,6 +36,7 @@ import com.android.internal.graphics.cam.Cam; import com.android.internal.graphics.palette.CelebiQuantizer; import com.android.internal.graphics.palette.Palette; import com.android.internal.graphics.palette.VariationalKMeansQuantizer; +import com.android.internal.util.ContrastColorUtil; import java.io.FileOutputStream; import java.lang.annotation.Retention; @@ -93,10 +94,18 @@ public final class WallpaperColors implements Parcelable { // using the area instead. This way our comparisons are aspect ratio independent. private static final int MAX_WALLPAPER_EXTRACTION_AREA = MAX_BITMAP_SIZE * MAX_BITMAP_SIZE; - // Decides when dark theme is optimal for this wallpaper. - // The midpoint of perceptual luminance, 50, is 18.42 in relative luminance. - // ColorUtils.calculateLuminance returns relative luminance on a scale from 0 to 1. - private static final float DARK_THEME_MEAN_LUMINANCE = 0.1842f; + // When extracting the main colors, only consider colors + // present in at least MIN_COLOR_OCCURRENCE of the image + private static final float MIN_COLOR_OCCURRENCE = 0.05f; + + // Decides when dark theme is optimal for this wallpaper + private static final float DARK_THEME_MEAN_LUMINANCE = 0.3f; + // Minimum mean luminosity that an image needs to have to support dark text + private static final float BRIGHT_IMAGE_MEAN_LUMINANCE = 0.7f; + // We also check if the image has dark pixels in it, + // to avoid bright images with some dark spots. + private static final float DARK_PIXEL_CONTRAST = 5.5f; + private static final float MAX_DARK_AREA = 0.05f; private final List<Color> mMainColors; private final Map<Integer, Integer> mAllColors; @@ -244,9 +253,12 @@ public final class WallpaperColors implements Parcelable { this(primaryColor, secondaryColor, tertiaryColor, 0); // Calculate dark theme support based on primary color. - final double relativeLuminance = ColorUtils.calculateLuminance(primaryColor.toArgb()); - final boolean wallpaperIsDark = relativeLuminance < DARK_THEME_MEAN_LUMINANCE; - mColorHints |= wallpaperIsDark ? HINT_SUPPORTS_DARK_THEME : HINT_SUPPORTS_DARK_TEXT; + final float[] tmpHsl = new float[3]; + ColorUtils.colorToHSL(primaryColor.toArgb(), tmpHsl); + final float luminance = tmpHsl[2]; + if (luminance < DARK_THEME_MEAN_LUMINANCE) { + mColorHints |= HINT_SUPPORTS_DARK_THEME; + } } /** @@ -524,6 +536,9 @@ public final class WallpaperColors implements Parcelable { dimAmount = MathUtils.saturate(dimAmount); int[] pixels = new int[source.getWidth() * source.getHeight()]; + double totalLuminance = 0; + final int maxDarkPixels = (int) (pixels.length * MAX_DARK_AREA); + int darkPixels = 0; source.getPixels(pixels, 0 /* offset */, source.getWidth(), 0 /* x */, 0 /* y */, source.getWidth(), source.getHeight()); @@ -532,70 +547,42 @@ public final class WallpaperColors implements Parcelable { int dimmingLayerAlpha = (int) (255 * dimAmount); int blackTransparent = ColorUtils.setAlphaComponent(Color.BLACK, dimmingLayerAlpha); - // The median luminance in the wallpaper will be used to decide if it is light or dark. - // - // Calculating the luminances, adding them to a data structure, then selecting - // the middle element would be expensive, the sort would be O(n), where n is the number - // of pixels. - // - // Instead, we create an integer array with 101 elements initialized to zero. - // Why 101? 0 through 100, inclusive, matching the range of luminance. - // Then, for each pixel, the luminance is calculated, and the integer at the array index - // equal to the rounded luminance is incremented. - // - // After processing the pixels, the median luminance is determined by iterating over the - // array containing the count for each luminance. Starting from 0, we adding the count at - // each index until pixels.length/2 is exceeded. When that occurs, it means the current - // array index contains the pixel of median luminance, thus the current array index is the - // median luminance. - int[] luminanceCounts = new int[101]; + // This bitmap was already resized to fit the maximum allowed area. + // Let's just loop through the pixels, no sweat! + float[] tmpHsl = new float[3]; for (int i = 0; i < pixels.length; i++) { int pixelColor = pixels[i]; + ColorUtils.colorToHSL(pixelColor, tmpHsl); final int alpha = Color.alpha(pixelColor); - if (alpha == 0) { - continue; - } - // If the wallpaper is dimmed, apply dimming before calculating luminance. - int compositeColor = dimAmount <= 0 ? pixelColor : - ColorUtils.compositeColors(blackTransparent, pixelColor); - - // calculateLuminance will return relative luminance on a scale from 0 to 1. Intent - // is normalize to 0 to 100, and that is done by defensively normalizing to - // luminanceCounts.length, then flooring the result to defensively avoid any imprecision - // in the result of calculateLuminance that could cause it to exceed 1 and thus the - // array bounds. - float relativeLuminance = (float) ColorUtils.calculateLuminance(compositeColor) - * luminanceCounts.length - 1; - int intRelativeLuminance = (int) Math.floor(relativeLuminance); - int clampedRelativeLuminance = (intRelativeLuminance < 0) ? 0 : - (intRelativeLuminance > luminanceCounts.length - 1) ? luminanceCounts.length - 1 - : intRelativeLuminance; - luminanceCounts[clampedRelativeLuminance] += 1; - } - - int criticalRelativeLuminance = 0; - int luminancesProcessed = 0; - int criticalLuminanceIndex = (int) Math.floor(pixels.length * 0.5); - for (int i = 0; i < 100; i++) { - luminancesProcessed += luminanceCounts[i]; - if (luminancesProcessed > criticalLuminanceIndex) { - criticalRelativeLuminance = i; - break; + // Apply composite colors where the foreground is a black layer with an alpha value of + // the dim amount and the background is the wallpaper pixel color. + int compositeColors = ColorUtils.compositeColors(blackTransparent, pixelColor); + + // Calculate the adjusted luminance of the dimmed wallpaper pixel color. + double adjustedLuminance = ColorUtils.calculateLuminance(compositeColors); + + // Make sure we don't have a dark pixel mass that will + // make text illegible. + final boolean satisfiesTextContrast = ContrastColorUtil + .calculateContrast(pixelColor, Color.BLACK) > DARK_PIXEL_CONTRAST; + if (!satisfiesTextContrast && alpha != 0) { + darkPixels++; + if (DEBUG_DARK_PIXELS) { + pixels[i] = Color.RED; + } } + totalLuminance += adjustedLuminance; } - // Wallpaper is dark if the median pixel is less than mid-gray. - // - // Relative luminance places mid-gray at 18.42, 19 is used since luminances were rounded to - // ints to be stored in the array. - // - // Why not use perceptual luminance? It would require one more conversion step at each - // pixel, or adding a function to convert relative luminance to perceptual luminance just - // for this line. - boolean wallpaperIsDark = criticalRelativeLuminance < 19; int hints = 0; - hints |= wallpaperIsDark ? HINT_SUPPORTS_DARK_THEME : HINT_SUPPORTS_DARK_TEXT; + double meanLuminance = totalLuminance / pixels.length; + if (meanLuminance > BRIGHT_IMAGE_MEAN_LUMINANCE && darkPixels < maxDarkPixels) { + hints |= HINT_SUPPORTS_DARK_TEXT; + } + if (meanLuminance < DARK_THEME_MEAN_LUMINANCE) { + hints |= HINT_SUPPORTS_DARK_THEME; + } if (DEBUG_DARK_PIXELS) { try (FileOutputStream out = new FileOutputStream("/data/pixels.png")) { @@ -605,8 +592,8 @@ public final class WallpaperColors implements Parcelable { } catch (Exception e) { e.printStackTrace(); } - Log.d("WallpaperColors", "median relative L: " + criticalRelativeLuminance - + ", numPixels: " + pixels.length); + Log.d("WallpaperColors", "l: " + meanLuminance + ", d: " + darkPixels + + " maxD: " + maxDarkPixels + " numPixels: " + pixels.length); } return hints; diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java index 1c3bec5b52f4..b0b3e9e743cf 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -569,8 +569,19 @@ public abstract class DisplayManagerInternal { void onProximityNegative(); void onDisplayStateChange(boolean allInactive, boolean allOff); - void acquireSuspendBlocker(); - void releaseSuspendBlocker(); + /** + * Acquires a suspend blocker with a specified label. + * + * @param id A logging label for the acquisition. + */ + void acquireSuspendBlocker(String id); + + /** + * Releases a suspend blocker with a specified label. + * + * @param id A logging label for the release. + */ + void releaseSuspendBlocker(String id); } /** diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 21ecf8b0888c..334a659d7f23 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -806,11 +806,6 @@ public class InputMethodService extends AbstractInputMethodService { @NonNull EditorInfo editorInfo, boolean restarting, @NonNull IBinder startInputToken, @InputMethodNavButtonFlags int navButtonFlags, @NonNull ImeOnBackInvokedDispatcher imeDispatcher) { - mImeDispatcher = imeDispatcher; - if (mWindow != null) { - mWindow.getOnBackInvokedDispatcher().setImeOnBackInvokedDispatcher( - imeDispatcher); - } mPrivOps.reportStartInputAsync(startInputToken); mNavigationBarController.onNavButtonFlagsChanged(navButtonFlags); if (restarting) { @@ -818,6 +813,15 @@ public class InputMethodService extends AbstractInputMethodService { } else { startInput(inputConnection, editorInfo); } + // Update the IME dispatcher last, so that the previously registered back callback + // (if any) can be unregistered using the old dispatcher if {@link #doFinishInput()} + // is called from {@link #startInput(InputConnection, EditorInfo)} or + // {@link #restartInput(InputConnection, EditorInfo)}. + mImeDispatcher = imeDispatcher; + if (mWindow != null) { + mWindow.getOnBackInvokedDispatcher().setImeOnBackInvokedDispatcher( + imeDispatcher); + } } /** @@ -3860,6 +3864,11 @@ public class InputMethodService extends AbstractInputMethodService { }; private void compatHandleBack() { + if (!mDecorViewVisible) { + Log.e(TAG, "Back callback invoked on a hidden IME. Removing the callback..."); + unregisterCompatOnBackInvokedCallback(); + return; + } final KeyEvent downEvent = createBackKeyEvent( KeyEvent.ACTION_DOWN, false /* isTracking */); onKeyDown(KeyEvent.KEYCODE_BACK, downEvent); diff --git a/core/java/android/net/VpnManager.java b/core/java/android/net/VpnManager.java index f62d7c4a698d..2e64a74a5d67 100644 --- a/core/java/android/net/VpnManager.java +++ b/core/java/android/net/VpnManager.java @@ -100,6 +100,12 @@ public class VpnManager { /** * Action sent in {@link android.content.Intent}s to VpnManager clients when an event occurred. * + * <p>If the provisioning application declares a service handling this intent action, but is not + * already running, it will be started. Upon starting, the application is granted a short grace + * period to run in the background even while the device is idle to handle any potential + * failures. Applications requiring long-running actions triggered by one of these events should + * declare a foreground service to prevent being killed once the grace period expires. + * * This action will have a category of either {@link #CATEGORY_EVENT_IKE_ERROR}, * {@link #CATEGORY_EVENT_NETWORK_ERROR}, or {@link #CATEGORY_EVENT_DEACTIVATED_BY_USER}, * that the app can use to filter events it's interested in reacting to. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d2a86eb31870..805fdc44b256 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11374,7 +11374,7 @@ public final class Settings { * Whether or not data roaming is enabled. (0 = false, 1 = true) * Use {@link TelephonyManager#isDataRoamingEnabled} instead of calling via settings. */ - @Readable(maxTargetSdk = Build.VERSION_CODES.S) + @Readable(maxTargetSdk = Build.VERSION_CODES.S_V2) public static final String DATA_ROAMING = "data_roaming"; /** diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 5217b28942f8..2d461c6cf92e 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1130,18 +1130,16 @@ public class DreamService extends Service implements Window.Callback { final PackageManager pm = context.getPackageManager(); - final TypedArray rawMetadata = readMetadata(pm, serviceInfo); - if (rawMetadata == null) return null; - - final DreamMetadata metadata = new DreamMetadata( - convertToComponentName(rawMetadata.getString( - com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo), - rawMetadata.getDrawable( - com.android.internal.R.styleable.Dream_previewImage), - rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, - DEFAULT_SHOW_COMPLICATIONS)); - rawMetadata.recycle(); - return metadata; + try (TypedArray rawMetadata = readMetadata(pm, serviceInfo)) { + if (rawMetadata == null) return null; + return new DreamMetadata( + convertToComponentName(rawMetadata.getString( + com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo), + rawMetadata.getDrawable( + com.android.internal.R.styleable.Dream_previewImage), + rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, + DEFAULT_SHOW_COMPLICATIONS)); + } } /** diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java index 3cffeb0578d4..380c1045aea8 100644 --- a/core/java/android/view/FrameMetrics.java +++ b/core/java/android/view/FrameMetrics.java @@ -254,8 +254,9 @@ public final class FrameMetrics { int GPU_COMPLETED = 19; int SWAP_BUFFERS_COMPLETED = 20; int DISPLAY_PRESENT_TIME = 21; + int COMMAND_SUBMISSION_COMPLETED = 22; - int FRAME_STATS_COUNT = 22; // must always be last and in sync with + int FRAME_STATS_COUNT = 23; // must always be last and in sync with // FrameInfoIndex::NumIndexes in libs/hwui/FrameInfo.h } @@ -291,7 +292,7 @@ public final class FrameMetrics { // RESERVED VSYNC_TIMESTAMP 0, 0, // GPU_DURATION - Index.SWAP_BUFFERS, Index.GPU_COMPLETED, + Index.COMMAND_SUBMISSION_COMPLETED, Index.GPU_COMPLETED, // DEADLINE Index.INTENDED_VSYNC, Index.FRAME_DEADLINE, }; diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java index 0b05d94663cc..2922ad6ff6a8 100644 --- a/core/java/android/view/InputWindowHandle.java +++ b/core/java/android/view/InputWindowHandle.java @@ -210,6 +210,7 @@ public final class InputWindowHandle { .append(", scaleFactor=").append(scaleFactor) .append(", transform=").append(transform) .append(", windowToken=").append(windowToken) + .append(", isClone=").append(isClone) .toString(); } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 2e48c2b77233..7e264cea46bb 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -719,13 +719,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private void releaseSurfaces(boolean releaseSurfacePackage) { mSurfaceAlpha = 1f; - - mSurfaceLock.lock(); - try { - mSurface.destroy(); - } finally { - mSurfaceLock.unlock(); - } + mSurface.destroy(); + synchronized (mSurfaceControlLock) { if (mBlastBufferQueue != null) { mBlastBufferQueue.destroy(); diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 7353bbccf77c..7d7270d1ef76 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -522,6 +522,61 @@ public final class AutofillManager { public static final int RESULT_CODE_NOT_SERVICE = -1; /** + * Reasons to commit the Autofill context. + * + * <p>If adding a new reason, modify + * {@link com.android.server.autofill.PresentationStatsEventLogger#getNoPresentationEventReason(int)} + * as well.</p> + * + * TODO(b/233833662): Expose this as a public API in U. + * @hide + */ + @IntDef(prefix = { "COMMIT_REASON_" }, value = { + COMMIT_REASON_UNKNOWN, + COMMIT_REASON_ACTIVITY_FINISHED, + COMMIT_REASON_VIEW_COMMITTED, + COMMIT_REASON_VIEW_CLICKED, + COMMIT_REASON_VIEW_CHANGED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AutofillCommitReason {} + + /** + * Autofill context was committed because of an unknown reason. + * + * @hide + */ + public static final int COMMIT_REASON_UNKNOWN = 0; + + /** + * Autofill context was committed because activity finished. + * + * @hide + */ + public static final int COMMIT_REASON_ACTIVITY_FINISHED = 1; + + /** + * Autofill context was committed because {@link #commit()} was called. + * + * @hide + */ + public static final int COMMIT_REASON_VIEW_COMMITTED = 2; + + /** + * Autofill context was committed because view was clicked. + * + * @hide + */ + public static final int COMMIT_REASON_VIEW_CLICKED = 3; + + /** + * Autofill context was committed because of view changed. + * + * @hide + */ + public static final int COMMIT_REASON_VIEW_CHANGED = 4; + + /** * Makes an authentication id from a request id and a dataset id. * * @param requestId The request id. @@ -1585,7 +1640,7 @@ public final class AutofillManager { } if (mSaveTriggerId != null && mSaveTriggerId.equals(id)) { if (sDebug) Log.d(TAG, "triggering commit by click of " + id); - commitLocked(); + commitLocked(/* commitReason= */ COMMIT_REASON_VIEW_CLICKED); mMetricsLogger.write(newLog(MetricsEvent.AUTOFILL_SAVE_EXPLICITLY_TRIGGERED)); } } @@ -1603,7 +1658,7 @@ public final class AutofillManager { synchronized (mLock) { if (mSaveOnFinish) { if (sDebug) Log.d(TAG, "onActivityFinishing(): calling commitLocked()"); - commitLocked(); + commitLocked(/* commitReason= */ COMMIT_REASON_ACTIVITY_FINISHED); } else { if (sDebug) Log.d(TAG, "onActivityFinishing(): calling cancelLocked()"); cancelLocked(); @@ -1628,16 +1683,16 @@ public final class AutofillManager { } if (sVerbose) Log.v(TAG, "commit() called by app"); synchronized (mLock) { - commitLocked(); + commitLocked(/* commitReason= */ COMMIT_REASON_VIEW_COMMITTED); } } @GuardedBy("mLock") - private void commitLocked() { + private void commitLocked(@AutofillCommitReason int commitReason) { if (!mEnabled && !isActiveLocked()) { return; } - finishSessionLocked(); + finishSessionLocked(/* commitReason= */ commitReason); } /** @@ -2070,13 +2125,13 @@ public final class AutofillManager { } @GuardedBy("mLock") - private void finishSessionLocked() { + private void finishSessionLocked(@AutofillCommitReason int commitReason) { if (sVerbose) Log.v(TAG, "finishSessionLocked(): " + getStateAsStringLocked()); if (!isActiveLocked()) return; try { - mService.finishSession(mSessionId, mContext.getUserId()); + mService.finishSession(mSessionId, mContext.getUserId(), commitReason); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3549,7 +3604,7 @@ public final class AutofillManager { } if (mVisibleTrackedIds == null) { - finishSessionLocked(); + finishSessionLocked(/* commitReason= */ COMMIT_REASON_VIEW_CHANGED); } } @@ -3582,9 +3637,9 @@ public final class AutofillManager { if (mVisibleTrackedIds == null) { if (sVerbose) { - Log.v(TAG, "No more visible ids. Invisibile = " + mInvisibleTrackedIds); + Log.v(TAG, "No more visible ids. Invisible = " + mInvisibleTrackedIds); } - finishSessionLocked(); + finishSessionLocked(/* commitReason= */ COMMIT_REASON_VIEW_CHANGED); } } @@ -3656,7 +3711,7 @@ public final class AutofillManager { if (sVerbose) { Log.v(TAG, "onVisibleForAutofillChangedLocked(): no more visible ids"); } - finishSessionLocked(); + finishSessionLocked(/* commitReason= */ COMMIT_REASON_VIEW_CHANGED); } } } diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl index a507e74c30ab..cefd6dc13005 100644 --- a/core/java/android/view/autofill/IAutoFillManager.aidl +++ b/core/java/android/view/autofill/IAutoFillManager.aidl @@ -49,7 +49,7 @@ oneway interface IAutoFillManager { void updateSession(int sessionId, in AutofillId id, in Rect bounds, in AutofillValue value, int action, int flags, int userId); void setAutofillFailure(int sessionId, in List<AutofillId> ids, int userId); - void finishSession(int sessionId, int userId); + void finishSession(int sessionId, int userId, int commitReason); void cancelSession(int sessionId, int userId); void setAuthenticationResult(in Bundle data, int sessionId, int authenticationId, int userId); void setHasCallback(int sessionId, int userId, boolean hasIt); diff --git a/core/java/android/window/ProxyOnBackInvokedDispatcher.java b/core/java/android/window/ProxyOnBackInvokedDispatcher.java index bedf5038f669..10d43e89a09d 100644 --- a/core/java/android/window/ProxyOnBackInvokedDispatcher.java +++ b/core/java/android/window/ProxyOnBackInvokedDispatcher.java @@ -90,7 +90,11 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher { synchronized (mLock) { mCallbacks.add(Pair.create(callback, priority)); if (mActualDispatcher != null) { - mActualDispatcher.registerOnBackInvokedCallback(priority, callback); + if (priority <= PRIORITY_SYSTEM) { + mActualDispatcher.registerSystemOnBackInvokedCallback(callback); + } else { + mActualDispatcher.registerOnBackInvokedCallback(priority, callback); + } } } } @@ -171,7 +175,16 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher { return; } clearCallbacksOnDispatcher(); - mActualDispatcher = actualDispatcher; + if (actualDispatcher instanceof ProxyOnBackInvokedDispatcher) { + // We don't want to nest ProxyDispatchers, so if we are given on, we unwrap its + // actual dispatcher. + // This can happen when an Activity is recreated but the Window is preserved (e.g. + // when going from split-screen back to single screen) + mActualDispatcher = + ((ProxyOnBackInvokedDispatcher) actualDispatcher).mActualDispatcher; + } else { + mActualDispatcher = actualDispatcher; + } transferCallbacksToDispatcher(); } } diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 61c844ac8170..66abe30d0123 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -300,6 +300,8 @@ public class ChooserActivity extends ResolverActivity implements @VisibleForTesting protected ChooserMultiProfilePagerAdapter mChooserMultiProfilePagerAdapter; + private final EnterTransitionAnimationDelegate mEnterTransitionAnimationDelegate = + new EnterTransitionAnimationDelegate(); private boolean mRemoveSharedElements = false; @@ -383,7 +385,7 @@ public class ChooserActivity extends ResolverActivity implements // transition animation. getWindow().setWindowAnimations(0); } - startPostponedEnterTransition(); + mEnterTransitionAnimationDelegate.markImagePreviewReady(); return true; } }); @@ -431,7 +433,7 @@ public class ChooserActivity extends ResolverActivity implements mHideParentOnFail = false; } mRemoveSharedElements = true; - startPostponedEnterTransition(); + mEnterTransitionAnimationDelegate.markImagePreviewReady(); } } @@ -724,7 +726,7 @@ public class ChooserActivity extends ResolverActivity implements mRemoveSharedElements = false; } }); - postponeEnterTransition(); + mEnterTransitionAnimationDelegate.postponeTransition(); } @Override @@ -1242,6 +1244,9 @@ public class ChooserActivity extends ResolverActivity implements if (layout != null) { adjustPreviewWidth(getResources().getConfiguration().orientation, layout); } + if (previewType != CONTENT_PREVIEW_IMAGE) { + mEnterTransitionAnimationDelegate.markImagePreviewReady(); + } return layout; } @@ -2514,88 +2519,94 @@ public class ChooserActivity extends ResolverActivity implements if (mResolverDrawerLayout == null || gridAdapter == null) { return; } + int offset = calculateDrawerOffset(top, bottom, recyclerView, gridAdapter); + mResolverDrawerLayout.setCollapsibleHeightReserved(offset); + mEnterTransitionAnimationDelegate.markOffsetCalculated(); + }); + } + } - final int bottomInset = mSystemWindowInsets != null - ? mSystemWindowInsets.bottom : 0; - int offset = bottomInset; - int rowsToShow = gridAdapter.getSystemRowCount() - + gridAdapter.getProfileRowCount() - + gridAdapter.getServiceTargetRowCount() - + gridAdapter.getCallerAndRankedTargetRowCount(); - - // then this is most likely not a SEND_* action, so check - // the app target count - if (rowsToShow == 0) { - rowsToShow = gridAdapter.getRowCount(); - } + private int calculateDrawerOffset( + int top, int bottom, RecyclerView recyclerView, ChooserGridAdapter gridAdapter) { - // still zero? then use a default height and leave, which - // can happen when there are no targets to show - if (rowsToShow == 0 && !shouldShowStickyContentPreview()) { - offset += getResources().getDimensionPixelSize( - R.dimen.chooser_max_collapsed_height); - mResolverDrawerLayout.setCollapsibleHeightReserved(offset); - return; - } + final int bottomInset = mSystemWindowInsets != null + ? mSystemWindowInsets.bottom : 0; + int offset = bottomInset; + int rowsToShow = gridAdapter.getSystemRowCount() + + gridAdapter.getProfileRowCount() + + gridAdapter.getServiceTargetRowCount() + + gridAdapter.getCallerAndRankedTargetRowCount(); - View stickyContentPreview = findViewById(R.id.content_preview_container); - if (shouldShowStickyContentPreview() && isStickyContentPreviewShowing()) { - offset += stickyContentPreview.getHeight(); - } + // then this is most likely not a SEND_* action, so check + // the app target count + if (rowsToShow == 0) { + rowsToShow = gridAdapter.getRowCount(); + } - if (shouldShowTabs()) { - offset += findViewById(R.id.tabs).getHeight(); - } + // still zero? then use a default height and leave, which + // can happen when there are no targets to show + if (rowsToShow == 0 && !shouldShowStickyContentPreview()) { + offset += getResources().getDimensionPixelSize( + R.dimen.chooser_max_collapsed_height); + return offset; + } - if (recyclerView.getVisibility() == View.VISIBLE) { - int directShareHeight = 0; - rowsToShow = Math.min(4, rowsToShow); - boolean shouldShowExtraRow = shouldShowExtraRow(rowsToShow); - mLastNumberOfChildren = recyclerView.getChildCount(); - for (int i = 0, childCount = recyclerView.getChildCount(); - i < childCount && rowsToShow > 0; i++) { - View child = recyclerView.getChildAt(i); - if (((GridLayoutManager.LayoutParams) - child.getLayoutParams()).getSpanIndex() != 0) { - continue; - } - int height = child.getHeight(); - offset += height; - if (shouldShowExtraRow) { - offset += height; - } + View stickyContentPreview = findViewById(R.id.content_preview_container); + if (shouldShowStickyContentPreview() && isStickyContentPreviewShowing()) { + offset += stickyContentPreview.getHeight(); + } - if (gridAdapter.getTargetType( - recyclerView.getChildAdapterPosition(child)) - == ChooserListAdapter.TARGET_SERVICE) { - directShareHeight = height; - } - rowsToShow--; - } + if (shouldShowTabs()) { + offset += findViewById(R.id.tabs).getHeight(); + } + + if (recyclerView.getVisibility() == View.VISIBLE) { + int directShareHeight = 0; + rowsToShow = Math.min(4, rowsToShow); + boolean shouldShowExtraRow = shouldShowExtraRow(rowsToShow); + mLastNumberOfChildren = recyclerView.getChildCount(); + for (int i = 0, childCount = recyclerView.getChildCount(); + i < childCount && rowsToShow > 0; i++) { + View child = recyclerView.getChildAt(i); + if (((GridLayoutManager.LayoutParams) + child.getLayoutParams()).getSpanIndex() != 0) { + continue; + } + int height = child.getHeight(); + offset += height; + if (shouldShowExtraRow) { + offset += height; + } - boolean isExpandable = getResources().getConfiguration().orientation - == Configuration.ORIENTATION_PORTRAIT && !isInMultiWindowMode(); - if (directShareHeight != 0 && isSendAction(getTargetIntent()) - && isExpandable) { - // make sure to leave room for direct share 4->8 expansion - int requiredExpansionHeight = - (int) (directShareHeight / DIRECT_SHARE_EXPANSION_RATE); - int topInset = mSystemWindowInsets != null ? mSystemWindowInsets.top : 0; - int minHeight = bottom - top - mResolverDrawerLayout.getAlwaysShowHeight() - - requiredExpansionHeight - topInset - bottomInset; - - offset = Math.min(offset, minHeight); - } - } else { - ViewGroup currentEmptyStateView = getActiveEmptyStateView(); - if (currentEmptyStateView.getVisibility() == View.VISIBLE) { - offset += currentEmptyStateView.getHeight(); - } + if (gridAdapter.getTargetType( + recyclerView.getChildAdapterPosition(child)) + == ChooserListAdapter.TARGET_SERVICE) { + directShareHeight = height; } + rowsToShow--; + } - mResolverDrawerLayout.setCollapsibleHeightReserved(Math.min(offset, bottom - top)); - }); + boolean isExpandable = getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT && !isInMultiWindowMode(); + if (directShareHeight != 0 && isSendAction(getTargetIntent()) + && isExpandable) { + // make sure to leave room for direct share 4->8 expansion + int requiredExpansionHeight = + (int) (directShareHeight / DIRECT_SHARE_EXPANSION_RATE); + int topInset = mSystemWindowInsets != null ? mSystemWindowInsets.top : 0; + int minHeight = bottom - top - mResolverDrawerLayout.getAlwaysShowHeight() + - requiredExpansionHeight - topInset - bottomInset; + + offset = Math.min(offset, minHeight); + } + } else { + ViewGroup currentEmptyStateView = getActiveEmptyStateView(); + if (currentEmptyStateView.getVisibility() == View.VISIBLE) { + offset += currentEmptyStateView.getHeight(); + } } + + return Math.min(offset, bottom - top); } /** @@ -3930,6 +3941,51 @@ public class ChooserActivity extends ResolverActivity implements } } + /** + * A helper class to track app's readiness for the scene transition animation. + * The app is ready when both the image is laid out and the drawer offset is calculated. + */ + private class EnterTransitionAnimationDelegate implements View.OnLayoutChangeListener { + private boolean mPreviewReady = false; + private boolean mOffsetCalculated = false; + + void postponeTransition() { + postponeEnterTransition(); + } + + void markImagePreviewReady() { + if (!mPreviewReady) { + mPreviewReady = true; + maybeStartListenForLayout(); + } + } + + void markOffsetCalculated() { + if (!mOffsetCalculated) { + mOffsetCalculated = true; + maybeStartListenForLayout(); + } + } + + private void maybeStartListenForLayout() { + if (mPreviewReady && mOffsetCalculated && mResolverDrawerLayout != null) { + if (mResolverDrawerLayout.isInLayout()) { + startPostponedEnterTransition(); + } else { + mResolverDrawerLayout.addOnLayoutChangeListener(this); + mResolverDrawerLayout.requestLayout(); + } + } + } + + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) { + v.removeOnLayoutChangeListener(this); + startPostponedEnterTransition(); + } + } + @Override protected void maybeLogProfileChange() { getChooserActivityLogger().logShareheetProfileChanged(); diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 777104d89c0b..7c08a7bbc826 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -543,6 +543,11 @@ public final class SystemUiDeviceConfigFlags { */ public static final String TASK_MANAGER_ENABLED = "task_manager_enabled"; + /** + * (boolean) Whether the task manager should show an attention grabbing dot when tasks changed. + */ + public static final String TASK_MANAGER_SHOW_FOOTER_DOT = "task_manager_show_footer_dot"; + /** * (boolean) Whether the clipboard overlay is enabled. diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 488fb180723e..f727d80bba12 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -342,7 +342,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { boolean mDecorFitsSystemWindows = true; - private ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher = + private final ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher = new ProxyOnBackInvokedDispatcher(); static class WindowManagerHolder { @@ -378,6 +378,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { // window, as we'll be skipping the addView in handleResumeActivity(), and // the token will not be updated as for a new window. getAttributes().token = preservedWindow.getAttributes().token; + mProxyOnBackInvokedDispatcher.setActualDispatcher( + preservedWindow.getOnBackInvokedDispatcher()); } // Even though the device doesn't support picture-in-picture mode, // an user can force using it through developer options. diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 634063a44b66..e93a7854f1cd 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -242,7 +242,8 @@ oneway interface IStatusBar * Displays a text toast. */ void showToast(int uid, String packageName, IBinder token, CharSequence text, - IBinder windowToken, int duration, @nullable ITransientNotificationCallback callback); + IBinder windowToken, int duration, @nullable ITransientNotificationCallback callback, + int displayId); /** * Cancels toast with token {@code token} in {@code packageName}. diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index 90eeabb47e9a..1cdc10866f2c 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -929,7 +929,7 @@ public class ResolverDrawerLayout extends ViewGroup { // Single-use layout; just ignore the mode and use available space. // Clamp to maxWidth. if (mMaxWidth >= 0) { - widthSize = Math.min(widthSize, mMaxWidth); + widthSize = Math.min(widthSize, mMaxWidth + getPaddingLeft() + getPaddingRight()); } final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); @@ -1008,8 +1008,9 @@ public class ResolverDrawerLayout extends ViewGroup { View indicatorHost = null; int ypos = mTopOffset; - int leftEdge = getPaddingLeft(); - int rightEdge = width - getPaddingRight(); + final int leftEdge = getPaddingLeft(); + final int rightEdge = width - getPaddingRight(); + final int widthAvailable = rightEdge - leftEdge; final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { @@ -1030,7 +1031,6 @@ public class ResolverDrawerLayout extends ViewGroup { final int bottom = top + child.getMeasuredHeight(); final int childWidth = child.getMeasuredWidth(); - final int widthAvailable = rightEdge - leftEdge; final int left = leftEdge + (widthAvailable - childWidth) / 2; final int right = left + childWidth; diff --git a/core/proto/android/os/processstarttime.proto b/core/proto/android/os/processstarttime.proto new file mode 100644 index 000000000000..d0f8baee7da2 --- /dev/null +++ b/core/proto/android/os/processstarttime.proto @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto2"; +package android.os; + +option java_multiple_files = true; + +// This message is used for statsd logging and should be kept in sync with +// frameworks/proto_logging/stats/atoms.proto +/** + * Logs information about process start time. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java + */ +message ProcessStartTime { + // The uid of the ProcessRecord. + optional int32 uid = 1; + + // The process pid. + optional int32 pid = 2; + + // The process name. + // Usually package name, "system" for system server. + // Provided by ActivityManagerService. + optional string process_name = 3; + + enum StartType { + UNKNOWN = 0; + WARM = 1; + HOT = 2; + COLD = 3; + } + + // The start type. + optional StartType type = 4; + + // The elapsed realtime at the start of the process. + optional int64 process_start_time_millis = 5; + + // Number of milliseconds it takes to reach bind application. + optional int32 bind_application_delay_millis = 6; + + // Number of milliseconds it takes to finish start of the process. + optional int32 process_start_delay_millis = 7; + + // hostingType field in ProcessRecord, the component type such as "activity", + // "service", "content provider", "broadcast" or other strings. + optional string hosting_type = 8; + + // hostingNameStr field in ProcessRecord. The component class name that runs + // in this process. + optional string hosting_name = 9; + + // Broadcast action name. + optional string broadcast_action_name = 10; + + enum HostingTypeId { + HOSTING_TYPE_UNKNOWN = 0; + HOSTING_TYPE_ACTIVITY = 1; + HOSTING_TYPE_ADDED_APPLICATION = 2; + HOSTING_TYPE_BACKUP = 3; + HOSTING_TYPE_BROADCAST = 4; + HOSTING_TYPE_CONTENT_PROVIDER = 5; + HOSTING_TYPE_LINK_FAIL = 6; + HOSTING_TYPE_ON_HOLD = 7; + HOSTING_TYPE_NEXT_ACTIVITY = 8; + HOSTING_TYPE_NEXT_TOP_ACTIVITY = 9; + HOSTING_TYPE_RESTART = 10; + HOSTING_TYPE_SERVICE = 11; + HOSTING_TYPE_SYSTEM = 12; + HOSTING_TYPE_TOP_ACTIVITY = 13; + HOSTING_TYPE_EMPTY = 14; + } + + optional HostingTypeId hosting_type_id = 11; +} + diff --git a/core/res/res/drawable-nodpi/platlogo.xml b/core/res/res/drawable-nodpi/platlogo.xml index 1d67570cf485..f816d0c41349 100644 --- a/core/res/res/drawable-nodpi/platlogo.xml +++ b/core/res/res/drawable-nodpi/platlogo.xml @@ -13,24 +13,23 @@ Copyright (C) 2021 The Android Open Source Project See the License for the specific language governing permissions and limitations under the License. --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" +<vector android:height="128dp" android:width="128dp" - android:height="128dp" - android:viewportWidth="128" - android:viewportHeight="128"> - <path - android:pathData="M64,64m-64,0a64,64 0,1 1,128 0a64,64 0,1 1,-128 0" - android:fillColor="@android:color/system_accent3_500"/> - <path - android:pathData="M32.5,34.15a10,10 0,0 1,9.94 10V93.85" - android:strokeWidth="4" - android:fillColor="#00000000" - android:strokeColor="#fff" - android:strokeLineCap="round"/> - <path - android:pathData="M95.5,93.85H55.71V83.9A19.9,19.9 0,0 1,75.61 64h10a9.94,9.94 0,0 0,9.94 -10,19.9 19.9,0 0,0 -38.69,-6.56A20.77,20.77 0,0 0,56 50.73" - android:strokeWidth="4" - android:fillColor="#00000000" - android:strokeColor="#fff" - android:strokeLineCap="round"/> + android:viewportHeight="24" + android:viewportWidth="24" + xmlns:android="http://schemas.android.com/apk/res/android"> + <path + android:pathData="M11 0.51a2.06 2.06 0 0 1 2 0l0.58 0.37a4.15 4.15 0 0 0 2.23 0.55l0.69-0.06a2.07 2.07 0 0 1 1.81 0.95l0.33 0.6a4.14 4.14 0 0 0 1.72 1.52l0.64 0.27a2 2 0 0 1 1.16 1.68l0 0.69A4.12 4.12 0 0 0 23 9.23l0.44 0.53a2.06 2.06 0 0 1 0.24 2l-0.3 0.62a4.14 4.14 0 0 0-0.27 2.28l0.14 0.68a2.08 2.08 0 0 1-0.72 1.91l-0.56 0.41a4 4 0 0 0-1.3 1.89l-0.19 0.66A2.06 2.06 0 0 1 19 21.58l-0.68 0.11a4.09 4.09 0 0 0-2 1.07l-0.48 0.5a2.08 2.08 0 0 1-2 0.49l-0.65-0.23a4.28 4.28 0 0 0-2.3 0l-0.65 0.23a2.08 2.08 0 0 1-2-0.49l-0.48-0.5a4 4 0 0 0-2-1.07L5 21.58A2.06 2.06 0 0 1 3.5 20.23l-0.19-0.66A4 4 0 0 0 2 17.68l-0.56-0.41a2.08 2.08 0 0 1-0.72-1.91l0.14-0.68A4.14 4.14 0 0 0 0.6 12.4l-0.3-0.62a2.06 2.06 0 0 1 0.24-2L1 9.23A4.16 4.16 0 0 0 1.8 7.08l0-0.69A2 2 0 0 1 3 4.71l0.64-0.27A4.14 4.14 0 0 0 5.34 2.92l0.33-0.6a2.07 2.07 0 0 1 1.81-0.95l0.69 0.06A4.15 4.15 0 0 0 10.4 0.88Z" + android:fillColor="@android:color/system_accent3_400" + /> + <path + android:pathData="M12.34 6.53h4.05l-2 4.05a3.95 3.95 0 0 1-0.57 7.85 4.1 4.1 0 0 1-1.45-0.27" + android:strokeColor="@android:color/system_accent1_800" + android:strokeWidth="2"/> + <path + android:pathData="M12.34 6.53h4.05l-2 4.05a3.95 3.95 0 0 1-0.57 7.85 4.1 4.1 0 0 1-1.45-0.27" + android:strokeColor="@android:color/system_neutral1_100" + android:strokeWidth="0.5"/> + </vector> + diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 4d04edca73d6..dceeb7392d51 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1922,7 +1922,7 @@ <string name="language_selection_title" msgid="52674936078683285">"إضافة لغة"</string> <string name="country_selection_title" msgid="5221495687299014379">"تفضيل المنطقة"</string> <string name="search_language_hint" msgid="7004225294308793583">"اكتب اسم اللغة"</string> - <string name="language_picker_section_suggested" msgid="6556199184638990447">"المناطق المقترحة"</string> + <string name="language_picker_section_suggested" msgid="6556199184638990447">"اللغات المقترَحة"</string> <string name="language_picker_section_all" msgid="1985809075777564284">"جميع اللغات"</string> <string name="region_picker_section_all" msgid="756441309928774155">"كل المناطق"</string> <string name="locale_search_menu" msgid="6258090710176422934">"البحث"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index a3be5f0b1bca..fae9dd7e617c 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1690,7 +1690,7 @@ <string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Funktionen auswählen, die du mit der Schaltfläche \"Bedienungshilfen\" verwenden möchtest"</string> <string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Funktionen für Verknüpfung mit Lautstärketaste auswählen"</string> <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> wurde deaktiviert"</string> - <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Verknüpfungen bearbeiten"</string> + <string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Kurzbefehle bearbeiten"</string> <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Fertig"</string> <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Verknüpfung deaktivieren"</string> <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Verknüpfung verwenden"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ac6023590c80..54c3490740e5 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2422,7 +2422,7 @@ <!-- Whether to dismiss the active dream when an activity is started. Doesn't apply to assistant activities (ACTIVITY_TYPE_ASSISTANT) --> - <bool name="config_dismissDreamOnActivityStart">true</bool> + <bool name="config_dismissDreamOnActivityStart">false</bool> <!-- The prefix of dream component names that are loggable. If empty, logs "other" for all. --> <string name="config_loggable_dream_prefix" translatable="false"></string> diff --git a/libs/WindowManager/Shell/res/values-ar/strings_tv.xml b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml index 45b306643b5c..9c195a7386a9 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"نافذة ضمن النافذة"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ليس هناك عنوان للبرنامج)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"إغلاق"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ملء الشاشة"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"نقل"</string> + <string name="pip_expand" msgid="1051966011679297308">"توسيع"</string> + <string name="pip_collapse" msgid="3903295106641385962">"تصغير"</string> <string name="pip_edu_text" msgid="3672999496647508701">" انقر مرتين على "<annotation icon="home_icon">" الصفحة الرئيسية "</annotation>" للوصول لعناصر التحكم."</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"قائمة نافذة ضمن النافذة"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"نقل لليسار"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"نقل لليمين"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"نقل للأعلى"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"نقل للأسفل"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"تمّ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml index 91b966226b0d..51a1262b1de7 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zatvori"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Ceo ekran"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Premesti"</string> + <string name="pip_expand" msgid="1051966011679297308">"Proširi"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Skupi"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Dvaput pritisnite "<annotation icon="home_icon">" HOME "</annotation>" za kontrole"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Meni Slika u slici."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Pomerite nalevo"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Pomerite nadesno"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Pomerite nagore"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Pomerite nadole"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Gotovo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings_tv.xml b/libs/WindowManager/Shell/res/values-be/strings_tv.xml index 7ff6ce7b52ea..15a353c649d6 100644 --- a/libs/WindowManager/Shell/res/values-be/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-be/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Відарыс у відарысе"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Праграма без назвы)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Закрыць"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Поўнаэкранны рэжым"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Перамясціць"</string> + <string name="pip_expand" msgid="1051966011679297308">"Разгарнуць"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Згарнуць"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Двойчы націсніце "<annotation icon="home_icon">" ГАЛОЎНЫ ЭКРАН "</annotation>" для пераходу ў налады"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Меню рэжыму \"Відарыс у відарысе\"."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Перамясціць улева"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Перамясціць управа"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Перамясціць уверх"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Перамясціць уніз"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Гатова"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings_tv.xml b/libs/WindowManager/Shell/res/values-bg/strings_tv.xml index c5dde1576cbc..2b27a6927077 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Картина в картината"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програма без заглавие)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Затваряне"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Цял екран"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Преместване"</string> + <string name="pip_expand" msgid="1051966011679297308">"Разгъване"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Свиване"</string> <string name="pip_edu_text" msgid="3672999496647508701">" За достъп до контролите натиснете 2 пъти "<annotation icon="home_icon">"НАЧАЛО"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Меню за функцията „Картина в картината“."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Преместване наляво"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Преместване надясно"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Преместване нагоре"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Преместване надолу"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Готово"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings_tv.xml b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml index 4005c7a9c87f..23c8ffabeede 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ছবির-মধ্যে-ছবি"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিরোনামহীন প্রোগ্রাম)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"বন্ধ করুন"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"পূর্ণ স্ক্রিন"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"সরান"</string> + <string name="pip_expand" msgid="1051966011679297308">"বড় করুন"</string> + <string name="pip_collapse" msgid="3903295106641385962">"আড়াল করুন"</string> <string name="pip_edu_text" msgid="3672999496647508701">" কন্ট্রোলের জন্য "<annotation icon="home_icon">" হোম "</annotation>" বোতামে ডবল প্রেস করুন"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"ছবির-মধ্যে-ছবি মেনু।"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"বাঁদিকে সরান"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ডানদিকে সরান"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"উপরে তুলুন"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"নিচে নামান"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"হয়ে গেছে"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml index e2ea376a1685..443fd620fd65 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zatvori"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli ekran"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Premjesti"</string> + <string name="pip_expand" msgid="1051966011679297308">"Proširi"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Suzi"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Dvaput pritisnite "<annotation icon="home_icon">" POČETNI EKRAN "</annotation>" za kontrole"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Meni za način rada slika u slici."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Pomjeranje ulijevo"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Pomjeranje udesno"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Pomjeranje nagore"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Pomjeranje nadolje"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Gotovo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings_tv.xml b/libs/WindowManager/Shell/res/values-ca/strings_tv.xml index 38cd35c2eaa6..94ba0db7e978 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantalla en pantalla"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sense títol)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Tanca"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Mou"</string> + <string name="pip_expand" msgid="1051966011679297308">"Desplega"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Replega"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Prem dos cops "<annotation icon="home_icon">" INICI "</annotation>" per accedir als controls"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menú de pantalla en pantalla."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Mou cap a l\'esquerra"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Mou cap a la dreta"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Mou cap amunt"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Mou cap avall"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Fet"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings_tv.xml b/libs/WindowManager/Shell/res/values-cs/strings_tv.xml index 4eeff008fd26..3ed85dce0433 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Obraz v obraze"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Bez názvu)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zavřít"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Celá obrazovka"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Přesunout"</string> + <string name="pip_expand" msgid="1051966011679297308">"Rozbalit"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Sbalit"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Ovládací prvky zobrazíte dvojitým stisknutím "<annotation icon="home_icon">"tlačítka plochy"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Nabídka režimu obrazu v obraze"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Přesunout doleva"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Přesunout doprava"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Přesunout nahoru"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Přesunout dolů"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Hotovo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings_tv.xml b/libs/WindowManager/Shell/res/values-da/strings_tv.xml index f2ae12c01aab..09024428a825 100644 --- a/libs/WindowManager/Shell/res/values-da/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-da/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Integreret billede"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program uden titel)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Luk"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Fuld skærm"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Flyt"</string> + <string name="pip_expand" msgid="1051966011679297308">"Udvid"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Skjul"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Tryk to gange på "<annotation icon="home_icon">" HJEM "</annotation>" for at se indstillinger"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menu for integreret billede."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Flyt til venstre"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Flyt til højre"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Flyt op"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Flyt ned"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Udfør"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings_tv.xml b/libs/WindowManager/Shell/res/values-de/strings_tv.xml index 7ba693b1ce07..18535c9d9338 100644 --- a/libs/WindowManager/Shell/res/values-de/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-de/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Bild im Bild"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Kein Sendungsname gefunden)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Schließen"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Vollbild"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Bewegen"</string> + <string name="pip_expand" msgid="1051966011679297308">"Maximieren"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Minimieren"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Für Steuerelemente zweimal "<annotation icon="home_icon">"STARTBILDSCHIRMTASTE"</annotation>" drücken"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menü „Bild im Bild“."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Nach links bewegen"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Nach rechts bewegen"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Nach oben bewegen"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Nach unten bewegen"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Fertig"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml index 187d41c13dbd..a2c27b79e04c 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings_tv.xml @@ -25,7 +25,7 @@ <string name="pip_expand" msgid="1051966011679297308">"Expandir"</string> <string name="pip_collapse" msgid="3903295106641385962">"Contraer"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Presiona dos veces "<annotation icon="home_icon">"INICIO"</annotation>" para ver los controles"</string> - <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menú de Pantalla en pantalla"</string> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menú de pantalla en pantalla"</string> <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Mover hacia la izquierda"</string> <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Mover hacia la derecha"</string> <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Mover hacia arriba"</string> diff --git a/libs/WindowManager/Shell/res/values-es/strings_tv.xml b/libs/WindowManager/Shell/res/values-es/strings_tv.xml index d2fd0dc97dbc..7993e03b2464 100644 --- a/libs/WindowManager/Shell/res/values-es/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-es/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Imagen en imagen"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sin título)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Cerrar"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Mover"</string> + <string name="pip_expand" msgid="1051966011679297308">"Mostrar"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Ocultar"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Pulsa dos veces "<annotation icon="home_icon">"INICIO"</annotation>" para ver los controles"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menú de imagen en imagen."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Mover hacia la izquierda"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Mover hacia la derecha"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Mover hacia arriba"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Mover hacia abajo"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Hecho"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings_tv.xml b/libs/WindowManager/Shell/res/values-et/strings_tv.xml index bcdacfb77c2e..e8fcb180c0c4 100644 --- a/libs/WindowManager/Shell/res/values-et/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-et/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pilt pildis"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programmi pealkiri puudub)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Sule"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Täisekraan"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Teisalda"</string> + <string name="pip_expand" msgid="1051966011679297308">"Laienda"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Ahenda"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Nuppude nägemiseks vajutage 2 korda nuppu "<annotation icon="home_icon">"AVAKUVA"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menüü Pilt pildis."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Teisalda vasakule"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Teisalda paremale"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Teisalda üles"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Teisalda alla"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Valmis"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings_tv.xml b/libs/WindowManager/Shell/res/values-eu/strings_tv.xml index 9cb1fa971a0b..07d75d2de9cd 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantaila txiki gainjarria"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa izengabea)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Itxi"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pantaila osoa"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Mugitu"</string> + <string name="pip_expand" msgid="1051966011679297308">"Zabaldu"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Tolestu"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Kontrolatzeko aukerak atzitzeko, sakatu birritan "<annotation icon="home_icon">" HASIERA "</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Pantaila txiki gainjarriaren menua."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Eraman ezkerrera"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Eraman eskuinera"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Eraman gora"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Eraman behera"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Eginda"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings_tv.xml b/libs/WindowManager/Shell/res/values-fi/strings_tv.xml index e5380047fe42..24ab7d99e180 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Kuva kuvassa"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Nimetön)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Sulje"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Koko näyttö"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Siirrä"</string> + <string name="pip_expand" msgid="1051966011679297308">"Laajenna"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Tiivistä"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Asetukset: paina "<annotation icon="home_icon">"ALOITUSNÄYTTÖPAINIKETTA"</annotation>" kahdesti"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Kuva kuvassa ‑valikko."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Siirrä vasemmalle"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Siirrä oikealle"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Siirrä ylös"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Siirrä alas"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Valmis"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml index 2a6355fb3126..87651ec711d9 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Incrustation d\'image"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Aucun programme de titre)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Fermer"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Plein écran"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Déplacer"</string> + <string name="pip_expand" msgid="1051966011679297308">"Développer"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Réduire"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Appuyez deux fois sur "<annotation icon="home_icon">" ACCUEIL "</annotation>" pour les commandes"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menu d\'incrustation d\'image."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Déplacer vers la gauche"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Déplacer vers la droite"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Déplacer vers le haut"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Déplacer vers le bas"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings_tv.xml b/libs/WindowManager/Shell/res/values-fr/strings_tv.xml index ac44d6e595ac..37863fb82295 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-picture"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programme sans titre)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Fermer"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Plein écran"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Déplacer"</string> + <string name="pip_expand" msgid="1051966011679297308">"Développer"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Réduire"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Menu de commandes : appuyez deux fois sur "<annotation icon="home_icon">"ACCUEIL"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menu \"Picture-in-picture\"."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Déplacer vers la gauche"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Déplacer vers la droite"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Déplacer vers le haut"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Déplacer vers le bas"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings_tv.xml b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml index d566226e8225..5d6de76c4deb 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantalla superposta"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sen título)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Pechar"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Mover"</string> + <string name="pip_expand" msgid="1051966011679297308">"Despregar"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Contraer"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Preme "<annotation icon="home_icon">"INICIO"</annotation>" dúas veces para acceder aos controis"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menú de pantalla superposta."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Mover cara á esquerda"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Mover cara á dereita"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Mover cara arriba"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Mover cara abaixo"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Feito"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings_tv.xml b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml index cc62d69c29b2..e0227253b2dc 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"पिक्चर में पिक्चर"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(कोई शीर्षक कार्यक्रम नहीं)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"बंद करें"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"फ़ुल स्क्रीन"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ले जाएं"</string> + <string name="pip_expand" msgid="1051966011679297308">"बड़ा करें"</string> + <string name="pip_collapse" msgid="3903295106641385962">"छोटा करें"</string> <string name="pip_edu_text" msgid="3672999496647508701">" कंट्रोल मेन्यू पर जाने के लिए, "<annotation icon="home_icon">" होम बटन"</annotation>" दो बार दबाएं"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"पिक्चर में पिक्चर मेन्यू."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"बाईं ओर ले जाएं"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"दाईं ओर ले जाएं"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ऊपर ले जाएं"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"नीचे ले जाएं"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"हो गया"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hr/strings_tv.xml b/libs/WindowManager/Shell/res/values-hr/strings_tv.xml index 42eb1eef7a6b..a09e6e805f63 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zatvori"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli zaslon"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Premjesti"</string> + <string name="pip_expand" msgid="1051966011679297308">"Proširi"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Sažmi"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Dvaput pritisnite "<annotation icon="home_icon">"POČETNI ZASLON"</annotation>" za kontrole"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Izbornik slike u slici."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Pomaknite ulijevo"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Pomaknite udesno"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Pomaknite prema gore"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Pomaknite prema dolje"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Gotovo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings_tv.xml b/libs/WindowManager/Shell/res/values-hy/strings_tv.xml index 0a0892bc0498..7963abf8972b 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Նկար նկարի մեջ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Առանց վերնագրի ծրագիր)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Փակել"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Լիէկրան"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Տեղափոխել"</string> + <string name="pip_expand" msgid="1051966011679297308">"Ծավալել"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Ծալել"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Կարգավորումների համար կրկնակի սեղմեք "<annotation icon="home_icon">"ԳԼԽԱՎՈՐ ԷԿՐԱՆ"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"«Նկար նկարի մեջ» ռեժիմի ընտրացանկ։"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Տեղափոխել ձախ"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Տեղափոխել աջ"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Տեղափոխել վերև"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Տեղափոխել ներքև"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Պատրաստ է"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings_tv.xml b/libs/WindowManager/Shell/res/values-in/strings_tv.xml index b04fee847a3c..7d37154bb86c 100644 --- a/libs/WindowManager/Shell/res/values-in/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-in/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Picture-in-Picture"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program tanpa judul)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Tutup"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Layar penuh"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Pindahkan"</string> + <string name="pip_expand" msgid="1051966011679297308">"Luaskan"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Ciutkan"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Tekan dua kali "<annotation icon="home_icon">" HOME "</annotation>" untuk membuka kontrol"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menu Picture-in-Picture."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Pindahkan ke kiri"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Pindahkan ke kanan"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Pindahkan ke atas"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Pindahkan ke bawah"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Selesai"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings_tv.xml b/libs/WindowManager/Shell/res/values-is/strings_tv.xml index 661832afdf55..1490cb98e034 100644 --- a/libs/WindowManager/Shell/res/values-is/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-is/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Mynd í mynd"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Efni án titils)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Loka"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Allur skjárinn"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Færa"</string> + <string name="pip_expand" msgid="1051966011679297308">"Stækka"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Minnka"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Ýttu tvisvar á "<annotation icon="home_icon">" HEIM "</annotation>" til að opna stillingar"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Valmynd fyrir mynd í mynd."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Færa til vinstri"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Færa til hægri"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Færa upp"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Færa niður"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Lokið"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings_tv.xml b/libs/WindowManager/Shell/res/values-km/strings_tv.xml index a2911d37b3cd..1a7ae813c1d3 100644 --- a/libs/WindowManager/Shell/res/values-km/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-km/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"រូបក្នុងរូប"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(កម្មវិធីគ្មានចំណងជើង)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"បិទ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ពេញអេក្រង់"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ផ្លាស់ទី"</string> + <string name="pip_expand" msgid="1051966011679297308">"ពង្រីក"</string> + <string name="pip_collapse" msgid="3903295106641385962">"បង្រួម"</string> <string name="pip_edu_text" msgid="3672999496647508701">" ចុចពីរដងលើ"<annotation icon="home_icon">"ប៊ូតុងដើម"</annotation>" ដើម្បីបើកផ្ទាំងគ្រប់គ្រង"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"ម៉ឺនុយរូបក្នុងរូប"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ផ្លាស់ទីទៅឆ្វេង"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ផ្លាស់ទីទៅស្តាំ"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ផ្លាស់ទីឡើងលើ"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"ផ្លាស់ទីចុះក្រោម"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"រួចរាល់"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings_tv.xml b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml index 2f0bf96a08c5..45de068c80a0 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ಶೀರ್ಷಿಕೆ ರಹಿತ ಕಾರ್ಯಕ್ರಮ)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"ಮುಚ್ಚಿರಿ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ಪೂರ್ಣ ಪರದೆ"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ಸರಿಸಿ"</string> + <string name="pip_expand" msgid="1051966011679297308">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string> + <string name="pip_collapse" msgid="3903295106641385962">"ಕುಗ್ಗಿಸಿ"</string> <string name="pip_edu_text" msgid="3672999496647508701">" ಕಂಟ್ರೋಲ್ಗಳಿಗಾಗಿ "<annotation icon="home_icon">" ಹೋಮ್ "</annotation>" ಅನ್ನು ಎರಡು ಬಾರಿ ಒತ್ತಿ"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೆನು."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ಎಡಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ಬಲಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ಮೇಲಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"ಕೆಳಗೆ ಸರಿಸಿ"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"ಮುಗಿದಿದೆ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings_tv.xml b/libs/WindowManager/Shell/res/values-ko/strings_tv.xml index e2aa7dc031a6..9e8f1f1258a5 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"PIP 모드"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(제목 없는 프로그램)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"닫기"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"전체화면"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"이동"</string> + <string name="pip_expand" msgid="1051966011679297308">"펼치기"</string> + <string name="pip_collapse" msgid="3903295106641385962">"접기"</string> <string name="pip_edu_text" msgid="3672999496647508701">" 제어 메뉴에 액세스하려면 "<annotation icon="home_icon">" 홈 "</annotation>"을 두 번 누르세요."</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"PIP 모드 메뉴입니다."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"왼쪽으로 이동"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"오른쪽으로 이동"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"위로 이동"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"아래로 이동"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"완료"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings_tv.xml b/libs/WindowManager/Shell/res/values-ky/strings_tv.xml index 706641a03c9a..19fac5876bb0 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Сүрөттөгү сүрөт"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Аталышы жок программа)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Жабуу"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Толук экран"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Жылдыруу"</string> + <string name="pip_expand" msgid="1051966011679297308">"Жайып көрсөтүү"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Жыйыштыруу"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Башкаруу элементтерин ачуу үчүн "<annotation icon="home_icon">" БАШКЫ БЕТ "</annotation>" баскычын эки жолу басыңыз"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Сүрөт ичиндеги сүрөт менюсу."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Солго жылдыруу"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Оңго жылдыруу"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Жогору жылдыруу"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Төмөн жылдыруу"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Бүттү"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings_tv.xml b/libs/WindowManager/Shell/res/values-lo/strings_tv.xml index d75453f83220..6cd0f37c516c 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ການສະແດງຜົນຊ້ອນກັນ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ໂປຣແກຣມບໍ່ມີຊື່)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"ປິດ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ເຕັມໜ້າຈໍ"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ຍ້າຍ"</string> + <string name="pip_expand" msgid="1051966011679297308">"ຂະຫຍາຍ"</string> + <string name="pip_collapse" msgid="3903295106641385962">"ຫຍໍ້"</string> <string name="pip_edu_text" msgid="3672999496647508701">" ກົດ "<annotation icon="home_icon">" HOME "</annotation>" ສອງເທື່ອສຳລັບການຄວບຄຸມ"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"ເມນູການສະແດງຜົນຊ້ອນກັນ."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ຍ້າຍໄປຊ້າຍ"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ຍ້າຍໄປຂວາ"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ຍ້າຍຂຶ້ນ"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"ຍ້າຍລົງ"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"ແລ້ວໆ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings_tv.xml b/libs/WindowManager/Shell/res/values-lv/strings_tv.xml index d0e017e10fb5..11abac6f6197 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Attēls attēlā"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programma bez nosaukuma)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Aizvērt"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pilnekrāna režīms"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Pārvietot"</string> + <string name="pip_expand" msgid="1051966011679297308">"Izvērst"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Sakļaut"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Atvērt vadīklas: divreiz nospiediet pogu "<annotation icon="home_icon">"SĀKUMS"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Izvēlne attēlam attēlā."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Pārvietot pa kreisi"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Pārvietot pa labi"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Pārvietot augšup"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Pārvietot lejup"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Gatavs"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings_tv.xml b/libs/WindowManager/Shell/res/values-my/strings_tv.xml index 04d27411d673..105628d8149e 100644 --- a/libs/WindowManager/Shell/res/values-my/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-my/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"နှစ်ခုထပ်၍ကြည့်ခြင်း"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ခေါင်းစဉ်မဲ့ အစီအစဉ်)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"ပိတ်ရန်"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"မျက်နှာပြင် အပြည့်"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ရွှေ့ရန်"</string> + <string name="pip_expand" msgid="1051966011679297308">"ချဲ့ရန်"</string> + <string name="pip_collapse" msgid="3903295106641385962">"လျှော့ပြရန်"</string> <string name="pip_edu_text" msgid="3672999496647508701">" ထိန်းချုပ်မှုအတွက် "<annotation icon="home_icon">" ပင်မခလုတ် "</annotation>" နှစ်ချက်နှိပ်ပါ"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"နှစ်ခုထပ်၍ ကြည့်ခြင်းမီနူး။"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ဘယ်သို့ရွှေ့ရန်"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ညာသို့ရွှေ့ရန်"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"အပေါ်သို့ရွှေ့ရန်"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"အောက်သို့ရွှေ့ရန်"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"ပြီးပြီ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings_tv.xml b/libs/WindowManager/Shell/res/values-nb/strings_tv.xml index ed135c526f0a..ca63518df7a5 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Bilde-i-bilde"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program uten tittel)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Lukk"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Fullskjerm"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Flytt"</string> + <string name="pip_expand" msgid="1051966011679297308">"Vis"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Skjul"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Dobbelttrykk på "<annotation icon="home_icon">"HJEM"</annotation>" for å åpne kontroller"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Bilde-i-bilde-meny."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Flytt til venstre"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Flytt til høyre"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Flytt opp"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Flytt ned"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Ferdig"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings_tv.xml b/libs/WindowManager/Shell/res/values-or/strings_tv.xml index bf86592c7bb1..0c1d99e4ca71 100644 --- a/libs/WindowManager/Shell/res/values-or/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-or/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ପିକଚର୍-ଇନ୍-ପିକଚର୍"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(କୌଣସି ଟାଇଟଲ୍ ପ୍ରୋଗ୍ରାମ୍ ନାହିଁ)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ମୁଭ କରନ୍ତୁ"</string> + <string name="pip_expand" msgid="1051966011679297308">"ବିସ୍ତାର କରନ୍ତୁ"</string> + <string name="pip_collapse" msgid="3903295106641385962">"ସଙ୍କୁଚିତ କରନ୍ତୁ"</string> <string name="pip_edu_text" msgid="3672999496647508701">" ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ପାଇଁ "<annotation icon="home_icon">" ହୋମ ବଟନ "</annotation>"କୁ ଦୁଇଥର ଦବାନ୍ତୁ"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"ପିକଚର-ଇନ-ପିକଚର ମେନୁ।"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ବାମକୁ ମୁଭ କରନ୍ତୁ"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ଡାହାଣକୁ ମୁଭ କରନ୍ତୁ"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ଉପରକୁ ମୁଭ କରନ୍ତୁ"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"ତଳକୁ ମୁଭ କରନ୍ତୁ"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"ହୋଇଗଲା"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings_tv.xml b/libs/WindowManager/Shell/res/values-pl/strings_tv.xml index d024e1312954..2bb90addc241 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Obraz w obrazie"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez tytułu)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zamknij"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pełny ekran"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Przenieś"</string> + <string name="pip_expand" msgid="1051966011679297308">"Rozwiń"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Zwiń"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Naciśnij dwukrotnie "<annotation icon="home_icon">"EKRAN GŁÓWNY"</annotation>", aby wyświetlić ustawienia"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menu funkcji Obraz w obrazie."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Przenieś w lewo"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Przenieś w prawo"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Przenieś w górę"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Przenieś w dół"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Gotowe"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings_tv.xml b/libs/WindowManager/Shell/res/values-sl/strings_tv.xml index 16331a69afcf..88fc8325aa01 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika v sliki"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program brez naslova)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Zapri"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Celozaslonsko"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Premakni"</string> + <string name="pip_expand" msgid="1051966011679297308">"Razširi"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Strni"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Za kontrolnike dvakrat pritisnite gumb za "<annotation icon="home_icon">" ZAČETNI ZASLON "</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Meni za sliko v sliki"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Premakni levo"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Premakni desno"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Premakni navzgor"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Premakni navzdol"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Končano"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings_tv.xml b/libs/WindowManager/Shell/res/values-sq/strings_tv.xml index a229d2dea9e4..58687e5867fe 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Figurë brenda figurës"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program pa titull)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Mbyll"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Ekrani i plotë"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Lëviz"</string> + <string name="pip_expand" msgid="1051966011679297308">"Zgjero"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Palos"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Trokit dy herë "<annotation icon="home_icon">" KREU "</annotation>" për kontrollet"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Menyja e \"Figurës brenda figurës\"."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Lëviz majtas"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Lëviz djathtas"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Lëviz lart"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Lëviz poshtë"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"U krye"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings_tv.xml b/libs/WindowManager/Shell/res/values-sr/strings_tv.xml index 7491876a1c19..e850979174a3 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Слика у слици"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програм без наслова)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Затвори"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Цео екран"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Премести"</string> + <string name="pip_expand" msgid="1051966011679297308">"Прошири"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Скупи"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Двапут притисните "<annotation icon="home_icon">" HOME "</annotation>" за контроле"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Мени Слика у слици."</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Померите налево"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Померите надесно"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Померите нагоре"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Померите надоле"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Готово"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings_tv.xml b/libs/WindowManager/Shell/res/values-th/strings_tv.xml index f379fad894de..27cf56c6e154 100644 --- a/libs/WindowManager/Shell/res/values-th/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-th/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"การแสดงภาพซ้อนภาพ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ไม่มีชื่อรายการ)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"ปิด"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"เต็มหน้าจอ"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"ย้าย"</string> + <string name="pip_expand" msgid="1051966011679297308">"ขยาย"</string> + <string name="pip_collapse" msgid="3903295106641385962">"ยุบ"</string> <string name="pip_edu_text" msgid="3672999496647508701">" กดปุ่ม "<annotation icon="home_icon">" หน้าแรก "</annotation>" สองครั้งเพื่อเปิดการควบคุม"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"เมนูการแสดงภาพซ้อนภาพ"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"ย้ายไปทางซ้าย"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"ย้ายไปทางขวา"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"ย้ายขึ้น"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"ย้ายลง"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"เสร็จ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings_tv.xml b/libs/WindowManager/Shell/res/values-tr/strings_tv.xml index 579d7ae56a94..69bb608061e4 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings_tv.xml @@ -24,7 +24,7 @@ <string name="pip_move" msgid="158770205886688553">"Taşı"</string> <string name="pip_expand" msgid="1051966011679297308">"Genişlet"</string> <string name="pip_collapse" msgid="3903295106641385962">"Daralt"</string> - <string name="pip_edu_text" msgid="3672999496647508701">" Kontroller için "<annotation icon="home_icon">" ANA SAYFA "</annotation>"\'ya iki kez basın"</string> + <string name="pip_edu_text" msgid="3672999496647508701">" Kontroller için "<annotation icon="home_icon">" ANA SAYFA "</annotation>" düğmesine iki kez basın"</string> <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Pencere içinde pencere menüsü."</string> <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Sola taşı"</string> <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Sağa taşı"</string> diff --git a/libs/WindowManager/Shell/res/values-uk/strings_tv.xml b/libs/WindowManager/Shell/res/values-uk/strings_tv.xml index 4b2d9df48a72..81a8285c58cf 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Картинка в картинці"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Програма без назви)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"Закрити"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"На весь екран"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"Перемістити"</string> + <string name="pip_expand" msgid="1051966011679297308">"Розгорнути"</string> + <string name="pip_collapse" msgid="3903295106641385962">"Згорнути"</string> <string name="pip_edu_text" msgid="3672999496647508701">" Відкрити елементи керування: двічі натисніть "<annotation icon="home_icon">"HOME"</annotation></string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"Меню \"картинка в картинці\""</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"Перемістити ліворуч"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"Перемістити праворуч"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"Перемістити вгору"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"Перемістити вниз"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"Готово"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml index e3292a119547..acbc26d033cd 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"畫中畫"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(沒有標題的節目)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"關閉"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"全螢幕"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"移動"</string> + <string name="pip_expand" msgid="1051966011679297308">"展開"</string> + <string name="pip_collapse" msgid="3903295106641385962">"收合"</string> <string name="pip_edu_text" msgid="3672999496647508701">" 按兩下"<annotation icon="home_icon">" 主畫面按鈕"</annotation>"即可顯示控制項"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"畫中畫選單。"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"向左移"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"向右移"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"向上移"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"向下移"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"完成"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml index f670e3afd2c6..f8c683ec3a60 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings_tv.xml @@ -19,26 +19,16 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"子母畫面"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(無標題的節目)"</string> - <!-- no translation found for pip_close (2955969519031223530) --> - <skip /> + <string name="pip_close" msgid="2955969519031223530">"關閉"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"全螢幕"</string> - <!-- no translation found for pip_move (158770205886688553) --> - <skip /> - <!-- no translation found for pip_expand (1051966011679297308) --> - <skip /> - <!-- no translation found for pip_collapse (3903295106641385962) --> - <skip /> + <string name="pip_move" msgid="158770205886688553">"移動"</string> + <string name="pip_expand" msgid="1051966011679297308">"展開"</string> + <string name="pip_collapse" msgid="3903295106641385962">"收合"</string> <string name="pip_edu_text" msgid="3672999496647508701">" 按兩下"<annotation icon="home_icon">"主畫面按鈕"</annotation>"即可顯示控制選項"</string> - <!-- no translation found for a11y_pip_menu_entered (5106343214776801614) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_left (6612980937817141583) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_right (1119409122645529936) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_up (98502616918621959) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_down (3858802832725159740) --> - <skip /> - <!-- no translation found for a11y_action_pip_move_done (1486845365134416210) --> - <skip /> + <string name="a11y_pip_menu_entered" msgid="5106343214776801614">"子母畫面選單。"</string> + <string name="a11y_action_pip_move_left" msgid="6612980937817141583">"向左移動"</string> + <string name="a11y_action_pip_move_right" msgid="1119409122645529936">"向右移動"</string> + <string name="a11y_action_pip_move_up" msgid="98502616918621959">"向上移動"</string> + <string name="a11y_action_pip_move_down" msgid="3858802832725159740">"向下移動"</string> + <string name="a11y_action_pip_move_done" msgid="1486845365134416210">"完成"</string> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java index bf074b0337ef..9230c22c5d95 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java @@ -145,6 +145,8 @@ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer { } mDisplayAreasInfo.remove(displayId); + mLeashes.get(displayId).release(); + mLeashes.remove(displayId); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipContentOverlay.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipContentOverlay.java index 3dea0e02c530..0e32663955d3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipContentOverlay.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipContentOverlay.java @@ -134,9 +134,6 @@ public abstract class PipContentOverlay { tx.setBuffer(mLeash, mSnapshot.getHardwareBuffer()); // Relocate the content to parentLeash's coordinates. tx.setPosition(mLeash, -mSourceRectHint.left, -mSourceRectHint.top); - tx.setWindowCrop(mLeash, - (int) (mSourceRectHint.width() * mTaskSnapshotScaleX), - (int) (mSourceRectHint.height() * mTaskSnapshotScaleY)); tx.setScale(mLeash, mTaskSnapshotScaleX, mTaskSnapshotScaleY); tx.reparent(mLeash, parentLeash); tx.apply(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index c05654a74034..e624de661737 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -1600,6 +1600,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, // Avoid double removal, which is fatal. return; } + if (surface == null || !surface.isValid()) { + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: trying to remove invalid content overlay (%s)", TAG, surface); + return; + } final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); tx.remove(surface); tx.apply(); diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp index fecf26906c04..8191f5e6a83a 100644 --- a/libs/hwui/FrameInfo.cpp +++ b/libs/hwui/FrameInfo.cpp @@ -20,19 +20,33 @@ namespace android { namespace uirenderer { -const std::array FrameInfoNames{ - "Flags", "FrameTimelineVsyncId", "IntendedVsync", - "Vsync", "InputEventId", "HandleInputStart", - "AnimationStart", "PerformTraversalsStart", "DrawStart", - "FrameDeadline", "FrameInterval", "FrameStartTime", - "SyncQueued", "SyncStart", "IssueDrawCommandsStart", - "SwapBuffers", "FrameCompleted", "DequeueBufferDuration", - "QueueBufferDuration", "GpuCompleted", "SwapBuffersCompleted", - "DisplayPresentTime", +const std::array FrameInfoNames{"Flags", + "FrameTimelineVsyncId", + "IntendedVsync", + "Vsync", + "InputEventId", + "HandleInputStart", + "AnimationStart", + "PerformTraversalsStart", + "DrawStart", + "FrameDeadline", + "FrameInterval", + "FrameStartTime", + "SyncQueued", + "SyncStart", + "IssueDrawCommandsStart", + "SwapBuffers", + "FrameCompleted", + "DequeueBufferDuration", + "QueueBufferDuration", + "GpuCompleted", + "SwapBuffersCompleted", + "DisplayPresentTime", + "CommandSubmissionCompleted" }; -static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 22, +static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 23, "Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)"); void FrameInfo::importUiThreadInfo(int64_t* info) { diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h index 540a88b16dc9..564ee4f53a54 100644 --- a/libs/hwui/FrameInfo.h +++ b/libs/hwui/FrameInfo.h @@ -58,6 +58,7 @@ enum class FrameInfoIndex { GpuCompleted, SwapBuffersCompleted, DisplayPresentTime, + CommandSubmissionCompleted, // Must be the last value! // Also must be kept in sync with FrameMetrics.java#FRAME_STATS_COUNT diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 744739accb2c..2aca41e41905 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -16,8 +16,15 @@ #include "SkiaOpenGLPipeline.h" +#include <GrBackendSurface.h> +#include <SkBlendMode.h> +#include <SkImageInfo.h> +#include <cutils/properties.h> #include <gui/TraceUtils.h> +#include <strings.h> + #include "DeferredLayerUpdater.h" +#include "FrameInfo.h" #include "LayerDrawable.h" #include "LightingInfo.h" #include "SkiaPipeline.h" @@ -27,17 +34,9 @@ #include "renderstate/RenderState.h" #include "renderthread/EglManager.h" #include "renderthread/Frame.h" +#include "renderthread/IRenderPipeline.h" #include "utils/GLUtils.h" -#include <GLES3/gl3.h> - -#include <GrBackendSurface.h> -#include <SkBlendMode.h> -#include <SkImageInfo.h> - -#include <cutils/properties.h> -#include <strings.h> - using namespace android::uirenderer::renderthread; namespace android { @@ -69,12 +68,11 @@ Frame SkiaOpenGLPipeline::getFrame() { return mEglManager.beginFrame(mEglSurface); } -bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, - const LightGeometry& lightGeometry, - LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds, - bool opaque, const LightInfo& lightInfo, - const std::vector<sp<RenderNode>>& renderNodes, - FrameInfoVisualizer* profiler) { +IRenderPipeline::DrawResult SkiaOpenGLPipeline::draw( + const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, + const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, + const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, + const std::vector<sp<RenderNode>>& renderNodes, FrameInfoVisualizer* profiler) { if (!isCapturingSkp()) { mEglManager.damageFrame(frame, dirty); } @@ -129,7 +127,7 @@ bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, con dumpResourceCacheUsage(); } - return true; + return {true, IRenderPipeline::DrawResult::kUnknownTime}; } bool SkiaOpenGLPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h index fddd97f1c5b3..186998a01745 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h @@ -36,11 +36,14 @@ public: renderthread::MakeCurrentResult makeCurrent() override; renderthread::Frame getFrame() override; - bool draw(const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty, - const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, - const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, - const std::vector<sp<RenderNode> >& renderNodes, - FrameInfoVisualizer* profiler) override; + renderthread::IRenderPipeline::DrawResult draw(const renderthread::Frame& frame, + const SkRect& screenDirty, const SkRect& dirty, + const LightGeometry& lightGeometry, + LayerUpdateQueue* layerUpdateQueue, + const Rect& contentDrawBounds, bool opaque, + const LightInfo& lightInfo, + const std::vector<sp<RenderNode> >& renderNodes, + FrameInfoVisualizer* profiler) override; GrSurfaceOrigin getSurfaceOrigin() override { return kBottomLeft_GrSurfaceOrigin; } bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) override; diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 99fd463b0660..905d46e58014 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -16,7 +16,15 @@ #include "SkiaVulkanPipeline.h" +#include <GrDirectContext.h> +#include <GrTypes.h> +#include <SkSurface.h> +#include <SkTypes.h> +#include <cutils/properties.h> #include <gui/TraceUtils.h> +#include <strings.h> +#include <vk/GrVkTypes.h> + #include "DeferredLayerUpdater.h" #include "LightingInfo.h" #include "Readback.h" @@ -26,16 +34,7 @@ #include "VkInteropFunctorDrawable.h" #include "renderstate/RenderState.h" #include "renderthread/Frame.h" - -#include <SkSurface.h> -#include <SkTypes.h> - -#include <GrDirectContext.h> -#include <GrTypes.h> -#include <vk/GrVkTypes.h> - -#include <cutils/properties.h> -#include <strings.h> +#include "renderthread/IRenderPipeline.h" using namespace android::uirenderer::renderthread; @@ -64,15 +63,14 @@ Frame SkiaVulkanPipeline::getFrame() { return vulkanManager().dequeueNextBuffer(mVkSurface); } -bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, - const LightGeometry& lightGeometry, - LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds, - bool opaque, const LightInfo& lightInfo, - const std::vector<sp<RenderNode>>& renderNodes, - FrameInfoVisualizer* profiler) { +IRenderPipeline::DrawResult SkiaVulkanPipeline::draw( + const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, + const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, + const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, + const std::vector<sp<RenderNode>>& renderNodes, FrameInfoVisualizer* profiler) { sk_sp<SkSurface> backBuffer = mVkSurface->getCurrentSkSurface(); if (backBuffer.get() == nullptr) { - return false; + return {false, -1}; } // update the coordinates of the global light position based on surface rotation @@ -94,9 +92,10 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, con profiler->draw(profileRenderer); } + nsecs_t submissionTime = IRenderPipeline::DrawResult::kUnknownTime; { ATRACE_NAME("flush commands"); - vulkanManager().finishFrame(backBuffer.get()); + submissionTime = vulkanManager().finishFrame(backBuffer.get()); } layerUpdateQueue->clear(); @@ -105,7 +104,7 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, con dumpResourceCacheUsage(); } - return true; + return {true, submissionTime}; } bool SkiaVulkanPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h index 56d42e013f31..ada6af67d4a0 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h @@ -33,11 +33,14 @@ public: renderthread::MakeCurrentResult makeCurrent() override; renderthread::Frame getFrame() override; - bool draw(const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty, - const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, - const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, - const std::vector<sp<RenderNode> >& renderNodes, - FrameInfoVisualizer* profiler) override; + renderthread::IRenderPipeline::DrawResult draw(const renderthread::Frame& frame, + const SkRect& screenDirty, const SkRect& dirty, + const LightGeometry& lightGeometry, + LayerUpdateQueue* layerUpdateQueue, + const Rect& contentDrawBounds, bool opaque, + const LightInfo& lightInfo, + const std::vector<sp<RenderNode> >& renderNodes, + FrameInfoVisualizer* profiler) override; GrSurfaceOrigin getSurfaceOrigin() override { return kTopLeft_GrSurfaceOrigin; } bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) override; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 122c77f3dadc..976117b9bbd4 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -512,9 +512,9 @@ nsecs_t CanvasContext::draw() { ATRACE_FORMAT("Drawing " RECT_STRING, SK_RECT_ARGS(dirty)); - bool drew = mRenderPipeline->draw(frame, windowDirty, dirty, mLightGeometry, &mLayerUpdateQueue, - mContentDrawBounds, mOpaque, mLightInfo, mRenderNodes, - &(profiler())); + const auto drawResult = mRenderPipeline->draw(frame, windowDirty, dirty, mLightGeometry, + &mLayerUpdateQueue, mContentDrawBounds, mOpaque, + mLightInfo, mRenderNodes, &(profiler())); uint64_t frameCompleteNr = getFrameNumber(); @@ -534,8 +534,11 @@ nsecs_t CanvasContext::draw() { bool requireSwap = false; int error = OK; - bool didSwap = - mRenderPipeline->swapBuffers(frame, drew, windowDirty, mCurrentFrameInfo, &requireSwap); + bool didSwap = mRenderPipeline->swapBuffers(frame, drawResult.success, windowDirty, + mCurrentFrameInfo, &requireSwap); + + mCurrentFrameInfo->set(FrameInfoIndex::CommandSubmissionCompleted) = std::max( + drawResult.commandSubmissionTime, mCurrentFrameInfo->get(FrameInfoIndex::SwapBuffers)); mIsDirty = false; @@ -753,7 +756,8 @@ void CanvasContext::onSurfaceStatsAvailable(void* context, int32_t surfaceContro if (frameInfo != nullptr) { frameInfo->set(FrameInfoIndex::FrameCompleted) = std::max(gpuCompleteTime, frameInfo->get(FrameInfoIndex::SwapBuffersCompleted)); - frameInfo->set(FrameInfoIndex::GpuCompleted) = gpuCompleteTime; + frameInfo->set(FrameInfoIndex::GpuCompleted) = std::max( + gpuCompleteTime, frameInfo->get(FrameInfoIndex::CommandSubmissionCompleted)); std::scoped_lock lock(instance->mFrameMetricsReporterMutex); instance->mJankTracker.finishFrame(*frameInfo, instance->mFrameMetricsReporter, frameNumber, surfaceControlId); diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index aceb5a528fc8..ef58bc553c23 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -49,11 +49,21 @@ class IRenderPipeline { public: virtual MakeCurrentResult makeCurrent() = 0; virtual Frame getFrame() = 0; - virtual bool draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, - const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, - const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, - const std::vector<sp<RenderNode>>& renderNodes, - FrameInfoVisualizer* profiler) = 0; + + // Result of IRenderPipeline::draw + struct DrawResult { + // True if draw() succeeded, false otherwise + bool success = false; + // If drawing was successful, reports the time at which command + // submission occurred. -1 if this time is unknown. + static constexpr nsecs_t kUnknownTime = -1; + nsecs_t commandSubmissionTime = kUnknownTime; + }; + virtual DrawResult draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, + const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue, + const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo, + const std::vector<sp<RenderNode>>& renderNodes, + FrameInfoVisualizer* profiler) = 0; virtual bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) = 0; virtual DeferredLayerUpdater* createTextureLayer() = 0; diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index a9ff2c60fdbe..718d4a16d5c8 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -494,7 +494,7 @@ static void destroy_semaphore(void* context) { } } -void VulkanManager::finishFrame(SkSurface* surface) { +nsecs_t VulkanManager::finishFrame(SkSurface* surface) { ATRACE_NAME("Vulkan finish frame"); ALOGE_IF(mSwapSemaphore != VK_NULL_HANDLE || mDestroySemaphoreContext != nullptr, "finishFrame already has an outstanding semaphore"); @@ -530,6 +530,7 @@ void VulkanManager::finishFrame(SkSurface* surface) { GrDirectContext* context = GrAsDirectContext(surface->recordingContext()); ALOGE_IF(!context, "Surface is not backed by gpu"); context->submit(); + const nsecs_t submissionTime = systemTime(); if (semaphore != VK_NULL_HANDLE) { if (submitted == GrSemaphoresSubmitted::kYes) { mSwapSemaphore = semaphore; @@ -558,6 +559,8 @@ void VulkanManager::finishFrame(SkSurface* surface) { } } skiapipeline::ShaderCache::get().onVkFrameFlushed(context); + + return submissionTime; } void VulkanManager::swapBuffers(VulkanSurface* surface, const SkRect& dirtyRect) { diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h index b816649edf6e..b8c2bdf112f8 100644 --- a/libs/hwui/renderthread/VulkanManager.h +++ b/libs/hwui/renderthread/VulkanManager.h @@ -84,7 +84,9 @@ public: void destroySurface(VulkanSurface* surface); Frame dequeueNextBuffer(VulkanSurface* surface); - void finishFrame(SkSurface* surface); + // Finishes the frame and submits work to the GPU + // Returns the estimated start time for intiating GPU work, -1 otherwise. + nsecs_t finishFrame(SkSurface* surface); void swapBuffers(VulkanSurface* surface, const SkRect& dirtyRect); // Inserts a wait on fence command into the Vulkan command buffer. diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml index fc449d5d4a46..3d35e55ed68c 100644 --- a/packages/CompanionDeviceManager/res/values-pa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml @@ -38,8 +38,8 @@ <string name="helper_summary_computer" msgid="1676407599909474428">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string> <string name="summary_generic" msgid="2346762210105903720"></string> - <string name="consent_yes" msgid="8344487259618762872">"ਇਜਾਜ਼ਤ ਦਿਓ"</string> - <string name="consent_no" msgid="2640796915611404382">"ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ"</string> + <string name="consent_yes" msgid="8344487259618762872">"ਆਗਿਆ ਦਿਓ"</string> + <string name="consent_no" msgid="2640796915611404382">"ਆਗਿਆ ਨਾ ਦਿਓ"</string> <string name="consent_back" msgid="2560683030046918882">"ਪਿੱਛੇ"</string> <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ਐਪ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਆਪਣੀ ਘੜੀ \'ਤੇ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰੋ"</string> <string name="permission_sync_summary" msgid="8873391306499120778">"ਤੁਹਾਡੀ ਘੜੀ ਦਾ ਸੈੱਟਅੱਪ ਕਰਨਾ ਆਸਾਨ ਬਣਾਉਣ ਲਈ, ਤੁਹਾਡੀ ਘੜੀ \'ਤੇ ਸਥਾਪਤ ਐਪਾਂ ਸੈੱਟਅੱਪ ਦੌਰਾਨ ਉਹੀ ਇਜਾਜ਼ਤਾਂ ਵਰਤਣਗੀਆਂ ਜੋ ਤੁਹਾਡਾ ਫ਼ੋਨ ਵਰਤਦਾ ਹੈ।\n\n ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਵਿੱਚ ਤੁਹਾਡੀ ਘੜੀ ਦੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਅਤੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਸ਼ਾਮਲ ਹੋ ਸਕਦੀ ਹੈ।"</string> diff --git a/packages/EasterEgg/res/drawable/android_13.xml b/packages/EasterEgg/res/drawable/android_13.xml new file mode 100644 index 000000000000..edc44ce4eaa3 --- /dev/null +++ b/packages/EasterEgg/res/drawable/android_13.xml @@ -0,0 +1,42 @@ +<!-- +Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2 (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:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="1.56" + android:strokeColor="@android:color/system_neutral1_100" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="1.56" + android:strokeColor="@android:color/system_neutral1_100" + /> + +</vector>
\ No newline at end of file diff --git a/packages/EasterEgg/res/drawable/android_13_mono.xml b/packages/EasterEgg/res/drawable/android_13_mono.xml new file mode 100644 index 000000000000..55c1bcd94831 --- /dev/null +++ b/packages/EasterEgg/res/drawable/android_13_mono.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2 (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:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> +</vector>
\ No newline at end of file diff --git a/packages/EasterEgg/res/drawable/icon.xml b/packages/EasterEgg/res/drawable/icon.xml index 7054962b3503..cdac1f98be30 100644 --- a/packages/EasterEgg/res/drawable/icon.xml +++ b/packages/EasterEgg/res/drawable/icon.xml @@ -15,5 +15,6 @@ Copyright (C) 2018 The Android Open Source Project --> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/icon_bg"/> - <foreground android:drawable="@drawable/android_s"/> + <foreground android:drawable="@drawable/android_13"/> + <monochrome android:drawable="@drawable/android_13_mono"/> </adaptive-icon> diff --git a/packages/EasterEgg/res/drawable/icon_bg.xml b/packages/EasterEgg/res/drawable/icon_bg.xml index d08e160ea312..231b4b802ecc 100644 --- a/packages/EasterEgg/res/drawable/icon_bg.xml +++ b/packages/EasterEgg/res/drawable/icon_bg.xml @@ -14,5 +14,5 @@ Copyright (C) 2018 The Android Open Source Project limitations under the License. --> <color xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@android:color/system_accent2_500" /> + android:color="@android:color/system_accent3_400" /> diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index 8ddc87c0c738..e2a5aaa24690 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -84,9 +84,9 @@ <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"セキュリティ上の理由から、お使いのタブレットでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string> <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"セキュリティ上の理由から、お使いのテレビでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string> <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"セキュリティ上の理由から、お使いのスマートフォンでは現在、この提供元からの不明なアプリをインストールすることはできません。これは [設定] で変更できます。"</string> - <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"不明なアプリをインストールするとスマートフォンや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるスマートフォンへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string> - <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"不明なアプリをインストールするとタブレットや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるタブレットへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string> - <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"不明なアプリをインストールするとテレビや個人データが攻撃を受ける可能性が高くなります。このアプリをインストールすることにより、アプリの使用により生じる可能性があるテレビへの損害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意するものとします。"</string> + <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"不明なアプリをインストールするとスマートフォンや個人データの侵害に対する安全性が低下します。このアプリをインストールすることで、アプリの使用により生じる可能性があるスマートフォンへの侵害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意することになります。"</string> + <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"不明なアプリをインストールするとタブレットや個人データの侵害に対する安全性が低下します。このアプリをインストールすることで、アプリの使用により生じる可能性があるタブレットへの侵害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意することになります。"</string> + <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"不明なアプリをインストールするとテレビや個人データの侵害に対する安全性が低下します。このアプリをインストールすることで、アプリの使用により生じる可能性があるテレビへの侵害やデータの損失について、ユーザーご自身が単独で責任を負うことに同意することになります。"</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"次へ"</string> <string name="external_sources_settings" msgid="4046964413071713807">"設定"</string> <string name="wear_app_channel" msgid="1960809674709107850">"Wearアプリ インストール/アンインストール"</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 17a0e821112f..50422d71a5b1 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -21,8 +21,8 @@ <string name="update" msgid="3932142540719227615">"अपडेट गर्नुहोस्"</string> <string name="done" msgid="6632441120016885253">"सम्पन्न भयो"</string> <string name="cancel" msgid="1018267193425558088">"रद्द गर्नुहोस्"</string> - <string name="installing" msgid="4921993079741206516">"स्थापना गर्दै…"</string> - <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> स्थापना गर्दै…"</string> + <string name="installing" msgid="4921993079741206516">"इन्स्टल गरिँदै छ"</string> + <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> इन्स्टल गरिँदै छ"</string> <string name="install_done" msgid="5987363587661783896">"एप इन्स्टल गरियो।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"तपाईं यो एप इन्स्टल गर्न चाहनुहुन्छ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तपाईं यो एप अपडेट गर्न चाहनुहुन्छ?"</string> diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index d5b85738314e..05bf12791224 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -83,7 +83,7 @@ <string name="app_name_unknown" msgid="6881210203354323926">"ਅਗਿਆਤ"</string> <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਟੀਵੀ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> + <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹੋਣ ਵਾਲੇ ਹਮਲਿਆਂ ਕਰਕੇ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਨਿੱਜੀ ਡਾਟੇ ਨਾਲ ਛੇੜਛਾੜ ਹੋ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ਤੁਹਾਡਾ ਟੀਵੀ ਅਤੇ ਨਿੱਜੀ ਡਾਟਾ ਅਗਿਆਤ ਐਪਾਂ ਤੋਂ ਹਮਲੇ ਪ੍ਰਤੀ ਵਧੇਰੇ ਵਿੰਨਣਸ਼ੀਲ ਹਨ। ਇਹ ਐਪ ਸਥਾਪਤ ਕਰਕੇ, ਤੁਸੀਂ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਆਪਣੇ ਟੀਵੀ ਨੂੰ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਨੁਕਸਾਨ ਜਾਂ ਡਾਟੇ ਦੀ ਹਾਨੀ ਲਈ ਤੁਸੀਂ ਜ਼ੁੰਮੇਵਾਰ ਹੋ ਜੋ ਸ਼ਾਇਦ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਹੋ ਸਕਦਾ ਹੈ।"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index c31ec3004c5b..3a38abdc307f 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -653,7 +653,7 @@ <string name="allow_turn_screen_on" msgid="6194845766392742639">"Eman pantaila pizteko baimena"</string> <string name="allow_turn_screen_on_description" msgid="43834403291575164">"Eman pantaila pizteko baimena aplikazioei. Baimena emanez gero, aplikazioek edonoiz piztu ahal izango dute pantaila, zuk halako asmorik izan ez arren."</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren audioa igortzeari utzi nahi diozu?"</string> - <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> aplikazioaren audioa igortzen baduzu, edo audio-irteera aldatzen baduzu, une hartako igorpena eten egingo da"</string> + <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"<xliff:g id="SWITCHAPP">%1$s</xliff:g> aplikazioaren audioa igortzen edo audio-irteera aldatzen baduzu, une hartako igorpena etengo da"</string> <string name="bt_le_audio_broadcast_dialog_switch_app" msgid="5749813313369517812">"Igorri <xliff:g id="SWITCHAPP">%1$s</xliff:g> aplikazioaren audioa"</string> <string name="bt_le_audio_broadcast_dialog_different_output" msgid="2638402023060391333">"Aldatu audio-irteera"</string> <string name="back_navigation_animation" msgid="8105467568421689484">"Atzera egiteko keinuaren animazio-igarleak"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 108d66f9ce58..b667fc0519b2 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -185,7 +185,7 @@ <string name="launch_defaults_none" msgid="8049374306261262709">"Aucun paramètre par défaut défini"</string> <string name="tts_settings" msgid="8130616705989351312">"Paramètres de la synthèse vocale"</string> <string name="tts_settings_title" msgid="7602210956640483039">"Sortie de la synthèse vocale"</string> - <string name="tts_default_rate_title" msgid="3964187817364304022">"Cadence"</string> + <string name="tts_default_rate_title" msgid="3964187817364304022">"Débit"</string> <string name="tts_default_rate_summary" msgid="3781937042151716987">"Vitesse à laquelle le texte est énoncé"</string> <string name="tts_default_pitch_title" msgid="6988592215554485479">"Ton"</string> <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Affecte le ton utilisé pour la synthèse vocale"</string> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 25113d246947..45bc5b8011e0 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -31,7 +31,7 @@ <item msgid="7852381437933824454">"डिस्कनेक्ट करत आहे..."</item> <item msgid="5046795712175415059">"डिस्कनेक्ट केले"</item> <item msgid="2473654476624070462">"अयशस्वी"</item> - <item msgid="9146847076036105115">"अवरोधित"</item> + <item msgid="9146847076036105115">"ब्लॉक केले"</item> <item msgid="4543924085816294893">"तात्पुरते खराब कनेक्शन टाळत आहे"</item> </string-array> <string-array name="wifi_status_with_ssid"> @@ -45,7 +45,7 @@ <item msgid="1175040558087735707">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> वरून डिस्कनेक्ट करत आहे…"</item> <item msgid="699832486578171722">"डिस्कनेक्ट केले"</item> <item msgid="522383512264986901">"अयशस्वी"</item> - <item msgid="3602596701217484364">"अवरोधित"</item> + <item msgid="3602596701217484364">"ब्लॉक केले"</item> <item msgid="1999413958589971747">"तात्पुरते खराब कनेक्शन टाळत आहे"</item> </string-array> <string-array name="hdcp_checking_titles"> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 7998cbdf9034..2514eff82333 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -448,8 +448,7 @@ <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (အနီ-အစိမ်း)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (အပြာ-အဝါ)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"အရောင်ပြင်ဆင်မှု"</string> - <!-- syntax error in translation for accessibility_display_daltonizer_preference_subtitle (1522101114585266455) org.xmlpull.v1.XmlPullParserException: expected: /string read: li (position:END_TAG </li>@1:326 in <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"အရောင် အမှန်ပြင်ခြင်းသည် အောက်ပါတို့အတွက် အသုံးဝင်နိုင်သည်-<br/> <ol> <li>&nbsp;အရောင်များကို ပိုမိုမှန်ကန်စွာ ကြည့်ရှုခြင်း</li> <li>&nbsp;အာရုံစိုက်နိုင်ရန် အရောင်များ ဖယ်ရှားခြင်း</li> </ol>"</string> -) --> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"အရောင် အမှန်ပြင်ခြင်းသည် အောက်ပါတို့အတွက် အသုံးဝင်နိုင်သည်-<br/> <ol> <li>&nbsp;အရောင်များကို ပိုမိုမှန်ကန်စွာ ကြည့်ရှုခြင်း&lt</li> <li>&nbsp;အာရုံစိုက်နိုင်ရန် အရောင်များ ဖယ်ရှားခြင်း</li> </ol>"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> မှ ကျော်၍ လုပ်ထားသည်။"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည်"</string> diff --git a/packages/SystemUI/res/drawable-nodpi/android_13.xml b/packages/SystemUI/res/drawable-nodpi/android_13.xml new file mode 100644 index 000000000000..edc44ce4eaa3 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/android_13.xml @@ -0,0 +1,42 @@ +<!-- +Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2 (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:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="1.56" + android:strokeColor="@android:color/system_neutral1_100" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="1.56" + android:strokeColor="@android:color/system_neutral1_100" + /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable-nodpi/android_13_mono.xml b/packages/SystemUI/res/drawable-nodpi/android_13_mono.xml new file mode 100644 index 000000000000..55c1bcd94831 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/android_13_mono.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2 (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:pathData="M37,39.03l8.58,0l0,33.94" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> + <path + android:pathData="M53.98,39.03h11.31l-5.59,11.31c6.02,0.96 10.11,6.62 9.15,12.64c-0.85,5.3 -5.38,9.22 -10.74,9.29c-1.38,-0 -2.76,-0.26 -4.05,-0.75" + android:strokeWidth="6.2" + android:strokeColor="@android:color/system_accent1_800" + /> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable-nodpi/icon.xml b/packages/SystemUI/res/drawable-nodpi/icon.xml index 997249632709..cdac1f98be30 100644 --- a/packages/SystemUI/res/drawable-nodpi/icon.xml +++ b/packages/SystemUI/res/drawable-nodpi/icon.xml @@ -15,5 +15,6 @@ Copyright (C) 2018 The Android Open Source Project --> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/icon_bg"/> - <foreground android:drawable="@drawable/android_12"/> + <foreground android:drawable="@drawable/android_13"/> + <monochrome android:drawable="@drawable/android_13_mono"/> </adaptive-icon> diff --git a/packages/SystemUI/res/drawable-nodpi/icon_bg.xml b/packages/SystemUI/res/drawable-nodpi/icon_bg.xml index f7b0982dfaf8..231b4b802ecc 100644 --- a/packages/SystemUI/res/drawable-nodpi/icon_bg.xml +++ b/packages/SystemUI/res/drawable-nodpi/icon_bg.xml @@ -14,5 +14,5 @@ Copyright (C) 2018 The Android Open Source Project limitations under the License. --> <color xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/material_dynamic_primary50" /> + android:color="@android:color/system_accent3_400" /> diff --git a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml index 18f870d27772..3d784898f56d 100644 --- a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml +++ b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml @@ -24,6 +24,7 @@ android:layout_height="wrap_content" android:layout_marginTop="40dp" android:layout_marginStart="4dp" + android:textColor="?android:attr/textColorSecondary" app:layout_constraintStart_toStartOf="@id/done_button" app:layout_constraintTop_toBottomOf="@id/done_button" /> diff --git a/packages/SystemUI/res/layout/media_long_press_menu.xml b/packages/SystemUI/res/layout/media_long_press_menu.xml index 99c5e4707338..a8ddd4cb93ef 100644 --- a/packages/SystemUI/res/layout/media_long_press_menu.xml +++ b/packages/SystemUI/res/layout/media_long_press_menu.xml @@ -26,7 +26,7 @@ android:layout_marginStart="@dimen/qs_media_padding" android:layout_marginEnd="@dimen/qs_media_padding" android:id="@+id/remove_text" - android:fontFamily="@*android:string/config_headlineFontFamily" + android:fontFamily="@*android:string/config_headlineFontFamilyMedium" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" @@ -62,7 +62,6 @@ android:layout_marginEnd="@dimen/qs_media_action_spacing" android:layout_marginBottom="@dimen/qs_media_padding" app:layout_constrainedWidth="true" - app:layout_constraintWidth_min="@dimen/min_clickable_item_size" app:layout_constraintHeight_min="@dimen/min_clickable_item_size" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" @@ -73,6 +72,7 @@ android:id="@+id/dismiss_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:layout_constraintWidth_min="@dimen/min_clickable_item_size" android:layout_gravity="center|top" style="@style/MediaPlayer.SolidButton" android:background="@drawable/qs_media_solid_button" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index eb73da47031d..5c1a6b580cb8 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ligging"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofoon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"skermopname"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Titelloos"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingvenster"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Onbekende program"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Hou op uitsaai"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Beskikbare toestelle vir oudio-uitsette."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Hoe uitsaai werk"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Saai uit"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Mense in jou omtrek met versoenbare Bluetooth-toestelle kan na die media luister wat jy uitsaai"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e6fb5d77c13a..5176f7cdb54b 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ካሜራ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"አካባቢ"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ማይክሮፎን"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ማያን መቅረጽ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ርዕስ የለም"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"የማጉያ መስኮት"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"የማይታወቅ መተግበሪያ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Cast ማድረግ አቁም"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ለኦዲዮ ውጽዓት ተገኚ የሆኑ መሣሪያዎች"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ማሰራጨት እንዴት እንደሚሠራ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ስርጭት"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ተኳሃኝ የብሉቱዝ መሣሪያዎች ያላቸው በአቅራቢያዎ ያሉ ሰዎች እርስዎ እያሰራጩት ያሉትን ሚዲያ ማዳመጥ ይችላሉ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 22b316a84b7d..8a6fa77d64b4 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -759,6 +759,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"الكاميرا"</string> <string name="privacy_type_location" msgid="7991481648444066703">"الموقع"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"الميكروفون"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"تسجيل محتوى الشاشة"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"بلا عنوان"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string> <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string> @@ -868,6 +869,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"تطبيق غير معروف"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"إيقاف البث"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"الأجهزة المتاحة لإخراج الصوت"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"كيفية عمل البث"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"البث"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"يمكن للأشخاص القريبين منك الذين لديهم أجهزة متوافقة تتضمّن بلوتوث الاستماع إلى الوسائط التي تبثها."</string> @@ -963,8 +966,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"تم"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"تم النسخ."</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"من <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"إغلاق حافظة النص المنسوخ"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"تعديل النص المنسوخ"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"تعديل الصورة المنسوخة"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"الإرسال إلى جهاز مجاور"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 631d37c669b1..9aea4dee1542 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"Camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"অৱস্থান"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"মাইক্ৰ\'ফ\'ন"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"স্ক্ৰীন ৰেকৰ্ডিং"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"অজ্ঞাত এপ্"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"কাষ্ট বন্ধ কৰক"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিঅ\' আউটপুটৰ বাবে উপলব্ধ ডিভাইচ।"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"সম্প্ৰচাৰ কৰাটোৱে কেনেকৈ কাম কৰে"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"সম্প্ৰচাৰ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"সমিল ব্লুটুথ ডিভাইচৰ সৈতে আপোনাৰ নিকটৱৰ্তী স্থানত থকা লোকসকলে আপুনি সম্প্ৰচাৰ কৰা মিডিয়াটো শুনিব পাৰে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index fb553b69e9c0..4f660ef01b19 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"məkan"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekran çəkimi"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıq yoxdur"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Böyütmə Pəncərəsi"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Naməlum tətbiq"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Yayımı dayandırın"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio çıxış üçün əlçatan cihazlar."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayım necə işləyir"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Yayım"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Uyğun Bluetooth cihazları olan yaxınlığınızdakı insanlar yayımladığınız medianı dinləyə bilər"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index bd29e62a0871..f4a7bcc392b2 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kameru"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokaciju"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje ekrana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećanje"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi prebacivanje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcioniše emitovanje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitovanje"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Ljudi u blizini sa kompatibilnim Bluetooth uređajima mogu da slušaju medijski sadržaj koji emitujete"</string> @@ -942,8 +945,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Gotovo"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano je"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Od: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Odbaci kopirani tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Izmenite kopirani tekst"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Izmenite kopiranu sliku"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošalji na uređaj u blizini"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 8481d55bf397..db88988f7491 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"геалакацыя"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"мікрафон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"запіс экрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без назвы"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Акно павелічэння"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Невядомая праграма"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Спыніць трансляцыю"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Даступныя прылады для вываду аўдыя."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як адбываецца трансляцыя"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Трансляцыя"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Людзі паблізу, у якіх ёсць прылады з Bluetooth, змогуць праслухваць мультымедыйнае змесціва, якое вы трансліруеце"</string> @@ -949,8 +952,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Гатова"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скапіравана"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"З праграмы \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Адхіліць устаўку скапіраванага тэксту"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Змяніць скапіраваны тэкст"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Змяніць скапіраваны відарыс"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Адправіць на прыладу паблізу"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 97318b557d2a..4ec0730cded6 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камерата"</string> <string name="privacy_type_location" msgid="7991481648444066703">"местополож."</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофона"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"записване на екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Няма заглавие"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за увеличение"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Неизвестно приложение"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Спиране на предаването"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Налични устройства за аудиоизход."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работи предаването"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Предаване"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Хората в близост със съвместими устройства с Bluetooth могат да слушат мултимедията, която предавате"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Готово"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"От <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Отхвърляне на копирания текст"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Редактиране на копирания текст"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Редактиране на копираното изображение"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Изпращане до устройство в близост"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e46e7a593793..95f14164e4de 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ক্যামেরা"</string> <string name="privacy_type_location" msgid="7991481648444066703">"লোকেশন"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"মাইক্রোফোন"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"স্ক্রিন রেকর্ডিং"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"কোনও শীর্ষক নেই"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string> <string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"অজানা অ্যাপ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"কাস্ট করা বন্ধ করুন"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিও আউটপুটের জন্য উপলভ্য ডিভাইস।"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ব্রডকাস্ট কীভাবে কাজ করে"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"সম্প্রচার করুন"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"আশপাশে লোকজন যাদের মানানসই ব্লুটুথ ডিভাইস আছে, তারা আপনার ব্রডকাস্ট করা মিডিয়া শুনতে পারবেন"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"হয়ে গেছে"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"কপি করা হয়েছে"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> থেকে"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"কপি করা টেক্সট বাতিল করুন"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"কপি করা টেক্সট এডিট করুন"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"কপি করা ছবি এডিট করুন"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"আশেপাশের ডিভাইসে পাঠান"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 7befbaa79264..bdc1553e745d 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kameru"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokaciju"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje ekrana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za uvećavanje"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audio izlaz."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako funkcionira emitiranje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitirajte"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osobe u vašoj blizini s kompatibilnim Bluetooth uređajima mogu slušati medijske sadržaje koje emitirate"</string> @@ -942,8 +945,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Gotovo"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Odbaci kopirani tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Uredi kopirani tekst"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Uredi kopiranu sliku"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošalji na uređaj u blizini"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index b494984bda9c..409105610d89 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"càmera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ubicació"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"micròfon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravació de pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sense títol"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra d\'ampliació"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicació desconeguda"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Atura l\'emissió"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositius disponibles per a la sortida d\'àudio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Com funciona l\'emissió"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emet"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Les persones properes amb dispositius Bluetooth compatibles poden escoltar el contingut multimèdia que emets"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Fet"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"S\'ha copiat"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"De: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Ignora el text copiat"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edita el text que has copiat"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edita la imatge que has copiat"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Envia a un dispositiu proper"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index e526ca63a224..438b2bc33e48 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparát"</string> <string name="privacy_type_location" msgid="7991481648444066703">"poloha"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"nahrávání obrazovky"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Zvětšovací okno"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznámá aplikace"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zastavit odesílání"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupná zařízení pro zvukový výstup."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jak vysílání funguje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Vysílání"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Lidé ve vašem okolí s kompatibilními zařízeními Bluetooth mohou poslouchat média, která vysíláte"</string> @@ -949,8 +952,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Hotovo"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Zkopírováno"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Z aplikace <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Odmítnout zkopírovaný text"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Upravit zkopírovaný text"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Upravit zkopírovaný obrázek"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Odeslat do zařízení v okolí"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 24692edeb949..bebd5c6d4575 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kameraet"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokation"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofonen"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"skærmoptagelse"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vindue med forstørrelse"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ukendt app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop med at caste"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Enheder, der er tilgængelige for lydoutput."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Sådan fungerer udsendelser"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Udsendelse"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personer i nærheden, som har kompatible Bluetooth-enheder, kan lytte til det medie, du udsender"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Udfør"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopieret"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Fra <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Afvis kopieret tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Rediger kopieret tekst"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Rediger kopieret billede"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send til enhed i nærheden"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 654181965672..85f8671b9ad3 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"Kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"Standort"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"Mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"Bildschirmaufzeichnung"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Kein Titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrößerungsfenster"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unbekannte App"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Streaming beenden"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Für die Audioausgabe verfügbare Geräte."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Funktionsweise von Nachrichten an alle"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Nachricht an alle"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personen, die in der Nähe sind und kompatible Bluetooth-Geräten haben, können sich die Medien anhören, die du per Nachricht an alle sendest"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Fertig"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Von <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Kopierten Text verwerfen"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Kopierten Text bearbeiten"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Kopiertes Bild bearbeiten"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"An Gerät in der Nähe senden"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 63e5725d1c60..35748343a225 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"κάμερα"</string> <string name="privacy_type_location" msgid="7991481648444066703">"τοποθεσία"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"μικρόφωνο"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"εγγραφή οθόνης"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Χωρίς τίτλο"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Παράθυρο μεγέθυνσης"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Άγνωστη εφαρμογή"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Διακοπή μετάδοσης"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Διαθέσιμες συσκευές για έξοδο ήχου."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Πώς λειτουργεί η μετάδοση"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Μετάδοση"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Οι άνθρωποι με συμβατές συσκευές Bluetooth που βρίσκονται κοντά σας μπορούν να ακούσουν το μέσο που μεταδίδετε."</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 66bab207ba23..6f339b56a292 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"location"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 804910335b3b..9c88ac21ee82 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"location"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 66bab207ba23..6f339b56a292 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"location"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 66bab207ba23..6f339b56a292 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"location"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media that you\'re broadcasting"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index cf3731df5cb3..06485200c04d 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"location"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"screen recording"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Magnification Window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Unknown app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stop casting"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Available devices for audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"How broadcasting works"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"People near you with compatible Bluetooth devices can listen to the media you\'re broadcasting"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index ecbb54a5c4ee..7ff395a9ef8d 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"cámara"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ubicación"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"micrófono"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"Grabación de pant."</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconocida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Detener transmisión"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponibles para salida de audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la transmisión"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmisión"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Las personas cercanas con dispositivos Bluetooth compatibles pueden escuchar el contenido multimedia que transmites"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 4937d45e39f8..4d0869edcd63 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"cámara"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ubicación"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"micrófono"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"grabación de pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventana de ampliación"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicación desconocida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Dejar de enviar contenido"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponibles para la salida de audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cómo funciona la emisión"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emisión"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Las personas cercanas con dispositivos Bluetooth compatibles pueden escuchar el contenido multimedia que emites"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Hecho"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Descartar texto copiado"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Editar texto copiado"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Editar imagen copiada"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Enviar a dispositivo cercano"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 0ab10be28704..2bb5757b76e6 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kaamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"asukoht"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekraanikuva salvest."</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Pealkiri puudub"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Tundmatu rakendus"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Lõpeta ülekanne"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Saadaolevad seadmed heli esitamiseks."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kuidas ülekandmine toimib?"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Ülekanne"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Teie läheduses olevad inimesed, kellel on ühilduvad Bluetooth-seadmed, saavad kuulata teie ülekantavat meediat"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Valmis"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopeeritud"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Rakendusest <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Loobu kopeeritud tekstist"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Muuda kopeeritud teksti"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Muuda kopeeritud pilti"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Saada läheduses olevasse seadmesse"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index e24adca4c592..e6948e8dfd3d 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"kokapena"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofonoa"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"pantaila-grabaketa"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ez du izenik"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Lupa-leihoa"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikazio ezezaguna"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Gelditu igorpena"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio-irteerarako gailu erabilgarriak."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Nola funtzionatzen dute iragarpenek?"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Iragarri"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Bluetooth bidezko gailu bateragarriak dituzten inguruko pertsonek iragartzen ari zaren multimedia-edukia entzun dezakete"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Eginda"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiatu da"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Jatorria: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Baztertu kopiatutako testua"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Editatu kopiatutako testua"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Editatu kopiatutako irudia"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Bidali inguruko gailu batera"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 28d4baf71c18..ae86255f56ef 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"دوربین"</string> <string name="privacy_type_location" msgid="7991481648444066703">"مکان"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"میکروفون"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ضبط صفحهنمایش"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string> <string name="magnification_window_title" msgid="4863914360847258333">"پنجره بزرگنمایی"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"برنامه ناشناس"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"توقف ارسال محتوا"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"دستگاههای دردسترس برای خروجی صدا."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"همهفرتستی چطور کار میکند"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"همهفرستی"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"افرادی که در اطرافتان دستگاههای Bluetooth سازگار دارند میتوانند به رسانهای که همهفرستی میکنید گوش کنند"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index a805e6a6c89a..6a023337acf4 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"sijainti"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofoni"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"näytön tallennus"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ei nimeä"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurennusikkuna"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Tuntematon sovellus"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Lopeta striimaus"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Käytettävissä olevat audiolaitteet"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Miten lähetys toimii"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Lähetys"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Lähistöllä olevat ihmiset, joilla on yhteensopiva Bluetooth-laite, voivat kuunnella lähettämääsi mediaa"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Valmis"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopioitu"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Lähde: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Hylkää kopioitu teksti"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Muokkaa kopioitua tekstiä"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Muokkaa kopioitua kuvaa"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Lähetä lähellä olevaan laitteeseen"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 361b9605c4c7..0d67eda0756b 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"appareil photo"</string> <string name="privacy_type_location" msgid="7991481648444066703">"position"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microphone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"enregistrement d\'écran"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Veille"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Application inconnue"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Arrêter la diffusion"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Appareils disponibles pour la sortie audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement de la diffusion"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Diffusion"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Les personnes à proximité disposant d\'appareils Bluetooth compatibles peuvent écouter le contenu multimédia que vous diffusez"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"OK"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"À partir de <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Ignorer le texte copié"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Modifier le texte copié"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Modifier l\'image copiée"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Envoyer à un appareil à proximité"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 16f16cdb742c..23f3e7c584dd 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"l\'appareil photo"</string> <string name="privacy_type_location" msgid="7991481648444066703">"la position"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"le micro"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"enregistrement écran"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fenêtre d\'agrandissement"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Appli inconnue"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Arrêter la diffusion"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Appareils disponibles pour la sortie audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Fonctionnement des annonces"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Annonce"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Les personnes à proximité équipées d\'appareils Bluetooth compatibles peuvent écouter le contenu multimédia que vous diffusez"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"OK"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Ignorer le texte copié"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Modifier le texte copié"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Modifier l\'image copiée"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Envoyer à un appareil à proximité"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 068d7cfb995a..5f89f8c362fd 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"a cámara"</string> <string name="privacy_type_location" msgid="7991481648444066703">"a localiz."</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"o micrófono"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravación pantalla"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sen título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicación descoñecida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Deter emisión"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos dispoñibles para a saída de audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funcionan as difusións?"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Difusión"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As persoas que estean preto de ti e que dispoñan de dispositivos Bluetooth compatibles poden escoitar o contido multimedia que difundas"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Feito"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiouse"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"De <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Ignorar texto copiado"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Editar texto copiado"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Editar imaxe copiada"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Enviar a dispositivo próximo"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 30395f74b809..5648a4568d1e 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"કૅમેરા"</string> <string name="privacy_type_location" msgid="7991481648444066703">"સ્થાન"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"માઇક્રોફોન"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"સ્ક્રીન રેકોર્ડિંગ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string> <string name="magnification_window_title" msgid="4863914360847258333">"વિસ્તૃતીકરણ વિંડો"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"અજાણી ઍપ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"કાસ્ટ કરવાનું રોકો"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ઑડિયો આઉટપુટ માટે ઉપલબ્ધ ડિવાઇસ."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"બ્રોડકાસ્ટ પ્રક્રિયાની કામ કરવાની રીત"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"બ્રોડકાસ્ટ કરો"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"સુસંગત બ્લૂટૂથ ડિવાઇસ ધરાવતા નજીકના લોકો તમે જે મીડિયા બ્રોડકાસ્ટ કરી રહ્યાં છો તે સાંભળી શકે છે"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index c3b0459e30c1..e16ef0f3d1be 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"कैमरा"</string> <string name="privacy_type_location" msgid="7991481648444066703">"जगह"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"माइक्रोफ़ोन"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रिकॉर्डिंग"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string> <string name="magnification_window_title" msgid="4863914360847258333">"स्क्रीन को बड़ा करके दिखाने वाली विंडो"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अनजान ऐप्लिकेशन"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्टिंग करना रोकें"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ऑडियो आउटपुट के लिए उपलब्ध डिवाइस."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ब्रॉडकास्ट करने की सुविधा कैसे काम करती है"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ब्रॉडकास्ट करें"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"आपके आस-पास मौजूद लोग, ब्रॉडकास्ट किए जा रहे मीडिया को सुन सकते हैं. हालांकि, इसके लिए उनके पास ऐसे ब्लूटूथ डिवाइस होने चाहिए जिन पर मीडिया चलाया जा सके"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"हो गया"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कॉपी किया गया"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> से"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"कॉपी किए गए टेक्स्ट को खारिज करें"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"कॉपी किए गए टेक्स्ट में बदलाव करें"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"कॉपी की गई इमेज में बदलाव करें"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"कॉन्टेंट को आस-पास मौजूद डिवाइस पर भेजें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 2e8b4ab5d9e2..68afcba3a291 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparat"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokaciju"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje zaslona"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Prozor za povećavanje"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nepoznata aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zaustavi emitiranje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupni uređaji za audioizlaz."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako emitiranje funkcionira"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Emitiranje"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osobe u blizini s kompatibilnim Bluetooth uređajima mogu slušati medije koje emitirate"</string> @@ -942,8 +945,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Gotovo"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Odbaci kopirani tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Uredi kopirani tekst"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Uredi kopiranu sliku"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošalji uređaju u blizini"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 40afd6f36a56..7def3764f365 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"helyadatok"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"képernyőrögzítés"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nincs cím"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Nagyítás ablaka"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ismeretlen alkalmazás"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Átküldés leállítása"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Rendelkezésre álló eszközök a hangkimenethez."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"A közvetítés működése"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Közvetítés"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"A közelben tartózkodó, kompatibilis Bluetooth-eszközzel rendelkező személyek meghallgathatják az Ön közvetített médiatartalmait"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 2dc7d14be243..500afd1ace81 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"տեսախցիկը"</string> <string name="privacy_type_location" msgid="7991481648444066703">"վայրը"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"խոսափողը"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"էկրանի տեսագրում"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Խոշորացման պատուհան"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Անհայտ հավելված"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Կանգնեցնել հեռարձակումը"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Հասանելի սարքեր ձայնի արտածման համար։"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ինչպես է աշխատում հեռարձակումը"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Հեռարձակում"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Ձեր մոտակայքում գտնվող՝ համատեղելի Bluetooth սարքերով մարդիկ կարող են լսել մեդիա ֆայլերը, որոնք դուք հեռարձակում եք։"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Պատրաստ է"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Պատճենվեց"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածից"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Հեռացնել պատճենված տեքստը"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Փոփոխել պատճենված տեքստը"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Փոփոխել պատճենված պատկերը"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Ուղարկել մոտակա սարքի"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index af5202a1b120..91655cbc991c 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokasi"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"perekaman layar"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Tanpa judul"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Jendela Pembesaran"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikasi tidak dikenal"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Hentikan transmisi"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Perangkat yang tersedia untuk output audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara kerja siaran"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Siaran"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Orang di dekat Anda dengan perangkat Bluetooth yang kompatibel dapat mendengarkan media yang sedang Anda siarkan"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Selesai"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Disalin"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Dari <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Tutup teks yang disalin"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edit teks yang disalin"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edit gambar yang disalin"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Kirim ke perangkat di sekitar"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 666d6ca7013b..1df970fbfb8a 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"myndavél"</string> <string name="privacy_type_location" msgid="7991481648444066703">"staðsetning"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"hljóðnemi"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"skjáupptaka"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Enginn titill"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Stækkunargluggi"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Óþekkt forrit"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stöðva útsendingu"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Tæki í boði fyrir hljóðúttak."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Svona virkar útsending"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Útsending"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Fólk nálægt þér með samhæf Bluetooth-tæki getur hlustað á efnið sem þú sendir út"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Lokið"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Afritað"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Frá <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Hunsa afritaðan texta"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Breyta afrituðum texta"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Breyta afritaðri mynd"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Senda í nálægt tæki"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 353762cecdc3..9f2b56e2f60b 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotocamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"posizione"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfono"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"Registraz. schermo"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Finestra ingrandimento"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App sconosciuta"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Interrompi trasmissione"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivi disponibili per l\'uscita audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Come funziona la trasmissione"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Annuncio"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Le persone vicine a te che hanno dispositivi Bluetooth compatibili possono ascoltare i contenuti multimediali che stai trasmettendo"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 5aab763a6348..89e5d23d166d 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"מצלמה"</string> <string name="privacy_type_location" msgid="7991481648444066703">"מיקום"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"מיקרופון"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"הקלטת המסך"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ללא שם"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string> <string name="magnification_window_title" msgid="4863914360847258333">"חלון הגדלה"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"אפליקציה לא ידועה"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"עצירת ההעברה (casting)"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"מכשירים זמינים לפלט אודיו."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"הסבר על שידורים"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"שידור"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"אנשים בקרבת מקום עם מכשירי Bluetooth תואמים יכולים להאזין למדיה שמשודרת על ידך"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index fc2ddef7e9cf..c092dbd7b359 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"カメラ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"現在地情報"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"マイク"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"画面の録画"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"タイトルなし"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"拡大ウィンドウ"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明なアプリ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"キャストを停止"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"音声出力ができるデバイスです。"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ブロードキャストの仕組み"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ブロードキャスト"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Bluetooth 対応デバイスを持っている付近のユーザーは、あなたがブロードキャストしているメディアを聴けます"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index f3eb61190a62..81cff8f3fc87 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"კამერა"</string> <string name="privacy_type_location" msgid="7991481648444066703">"მდებარეობა"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"მიკროფონი"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ეკრანის ჩაწერა"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"უსათაურო"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string> <string name="magnification_window_title" msgid="4863914360847258333">"გადიდების ფანჯარა"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"უცნობი აპი"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ტრანსლირების შეწყვეტა"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ხელმისაწვდომი მოწყობილობები გამომავალი აუდიოსთვის."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ტრანსლირების მუშაობის პრინციპი"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ტრანსლაცია"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"თქვენთან ახლოს მყოფ ხალხს თავსებადი Bluetooth მოწყობილობით შეუძლიათ თქვენ მიერ ტრანსლირებული მედიის მოსმენა"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 8d9be165f52e..a4776dd82344 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"геодерек"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"экранды бейнеге жазу"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Атауы жоқ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ұлғайту терезесі"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Белгісіз қолданба"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Трансляцияны тоқтату"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио шығыс үшін қолжетімді құрылғылар бар."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Тарату қалай жүзеге асады"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Тарату"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Үйлесімді Bluetooth құрылғылары бар маңайдағы адамдар сіз таратып жатқан медиамазмұнды тыңдай алады."</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index af3d7969b9c8..2319f9d6d43a 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"កាមេរ៉ា"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ទីតាំង"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"មីក្រូហ្វូន"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ការថតវីដេអូអេក្រង់"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"គ្មានចំណងជើង"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"វិនដូការពង្រីក"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"កម្មវិធីដែលមិនស្គាល់"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"បញ្ឈប់ការភ្ជាប់"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ឧបករណ៍ដែលអាចប្រើបានសម្រាប់ឧបករណ៍បញ្ចេញសំឡេង។"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"របៀបដែលការផ្សាយដំណើរការ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ការផ្សាយ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"មនុស្សនៅជិតអ្នកដែលមានឧបករណ៍ប៊្លូធូសត្រូវគ្នាអាចស្តាប់មេឌៀដែលអ្នកកំពុងផ្សាយបាន"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"រួចរាល់"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"បានចម្លង"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"ពី <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"ច្រានចោលអត្ថបទដែលបានចម្លង"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"កែអត្ថបទដែលបានចម្លង"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"កែរូបភាពដែលបានចម្លង"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ផ្ញើទៅឧបករណ៍នៅជិត"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 14eb7f403310..cfb0d24e5970 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ಕ್ಯಾಮರಾ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ಸ್ಥಳ"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ಮೈಕ್ರೋಫೋನ್"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ವರ್ಧನೆಯ ವಿಂಡೋ"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ಅಪರಿಚಿತ ಆ್ಯಪ್"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ಬಿತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ಆಡಿಯೋ ಔಟ್ಪುಟ್ಗಾಗಿ ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ಪ್ರಸಾರವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ಪ್ರಸಾರ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ಹೊಂದಾಣಿಕೆಯಾಗುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಹೊಂದಿರುವ ಸಮೀಪದಲ್ಲಿರುವ ಜನರು ನೀವು ಪ್ರಸಾರ ಮಾಡುತ್ತಿರುವ ಮಾಧ್ಯಮವನ್ನು ಆಲಿಸಬಹುದು"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"ಮುಗಿದಿದೆ"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ನಕಲಿಸಲಾಗಿದೆ"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> ನಿಂದ"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"ನಕಲಿಸಿದ ಪಠ್ಯವನ್ನು ವಜಾಗೊಳಿಸಿ"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"ನಕಲಿಸಿದ ಪಠ್ಯವನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"ನಕಲಿಸಿದ ಚಿತ್ರವನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 5ad7ef840352..8e6d2ca6c87d 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"카메라"</string> <string name="privacy_type_location" msgid="7991481648444066703">"위치"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"마이크"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"화면 녹화"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"제목 없음"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string> <string name="magnification_window_title" msgid="4863914360847258333">"확대 창"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"알 수 없는 앱"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"전송 중지"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"오디오 출력에 사용 가능한 기기입니다."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"브로드캐스팅 작동 원리"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"브로드캐스트"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"호환되는 블루투스 기기를 가진 근처의 사용자가 내가 브로드캐스트 중인 미디어를 수신 대기할 수 있습니다."</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"완료"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"복사됨"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"복사한 위치: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"복사된 텍스트 닫기"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"복사된 텍스트 편집"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"복사된 이미지 편집"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"근처 기기에 전송"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ae7e377eb399..9600ec26a1e4 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"жайгашкан жер"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"экранды жаздыруу"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Чоңойтуу терезеси"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Белгисиз колдонмо"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Тышкы экранга чыгарууну токтотуу"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио чыгаруу үчүн жеткиликтүү түзмөктөр."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Кабарлоо кантип иштейт"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Кабарлоо"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Шайкеш Bluetooth түзмөктөрү болгон жакын жердеги кишилер кабарлап жаткан медиаңызды уга алышат"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Бүттү"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Көчүрүлдү"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосунан"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Көчүрүлгөн текстти жабуу"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Көчүрүлгөн текстти түзөтүү"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Көчүрүлгөн сүрөттү түзөтүү"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Жакын жердеги түзмөккө жөнөтүү"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index be0215243abf..13b1484562db 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ກ້ອງຖ່າຍຮູບ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ສະຖານທີ່"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ໄມໂຄຣໂຟນ"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ການບັນທຶກໜ້າຈໍ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ບໍ່ມີຊື່"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ໜ້າຈໍການຂະຫຍາຍ"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ແອັບທີ່ບໍ່ຮູ້ຈັກ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ຢຸດການສົ່ງສັນຍານ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ອຸປະກອນທີ່ສາມາດໃຊ້ໄດ້ສຳລັບເອົ້າພຸດສຽງ."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ການອອກອາກາດເຮັດວຽກແນວໃດ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ອອກອາກາດ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ຄົນທີ່ຢູ່ໃກ້ທ່ານທີ່ມີອຸປະກອນ Bluetooth ທີ່ເຂົ້າກັນໄດ້ຈະສາມາດຟັງມີເດຍທີ່ທ່ານກຳລັງອອກອາກາດຢູ່ໄດ້"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"ແລ້ວໆ"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ສຳເນົາແລ້ວ"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"ຈາກ <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"ປິດຂໍ້ຄວາມທີ່ສຳເນົາໄວ້"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"ແກ້ໄຂຂໍ້ຄວາມທີ່ສຳເນົາແລ້ວ"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"ແກ້ໄຂຮູບທີ່ສຳເນົາແລ້ວ"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ສົ່ງໄປຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 4ae45bab814e..6f740ed6e180 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparatą"</string> <string name="privacy_type_location" msgid="7991481648444066703">"vietovę"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofoną"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekrano įrašymas"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nėra pavadinimo"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Didinimo langas"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nežinoma programa"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Sustabdyti perdavimą"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Pasiekiami garso išvesties įrenginiai."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kaip veikia transliacija"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transliacija"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Netoliese esantys žmonės, turintys suderinamus „Bluetooth“ įrenginius, gali klausyti jūsų transliuojamos medijos"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index b172b91752d1..38c095f17de2 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"atrašanās vieta"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofons"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekrāna ierakstīšana"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nav nosaukuma"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Palielināšanas logs"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nezināma lietotne"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Apturēt apraidi"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio izvadei pieejamās ierīces."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kā darbojas apraide"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Apraide"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Tuvumā esošās personas ar saderīgām Bluetooth ierīcēm var klausīties jūsu apraidīto multivides saturu."</string> @@ -942,8 +945,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Gatavs"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nokopēts"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"No lietotnes <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Nerādīt kopēto tekstu"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Rediģēt nokopēto tekstu"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Rediģēt nokopēto attēlu"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Sūtīt uz tuvumā esošu ierīci"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 7c60823672ff..842cae816040 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"локација"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"снимање на екранот"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслов"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозорец за зголемување"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Непозната апликација"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Сопри со емитување"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Достапни уреди за аудиоизлез."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционира емитувањето"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Емитување"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Луѓето во ваша близина со компатибилни уреди со Bluetooth може да ги слушаат аудиозаписите што ги емитувате"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 26850c8e6446..f9732ca39ef3 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ക്യാമറ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ലൊക്കേഷന്"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"മൈക്രോഫോൺ"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"സ്ക്രീൻ റെക്കോർഡിംഗ്"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"പേരില്ല"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"അജ്ഞാതമായ ആപ്പ്"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"കാസ്റ്റ് ചെയ്യുന്നത് നിർത്തുക"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ഓഡിയോ ഔട്ട്പുട്ടിന് ലഭ്യമായ ഉപകരണങ്ങൾ."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ബ്രോഡ്കാസ്റ്റ് എങ്ങനെയാണ് പ്രവർത്തിക്കുന്നത്"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ബ്രോഡ്കാസ്റ്റ്"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"അനുയോജ്യമായ Bluetooth ഉപകരണങ്ങളോടെ സമീപമുള്ള ആളുകൾക്ക് നിങ്ങൾ ബ്രോഡ്കാസ്റ്റ് ചെയ്യുന്ന മീഡിയ കേൾക്കാനാകും"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 55fae241430f..0e6a9a163135 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камер"</string> <string name="privacy_type_location" msgid="7991481648444066703">"байршил"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"дэлгэцийн бичлэг"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Гарчиггүй"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Томруулалтын цонх"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Үл мэдэгдэх апп"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Дамжуулахыг зогсоох"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Аудио гаралт хийх боломжтой төхөөрөмжүүд."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Нэвтрүүлэлт хэрхэн ажилладаг вэ?"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Нэвтрүүлэлт"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Тохиромжтой Bluetooth төхөөрөмжүүдтэй таны ойролцоох хүмүүс таны нэвтрүүлж буй медиаг сонсох боломжтой"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index b0f3c8a1d024..7e9629d09462 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"स्थान"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"मायक्रोफोन"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रेकॉर्डिंग"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string> <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अज्ञात अॅप"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्ट करणे थांबवा"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ऑडिओ आउटपुटसाठी उपलब्ध डिव्हाइस."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ब्रॉडकास्टिंग कसे काम करते"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ब्रॉडकास्ट करा"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"कंपॅटिबिल ब्लूटूथ डिव्हाइस असलेले तुमच्या जवळपासचे लोक हे तुम्ही ब्रॉडकास्ट करत असलेला मीडिया ऐकू शकतात"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index f8f650970cd7..47d8a849188c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokasi"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"rakaman skrin"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Tetingkap Pembesaran"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Apl yang tidak diketahui"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Berhenti menghantar"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Peranti tersedia untuk audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cara siaran berfungsi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Siarkan"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Orang berdekatan anda dengan peranti Bluetooth yang serasi boleh mendengar media yang sedang anda siarkan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 3a341d5446db..dc8b82e66dc1 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ကင်မရာ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"တည်နေရာ"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"မိုက်ခရိုဖုန်း"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"စခရင်ရိုက်ကူးမှု"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ခေါင်းစဉ် မရှိပါ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ဝင်းဒိုး ချဲ့ခြင်း"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"အမည်မသိ အက်ပ်"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ကာစ် ရပ်ရန်"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"အသံအထွက်အတွက် ရရှိနိုင်သောစက်များ။"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ထုတ်လွှင့်မှုဆောင်ရွက်ပုံ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ထုတ်လွှင့်ခြင်း"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"အနီးရှိတွဲသုံးနိုင်သော ဘလူးတုသ်သုံးစက် အသုံးပြုသူများက သင်ထုတ်လွှင့်နေသော မီဒီယာကို နားဆင်နိုင်သည်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index f2450b439b7e..f81e846673fa 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kameraet"</string> <string name="privacy_type_location" msgid="7991481648444066703">"posisjon"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofonen"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"skjermopptak"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen tittel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Forstørringsvindu"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ukjent app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Stopp castingen"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Tilgjengelige enheter for lydutgang."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Slik fungerer kringkasting"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Kringkasting"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Folk i nærheten med kompatible Bluetooth-enheter kan lytte til mediene du kringkaster"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Ferdig"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Fra <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Lukk kopiert tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Rediger den kopierte teksten"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Rediger det kopierte bildet"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Send til en enhet i nærheten"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 5fe026cb042e..a55abcbb6156 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"क्यामेरा"</string> <string name="privacy_type_location" msgid="7991481648444066703">"स्थान"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"माइक्रोफोन"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रिन रेकर्डिङ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string> <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"अज्ञात एप"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"कास्ट गर्न छाड्नुहोस्"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"अडियो आउटपुटका लागि उपलब्ध डिभाइसहरू।"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"प्रसारण गर्ने सुविधाले कसरी काम गर्छ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"प्रसारण"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"कम्प्याटिबल ब्लुटुथ डिभाइस भएका नजिकैका मान्छेहरू तपाईंले प्रसारण गरिरहनुभएको मिडिया सुन्न सक्छन्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 891bdc7ab0ac..deed394ed201 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"locatie"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfoon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"schermopname"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Geen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Vergrotingsvenster"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Onbekende app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Casten stoppen"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Beschikbare apparaten voor audio-uitvoer."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Hoe uitzenden werkt"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Uitzending"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Mensen bij jou in de buurt met geschikte bluetooth-apparaten kunnen luisteren naar de media die je uitzendt"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 70aafe5cf15d..ac91856f5578 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"କ୍ୟାମେରା"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ଲୋକେସନ୍"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ମାଇକ୍ରୋଫୋନ୍"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ସ୍କ୍ରିନ ରେକର୍ଡିଂ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ଅଜଣା ଆପ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"କାଷ୍ଟ କରିବା ବନ୍ଦ କରନ୍ତୁ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ଅଡିଓ ଆଉଟପୁଟ ପାଇଁ ଉପଲବ୍ଧ ଡିଭାଇସଗୁଡ଼ିକ।"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ବ୍ରଡକାଷ୍ଟିଂ କିପରି କାମ କରେ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ବ୍ରଡକାଷ୍ଟ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ଆପଣଙ୍କ ଆଖପାଖର କମ୍ପାଟିବଲ ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଥିବା ଲୋକମାନେ ଆପଣ ବ୍ରଡକାଷ୍ଟ କରୁଥିବା ମିଡିଆ ଶୁଣିପାରିବେ"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"ହୋଇଗଲା"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"କପି କରାଯାଇଛି"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"<xliff:g id="APPNAME">%1$s</xliff:g>ରୁ"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"କପି କରାଯାଇଥିବା ଟେକ୍ସଟକୁ ଖାରଜ କରନ୍ତୁ"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"କପି କରାଯାଇଥିବା ଟେକ୍ସଟକୁ ଏଡିଟ କରନ୍ତୁ"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"କପି କରାଯାଇଥିବା ଇମେଜକୁ ଏଡିଟ କରନ୍ତୁ"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ନିକଟସ୍ଥ ଡିଭାଇସକୁ ପଠାନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 97de165f7ab6..9e605d927e2e 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ਕੈਮਰਾ"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ਟਿਕਾਣਾ"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"ਅਗਿਆਤ ਐਪ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ਆਡੀਓ ਆਊਟਪੁੱਟ ਲਈ ਉਪਲਬਧ ਡੀਵਾਈਸ।"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ਪ੍ਰਸਾਰਨ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ਪ੍ਰਸਾਰਨ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ਅਨੁਰੂਪ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਨਜ਼ਦੀਕੀ ਲੋਕ ਤੁਹਾਡੇ ਵੱਲੋਂ ਪ੍ਰਸਾਰਨ ਕੀਤੇ ਜਾ ਰਹੇ ਮੀਡੀਆ ਨੂੰ ਸੁਣ ਸਕਦੇ ਹਨ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 0789af484b16..db9b805ccefe 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"aparat"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokalizacja"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"nagrywanie ekranu"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez tytułu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno powiększenia"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Nieznana aplikacja"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zatrzymaj przesyłanie"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostępne urządzenia do odtwarzania dźwięku."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jak działa transmitowanie"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmisja"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osoby w pobliżu ze zgodnymi urządzeniami Bluetooth mogą słuchać transmitowanych przez Ciebie multimediów"</string> @@ -949,8 +952,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Gotowe"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Skopiowano"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Od: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Odrzuć skopiowany tekst"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Edytuj skopiowany tekst"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Edytuj skopiowany obraz"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Wyślij na urządzenie w pobliżu"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index d9753e905d4e..9930250cb3bb 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"câmera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"localização"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de tela"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecido"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmitir"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As pessoas próximas a você com dispositivos Bluetooth compatíveis podem ouvir a mídia que você está transmitindo"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c20554a2bda4..0a01592f3297 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"câmara"</string> <string name="privacy_type_location" msgid="7991481648444066703">"localização"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de ecrã"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecida"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para a saída de áudio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmissão"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As pessoas próximas de si com dispositivos Bluetooth compatíveis podem ouvir o conteúdo multimédia que está a transmitir"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index d9753e905d4e..9930250cb3bb 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"câmera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"localização"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfone"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"gravação de tela"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Janela de ampliação"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecido"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispositivos disponíveis para saída de áudio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Como funciona a transmissão"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmitir"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"As pessoas próximas a você com dispositivos Bluetooth compatíveis podem ouvir a mídia que você está transmitindo"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 1d75ea69d50c..ce01a563c16d 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"cameră foto"</string> <string name="privacy_type_location" msgid="7991481648444066703">"locație"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"microfon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"înregistrare de ecran"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Fără titlu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Fereastra de mărire"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplicație necunoscută"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Nu mai proiectați"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dispozitive disponibile pentru ieșire audio."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cum funcționează transmisia"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmiteți"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Persoanele din apropiere cu dispozitive Bluetooth compatibile pot asculta conținutul pe care îl transmiteți"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d7ab354e71e9..c02195933f23 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"местоположение"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"запись экрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без названия"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Окно увеличения"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Неизвестное приложение"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Остановить трансляцию"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступные устройства для вывода звука."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Как работают трансляции"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Трансляция"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Находящиеся рядом с вами люди с совместимыми устройствами Bluetooth могут слушать медиафайлы, которые вы транслируете."</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 30b6fb1980d4..9c60ae49532f 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"කැමරාව"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ස්ථානය"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"මයික්රෝෆෝනය"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"තිර පටිගත කිරීම"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"මාතෘකාවක් නැත"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string> <string name="magnification_window_title" msgid="4863914360847258333">"විශාලන කවුළුව"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"නොදන්නා යෙදුම"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"විකාශය නවතන්න"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ශ්රව්ය ප්රතිදානය සඳහා තිබෙන උපාංග."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"විකාශනය ක්රියා කරන ආකාරය"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"විකාශනය"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ගැළපෙන බ්ලූටූත් උපාංග සහිත ඔබ අවට සිටින පුද්ගලයින්ට ඔබ විකාශනය කරන මාධ්යයට සවන් දිය හැකිය"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 1d475201b54a..9817ecfa2274 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparát"</string> <string name="privacy_type_location" msgid="7991481648444066703">"poloha"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofón"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"nahrávanie obrazovky"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Okno priblíženia"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznáma aplikácia"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Zastaviť prenos"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Dostupné zariadenia pre zvukový výstup."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Ako vysielanie funguje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Vysielanie"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Ľudia v okolí s kompatibilnými zariadeniami s rozhraním Bluetooth si môžu vypočuť médiá, ktoré vysielate"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index a9b8c0edfaa1..857e1df94b74 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparat"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokacijo"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"snemanje zaslona"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Brez naslova"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Povečevalno okno"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Neznana aplikacija"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ustavi predvajanje"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Razpoložljive naprave za zvočni izhod"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Kako deluje oddajanje"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Oddajanje"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Osebe v bližini z združljivo napravo Bluetooth lahko poslušajo predstavnost, ki jo oddajate."</string> @@ -949,8 +952,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Končano"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Iz aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Opusti kopirano besedilo"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Uredi kopirano besedilo"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Uredi kopirano sliko"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Pošlji v napravo v bližini"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 95e50b102b76..44d9a0dc5ad9 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamerën"</string> <string name="privacy_type_location" msgid="7991481648444066703">"vendndodhjen"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofonin"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"regjistrim i ekranit"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Pa titull"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dritarja e zmadhimit"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Aplikacion i panjohur"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ndalo transmetimin"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Pajisjet që ofrohen për daljen e audios."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Si funksionon transmetimi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Transmetimi"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personat në afërsi me ty me pajisje të përputhshme me Bluetooth mund të dëgjojnë median që ti po transmeton"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"U krye"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"U kopjua"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Nga <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Hiq tekstin e kopjuar"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Modifiko tekstin e kopjuar"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Modifiko imazhin e kopjuar"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Dërgo te pajisja në afërsi"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 03d7cd5caf6b..ff027afa03fd 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -744,6 +744,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камеру"</string> <string name="privacy_type_location" msgid="7991481648444066703">"локацију"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"микрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"снимање екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслова"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Прозор за увећање"</string> @@ -850,6 +851,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Непозната апликација"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Заустави пребацивање"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступни уређаји за аудио излаз."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Како функционише емитовање"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Емитовање"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Људи у близини са компатибилним Bluetooth уређајима могу да слушају медијски садржај који емитујете"</string> @@ -942,8 +945,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Готово"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано је"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"Од: <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Одбаци копирани текст"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Измените копирани текст"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Измените копирану слику"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Пошаљи на уређај у близини"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index f831f4cc4704..198c389595a1 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"plats"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"skärminspelning"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Förstoringsfönster"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Okänd app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Sluta casta"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Enheter som är tillgängliga för ljudutdata."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Så fungerar utsändning"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Utsändning"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Personer i närheten med kompatibla Bluetooth-enheter kan lyssna på medieinnehåll som du sänder ut"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 3af6a6c909c3..2f1be2421310 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"mahali"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"maikrofoni"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"kurekodi skrini"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Wimbo hauna jina"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Dirisha la Ukuzaji"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Programu isiyojulikana"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Acha kutuma"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Vifaa vya kutoa sauti vilivyopo"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Jinsi utangazaji unavyofanya kazi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Tangaza"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Watu walio karibu nawe wenye vifaa oanifu vya Bluetooth wanaweza kusikiliza maudhui unayoyatangaza"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 12ad0f715f07..1a0faf28f0be 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"கேமரா"</string> <string name="privacy_type_location" msgid="7991481648444066703">"இருப்பிடம்"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"மைக்ரோஃபோன்"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ஸ்கிரீன் ரெக்கார்டிங்"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"தலைப்பு இல்லை"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string> <string name="magnification_window_title" msgid="4863914360847258333">"பெரிதாக்கல் சாளரம்"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"அறியப்படாத ஆப்ஸ்"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"அலைபரப்புவதை நிறுத்து"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ஆடியோ அவுட்புட்டுக்குக் கிடைக்கும் சாதனங்கள்."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"பிராட்காஸ்ட் எவ்வாறு செயல்படுகிறது?"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"பிராட்காஸ்ட்"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"நீங்கள் பிராட்காஸ்ட் செய்யும் மீடியாவை அருகிலுள்ளவர்கள் இணக்கமான புளூடூத் சாதனங்கள் மூலம் கேட்கலாம்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index f0e953e4fe0f..ff3ff1a8ea9a 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"కెమెరా"</string> <string name="privacy_type_location" msgid="7991481648444066703">"లొకేషన్"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"మైక్రోఫోన్"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"స్క్రీన్ రికార్డింగ్"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"శీర్షిక లేదు"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> <string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"తెలియని యాప్"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"ప్రసారాన్ని ఆపివేయండి"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ఆడియో అవుట్పుట్ కోసం అందుబాటులో ఉన్న పరికరాలు."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"ప్రసారం కావడం అనేది ఎలా పని చేస్తుంది"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ప్రసారం"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"మీకు సమీపంలో ఉన్న వ్యక్తులు అనుకూలత ఉన్న బ్లూటూత్ పరికరాలతో మీరు ప్రసారం చేస్తున్న మీడియాను వినగలరు"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index b1dce4e9becd..852ab881cfb3 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"กล้องถ่ายรูป"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ตำแหน่ง"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ไมโครโฟน"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"การบันทึกหน้าจอ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"ไม่มีชื่อ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string> <string name="magnification_window_title" msgid="4863914360847258333">"หน้าต่างการขยาย"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"แอปที่ไม่รู้จัก"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"หยุดแคสต์"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"อุปกรณ์ที่พร้อมใช้งานสำหรับเอาต์พุตเสียง"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"วิธีการทำงานของการออกอากาศ"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"ประกาศ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"ผู้ที่อยู่ใกล้คุณและมีอุปกรณ์บลูทูธที่รองรับสามารถรับฟังสื่อที่คุณกำลังออกอากาศได้"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"เสร็จ"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"คัดลอกแล้ว"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"จาก <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"ปิดข้อความที่คัดลอก"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"แก้ไขข้อความที่คัดลอก"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"แก้ไขรูปภาพที่คัดลอก"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"ส่งไปยังอุปกรณ์ที่อยู่ใกล้เคียง"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index db0915dec4fa..ed56ff6d5542 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"lokasyon"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikropono"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"pag-record ng screen"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Walang pamagat"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Window ng Pag-magnify"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Hindi kilalang app"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Ihinto ang pag-cast"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Mga available na device para sa audio output."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Paano gumagana ang pag-broadcast"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Broadcast"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Makakapakinig ang mga taong malapit sa iyo na may mga compatible na Bluetooth device sa media na bino-broadcast mo"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 51ef51246cf5..20571866b69f 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"konum"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekran kaydı"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıksız"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Büyütme Penceresi"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Bilinmeyen uygulama"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Yayını durdur"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Ses çıkışı için kullanılabilir cihazlar."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Yayınlamanın işleyiş şekli"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Anons"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Yakınınızda ve uyumlu Bluetooth cihazları olan kişiler yayınladığınız medya içeriğini dinleyebilir"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index dff83c94af7a..aa764b36eff8 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -749,6 +749,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"камера"</string> <string name="privacy_type_location" msgid="7991481648444066703">"місце"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"мікрофон"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"запис відео з екрана"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Без назви"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Вікно збільшення"</string> @@ -856,6 +857,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Невідомий додаток"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Припинити трансляцію"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Доступні пристрої для відтворення звуку."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Як працює трансляція"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Трансляція"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Люди поблизу, які мають сумісні пристрої з Bluetooth, можуть слухати медіаконтент, який ви транслюєте."</string> @@ -949,8 +952,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"Готово"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скопійовано"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"З додатка <xliff:g id="APPNAME">%1$s</xliff:g>"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"Закрити буфер обміну зі скопійованим текстом"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"Редагувати скопійований текст"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"Редагувати скопійоване зображення"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"Надіслати на пристрій поблизу"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 78f5344c608d..e133c1b5a6e1 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"کیمرا"</string> <string name="privacy_type_location" msgid="7991481648444066703">"مقام"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"مائیکروفون"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"اسکرین ریکارڈنگ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"کوئی عنوان نہیں ہے"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string> <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"نامعلوم ایپ"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"کاسٹ کرنا بند کریں"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"آڈیو آؤٹ پٹ کے لیے دستیاب آلات۔"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"براڈکاسٹنگ کیسے کام کرتا ہے"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"براڈکاسٹ"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"موافق بلوٹوتھ آلات کے ساتھ آپ کے قریبی لوگ آپ کے نشر کردہ میڈیا کو سن سکتے ہیں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index de072d6eb86b..3fff2600f1a3 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"joylashuv"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ekranni yozuvi"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Nomsiz"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Kattalashtirish oynasi"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Notanish ilova"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Toʻxtatish"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Audio chiqish uchun mavjud qurilmalar."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Translatsiya qanday ishlaydi"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Translatsiya"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Atrofingizdagi mos Bluetooth qurilmasiga ega foydalanuvchilar siz translatsiya qilayotgan mediani tinglay olishadi"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 361b7b2ebb5e..7a0f00eb5157 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"máy ảnh"</string> <string name="privacy_type_location" msgid="7991481648444066703">"vị trí"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"micrô"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ghi màn hình"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Cửa sổ phóng to"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"Ứng dụng không xác định"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Dừng truyền"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Các thiết bị có sẵn để xuất âm thanh."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Cách tính năng truyền hoạt động"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Truyền"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Những người ở gần có thiết bị Bluetooth tương thích có thể nghe nội dung nghe nhìn bạn đang truyền"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 1ed22f68c716..2ce422b7d3e6 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"相机"</string> <string name="privacy_type_location" msgid="7991481648444066703">"位置信息"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"麦克风"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"屏幕录制"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大窗口"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"未知应用"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投射"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"音频输出的可用设备。"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"广播的运作方式"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"广播"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"附近使用兼容蓝牙设备的用户可以收听您广播的媒体内容"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 19e30c28d103..5ef2f3d0f7d0 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"相機"</string> <string name="privacy_type_location" msgid="7991481648444066703">"位置"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"麥克風"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"錄製螢幕畫面"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明應用程式"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投放"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"可用作音訊輸出的裝置"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播運作方式"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"廣播"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"附近有兼容藍牙裝置的人可收聽您正在廣播的媒體內容"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"完成"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"來自「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"關閉剪貼簿"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"編輯已複製的文字"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"編輯已複製的圖片"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"傳送至附近的裝置"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index c9b93aace984..bc3d9c405239 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"相機"</string> <string name="privacy_type_location" msgid="7991481648444066703">"位置"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"麥克風"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"錄製螢幕畫面"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> <string name="magnification_window_title" msgid="4863914360847258333">"放大視窗"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"不明的應用程式"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"停止投放"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"可用於輸出音訊的裝置。"</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播功能的運作方式"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"廣播"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"如果附近的人有相容的藍牙裝置,就可以聽到你正在廣播的媒體內容"</string> @@ -935,8 +938,7 @@ <string name="clipboard_edit_text_done" msgid="4551887727694022409">"完成"</string> <string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string> <string name="clipboard_edit_source" msgid="9156488177277788029">"來自「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string> - <!-- no translation found for clipboard_dismiss_description (3335990369850165486) --> - <skip /> + <string name="clipboard_dismiss_description" msgid="3335990369850165486">"關閉剪貼簿"</string> <string name="clipboard_edit_text_description" msgid="805254383912962103">"編輯複製的文字"</string> <string name="clipboard_edit_image_description" msgid="8904857948976041306">"編輯複製的圖片"</string> <string name="clipboard_send_nearby_description" msgid="4629769637846717650">"傳送到鄰近裝置"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2908ac7d44e3..398dae5e21e8 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -739,6 +739,7 @@ <string name="privacy_type_camera" msgid="7974051382167078332">"ikhamera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"indawo"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"imakrofoni"</string> + <string name="privacy_type_media_projection" msgid="8136723828804251547">"ukurekhoda isikrini"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Asikho isihloko"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Iwindi Lesikhulisi"</string> @@ -844,6 +845,8 @@ <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"I-app engaziwa"</string> <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Misa ukusakaza"</string> <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"Amadivayisi atholakalayo okukhipha umsindo."</string> + <!-- no translation found for media_output_dialog_accessibility_seekbar (5332843993805568978) --> + <skip /> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"Indlela ukusakaza okusebenza ngayo"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"Sakaza"</string> <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"Abantu abaseduze nawe abanamadivayisi e-Bluetooth ahambisanayo bangalalela imidiya oyisakazayo"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 40664992ba59..45713babf034 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -31,7 +31,7 @@ <!-- dimensions for the navigation bar handle --> <dimen name="navigation_handle_radius">2dp</dimen> - <dimen name="navigation_handle_bottom">8dp</dimen> + <dimen name="navigation_handle_bottom">10dp</dimen> <dimen name="navigation_handle_sample_horizontal_margin">10dp</dimen> <dimen name="navigation_home_handle_width">108dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 1dd41a35374f..99f4c767c0de 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2477,7 +2477,7 @@ <!-- Title for dialog listing applications currently running [CHAR LIMIT=NONE]--> <string name="fgs_manager_dialog_title">Active apps</string> <!-- Detailed message for dialog listing applications currently running [CHAR LIMIT=NONE]--> - <string name="fgs_manager_dialog_message">Even if you\u2019re not using these apps, they\u2019re still active and might affect battery life</string> + <string name="fgs_manager_dialog_message">These apps are active and running, even when you\u2019re not using them. This improves their functionality, but it may also affect battery life.</string> <!-- Label of the button to stop an app from running [CHAR LIMIT=12]--> <string name="fgs_manager_app_item_stop_button_label">Stop</string> <!-- Label of the button to stop an app from running but the app is already stopped and the button is disabled [CHAR LIMIT=12]--> diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index 3714c15af173..eab374508913 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -51,7 +51,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; @@ -100,7 +99,6 @@ import android.widget.TextView; import com.android.internal.logging.UiEventLogger; import com.android.internal.policy.PhoneWindow; -import com.android.settingslib.applications.InterestingConfigChanges; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastSender; @@ -166,10 +164,9 @@ public class ClipboardOverlayController { private boolean mBlockAttach = false; private Animator mExitAnimator; + private Animator mEnterAnimator; + private final int mOrientation; - /** Tracks config changes that require updating insets */ - private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( - ActivityInfo.CONFIG_KEYBOARD_HIDDEN); public ClipboardOverlayController(Context context, BroadcastDispatcher broadcastDispatcher, @@ -255,6 +252,7 @@ public class ClipboardOverlayController { mRemoteCopyChip.setIcon( Icon.createWithResource(mContext, R.drawable.ic_baseline_devices_24), true); mShareChip.setIcon(Icon.createWithResource(mContext, R.drawable.ic_screenshot_share), true); + mOrientation = mContext.getResources().getConfiguration().orientation; attachWindow(); withWindowAttached(() -> { @@ -266,9 +264,10 @@ public class ClipboardOverlayController { @Override public void onConfigurationChanged(Configuration overrideConfig, int newDisplayId) { - if (mConfigChanges.applyNewConfig(mContext.getResources())) { - updateInsets( - mWindowManager.getCurrentWindowMetrics().getWindowInsets()); + if (mContext.getResources().getConfiguration().orientation + != mOrientation) { + mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISSED_OTHER); + hideImmediate(); } } @@ -366,7 +365,7 @@ public class ClipboardOverlayController { Intent remoteCopyIntent = getRemoteCopyIntent(clipData); // Only show remote copy if it's available. PackageManager packageManager = mContext.getPackageManager(); - if (remoteCopyIntent != null && packageManager.resolveActivity( + if (packageManager.resolveActivity( remoteCopyIntent, PackageManager.ResolveInfoFlags.of(0)) != null) { mRemoteCopyChip.setVisibility(View.VISIBLE); mRemoteCopyChip.setOnClickListener((v) -> { @@ -381,7 +380,9 @@ public class ClipboardOverlayController { withWindowAttached(() -> { updateInsets( mWindowManager.getCurrentWindowMetrics().getWindowInsets()); - mView.post(this::animateIn); + if (mEnterAnimator == null || !mEnterAnimator.isRunning()) { + mView.post(this::animateIn); + } mView.announceForAccessibility(accessibilityAnnouncement); }); mTimeoutHandler.resetTimeout(); @@ -652,7 +653,8 @@ public class ClipboardOverlayController { if (mAccessibilityManager.isEnabled()) { mDismissButton.setVisibility(View.VISIBLE); } - getEnterAnimation().start(); + mEnterAnimator = getEnterAnimation(); + mEnterAnimator.start(); } private void animateOut() { diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java index b54b83274f45..c68a867653d9 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.PersistableBundle; +import android.text.Editable; import android.util.Log; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; @@ -89,16 +90,20 @@ public class EditTextActivity extends Activity @Override // ClipboardManager.OnPrimaryClipChangedListener public void onPrimaryClipChanged() { - hideImeAndFinish(); + hideIme(); + finish(); } private void saveToClipboard() { - ClipData clip = ClipData.newPlainText("text", mEditText.getText()); + hideIme(); + Editable editedText = mEditText.getText(); + editedText.clearSpans(); + ClipData clip = ClipData.newPlainText("text", editedText); PersistableBundle extras = new PersistableBundle(); extras.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, mSensitive); clip.getDescription().setExtras(extras); mClipboardManager.setPrimaryClip(clip); - hideImeAndFinish(); + finish(); } private void share() { @@ -111,9 +116,8 @@ public class EditTextActivity extends Activity startActivity(shareIntent); } - private void hideImeAndFinish() { + private void hideIme() { InputMethodManager imm = getSystemService(InputMethodManager.class); imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0); - finish(); } } diff --git a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt index 9b0d43272fd3..f1d5e94bfbf3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt @@ -238,5 +238,6 @@ class ColorSchemeTransition internal constructor( fun updateColorScheme(colorScheme: ColorScheme?, enableGradient: Boolean) { isGradientEnabled = enableGradient colorTransitions.forEach { it.updateColorScheme(colorScheme) } + colorScheme?.let { mediaViewHolder.gutsViewHolder.colorScheme = colorScheme } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt index 1a48a84aff23..73240b54a27a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/GutsViewHolder.kt @@ -40,6 +40,9 @@ class GutsViewHolder constructor(itemView: View) { val dismissText: TextView = itemView.requireViewById(R.id.dismiss_text) val settings: ImageButton = itemView.requireViewById(R.id.settings) + private var isDismissible: Boolean = true + var colorScheme: ColorScheme? = null + /** Marquees the main text of the guts menu. */ fun marquee(start: Boolean, delay: Long, tag: String) { val gutsTextHandler = gutsText.handler @@ -47,19 +50,31 @@ class GutsViewHolder constructor(itemView: View) { Log.d(tag, "marquee while longPressText.getHandler() is null", Exception()) return } - gutsTextHandler.postDelayed( { gutsText.isSelected = start }, delay) + gutsTextHandler.postDelayed({ gutsText.isSelected = start }, delay) + } + + /** Set whether this control can be dismissed, and update appearance to match */ + fun setDismissible(dismissible: Boolean) { + if (isDismissible == dismissible) return + + isDismissible = dismissible + colorScheme?.let { setColors(it) } } /** Sets the right colors on all the guts views based on the given [ColorScheme]. */ - fun setColors(colorScheme: ColorScheme) { - setSurfaceColor(surfaceFromScheme(colorScheme)) - setTextPrimaryColor(textPrimaryFromScheme(colorScheme)) - setAccentPrimaryColor(accentPrimaryFromScheme(colorScheme)) + fun setColors(scheme: ColorScheme) { + colorScheme = scheme + setSurfaceColor(surfaceFromScheme(scheme)) + setTextPrimaryColor(textPrimaryFromScheme(scheme)) + setAccentPrimaryColor(accentPrimaryFromScheme(scheme)) } /** Sets the surface color on all guts views that use it. */ fun setSurfaceColor(surfaceColor: Int) { dismissText.setTextColor(surfaceColor) + if (!isDismissible) { + cancelText.setTextColor(surfaceColor) + } } /** Sets the primary accent color on all guts views that use it. */ @@ -74,7 +89,9 @@ class GutsViewHolder constructor(itemView: View) { fun setTextPrimaryColor(textPrimary: Int) { val textColorList = ColorStateList.valueOf(textPrimary) gutsText.setTextColor(textColorList) - cancelText.setTextColor(textColorList) + if (isDismissible) { + cancelText.setTextColor(textColorList) + } } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 972e93b886b8..dea13251e100 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -1183,7 +1183,7 @@ public class MediaControlPanel { gutsViewHolder.getGutsText().setText(text); // Dismiss button - gutsViewHolder.getDismissText().setAlpha(isDismissible ? 1 : DISABLED_ALPHA); + gutsViewHolder.getDismissText().setVisibility(isDismissible ? View.VISIBLE : View.GONE); gutsViewHolder.getDismiss().setEnabled(isDismissible); gutsViewHolder.getDismiss().setOnClickListener(v -> { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; @@ -1194,11 +1194,18 @@ public class MediaControlPanel { }); // Cancel button + TextView cancelText = gutsViewHolder.getCancelText(); + if (isDismissible) { + cancelText.setBackground(mContext.getDrawable(R.drawable.qs_media_outline_button)); + } else { + cancelText.setBackground(mContext.getDrawable(R.drawable.qs_media_solid_button)); + } gutsViewHolder.getCancel().setOnClickListener(v -> { if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { closeGuts(); } }); + gutsViewHolder.setDismissible(isDismissible); // Settings button gutsViewHolder.getSettings().setOnClickListener(v -> { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt index deb5cbafccc4..27cd1ce2b440 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt @@ -270,8 +270,11 @@ class MediaViewController @Inject constructor( } } gutsIds.forEach { id -> - viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f - viewState.widgetStates.get(id)?.gone = !isGutsVisible + viewState.widgetStates.get(id)?.let { state -> + // Make sure to use the unmodified state if guts are visible + state.alpha = if (isGutsVisible) state.alpha else 0f + state.gone = if (isGutsVisible) state.gone else true + } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt index 60ef85d0b502..121021f19f70 100644 --- a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt @@ -99,7 +99,9 @@ open class SeekBarObserver( holder.seekBar.setMax(data.duration) val totalTimeString = DateUtils.formatElapsedTime( data.duration / DateUtils.SECOND_IN_MILLIS) - holder.scrubbingTotalTimeView.text = totalTimeString + if (data.scrubbing) { + holder.scrubbingTotalTimeView.text = totalTimeString + } data.elapsedTime?.let { if (!data.scrubbing && !(seekBarResetAnimator?.isRunning ?: false)) { @@ -113,9 +115,12 @@ open class SeekBarObserver( holder.seekBar.progress = it } } + val elapsedTimeString = DateUtils.formatElapsedTime( it / DateUtils.SECOND_IN_MILLIS) - holder.scrubbingElapsedTimeView.text = elapsedTimeString + if (data.scrubbing) { + holder.scrubbingElapsedTimeView.text = elapsedTimeString + } holder.seekBar.contentDescription = holder.seekBar.context.getString( R.string.controls_media_seekbar_description, diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt index 8d2b14a60632..80eacd1f3e63 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt @@ -44,6 +44,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_FOOTER_DOT import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.animation.DialogLaunchAnimator @@ -81,6 +82,8 @@ class FgsManagerController @Inject constructor( companion object { private val LOG_TAG = FgsManagerController::class.java.simpleName + private const val DEFAULT_TASK_MANAGER_ENABLED = true + private const val DEFAULT_TASK_MANAGER_SHOW_FOOTER_DOT = false } var changesSinceDialog = false @@ -88,6 +91,8 @@ class FgsManagerController @Inject constructor( var isAvailable = false private set + var showFooterDot = false + private set private val lock = Any() @@ -151,10 +156,14 @@ class FgsManagerController @Inject constructor( deviceConfigProxy.addOnPropertiesChangedListener(NAMESPACE_SYSTEMUI, backgroundExecutor) { isAvailable = it.getBoolean(TASK_MANAGER_ENABLED, isAvailable) + showFooterDot = + it.getBoolean(TASK_MANAGER_SHOW_FOOTER_DOT, showFooterDot) } - isAvailable = deviceConfigProxy - .getBoolean(NAMESPACE_SYSTEMUI, TASK_MANAGER_ENABLED, true) + isAvailable = deviceConfigProxy.getBoolean(NAMESPACE_SYSTEMUI, + TASK_MANAGER_ENABLED, DEFAULT_TASK_MANAGER_ENABLED) + showFooterDot = deviceConfigProxy.getBoolean(NAMESPACE_SYSTEMUI, + TASK_MANAGER_SHOW_FOOTER_DOT, DEFAULT_TASK_MANAGER_SHOW_FOOTER_DOT) dumpManager.registerDumpable(this) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java index abebf3e80b21..ba6b1dd28c97 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java @@ -149,8 +149,8 @@ public class QSFgsManagerFooter implements View.OnClickListener, if (mFgsManagerController.shouldUpdateFooterVisibility()) { mRootView.setVisibility(mNumPackages > 0 && mFgsManagerController.isAvailable() ? View.VISIBLE : View.GONE); - int dotVis = - mFgsManagerController.getChangesSinceDialog() ? View.VISIBLE : View.GONE; + int dotVis = mFgsManagerController.getShowFooterDot() + && mFgsManagerController.getChangesSinceDialog() ? View.VISIBLE : View.GONE; mDotView.setVisibility(dotVis); mCollapsedDotView.setVisibility(dotVis); if (mVisibilityChangedListener != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index aa80b730d24f..cc3121ddc0e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -398,11 +398,11 @@ public class CommandQueue extends IStatusBar.Stub implements /** * @see IStatusBar#showToast(int, String, IBinder, CharSequence, IBinder, int, - * ITransientNotificationCallback) + * ITransientNotificationCallback, int) */ default void showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, - @Nullable ITransientNotificationCallback callback) { } + @Nullable ITransientNotificationCallback callback, int displayId) { } /** * @see IStatusBar#hideToast(String, IBinder) (String, IBinder) @@ -944,7 +944,8 @@ public class CommandQueue extends IStatusBar.Stub implements @Override public void showToast(int uid, String packageName, IBinder token, CharSequence text, - IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback) { + IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback, + int displayId) { synchronized (mLock) { SomeArgs args = SomeArgs.obtain(); args.arg1 = packageName; @@ -954,6 +955,7 @@ public class CommandQueue extends IStatusBar.Stub implements args.arg5 = callback; args.argi1 = uid; args.argi2 = duration; + args.argi3 = displayId; mHandler.obtainMessage(MSG_SHOW_TOAST, args).sendToTarget(); } } @@ -1600,9 +1602,10 @@ public class CommandQueue extends IStatusBar.Stub implements (ITransientNotificationCallback) args.arg5; int uid = args.argi1; int duration = args.argi2; + int displayId = args.argi3; for (Callbacks callbacks : mCallbacks) { callbacks.showToast(uid, packageName, token, text, windowToken, duration, - callback); + callback, displayId); } break; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index 333815f6b11a..0280e0b729a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -44,6 +44,7 @@ import android.view.animation.Interpolator; import androidx.annotation.NonNull; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; import com.android.internal.logging.UiEventLogger; @@ -335,10 +336,24 @@ public class StatusBarStateControllerImpl implements ? Interpolators.FAST_OUT_SLOW_IN : Interpolators.TOUCH_RESPONSE_REVERSE; } - mDarkAnimator = ObjectAnimator.ofFloat(this, SET_DARK_AMOUNT_PROPERTY, mDozeAmountTarget); - mDarkAnimator.setInterpolator(Interpolators.LINEAR); - mDarkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP); - mDarkAnimator.addListener(new AnimatorListenerAdapter() { + if (mDozeAmount == 1f && !mIsDozing) { + // Workaround to force relayoutWindow to be called a frame earlier. Otherwise, if + // mDozeAmount = 1f, then neither start() nor the first frame of the animation will + // cause the scrim opacity to change, which ultimately results in an extra relayout and + // causes us to miss a frame. By settings the doze amount to be <1f a frame earlier, + // we can batch the relayout with the one in NotificationShadeWindowControllerImpl. + setDozeAmountInternal(0.99f); + } + mDarkAnimator = createDarkAnimator(); + } + + @VisibleForTesting + protected ObjectAnimator createDarkAnimator() { + ObjectAnimator darkAnimator = ObjectAnimator.ofFloat( + this, SET_DARK_AMOUNT_PROPERTY, mDozeAmountTarget); + darkAnimator.setInterpolator(Interpolators.LINEAR); + darkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP); + darkAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { cancelInteractionJankMonitor(); @@ -354,7 +369,8 @@ public class StatusBarStateControllerImpl implements beginInteractionJankMonitor(); } }); - mDarkAnimator.start(); + darkAnimator.start(); + return darkAnimator; } private void setDozeAmountInternal(float dozeAmount) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index f84a6df05422..9f9fba437869 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification; -import android.util.MathUtils; import android.util.Pools; import android.view.View; import android.view.animation.Interpolator; @@ -99,10 +98,7 @@ public class TransformState { if (sameAs(otherState)) { ensureVisible(); } else { - CrossFadeHelper.fadeIn( - mTransformedView, - MathUtils.constrainedMap(0, 1, 0.45f, 1, transformationAmount), - false /* remap */); + CrossFadeHelper.fadeIn(mTransformedView, transformationAmount, true /* remap */); } transformViewFullyFrom(otherState, transformationAmount); } @@ -298,10 +294,7 @@ public class TransformState { } return false; } else { - CrossFadeHelper.fadeOut( - mTransformedView, - MathUtils.constrainedMap(0, 1, 0, 0.55f, transformationAmount), - false /* remap */); + CrossFadeHelper.fadeOut(mTransformedView, transformationAmount); } transformViewFullyTo(otherState, transformationAmount); return true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java index 4c7b2bbfb6d9..b84a797bbb6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotificationRowBinderImpl.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.collection.inflation; +import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_PUBLIC; + import static java.util.Objects.requireNonNull; import android.annotation.Nullable; @@ -250,9 +252,11 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { params.setUseIncreasedCollapsedHeight(useIncreasedCollapsedHeight); params.setUseLowPriority(isLowPriority); - // TODO: Replace this API with RowContentBindParams directly. Also move to a separate - // redaction controller. - row.setNeedsRedaction(mNotificationLockscreenUserManager.needsRedaction(entry)); + if (mNotificationLockscreenUserManager.needsRedaction(entry)) { + params.requireContentViews(FLAG_CONTENT_VIEW_PUBLIC); + } else { + params.markContentViewsFreeable(FLAG_CONTENT_VIEW_PUBLIC); + } params.rebindAllContentViews(); mRowContentBindStage.requestRebind(entry, en -> { 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 1cae60b3d37d..7c206eb8a54e 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 @@ -42,7 +42,6 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.RemoteException; @@ -56,7 +55,6 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.MathUtils; import android.util.Property; -import android.util.Slog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -90,8 +88,8 @@ import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; -import com.android.systemui.statusbar.notification.LaunchAnimationParameters; import com.android.systemui.statusbar.notification.FeedbackIcon; +import com.android.systemui.statusbar.notification.LaunchAnimationParameters; import com.android.systemui.statusbar.notification.NotificationFadeAware; import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorController; import com.android.systemui.statusbar.notification.NotificationUtils; @@ -1505,8 +1503,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mUseIncreasedHeadsUpHeight = use; } + /** @deprecated TODO: Remove this when the old pipeline code is removed. */ + @Deprecated public void setNeedsRedaction(boolean needsRedaction) { - // TODO: Move inflation logic out of this call and remove this method if (mNeedsRedaction != needsRedaction) { mNeedsRedaction = needsRedaction; if (!isRemoved()) { @@ -2588,8 +2587,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } public void setSensitive(boolean sensitive, boolean hideSensitive) { + int intrinsicBefore = getIntrinsicHeight(); mSensitive = sensitive; mSensitiveHiddenInGeneral = hideSensitive; + if (intrinsicBefore != getIntrinsicHeight()) { + // The animation has a few flaws and is highly visible, so jump cut instead. + notifyHeightChanged(false /* needsAnimation */); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java index f26ecc32821d..a52f638e7c26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindParams.java @@ -102,8 +102,9 @@ public final class RowContentBindParams { * @see InflationFlag */ public void markContentViewsFreeable(@InflationFlag int contentViews) { + @InflationFlag int existingContentViews = contentViews &= mContentViews; mContentViews &= ~contentViews; - mDirtyContentViews &= ~contentViews; + mDirtyContentViews |= existingContentViews; } public @InflationFlag int getContentViews() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt index 6287857e7be9..22234b1ef17d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculator.kt @@ -58,7 +58,7 @@ constructor( private var maxKeyguardNotifications by notNull<Int>() /** Minimum space between two notifications, see [calculateGapAndDividerHeight]. */ - private var dividerHeight by notNull<Int>() + private var dividerHeight by notNull<Float>() init { updateResources() @@ -142,9 +142,13 @@ constructor( if (i == children.lastIndex) { 0f // No shelf needed. } else { + val firstViewInShelfIndex = i + 1 val spaceBeforeShelf = calculateGapAndDividerHeight( - stack, previous = currentNotification, current = children[i + 1], i) + stack, + previous = currentNotification, + current = children[firstViewInShelfIndex], + currentIndex = firstViewInShelfIndex) spaceBeforeShelf + shelfIntrinsicHeight } @@ -156,16 +160,17 @@ constructor( maxKeyguardNotifications = infiniteIfNegative(resources.getInteger(R.integer.keyguard_max_notification_count)) - dividerHeight = max(1, resources.getDimensionPixelSize(R.dimen.notification_divider_height)) + dividerHeight = + max(1f, resources.getDimensionPixelSize(R.dimen.notification_divider_height).toFloat()) } private val NotificationStackScrollLayout.childrenSequence: Sequence<ExpandableView> get() = children.map { it as ExpandableView } @VisibleForTesting - fun onLockscreen() : Boolean { - return statusBarStateController.state == KEYGUARD - && lockscreenShadeTransitionController.fractionToShade == 0f + fun onLockscreen(): Boolean { + return statusBarStateController.state == KEYGUARD && + lockscreenShadeTransitionController.fractionToShade == 0f } @VisibleForTesting @@ -207,11 +212,12 @@ constructor( stack: NotificationStackScrollLayout, previous: ExpandableView?, current: ExpandableView?, - visibleIndex: Int + currentIndex: Int ): Float { - var height = stack.calculateGapHeight(previous, current, visibleIndex) - height += dividerHeight - return height + if (currentIndex == 0) { + return 0f + } + return stack.calculateGapHeight(previous, current, currentIndex) + dividerHeight } private fun NotificationStackScrollLayout.showableChildren() = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index c1869e0575ed..e946bf1bb238 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -558,6 +558,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp if (!mUpdateMonitor.isDeviceInteractive()) { if (!mKeyguardViewController.isShowing() && !mScreenOffAnimationController.isKeyguardShowDelayed()) { + if (mKeyguardStateController.isUnlocked()) { + return MODE_WAKE_AND_UNLOCK; + } return MODE_ONLY_WAKE; } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { return MODE_WAKE_AND_UNLOCK_PULSING; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 8203987cd7d6..367684faa621 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -83,7 +83,6 @@ import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.provider.Settings; -import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.service.notification.StatusBarNotification; import android.text.TextUtils; @@ -780,7 +779,8 @@ public class CentralSurfacesImpl extends CoreStartable implements InteractionJankMonitor jankMonitor, DeviceStateManager deviceStateManager, DreamOverlayStateController dreamOverlayStateController, - WiredChargingRippleController wiredChargingRippleController) { + WiredChargingRippleController wiredChargingRippleController, + IDreamManager dreamManager) { super(context); mNotificationsController = notificationsController; mFragmentService = fragmentService; @@ -871,6 +871,7 @@ public class CentralSurfacesImpl extends CoreStartable implements mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mStartingSurfaceOptional = startingSurfaceOptional; mNotifPipelineFlags = notifPipelineFlags; + mDreamManager = dreamManager; lockscreenShadeTransitionController.setCentralSurfaces(this); statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged); @@ -924,8 +925,6 @@ public class CentralSurfacesImpl extends CoreStartable implements SysuiStatusBarStateController.RANK_STATUS_BAR); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); - mDreamManager = IDreamManager.Stub.asInterface( - ServiceManager.checkService(DreamService.DREAM_SERVICE)); mDisplay = mContext.getDisplay(); mDisplayId = mDisplay.getDisplayId(); @@ -1792,6 +1791,12 @@ public class CentralSurfacesImpl extends CoreStartable implements collapseShade(); } + // We should exit the dream to prevent the activity from starting below the + // dream. + if (mKeyguardUpdateMonitor.isDreaming()) { + awakenDreams(); + } + mActivityLaunchAnimator.startIntentWithAnimation(controller, animate, intent.getPackage(), showOverLockscreenWhenLocked, (adapter) -> TaskStackBuilder .create(mContext) @@ -2731,6 +2736,10 @@ public class CentralSurfacesImpl extends CoreStartable implements mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction, afterKeyguardGone); } else { + // If the keyguard isn't showing but the device is dreaming, we should exit the dream. + if (mKeyguardUpdateMonitor.isDreaming()) { + awakenDreams(); + } action.onDismiss(); } } @@ -3964,7 +3973,7 @@ public class CentralSurfacesImpl extends CoreStartable implements protected WindowManager mWindowManager; protected IWindowManager mWindowManagerService; - private IDreamManager mDreamManager; + private final IDreamManager mDreamManager; protected Display mDisplay; private int mDisplayId; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 9afdfd651130..c521161e85f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -4362,6 +4362,9 @@ public class NotificationPanelViewController extends PanelViewController { == firstRow))) { requestScrollerTopPaddingUpdate(false /* animate */); } + if (mKeyguardShowing) { + updateMaxDisplayedNotifications(true); + } requestPanelHeightUpdate(); } diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java index 0758f8fc4fab..9eb34a42a0a9 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java @@ -27,6 +27,7 @@ import android.app.INotificationManager; import android.app.ITransientNotificationCallback; import android.content.Context; import android.content.res.Configuration; +import android.hardware.display.DisplayManager; import android.os.IBinder; import android.os.ServiceManager; import android.os.UserHandle; @@ -106,10 +107,15 @@ public class ToastUI extends CoreStartable implements CommandQueue.Callbacks { @Override @MainThread public void showToast(int uid, String packageName, IBinder token, CharSequence text, - IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback) { + IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback, + int displayId) { Runnable showToastRunnable = () -> { UserHandle userHandle = UserHandle.getUserHandleForUid(uid); Context context = mContext.createContextAsUser(userHandle, 0); + + DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class); + Context displayContext = context.createDisplayContext( + mDisplayManager.getDisplay(displayId)); mToast = mToastFactory.createToast(mContext /* sysuiContext */, text, packageName, userHandle.getIdentifier(), mOrientation); @@ -118,7 +124,7 @@ public class ToastUI extends CoreStartable implements CommandQueue.Callbacks { } mCallback = callback; - mPresenter = new ToastPresenter(context, mIAccessibilityManager, + mPresenter = new ToastPresenter(displayContext, mIAccessibilityManager, mNotificationManager, packageName); // Set as trusted overlay so touches can pass through toasts mPresenter.getLayoutParams().setTrustedOverlay(); diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java index 8c842f162e24..4cbc709aadc4 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java @@ -208,7 +208,7 @@ public class QuickAccessWalletController { public void startQuickAccessUiIntent(ActivityStarter activityStarter, ActivityLaunchAnimator.Controller animationController, boolean hasCard) { - mQuickAccessWalletClient.getWalletPendingIntent(mBgExecutor, + mQuickAccessWalletClient.getWalletPendingIntent(mExecutor, walletPendingIntent -> { if (walletPendingIntent != null) { startQuickAccessViaPendingIntent(walletPendingIntent, activityStarter, diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt index 8fd2d2f81dce..b97924107322 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/ColorSchemeTransitionTest.kt @@ -57,11 +57,13 @@ class ColorSchemeTransitionTest : SysuiTestCase() { private lateinit var animatingColorTransitionFactory: AnimatingColorTransitionFactory @Mock private lateinit var mediaViewHolder: MediaViewHolder + @Mock private lateinit var gutsViewHolder: GutsViewHolder @JvmField @Rule val mockitoRule = MockitoJUnit.rule() @Before fun setUp() { + whenever(mediaViewHolder.gutsViewHolder).thenReturn(gutsViewHolder) animatingColorTransitionFactory = { _, _, _ -> mockAnimatingTransition } whenever(extractColor.invoke(colorScheme)).thenReturn(TARGET_COLOR) @@ -147,5 +149,6 @@ class ColorSchemeTransitionTest : SysuiTestCase() { fun testColorSchemeTransition_update() { colorSchemeTransition.updateColorScheme(colorScheme, true) verify(mockAnimatingTransition, times(10)).updateColorScheme(colorScheme) + verify(gutsViewHolder).colorScheme = colorScheme } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index e6df1066c00c..1cce7cfb5b8a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -603,6 +603,7 @@ class MediaDataManagerTest : SysuiTestCase() { .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean()) } + @Ignore("b/229838140") @Test fun testMediaRecommendationDisabled_removesSmartspaceData() { // GIVEN a media recommendation card is present diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt index 49be669bb4a5..9e9cda843c8f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarObserverTest.kt @@ -178,8 +178,10 @@ class SeekBarObserverTest : SysuiTestCase() { } @Test - fun seekBarProgress_enabled_timeViewsHaveTime() { - val data = SeekBarViewModel.Progress(enabled = true, true, true, false, 3000, 120000) + fun seekBarProgress_enabledAndScrubbing_timeViewsHaveTime() { + val isEnabled = true + val isScrubbing = true + val data = SeekBarViewModel.Progress(isEnabled, true, true, isScrubbing, 3000, 120000) observer.onChanged(data) @@ -188,8 +190,22 @@ class SeekBarObserverTest : SysuiTestCase() { } @Test - fun seekBarProgress_disabled_timeViewsEmpty() { - val data = SeekBarViewModel.Progress(enabled = false, true, true, false, 3000, 120000) + fun seekBarProgress_disabledAndScrubbing_timeViewsEmpty() { + val isEnabled = false + val isScrubbing = true + val data = SeekBarViewModel.Progress(isEnabled, true, true, isScrubbing, 3000, 120000) + + observer.onChanged(data) + + assertThat(scrubbingElapsedTimeView.text).isEqualTo("") + assertThat(scrubbingTotalTimeView.text).isEqualTo("") + } + + @Test + fun seekBarProgress_enabledAndNotScrubbing_timeViewsEmpty() { + val isEnabled = true + val isScrubbing = false + val data = SeekBarViewModel.Progress(isEnabled, true, true, isScrubbing, 3000, 120000) observer.onChanged(data) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt index bc1abe62c7ff..be631afdd1a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar +import android.animation.ObjectAnimator import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest @@ -46,6 +47,7 @@ import org.mockito.Mockito.`when` as whenever class StatusBarStateControllerImplTest : SysuiTestCase() { @Mock lateinit var interactionJankMonitor: InteractionJankMonitor + @Mock private lateinit var mockDarkAnimator: ObjectAnimator private lateinit var controller: StatusBarStateControllerImpl private lateinit var uiEventLogger: UiEventLoggerFake @@ -57,11 +59,13 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { whenever(interactionJankMonitor.end(anyInt())).thenReturn(true) uiEventLogger = UiEventLoggerFake() - controller = StatusBarStateControllerImpl( + controller = object : StatusBarStateControllerImpl( uiEventLogger, mock(DumpManager::class.java), interactionJankMonitor - ) + ) { + override fun createDarkAnimator(): ObjectAnimator { return mockDarkAnimator } + } } @Test @@ -127,4 +131,23 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { // Double check that we can still force it to happen. assertTrue(controller.setState(StatusBarState.SHADE, true /* force */)) } + + @Test + fun testSetDozeAmount_immediatelyChangesDozeAmount_lockscreenTransitionFromAod() { + // Put controller in AOD state + controller.setDozeAmount(1f, false) + + // When waking from doze, CentralSurfaces#updateDozingState will update the dozing state + // before the doze amount changes + controller.setIsDozing(false) + + // Animate the doze amount to 0f, as would normally happen + controller.setAndInstrumentDozeAmount(null, 0f, true) + + // Check that the doze amount is immediately set to a value slightly less than 1f. This is + // to ensure that any scrim implementation changes its opacity immediately rather than + // waiting an extra frame. Waiting an extra frame will cause a relayout (which is expensive) + // and cause us to drop a frame during the LOCKSCREEN_TRANSITION_FROM_AOD CUJ. + assertEquals(0.99f, controller.dozeAmount, 0.009f) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index b0da3eb84802..c36737c6724e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -24,6 +24,8 @@ import static com.android.systemui.statusbar.NotificationEntryHelper.modifyRanki import static com.android.systemui.statusbar.NotificationEntryHelper.modifySbn; import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -39,10 +41,12 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Notification; import android.app.NotificationChannel; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; +import android.util.DisplayMetrics; import android.view.View; import androidx.test.filters.SmallTest; @@ -53,6 +57,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.FeedbackIcon; +import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; import org.junit.Assert; @@ -71,6 +76,8 @@ import java.util.List; public class ExpandableNotificationRowTest extends SysuiTestCase { private ExpandableNotificationRow mGroupRow; + private ExpandableNotificationRow mNotifRow; + private ExpandableNotificationRow mPublicRow; private NotificationTestHelper mNotificationTestHelper; boolean mHeadsUpAnimatingAway = false; @@ -84,9 +91,101 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { mContext, mDependency, TestableLooper.get(this)); + mNotificationTestHelper.setDefaultInflationFlags(FLAG_CONTENT_VIEW_ALL); + // create a standard private notification row + Notification normalNotif = mNotificationTestHelper.createNotification(); + normalNotif.publicVersion = null; + mNotifRow = mNotificationTestHelper.createRow(normalNotif); + // create a notification row whose public version is identical + Notification publicNotif = mNotificationTestHelper.createNotification(); + publicNotif.publicVersion = mNotificationTestHelper.createNotification(); + mPublicRow = mNotificationTestHelper.createRow(publicNotif); + // create a group row mGroupRow = mNotificationTestHelper.createGroup(); mGroupRow.setHeadsUpAnimatingAwayListener( animatingAway -> mHeadsUpAnimatingAway = animatingAway); + + } + + @Test + public void testSetSensitiveOnNotifRowNotifiesOfHeightChange() throws InterruptedException { + // GIVEN a sensitive notification row that's currently redacted + measureAndLayout(mNotifRow); + mNotifRow.setHideSensitiveForIntrinsicHeight(true); + mNotifRow.setSensitive(true, true); + assertThat(mNotifRow.getShowingLayout()).isSameInstanceAs(mNotifRow.getPublicLayout()); + assertThat(mNotifRow.getIntrinsicHeight()).isGreaterThan(0); + + // GIVEN that the row has a height change listener + OnHeightChangedListener listener = mock(OnHeightChangedListener.class); + mNotifRow.setOnHeightChangedListener(listener); + + // WHEN the row is set to no longer be sensitive + mNotifRow.setSensitive(false, true); + + // VERIFY that the height change listener is invoked + assertThat(mNotifRow.getShowingLayout()).isSameInstanceAs(mNotifRow.getPrivateLayout()); + assertThat(mNotifRow.getIntrinsicHeight()).isGreaterThan(0); + verify(listener).onHeightChanged(eq(mNotifRow), eq(false)); + } + + @Test + public void testSetSensitiveOnGroupRowNotifiesOfHeightChange() { + // GIVEN a sensitive group row that's currently redacted + measureAndLayout(mGroupRow); + mGroupRow.setHideSensitiveForIntrinsicHeight(true); + mGroupRow.setSensitive(true, true); + assertThat(mGroupRow.getShowingLayout()).isSameInstanceAs(mGroupRow.getPublicLayout()); + assertThat(mGroupRow.getIntrinsicHeight()).isGreaterThan(0); + + // GIVEN that the row has a height change listener + OnHeightChangedListener listener = mock(OnHeightChangedListener.class); + mGroupRow.setOnHeightChangedListener(listener); + + // WHEN the row is set to no longer be sensitive + mGroupRow.setSensitive(false, true); + + // VERIFY that the height change listener is invoked + assertThat(mGroupRow.getShowingLayout()).isSameInstanceAs(mGroupRow.getPrivateLayout()); + assertThat(mGroupRow.getIntrinsicHeight()).isGreaterThan(0); + verify(listener).onHeightChanged(eq(mGroupRow), eq(false)); + } + + @Test + public void testSetSensitiveOnPublicRowDoesNotNotifyOfHeightChange() { + // GIVEN a sensitive public row that's currently redacted + measureAndLayout(mPublicRow); + mPublicRow.setHideSensitiveForIntrinsicHeight(true); + mPublicRow.setSensitive(true, true); + assertThat(mPublicRow.getShowingLayout()).isSameInstanceAs(mPublicRow.getPublicLayout()); + assertThat(mPublicRow.getIntrinsicHeight()).isGreaterThan(0); + + // GIVEN that the row has a height change listener + OnHeightChangedListener listener = mock(OnHeightChangedListener.class); + mPublicRow.setOnHeightChangedListener(listener); + + // WHEN the row is set to no longer be sensitive + mPublicRow.setSensitive(false, true); + + // VERIFY that the height change listener is not invoked, because the height didn't change + assertThat(mPublicRow.getShowingLayout()).isSameInstanceAs(mPublicRow.getPrivateLayout()); + assertThat(mPublicRow.getIntrinsicHeight()).isGreaterThan(0); + assertThat(mPublicRow.getPrivateLayout().getMinHeight()) + .isEqualTo(mPublicRow.getPublicLayout().getMinHeight()); + verify(listener, never()).onHeightChanged(eq(mPublicRow), eq(false)); + } + + private void measureAndLayout(ExpandableNotificationRow row) { + DisplayMetrics dm = new DisplayMetrics(); + getContext().getDisplay().getRealMetrics(dm); + int width = (int) Math.ceil(400f * dm.density); + int height = (int) Math.ceil(600f * dm.density); + + row.measure( + View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.UNSPECIFIED) + ); + row.layout(0, 0, row.getMeasuredWidth(), row.getMeasuredHeight()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index eceff7cc6362..38bd078589dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -124,6 +124,7 @@ public class NotificationTestHelper { private final PeopleNotificationIdentifier mPeopleNotificationIdentifier; public final OnUserInteractionCallback mOnUserInteractionCallback; public final Runnable mFutureDismissalRunnable; + private @InflationFlag int mDefaultInflationFlags; public NotificationTestHelper( Context context, @@ -189,6 +190,10 @@ public class NotificationTestHelper { .thenReturn(mFutureDismissalRunnable); } + public void setDefaultInflationFlags(@InflationFlag int defaultInflationFlags) { + mDefaultInflationFlags = defaultInflationFlags; + } + /** * Creates a generic row. * @@ -220,7 +225,7 @@ public class NotificationTestHelper { * @throws Exception */ public ExpandableNotificationRow createRow(Notification notification) throws Exception { - return generateRow(notification, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */); + return generateRow(notification, PKG, UID, USER_HANDLE, mDefaultInflationFlags); } /** @@ -271,7 +276,7 @@ public class NotificationTestHelper { null /* groupKey */, makeBubbleMetadata(null)); n.flags |= FLAG_BUBBLE; ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE, - 0 /* extraInflationFlags */, IMPORTANCE_HIGH); + mDefaultInflationFlags, IMPORTANCE_HIGH); modifyRanking(row.getEntry()) .setCanBubble(true) .build(); @@ -287,7 +292,7 @@ public class NotificationTestHelper { null /* groupKey */, makeShortcutBubbleMetadata(shortcutId)); n.flags |= FLAG_BUBBLE; ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE, - 0 /* extraInflationFlags */, IMPORTANCE_HIGH); + mDefaultInflationFlags, IMPORTANCE_HIGH); modifyRanking(row.getEntry()) .setCanBubble(true) .build(); @@ -304,7 +309,7 @@ public class NotificationTestHelper { GROUP_KEY /* groupKey */, makeBubbleMetadata(null)); n.flags |= FLAG_BUBBLE; ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE, - 0 /* extraInflationFlags */, IMPORTANCE_HIGH); + mDefaultInflationFlags, IMPORTANCE_HIGH); modifyRanking(row.getEntry()) .setCanBubble(true) .build(); @@ -383,7 +388,7 @@ public class NotificationTestHelper { @Nullable String groupKey) throws Exception { Notification notif = createNotification(isGroupSummary, groupKey); - return generateRow(notif, pkg, uid, userHandle, 0 /* inflationFlags */); + return generateRow(notif, pkg, uid, userHandle, mDefaultInflationFlags); } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculatorTest.kt index 663490ebfde0..ef680210e3fe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackSizeCalculatorTest.kt @@ -125,8 +125,7 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() { // Each row in separate section. setGapHeight(gapHeight) val spaceUsed = - listOf( - dividerHeight + rowHeight, + listOf(rowHeight, dividerHeight + gapHeight + rowHeight, dividerHeight + gapHeight + shelfHeight) .sum() @@ -149,9 +148,8 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() { val rowHeight = rowHeight val shelfHeight = shelfHeight val spaceUsed = - listOf( - dividerHeight + rowHeight, - dividerHeight + shelfHeight) + listOf(rowHeight, + dividerHeight + shelfHeight) .sum() val availableSpace = spaceUsed + 1 val rows = listOf(createMockRow(rowHeight), createMockRow(rowHeight)) @@ -195,7 +193,7 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() { val space = sizeCalculator.spaceNeeded(expandableView, visibleIndex = 0, previousView = null, stack = stackLayout, onLockscreen = true) - assertThat(space).isEqualTo(5 + dividerHeight) + assertThat(space).isEqualTo(5) } @Test @@ -209,7 +207,7 @@ class NotificationStackSizeCalculatorTest : SysuiTestCase() { val space = sizeCalculator.spaceNeeded(expandableView, visibleIndex = 0, previousView = null, stack = stackLayout, onLockscreen = false) - assertThat(space).isEqualTo(10 + dividerHeight) + assertThat(space).isEqualTo(10) } private fun computeMaxKeyguardNotifications( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index d6a2f0f22e5a..6864c65c9af4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -124,6 +124,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true); when(mKeyguardStateController.isFaceAuthEnabled()).thenReturn(true); + when(mKeyguardStateController.isUnlocked()).thenReturn(false); when(mKeyguardBypassController.onBiometricAuthenticated(any(), anyBoolean())) .thenReturn(true); when(mAuthController.isUdfpsFingerDown()).thenReturn(false); @@ -186,6 +187,24 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { } @Test + public void onBiometricAuthenticated_whenDeviceIsAlreadyUnlocked_wakeAndUnlock() { + reset(mUpdateMonitor); + reset(mStatusBarKeyguardViewManager); + when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); + when(mKeyguardStateController.isUnlocked()).thenReturn(true); + when(mUpdateMonitor.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(true); + when(mDozeScrimController.isPulsing()).thenReturn(false); + // the value of isStrongBiometric doesn't matter here since we only care about the returned + // value of isUnlockingWithBiometricAllowed() + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */); + + verify(mKeyguardViewMediator).onWakeAndUnlocking(); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_WAKE_AND_UNLOCK); + } + + @Test public void onBiometricAuthenticated_whenFingerprint_notifyKeyguardAuthenticated() { when(mUpdateMonitor.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(true); // the value of isStrongBiometric doesn't matter here since we only care about the returned diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index d364505445f0..16f934b5af59 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -477,7 +477,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { mJankMonitor, mDeviceStateManager, mDreamOverlayStateController, - mWiredChargingRippleController); + mWiredChargingRippleController, mDreamManager); when(mKeyguardViewMediator.registerCentralSurfaces( any(CentralSurfacesImpl.class), any(NotificationPanelViewController.class), @@ -534,6 +534,36 @@ public class CentralSurfacesImplTest extends SysuiTestCase { } @Test + public void executeRunnableDismissingKeyguard_dreaming_notShowing() throws RemoteException { + when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); + when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); + when(mKeyguardUpdateMonitor.isDreaming()).thenReturn(true); + + mCentralSurfaces.executeRunnableDismissingKeyguard(() -> {}, + /* cancelAction= */ null, + /* dismissShade= */ false, + /* afterKeyguardGone= */ false, + /* deferred= */ false); + mUiBgExecutor.runAllReady(); + verify(mDreamManager, times(1)).awaken(); + } + + @Test + public void executeRunnableDismissingKeyguard_notDreaming_notShowing() throws RemoteException { + when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); + when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); + when(mKeyguardUpdateMonitor.isDreaming()).thenReturn(false); + + mCentralSurfaces.executeRunnableDismissingKeyguard(() -> {}, + /* cancelAction= */ null, + /* dismissShade= */ false, + /* afterKeyguardGone= */ false, + /* deferred= */ false); + mUiBgExecutor.runAllReady(); + verify(mDreamManager, never()).awaken(); + } + + @Test public void lockscreenStateMetrics_notShowing() { // uninteresting state, except that fingerprint must be non-zero when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index f599e3b12c57..62058a179dac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -28,6 +28,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; @@ -121,6 +122,8 @@ import com.android.systemui.statusbar.notification.ConversationNotificationManag import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.row.ExpandableView; +import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; @@ -568,6 +571,38 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @Test + public void onNotificationHeightChangeWhileOnKeyguardWillComputeMaxKeyguardNotifications() { + mStatusBarStateController.setState(KEYGUARD); + ArgumentCaptor<OnHeightChangedListener> captor = + ArgumentCaptor.forClass(OnHeightChangedListener.class); + verify(mNotificationStackScrollLayoutController) + .setOnHeightChangedListener(captor.capture()); + OnHeightChangedListener listener = captor.getValue(); + + clearInvocations(mNotificationStackSizeCalculator); + listener.onHeightChanged(mock(ExpandableView.class), false); + + verify(mNotificationStackSizeCalculator) + .computeMaxKeyguardNotifications(any(), anyFloat(), anyFloat()); + } + + @Test + public void onNotificationHeightChangeWhileInShadeWillNotComputeMaxKeyguardNotifications() { + mStatusBarStateController.setState(SHADE); + ArgumentCaptor<OnHeightChangedListener> captor = + ArgumentCaptor.forClass(OnHeightChangedListener.class); + verify(mNotificationStackScrollLayoutController) + .setOnHeightChangedListener(captor.capture()); + OnHeightChangedListener listener = captor.getValue(); + + clearInvocations(mNotificationStackSizeCalculator); + listener.onHeightChanged(mock(ExpandableView.class), false); + + verify(mNotificationStackSizeCalculator, never()) + .computeMaxKeyguardNotifications(any(), anyFloat(), anyFloat()); + } + + @Test public void computeMaxKeyguardNotifications_lockscreenToShade_returnsExistingMax() { when(mAmbientState.getFractionToShade()).thenReturn(0.5f); mNotificationPanelViewController.setMaxDisplayedNotifications(-1); diff --git a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java index 84e6df23e740..797f86ae14c2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java @@ -44,6 +44,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -122,6 +123,7 @@ public class ToastUITest extends SysuiTestCase { mContextSpy = spy(mContext); when(mContextSpy.getPackageManager()).thenReturn(mPackageManager); doReturn(mContextSpy).when(mContextSpy).createContextAsUser(any(), anyInt()); + doReturn(mContextSpy).when(mContextSpy).createDisplayContext(any()); mToastUI = new ToastUI( mContextSpy, mCommandQueue, @@ -144,7 +146,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_addsCorrectViewToWindowManager() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); verify(mWindowManager).addView(mViewCaptor.capture(), any()); View view = mViewCaptor.getValue(); @@ -154,7 +156,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_addsViewWithCorrectLayoutParamsToWindowManager() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); verify(mWindowManager).addView(any(), mParamsCaptor.capture()); ViewGroup.LayoutParams params = mParamsCaptor.getValue(); @@ -170,7 +172,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_forAndroidPackage_addsAllUserFlag() throws Exception { mToastUI.showToast(ANDROID_UID, "android", TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); verify(mWindowManager).addView(any(), mParamsCaptor.capture()); ViewGroup.LayoutParams params = mParamsCaptor.getValue(); @@ -183,7 +185,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_forSystemUiPackage_addsAllUserFlag() throws Exception { mToastUI.showToast(SYSTEMUI_UID, "com.android.systemui", TOKEN_1, TEXT, WINDOW_TOKEN_1, - Toast.LENGTH_LONG, null); + Toast.LENGTH_LONG, null, Display.DEFAULT_DISPLAY); verify(mWindowManager).addView(any(), mParamsCaptor.capture()); ViewGroup.LayoutParams params = mParamsCaptor.getValue(); @@ -196,7 +198,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_callsCallback() throws Exception { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); verify(mCallback).onToastShown(); } @@ -216,7 +218,7 @@ public class ToastUITest extends SysuiTestCase { mAccessibilityManager).sendAccessibilityEvent(any(), anyInt()); mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); eventParcel.setDataPosition(0); assertThat(eventParcel.dataSize()).isGreaterThan(0); @@ -231,14 +233,14 @@ public class ToastUITest extends SysuiTestCase { public void testShowToast_accessibilityManagerClientIsRemoved() throws Exception { when(mContextSpy.getUserId()).thenReturn(USER_ID); mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); verify(mAccessibilityManager).removeClient(any(), eq(USER_ID)); } @Test public void testHideToast_removesView() throws Exception { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; View view = verifyWmAddViewAndAttachToParent(); @@ -254,7 +256,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testHideToast_finishesToken() throws Exception { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; verifyWmAddViewAndAttachToParent(); @@ -270,7 +272,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testHideToast_callsCallback() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; verifyWmAddViewAndAttachToParent(); @@ -286,7 +288,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testHideToast_whenNotCurrentToastToken_doesNotHideToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; verifyWmAddViewAndAttachToParent(); @@ -302,7 +304,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testHideToast_whenNotCurrentToastPackage_doesNotHideToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; verifyWmAddViewAndAttachToParent(); @@ -318,12 +320,12 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_afterShowToast_hidesCurrentToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); final SystemUIToast toast = mToastUI.mToast; View view = verifyWmAddViewAndAttachToParent(); mToastUI.showToast(UID_2, PACKAGE_NAME_2, TOKEN_2, TEXT, WINDOW_TOKEN_2, Toast.LENGTH_LONG, - null); + null, Display.DEFAULT_DISPLAY); if (toast.getOutAnimation() != null) { assertThat(toast.getOutAnimation().isRunning()).isTrue(); @@ -338,7 +340,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testShowToast_logs() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); verify(mToastLogger).logOnShowToast(UID_1, PACKAGE_NAME_1, TEXT, TOKEN_1.toString()); } @@ -354,7 +356,7 @@ public class ToastUITest extends SysuiTestCase { // WHEN the package posts a toast mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); // THEN the view can have unlimited lines assertThat(((TextView) mToastUI.mToast.getView() @@ -373,7 +375,7 @@ public class ToastUITest extends SysuiTestCase { // WHEN the package posts a toast mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); // THEN the view is limited to 2 lines assertThat(((TextView) mToastUI.mToast.getView() @@ -384,7 +386,7 @@ public class ToastUITest extends SysuiTestCase { @Test public void testHideToast_logs() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, - mCallback); + mCallback, Display.DEFAULT_DISPLAY); verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); verify(mToastLogger).logOnHideToast(PACKAGE_NAME_1, TOKEN_1.toString()); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index fc95cdd53f29..15d3fa9a03c4 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -69,6 +69,7 @@ import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.AutofillCommitReason; import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillManagerInternal; import android.view.autofill.AutofillValue; @@ -1657,11 +1658,12 @@ public final class AutofillManagerService } @Override - public void finishSession(int sessionId, int userId) { + public void finishSession(int sessionId, int userId, + @AutofillCommitReason int commitReason) { synchronized (mLock) { final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId); if (service != null) { - service.finishSessionLocked(sessionId, getCallingUid()); + service.finishSessionLocked(sessionId, getCallingUid(), commitReason); } else if (sVerbose) { Slog.v(TAG, "finishSession(): no service for " + userId); } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index aa5c501cd94e..fe85db286fa8 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -70,6 +70,7 @@ import android.util.Slog; import android.util.SparseArray; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.AutofillCommitReason; import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; @@ -423,7 +424,7 @@ final class AutofillManagerServiceImpl } @GuardedBy("mLock") - void finishSessionLocked(int sessionId, int uid) { + void finishSessionLocked(int sessionId, int uid, @AutofillCommitReason int commitReason) { if (!isEnabledLocked()) { return; } @@ -438,7 +439,7 @@ final class AutofillManagerServiceImpl final Session.SaveResult saveResult = session.showSaveLocked(); - session.logContextCommitted(saveResult.getNoSaveUiReason()); + session.logContextCommitted(saveResult.getNoSaveUiReason(), commitReason); if (saveResult.isLogSaveShown()) { session.logSaveUiShown(); diff --git a/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java new file mode 100644 index 000000000000..c6e595b1d785 --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/PresentationStatsEventLogger.java @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.autofill; + +import static android.service.autofill.FillEventHistory.Event.UI_TYPE_DIALOG; +import static android.service.autofill.FillEventHistory.Event.UI_TYPE_INLINE; +import static android.service.autofill.FillEventHistory.Event.UI_TYPE_MENU; +import static android.service.autofill.FillEventHistory.Event.UiType; +import static android.view.autofill.AutofillManager.COMMIT_REASON_ACTIVITY_FINISHED; +import static android.view.autofill.AutofillManager.COMMIT_REASON_VIEW_CHANGED; +import static android.view.autofill.AutofillManager.COMMIT_REASON_VIEW_CLICKED; +import static android.view.autofill.AutofillManager.COMMIT_REASON_VIEW_COMMITTED; + +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__DIALOG; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__INLINE; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__MENU; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED; +import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED; +import static com.android.server.autofill.Helper.sVerbose; + +import android.annotation.IntDef; +import android.annotation.Nullable; +import android.service.autofill.Dataset; +import android.util.Slog; +import android.view.autofill.AutofillId; +import android.view.autofill.AutofillManager; + +import com.android.internal.util.FrameworkStatsLog; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.List; +import java.util.Optional; + +/** Helper class to track and log Autofill presentation stats. */ +public final class PresentationStatsEventLogger { + private static final String TAG = "PresentationStatsEventLogger"; + + /** + * Reasons why presentation was not shown. These are wrappers around + * {@link com.android.os.AtomsProto.AutofillPresentationEventReported.PresentationEventResult}. + */ + @IntDef(prefix = { "NOT_SHOWN_REASON" }, value = { + NOT_SHOWN_REASON_ANY_SHOWN, + NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED, + NOT_SHOWN_REASON_VIEW_CHANGED, + NOT_SHOWN_REASON_ACTIVITY_FINISHED, + NOT_SHOWN_REASON_REQUEST_TIMEOUT, + NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY, + NOT_SHOWN_REASON_UNKNOWN + }) + @Retention(RetentionPolicy.SOURCE) + public @interface NotShownReason {} + public static final int NOT_SHOWN_REASON_ANY_SHOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN; + public static final int NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED; + public static final int NOT_SHOWN_REASON_VIEW_CHANGED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED; + public static final int NOT_SHOWN_REASON_ACTIVITY_FINISHED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED; + public static final int NOT_SHOWN_REASON_REQUEST_TIMEOUT = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT; + public static final int NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY; + public static final int NOT_SHOWN_REASON_UNKNOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON; + + private final int mSessionId; + private Optional<PresentationStatsEventInternal> mEventInternal; + + private PresentationStatsEventLogger(int sessionId) { + mSessionId = sessionId; + mEventInternal = Optional.empty(); + } + + public static PresentationStatsEventLogger forSessionId(int sessionId) { + return new PresentationStatsEventLogger(sessionId); + } + + public void startNewEvent() { + if (mEventInternal.isPresent()) { + Slog.e(TAG, "Failed to start new event because already have active event."); + return; + } + mEventInternal = Optional.of(new PresentationStatsEventInternal()); + } + + public void maybeSetRequestId(int requestId) { + mEventInternal.ifPresent(event -> event.mRequestId = requestId); + } + + public void maybeSetNoPresentationEventReason(@NotShownReason int reason) { + mEventInternal.ifPresent(event -> { + if (event.mCountShown == 0) { + event.mNoPresentationReason = reason; + } + }); + } + + public void maybeSetAvailableCount(@Nullable List<Dataset> datasetList, + AutofillId currentViewId) { + mEventInternal.ifPresent(event -> { + int availableCount = getDatasetCountForAutofillId(datasetList, currentViewId); + event.mAvailableCount = availableCount; + event.mIsDatasetAvailable = availableCount > 0; + }); + } + + public void maybeSetCountShown(@Nullable List<Dataset> datasetList, + AutofillId currentViewId) { + mEventInternal.ifPresent(event -> { + int countShown = getDatasetCountForAutofillId(datasetList, currentViewId); + event.mCountShown = countShown; + if (countShown > 0) { + event.mNoPresentationReason = NOT_SHOWN_REASON_ANY_SHOWN; + } + }); + } + + private static int getDatasetCountForAutofillId(@Nullable List<Dataset> datasetList, + AutofillId currentViewId) { + int availableCount = 0; + if (datasetList != null) { + for (int i = 0; i < datasetList.size(); i++) { + Dataset data = datasetList.get(i); + if (data != null && data.getFieldIds() != null + && data.getFieldIds().contains(currentViewId)) { + availableCount += 1; + } + } + } + return availableCount; + } + + public void maybeSetCountFilteredUserTyping(int countFilteredUserTyping) { + mEventInternal.ifPresent(event -> { + event.mCountFilteredUserTyping = countFilteredUserTyping; + }); + } + + public void maybeSetCountNotShownImePresentationNotDrawn( + int countNotShownImePresentationNotDrawn) { + mEventInternal.ifPresent(event -> { + event.mCountNotShownImePresentationNotDrawn = countNotShownImePresentationNotDrawn; + }); + } + + public void maybeSetCountNotShownImeUserNotSeen(int countNotShownImeUserNotSeen) { + mEventInternal.ifPresent(event -> { + event.mCountNotShownImeUserNotSeen = countNotShownImeUserNotSeen; + }); + } + + public void maybeSetDisplayPresentationType(@UiType int uiType) { + mEventInternal.ifPresent(event -> { + event.mDisplayPresentationType = getDisplayPresentationType(uiType); + }); + } + + public void logAndEndEvent() { + if (!mEventInternal.isPresent()) { + Slog.wtf(null, "Shouldn't be logging AutofillPresentationEventReported again for same " + + "event"); + return; + } + PresentationStatsEventInternal event = mEventInternal.get(); + if (sVerbose) { + Slog.v(TAG, "Log AutofillPresentationEventReported:" + + " requestId=" + event.mRequestId + + " sessionId=" + mSessionId + + " mNoPresentationEventReason=" + event.mNoPresentationReason + + " mAvailableCount=" + event.mAvailableCount + + " mCountShown=" + event.mCountShown + + " mCountFilteredUserTyping=" + event.mCountFilteredUserTyping + + " mCountNotShownImePresentationNotDrawn=" + + event.mCountNotShownImePresentationNotDrawn + + " mCountNotShownImeUserNotSeen=" + event.mCountNotShownImeUserNotSeen + + " mDisplayPresentationType=" + event.mDisplayPresentationType); + } + + // TODO(b/234185326): Distinguish empty responses from other no presentation reasons. + if (!event.mIsDatasetAvailable) { + mEventInternal = Optional.empty(); + return; + } + FrameworkStatsLog.write( + AUTOFILL_PRESENTATION_EVENT_REPORTED, + event.mRequestId, + mSessionId, + event.mNoPresentationReason, + event.mAvailableCount, + event.mCountShown, + event.mCountFilteredUserTyping, + event.mCountNotShownImePresentationNotDrawn, + event.mCountNotShownImeUserNotSeen, + event.mDisplayPresentationType); + mEventInternal = Optional.empty(); + } + + private final class PresentationStatsEventInternal { + int mRequestId; + @NotShownReason int mNoPresentationReason = NOT_SHOWN_REASON_UNKNOWN; + boolean mIsDatasetAvailable; + int mAvailableCount; + int mCountShown; + int mCountFilteredUserTyping; + int mCountNotShownImePresentationNotDrawn; + int mCountNotShownImeUserNotSeen; + int mDisplayPresentationType = AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE; + + PresentationStatsEventInternal() {} + } + + static int getNoPresentationEventReason( + @AutofillManager.AutofillCommitReason int commitReason) { + switch (commitReason) { + case COMMIT_REASON_VIEW_COMMITTED: + return NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY; + case COMMIT_REASON_ACTIVITY_FINISHED: + return NOT_SHOWN_REASON_ACTIVITY_FINISHED; + case COMMIT_REASON_VIEW_CHANGED: + return NOT_SHOWN_REASON_VIEW_CHANGED; + case COMMIT_REASON_VIEW_CLICKED: + // TODO(b/234185326): Add separate reason for view clicked. + default: + return NOT_SHOWN_REASON_UNKNOWN; + } + } + + private static int getDisplayPresentationType(@UiType int uiType) { + switch (uiType) { + case UI_TYPE_MENU: + return AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__MENU; + case UI_TYPE_INLINE: + return AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__INLINE; + case UI_TYPE_DIALOG: + return AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__DIALOG; + default: + return AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE; + } + } +} diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index ca0a7806898c..0fe9f8f90cea 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -32,6 +32,7 @@ import static android.view.autofill.AutofillManager.ACTION_START_SESSION; import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED; import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED; import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED; +import static android.view.autofill.AutofillManager.COMMIT_REASON_UNKNOWN; import static android.view.autofill.AutofillManager.FLAG_SMART_SUGGESTION_SYSTEM; import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString; @@ -42,6 +43,9 @@ import static com.android.server.autofill.Helper.getNumericValue; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sVerbose; import static com.android.server.autofill.Helper.toArray; +import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_REQUEST_TIMEOUT; +import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_CHANGED; +import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS; import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE; @@ -107,6 +111,7 @@ import android.util.TimeUtils; import android.view.KeyEvent; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.AutofillCommitReason; import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; @@ -391,6 +396,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } }; + @NonNull + @GuardedBy("mLock") + private PresentationStatsEventLogger mPresentationStatsEventLogger; + void onSwitchInputMethodLocked() { // One caveat is that for the case where the focus is on a field for which regular autofill // returns null, and augmented autofill is triggered, and then the user switches the input @@ -924,6 +933,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState Slog.v(TAG, "Requesting structure for request #" + ordinal + " ,requestId=" + requestId + ", flags=" + flags); } + mPresentationStatsEventLogger.maybeSetRequestId(requestId); // If the focus changes very quickly before the first request is returned each focus change // triggers a new partition and we end up with many duplicate partitions. This is @@ -1021,6 +1031,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mComponentName = componentName; mCompatMode = compatMode; mSessionState = STATE_ACTIVE; + mPresentationStatsEventLogger = PresentationStatsEventLogger.forSessionId(sessionId); synchronized (mLock) { mSessionFlags = new SessionFlags(); mSessionFlags.mAugmentedAutofillOnly = forAugmentedAutofillOnly; @@ -1271,6 +1282,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState message.length()); } } + + // TODO(b/234185326): Add separate reason for failures. + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_REQUEST_TIMEOUT); + mPresentationStatsEventLogger.logAndEndEvent(); } notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED, /* autofillableIds= */ null); @@ -1859,7 +1875,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState */ public void logContextCommitted() { mHandler.sendMessage(obtainMessage(Session::handleLogContextCommitted, this, - Event.NO_SAVE_UI_REASON_NONE)); + Event.NO_SAVE_UI_REASON_NONE, + COMMIT_REASON_UNKNOWN)); } /** @@ -1867,13 +1884,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * when necessary. * * @param saveDialogNotShowReason The reason why a save dialog was not shown. + * @param commitReason The reason why context is committed. */ - public void logContextCommitted(@NoSaveReason int saveDialogNotShowReason) { + public void logContextCommitted(@NoSaveReason int saveDialogNotShowReason, + @AutofillCommitReason int commitReason) { mHandler.sendMessage(obtainMessage(Session::handleLogContextCommitted, this, - saveDialogNotShowReason)); + saveDialogNotShowReason, commitReason)); } - private void handleLogContextCommitted(@NoSaveReason int saveDialogNotShowReason) { + private void handleLogContextCommitted(@NoSaveReason int saveDialogNotShowReason, + @AutofillCommitReason int commitReason) { final FillResponse lastResponse; synchronized (mLock) { lastResponse = getLastResponseLocked("logContextCommited(%s)"); @@ -1903,28 +1923,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Sets field classification scores if (userData != null && fcStrategy != null) { - logFieldClassificationScore(fcStrategy, userData, saveDialogNotShowReason); + logFieldClassificationScore(fcStrategy, userData, saveDialogNotShowReason, + commitReason); } else { - logContextCommitted(null, null, saveDialogNotShowReason); + logContextCommitted(null, null, saveDialogNotShowReason, commitReason); } } private void logContextCommitted(@Nullable ArrayList<AutofillId> detectedFieldIds, @Nullable ArrayList<FieldClassification> detectedFieldClassifications, - @NoSaveReason int saveDialogNotShowReason) { + @NoSaveReason int saveDialogNotShowReason, + @AutofillCommitReason int commitReason) { synchronized (mLock) { logContextCommittedLocked(detectedFieldIds, detectedFieldClassifications, - saveDialogNotShowReason); + saveDialogNotShowReason, commitReason); } } @GuardedBy("mLock") private void logContextCommittedLocked(@Nullable ArrayList<AutofillId> detectedFieldIds, @Nullable ArrayList<FieldClassification> detectedFieldClassifications, - @NoSaveReason int saveDialogNotShowReason) { + @NoSaveReason int saveDialogNotShowReason, + @AutofillCommitReason int commitReason) { final FillResponse lastResponse = getLastResponseLocked("logContextCommited(%s)"); if (lastResponse == null) return; + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + PresentationStatsEventLogger.getNoPresentationEventReason(commitReason)); + mPresentationStatsEventLogger.logAndEndEvent(); + final int flags = lastResponse.getFlags(); if ((flags & FillResponse.FLAG_TRACK_CONTEXT_COMMITED) == 0) { if (sVerbose) Slog.v(TAG, "logContextCommittedLocked(): ignored by flags " + flags); @@ -2102,7 +2129,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState */ private void logFieldClassificationScore(@NonNull FieldClassificationStrategy fcStrategy, @NonNull FieldClassificationUserData userData, - @NoSaveReason int saveDialogNotShowReason) { + @NoSaveReason int saveDialogNotShowReason, + @AutofillCommitReason int commitReason) { final String[] userValues = userData.getValues(); final String[] categoryIds = userData.getCategoryIds(); @@ -2148,7 +2176,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final RemoteCallback callback = new RemoteCallback((result) -> { if (result == null) { if (sDebug) Slog.d(TAG, "setFieldClassificationScore(): no results"); - logContextCommitted(null, null, saveDialogNotShowReason); + logContextCommitted(null, null, saveDialogNotShowReason, commitReason); return; } final Scores scores = result.getParcelable(EXTRA_SCORES); @@ -2210,7 +2238,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } logContextCommitted(detectedFieldIds, detectedFieldClassifications, - saveDialogNotShowReason); + saveDialogNotShowReason, commitReason); }); fcStrategy.calculateScores(callback, currentValues, userValues, categoryIds, @@ -2891,6 +2919,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (sDebug) { Slog.d(TAG, "Set the response has expired."); } + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_VIEW_CHANGED); + mPresentationStatsEventLogger.logAndEndEvent(); return; } @@ -2936,6 +2967,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (!isRequestSupportFillDialog(flags)) { mSessionFlags.mFillDialogDisabled = true; } + mPresentationStatsEventLogger.startNewEvent(); requestNewFillResponseLocked(viewState, ViewState.STATE_STARTED_SESSION, flags); break; case ACTION_VALUE_CHANGED: @@ -2994,6 +3026,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return; } + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED); + mPresentationStatsEventLogger.logAndEndEvent(); + if ((flags & FLAG_MANUAL_REQUEST) == 0) { // Not a manual request if (mAugmentedAutofillableIds != null && mAugmentedAutofillableIds.contains( @@ -3020,10 +3056,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + mPresentationStatsEventLogger.startNewEvent(); if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags)) { return; } + if (viewState.getResponse() != null) { + FillResponse response = viewState.getResponse(); + mPresentationStatsEventLogger.maybeSetRequestId(response.getRequestId()); + mPresentationStatsEventLogger.maybeSetAvailableCount( + response.getDatasets(), mCurrentViewId); + } + if (isSameViewEntered) { setFillDialogDisabledAndStartInput(); return; @@ -3042,6 +3086,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // on the IME side if it arrives before the input view is finished on the IME. mInlineSessionController.resetInlineFillUiLocked(); mCurrentViewId = null; + + mPresentationStatsEventLogger.maybeSetNoPresentationEventReason( + NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED); + mPresentationStatsEventLogger.logAndEndEvent(); } break; default: @@ -3215,6 +3263,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final ViewState currentView = mViewStates.get(mCurrentViewId); currentView.setState(ViewState.STATE_FILL_DIALOG_SHOWN); mService.logDatasetShown(id, mClientState, UI_TYPE_DIALOG); + + mPresentationStatsEventLogger.maybeSetCountShown( + response.getDatasets(), mCurrentViewId); + mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_DIALOG); } // Just show fill dialog once, so disabled after shown. // Note: Cannot disable before requestShowFillDialog() because the method @@ -3232,9 +3284,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (requestShowInlineSuggestionsLocked(response, filterText)) { final ViewState currentView = mViewStates.get(mCurrentViewId); currentView.setState(ViewState.STATE_INLINE_SHOWN); - //TODO(b/137800469): Fix it to log showed only when IME asks for inflation, + // TODO(b/137800469): Fix it to log showed only when IME asks for inflation, // rather than here where framework sends back the response. mService.logDatasetShown(id, mClientState, UI_TYPE_INLINE); + + // TODO(b/234475358): Log more accurate value of number of inline suggestions + // shown, inflated, and filtered. + mPresentationStatsEventLogger.maybeSetCountShown( + response.getDatasets(), mCurrentViewId); + mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_INLINE); return; } } @@ -3246,6 +3304,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { mService.logDatasetShown(id, mClientState, UI_TYPE_MENU); + + mPresentationStatsEventLogger.maybeSetCountShown( + response.getDatasets(), mCurrentViewId); + mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_MENU); } synchronized (mLock) { @@ -3794,6 +3856,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mResponses.put(requestId, newResponse); mClientState = newClientState != null ? newClientState : newResponse.getClientState(); + mPresentationStatsEventLogger.maybeSetAvailableCount( + newResponse.getDatasets(), mCurrentViewId); + setViewStatesLocked(newResponse, ViewState.STATE_FILLABLE, false); updateFillDialogTriggerIdsLocked(); updateTrackedIdsLocked(); diff --git a/services/companion/java/com/android/server/companion/AssociationStoreImpl.java b/services/companion/java/com/android/server/companion/AssociationStoreImpl.java index bd2a97df1d7a..229799a8457d 100644 --- a/services/companion/java/com/android/server/companion/AssociationStoreImpl.java +++ b/services/companion/java/com/android/server/companion/AssociationStoreImpl.java @@ -29,6 +29,7 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.CollectionUtils; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -267,6 +268,21 @@ class AssociationStoreImpl implements AssociationStore { } } + /** + * Dumps current companion device association states. + */ + public void dump(@NonNull PrintWriter out) { + out.append("Companion Device Associations: "); + if (getAssociations().isEmpty()) { + out.append("<empty>\n"); + } else { + out.append("\n"); + for (AssociationInfo a : getAssociations()) { + out.append(" ").append(a.toString()).append('\n'); + } + } + } + private void broadcastChange(@ChangeType int changeType, AssociationInfo association) { synchronized (mListeners) { for (OnChangeListener listener : mListeners) { diff --git a/services/companion/java/com/android/server/companion/CompanionApplicationController.java b/services/companion/java/com/android/server/companion/CompanionApplicationController.java index 6eb8e2619cb5..64729a2553df 100644 --- a/services/companion/java/com/android/server/companion/CompanionApplicationController.java +++ b/services/companion/java/com/android/server/companion/CompanionApplicationController.java @@ -33,6 +33,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.infra.PerUser; import com.android.internal.util.CollectionUtils; +import java.io.PrintWriter; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -234,6 +235,28 @@ class CompanionApplicationController { primaryServiceConnector.postOnDeviceDisappeared(association); } + void dump(@NonNull PrintWriter out) { + out.append("Companion Device Application Controller: \n"); + + synchronized (mBoundCompanionApplications) { + out.append(" Bound Companion Applications: "); + if (mBoundCompanionApplications.size() == 0) { + out.append("<empty>\n"); + } else { + out.append("\n"); + mBoundCompanionApplications.dump(out); + } + } + + out.append(" Companion Applications Scheduled For Rebinding: "); + if (mScheduledForRebindingCompanionApplications.size() == 0) { + out.append("<empty>\n"); + } else { + out.append("\n"); + mScheduledForRebindingCompanionApplications.dump(out); + } + } + private void onPrimaryServiceBindingDied(@UserIdInt int userId, @NonNull String packageName) { if (DEBUG) Log.i(TAG, "onPrimaryServiceBindingDied() u" + userId + "/" + packageName); @@ -333,5 +356,23 @@ class CompanionApplicationController { } } } + + private void dump(@NonNull PrintWriter out) { + for (int i = 0; i < size(); i++) { + final int userId = keyAt(i); + final Map<String, T> forUser = get(userId); + if (forUser.isEmpty()) { + out.append(" u").append(String.valueOf(userId)).append(": <empty>\n"); + } + + for (Map.Entry<String, T> packageValue : forUser.entrySet()) { + final String packageName = packageValue.getKey(); + final T value = packageValue.getValue(); + out.append(" u").append(String.valueOf(userId)).append("\\") + .append(packageName).append(" -> ") + .append(value.toString()).append('\n'); + } + } + } } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 0bfe2825bdd5..3f7cba6a4d09 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -764,14 +764,9 @@ public class CompanionDeviceManagerService extends SystemService { return; } - // TODO(b/218615185): mAssociationStore.dump() instead - out.append("Companion Device Associations:").append('\n'); - for (AssociationInfo a : mAssociationStore.getAssociations()) { - out.append(" ").append(a.toString()).append('\n'); - } - - // TODO(b/218615185): mDevicePresenceMonitor.dump() - // TODO(b/218615185): mCompanionAppController.dump() + mAssociationStore.dump(out); + mDevicePresenceMonitor.dump(out); + mCompanionAppController.dump(out); } } diff --git a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java index 89ed301eb661..0e4870af9930 100644 --- a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java +++ b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java @@ -33,6 +33,7 @@ import android.util.Log; import com.android.server.companion.AssociationStore; +import java.io.PrintWriter; import java.util.HashSet; import java.util.Set; @@ -293,6 +294,54 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange throw new SecurityException("Caller is neither Shell nor Root"); } + /** + * Dumps system information about devices that are marked as "present". + */ + public void dump(@NonNull PrintWriter out) { + out.append("Companion Device Present: "); + if (mConnectedBtDevices.isEmpty() + && mNearbyBleDevices.isEmpty() + && mReportedSelfManagedDevices.isEmpty()) { + out.append("<empty>\n"); + return; + } else { + out.append("\n"); + } + + out.append(" Connected Bluetooth Devices: "); + if (mConnectedBtDevices.isEmpty()) { + out.append("<empty>\n"); + } else { + out.append("\n"); + for (int associationId : mConnectedBtDevices) { + AssociationInfo a = mAssociationStore.getAssociationById(associationId); + out.append(" ").append(a.toShortString()).append('\n'); + } + } + + out.append(" Nearby BLE Devices: "); + if (mNearbyBleDevices.isEmpty()) { + out.append("<empty>\n"); + } else { + out.append("\n"); + for (int associationId : mNearbyBleDevices) { + AssociationInfo a = mAssociationStore.getAssociationById(associationId); + out.append(" ").append(a.toShortString()).append('\n'); + } + } + + out.append(" Self-Reported Devices: "); + if (mReportedSelfManagedDevices.isEmpty()) { + out.append("<empty>\n"); + } else { + out.append("\n"); + for (int associationId : mReportedSelfManagedDevices) { + AssociationInfo a = mAssociationStore.getAssociationById(associationId); + out.append(" ").append(a.toShortString()).append('\n'); + } + } + } + private class SimulatedDevicePresenceSchedulerHelper extends Handler { SimulatedDevicePresenceSchedulerHelper() { super(Looper.getMainLooper()); diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index 3b3bf11f2d9e..5f337ab9bae3 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -241,6 +241,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private void sendPendingIntent(int displayId, PendingIntent pendingIntent) throws PendingIntent.CanceledException { + final ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId); + options.setPendingIntentBackgroundActivityLaunchAllowed(true); + options.setPendingIntentBackgroundActivityLaunchAllowedByPermission(true); pendingIntent.send( mContext, /* code= */ 0, @@ -248,9 +251,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub /* onFinished= */ null, /* handler= */ null, /* requiredPermission= */ null, - ActivityOptions.makeBasic() - .setLaunchDisplayId(displayId) - .toBundle()); + options.toBundle()); } @Override // Binder call diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java index 6667d1b45027..5d0c732d5f48 100644 --- a/services/core/java/com/android/server/adb/AdbService.java +++ b/services/core/java/com/android/server/adb/AdbService.java @@ -56,6 +56,7 @@ import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.testharness.TestHarnessModeService; import java.io.File; import java.io.FileDescriptor; @@ -163,18 +164,8 @@ public class AdbService extends IAdbManager.Stub { } } - private void initAdbState() { + private void registerContentObservers() { try { - /* - * Use the normal bootmode persistent prop to maintain state of adb across - * all boot modes. - */ - mIsAdbUsbEnabled = containsFunction( - SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""), - UsbManager.USB_FUNCTION_ADB); - mIsAdbWifiEnabled = "1".equals( - SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0")); - // register observer to listen for settings changes mObserver = new AdbSettingsObserver(); mContentResolver.registerContentObserver( @@ -184,7 +175,7 @@ public class AdbService extends IAdbManager.Stub { Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED), false, mObserver); } catch (Exception e) { - Slog.e(TAG, "Error in initAdbState", e); + Slog.e(TAG, "Error in registerContentObservers", e); } } @@ -248,7 +239,7 @@ public class AdbService extends IAdbManager.Stub { mContentResolver = context.getContentResolver(); mDebuggingManager = new AdbDebuggingManager(context); - initAdbState(); + registerContentObservers(); LocalServices.addService(AdbManagerInternal.class, new AdbManagerInternalImpl()); } @@ -259,10 +250,23 @@ public class AdbService extends IAdbManager.Stub { public void systemReady() { if (DEBUG) Slog.d(TAG, "systemReady"); + /* + * Use the normal bootmode persistent prop to maintain state of adb across + * all boot modes. + */ + mIsAdbUsbEnabled = containsFunction( + SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""), + UsbManager.USB_FUNCTION_ADB); + boolean shouldEnableAdbUsb = mIsAdbUsbEnabled + || SystemProperties.getBoolean( + TestHarnessModeService.TEST_HARNESS_MODE_PROPERTY, false); + mIsAdbWifiEnabled = "1".equals( + SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0")); + // make sure the ADB_ENABLED setting value matches the current state try { Settings.Global.putInt(mContentResolver, - Settings.Global.ADB_ENABLED, mIsAdbUsbEnabled ? 1 : 0); + Settings.Global.ADB_ENABLED, shouldEnableAdbUsb ? 1 : 0); Settings.Global.putInt(mContentResolver, Settings.Global.ADB_WIFI_ENABLED, mIsAdbWifiEnabled ? 1 : 0); } catch (SecurityException e) { @@ -272,7 +276,7 @@ public class AdbService extends IAdbManager.Stub { } /** - * Callend in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}. + * Called in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}. */ public void bootCompleted() { if (DEBUG) Slog.d(TAG, "boot completed"); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 38d0e3051899..5026f318e441 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -4177,7 +4177,8 @@ public final class ActiveServices { final boolean isolated = (r.serviceInfo.flags&ServiceInfo.FLAG_ISOLATED_PROCESS) != 0; final String procName = r.processName; - HostingRecord hostingRecord = new HostingRecord("service", r.instanceName, + HostingRecord hostingRecord = new HostingRecord( + HostingRecord.HOSTING_TYPE_SERVICE, r.instanceName, r.definingPackageName, r.definingUid, r.serviceInfo.processName); ProcessRecord app; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e639b29e3535..71682f26e664 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1553,7 +1553,8 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("mProcLock") private ParcelFileDescriptor[] mLifeMonitorFds; - static final HostingRecord sNullHostingRecord = new HostingRecord(null); + static final HostingRecord sNullHostingRecord = + new HostingRecord(HostingRecord.HOSTING_TYPE_EMPTY); /** * Used to notify activity lifecycle events. */ @@ -1876,7 +1877,7 @@ public class ActivityManagerService extends IActivityManager.Stub false, 0, null, - new HostingRecord("system")); + new HostingRecord(HostingRecord.HOSTING_TYPE_SYSTEM)); app.setPersistent(true); app.setPid(MY_PID); app.mState.setMaxAdj(ProcessList.SYSTEM_ADJ); @@ -4731,7 +4732,7 @@ public class ActivityManagerService extends IActivityManager.Stub } catch (RemoteException e) { app.resetPackageList(mProcessStats); mProcessList.startProcessLocked(app, - new HostingRecord("link fail", processName), + new HostingRecord(HostingRecord.HOSTING_TYPE_LINK_FAIL, processName), ZYGOTE_POLICY_FLAG_EMPTY); return false; } @@ -5000,6 +5001,17 @@ public class ActivityManagerService extends IActivityManager.Stub checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); } + + final HostingRecord hostingRecord = app.getHostingRecord(); + final String action = hostingRecord.getAction(); + String shortAction = action; + if (action != null) { + // only log the last part of the action string to save stats data. + int index = action.lastIndexOf("."); + if (index != -1 && index != action.length() - 1) { + shortAction = action.substring(index + 1); + } + } FrameworkStatsLog.write( FrameworkStatsLog.PROCESS_START_TIME, app.info.uid, @@ -5009,8 +5021,10 @@ public class ActivityManagerService extends IActivityManager.Stub app.getStartElapsedTime(), (int) (bindApplicationTimeMillis - app.getStartUptime()), (int) (SystemClock.uptimeMillis() - app.getStartUptime()), - app.getHostingRecord().getType(), - (app.getHostingRecord().getName() != null ? app.getHostingRecord().getName() : "")); + hostingRecord.getType(), + hostingRecord.getName(), + shortAction, + HostingRecord.getHostingTypeIdStatsd(hostingRecord.getType())); return true; } @@ -5109,7 +5123,7 @@ public class ActivityManagerService extends IActivityManager.Stub Slog.v(TAG_PROCESSES, "Starting process on hold: " + procs.get(ip)); } mProcessList.startProcessLocked(procs.get(ip), - new HostingRecord("on-hold"), + new HostingRecord(HostingRecord.HOSTING_TYPE_ON_HOLD), ZYGOTE_POLICY_FLAG_BATCH_LAUNCH); } } @@ -6700,7 +6714,7 @@ public class ActivityManagerService extends IActivityManager.Stub isSdkSandbox, sdkSandboxUid, sdkSandboxClientAppPackage, - new HostingRecord("added application", + new HostingRecord(HostingRecord.HOSTING_TYPE_ADDED_APPLICATION, customProcess != null ? customProcess : info.processName)); updateLruProcessLocked(app, false, null); updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); @@ -6729,7 +6743,8 @@ public class ActivityManagerService extends IActivityManager.Stub } if (app.getThread() == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); - mProcessList.startProcessLocked(app, new HostingRecord("added application", + mProcessList.startProcessLocked(app, new HostingRecord( + HostingRecord.HOSTING_TYPE_ADDED_APPLICATION, customProcess != null ? customProcess : app.processName), zygotePolicyFlags, disableHiddenApiChecks, disableTestApiChecks, abiOverride); @@ -12384,7 +12399,8 @@ public class ActivityManagerService extends IActivityManager.Stub mProcessList.addProcessNameLocked(app); app.setPendingStart(false); - mProcessList.startProcessLocked(app, new HostingRecord("restart", app.processName), + mProcessList.startProcessLocked(app, new HostingRecord( + HostingRecord.HOSTING_TYPE_RESTART, app.processName), ZYGOTE_POLICY_FLAG_EMPTY); return true; } else if (pid > 0 && pid != MY_PID) { @@ -12769,7 +12785,7 @@ public class ActivityManagerService extends IActivityManager.Stub // startProcessLocked() returns existing proc's record if it's already running ProcessRecord proc = startProcessLocked(app.processName, app, false, 0, - new HostingRecord("backup", hostingName), + new HostingRecord(HostingRecord.HOSTING_TYPE_BACKUP, hostingName), ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS, false, false); if (proc == null) { Slog.e(TAG, "Unable to start backup agent process " + r); diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index d2e40c56c772..f7aa7c155719 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -1870,8 +1870,9 @@ public final class BroadcastQueue { r.curApp = mService.startProcessLocked(targetProcess, info.activityInfo.applicationInfo, true, r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND, - new HostingRecord("broadcast", r.curComponent), isActivityCapable - ? ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE : ZYGOTE_POLICY_FLAG_EMPTY, + new HostingRecord(HostingRecord.HOSTING_TYPE_BROADCAST, r.curComponent, + r.intent.getAction()), + isActivityCapable ? ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE : ZYGOTE_POLICY_FLAG_EMPTY, (r.intent.getFlags() & Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false); if (r.curApp == null) { // Ah, this recipient is unavailable. Finish it if necessary, diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index 7289331344c6..728792f608ef 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -483,7 +483,7 @@ public class ContentProviderHelper { checkTime(startTime, "getContentProviderImpl: before start process"); proc = mService.startProcessLocked( cpi.processName, cpr.appInfo, false, 0, - new HostingRecord("content provider", + new HostingRecord(HostingRecord.HOSTING_TYPE_CONTENT_PROVIDER, new ComponentName( cpi.applicationInfo.packageName, cpi.name)), Process.ZYGOTE_POLICY_FLAG_EMPTY, false, false); diff --git a/services/core/java/com/android/server/am/HostingRecord.java b/services/core/java/com/android/server/am/HostingRecord.java index bbf586123e1c..f88a8ce83d02 100644 --- a/services/core/java/com/android/server/am/HostingRecord.java +++ b/services/core/java/com/android/server/am/HostingRecord.java @@ -16,7 +16,10 @@ package com.android.server.am; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.ComponentName; +import android.os.ProcessStartTime; /** * This class describes various information required to start a process. @@ -43,6 +46,9 @@ import android.content.ComponentName; * * {@code mIsTopApp} will be passed to {@link android.os.Process#start}. So Zygote will initialize * the process with high priority. + * + * {@code mAction} the broadcast's intent action if the process is started for a broadcast + * receiver. */ public final class HostingRecord { @@ -50,51 +56,77 @@ public final class HostingRecord { private static final int WEBVIEW_ZYGOTE = 1; private static final int APP_ZYGOTE = 2; - private final String mHostingType; + public static final String HOSTING_TYPE_ACTIVITY = "activity"; + public static final String HOSTING_TYPE_ADDED_APPLICATION = "added application"; + public static final String HOSTING_TYPE_BACKUP = "backup"; + public static final String HOSTING_TYPE_BROADCAST = "broadcast"; + public static final String HOSTING_TYPE_CONTENT_PROVIDER = "content provider"; + public static final String HOSTING_TYPE_LINK_FAIL = "link fail"; + public static final String HOSTING_TYPE_ON_HOLD = "on-hold"; + public static final String HOSTING_TYPE_NEXT_ACTIVITY = "next-activity"; + public static final String HOSTING_TYPE_NEXT_TOP_ACTIVITY = "next-top-activity"; + public static final String HOSTING_TYPE_RESTART = "restart"; + public static final String HOSTING_TYPE_SERVICE = "service"; + public static final String HOSTING_TYPE_SYSTEM = "system"; + public static final String HOSTING_TYPE_TOP_ACTIVITY = "top-activity"; + public static final String HOSTING_TYPE_EMPTY = ""; + + private @NonNull final String mHostingType; private final String mHostingName; private final int mHostingZygote; private final String mDefiningPackageName; private final int mDefiningUid; private final boolean mIsTopApp; private final String mDefiningProcessName; + @Nullable private final String mAction; - public HostingRecord(String hostingType) { + public HostingRecord(@NonNull String hostingType) { this(hostingType, null /* hostingName */, REGULAR_ZYGOTE, null /* definingPackageName */, - -1 /* mDefiningUid */, false /* isTopApp */, null /* definingProcessName */); + -1 /* mDefiningUid */, false /* isTopApp */, null /* definingProcessName */, + null /* action */); } - public HostingRecord(String hostingType, ComponentName hostingName) { + public HostingRecord(@NonNull String hostingType, ComponentName hostingName) { this(hostingType, hostingName, REGULAR_ZYGOTE); } - public HostingRecord(String hostingType, ComponentName hostingName, String definingPackageName, - int definingUid, String definingProcessName) { + public HostingRecord(@NonNull String hostingType, ComponentName hostingName, + @Nullable String action) { + this(hostingType, hostingName.toShortString(), REGULAR_ZYGOTE, + null /* definingPackageName */, -1 /* mDefiningUid */, false /* isTopApp */, + null /* definingProcessName */, action); + } + + public HostingRecord(@NonNull String hostingType, ComponentName hostingName, + String definingPackageName, int definingUid, String definingProcessName) { this(hostingType, hostingName.toShortString(), REGULAR_ZYGOTE, definingPackageName, - definingUid, false /* isTopApp */, definingProcessName); + definingUid, false /* isTopApp */, definingProcessName, null /* action */); } - public HostingRecord(String hostingType, ComponentName hostingName, boolean isTopApp) { + public HostingRecord(@NonNull String hostingType, ComponentName hostingName, boolean isTopApp) { this(hostingType, hostingName.toShortString(), REGULAR_ZYGOTE, null /* definingPackageName */, -1 /* mDefiningUid */, isTopApp /* isTopApp */, - null /* definingProcessName */); + null /* definingProcessName */, null /* action */); } - public HostingRecord(String hostingType, String hostingName) { + public HostingRecord(@NonNull String hostingType, String hostingName) { this(hostingType, hostingName, REGULAR_ZYGOTE); } - private HostingRecord(String hostingType, ComponentName hostingName, int hostingZygote) { + private HostingRecord(@NonNull String hostingType, ComponentName hostingName, + int hostingZygote) { this(hostingType, hostingName.toShortString(), hostingZygote); } - private HostingRecord(String hostingType, String hostingName, int hostingZygote) { + private HostingRecord(@NonNull String hostingType, String hostingName, int hostingZygote) { this(hostingType, hostingName, hostingZygote, null /* definingPackageName */, - -1 /* mDefiningUid */, false /* isTopApp */, null /* definingProcessName */); + -1 /* mDefiningUid */, false /* isTopApp */, null /* definingProcessName */, + null /* action */); } - private HostingRecord(String hostingType, String hostingName, int hostingZygote, + private HostingRecord(@NonNull String hostingType, String hostingName, int hostingZygote, String definingPackageName, int definingUid, boolean isTopApp, - String definingProcessName) { + String definingProcessName, @Nullable String action) { mHostingType = hostingType; mHostingName = hostingName; mHostingZygote = hostingZygote; @@ -102,9 +134,10 @@ public final class HostingRecord { mDefiningUid = definingUid; mIsTopApp = isTopApp; mDefiningProcessName = definingProcessName; + mAction = action; } - public String getType() { + public @NonNull String getType() { return mHostingType; } @@ -147,14 +180,24 @@ public final class HostingRecord { } /** + * Returns the broadcast's intent action if the process is started for a broadcast receiver. + * + * @return the intent action of the broadcast. + */ + public @Nullable String getAction() { + return mAction; + } + + /** * Creates a HostingRecord for a process that must spawn from the webview zygote * @param hostingName name of the component to be hosted in this process * @return The constructed HostingRecord */ public static HostingRecord byWebviewZygote(ComponentName hostingName, String definingPackageName, int definingUid, String definingProcessName) { - return new HostingRecord("", hostingName.toShortString(), WEBVIEW_ZYGOTE, - definingPackageName, definingUid, false /* isTopApp */, definingProcessName); + return new HostingRecord(HostingRecord.HOSTING_TYPE_EMPTY, hostingName.toShortString(), + WEBVIEW_ZYGOTE, definingPackageName, definingUid, false /* isTopApp */, + definingProcessName, null /* action */); } /** @@ -166,8 +209,9 @@ public final class HostingRecord { */ public static HostingRecord byAppZygote(ComponentName hostingName, String definingPackageName, int definingUid, String definingProcessName) { - return new HostingRecord("", hostingName.toShortString(), APP_ZYGOTE, - definingPackageName, definingUid, false /* isTopApp */, definingProcessName); + return new HostingRecord(HostingRecord.HOSTING_TYPE_EMPTY, hostingName.toShortString(), + APP_ZYGOTE, definingPackageName, definingUid, false /* isTopApp */, + definingProcessName, null /* action */); } /** @@ -183,4 +227,44 @@ public final class HostingRecord { public boolean usesWebviewZygote() { return mHostingZygote == WEBVIEW_ZYGOTE; } + + /** + * Map the string hostingType to enum HostingType defined in ProcessStartTime proto. + * @param hostingType + * @return enum HostingType defined in ProcessStartTime proto + */ + public static int getHostingTypeIdStatsd(@NonNull String hostingType) { + switch(hostingType) { + case HOSTING_TYPE_ACTIVITY: + return ProcessStartTime.HOSTING_TYPE_ACTIVITY; + case HOSTING_TYPE_ADDED_APPLICATION: + return ProcessStartTime.HOSTING_TYPE_ADDED_APPLICATION; + case HOSTING_TYPE_BACKUP: + return ProcessStartTime.HOSTING_TYPE_BACKUP; + case HOSTING_TYPE_BROADCAST: + return ProcessStartTime.HOSTING_TYPE_BROADCAST; + case HOSTING_TYPE_CONTENT_PROVIDER: + return ProcessStartTime.HOSTING_TYPE_CONTENT_PROVIDER; + case HOSTING_TYPE_LINK_FAIL: + return ProcessStartTime.HOSTING_TYPE_LINK_FAIL; + case HOSTING_TYPE_ON_HOLD: + return ProcessStartTime.HOSTING_TYPE_ON_HOLD; + case HOSTING_TYPE_NEXT_ACTIVITY: + return ProcessStartTime.HOSTING_TYPE_NEXT_ACTIVITY; + case HOSTING_TYPE_NEXT_TOP_ACTIVITY: + return ProcessStartTime.HOSTING_TYPE_NEXT_TOP_ACTIVITY; + case HOSTING_TYPE_RESTART: + return ProcessStartTime.HOSTING_TYPE_RESTART; + case HOSTING_TYPE_SERVICE: + return ProcessStartTime.HOSTING_TYPE_SERVICE; + case HOSTING_TYPE_SYSTEM: + return ProcessStartTime.HOSTING_TYPE_SYSTEM; + case HOSTING_TYPE_TOP_ACTIVITY: + return ProcessStartTime.HOSTING_TYPE_TOP_ACTIVITY; + case HOSTING_TYPE_EMPTY: + return ProcessStartTime.HOSTING_TYPE_EMPTY; + default: + return ProcessStartTime.HOSTING_TYPE_UNKNOWN; + } + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index a26535fbdce3..0c5b19b0fb2e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -345,8 +345,8 @@ public class FingerprintService extends SystemService { if (!isKeyguard && !Utils.isSettings(getContext(), opPackageName) && sensorProps != null && sensorProps.isAnyUdfpsType()) { try { - return authenticateWithPrompt(operationId, sensorProps, userId, receiver, - opPackageName, ignoreEnrollmentState); + return authenticateWithPrompt(operationId, sensorProps, callingUid, + callingUserId, receiver, opPackageName, ignoreEnrollmentState); } catch (PackageManager.NameNotFoundException e) { Slog.e(TAG, "Invalid package", e); return -1; @@ -360,6 +360,7 @@ public class FingerprintService extends SystemService { private long authenticateWithPrompt( final long operationId, @NonNull final FingerprintSensorPropertiesInternal props, + final int uId, final int userId, final IFingerprintServiceReceiver receiver, final String opPackageName, @@ -367,7 +368,7 @@ public class FingerprintService extends SystemService { final Context context = getUiContext(); final Context promptContext = context.createPackageContextAsUser( - opPackageName, 0 /* flags */, UserHandle.getUserHandleForUid(userId)); + opPackageName, 0 /* flags */, UserHandle.getUserHandleForUid(uId)); final Executor executor = context.getMainExecutor(); final BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(promptContext) diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java index b9efdf551646..574a3e7eab7e 100644 --- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java @@ -192,10 +192,13 @@ public class MultipathPolicyTracker { private final int mSubId; private long mQuota; - /** Current multipath budget. Nonzero iff we have budget and a UsageCallback is armed. */ - private long mMultipathBudget; + /** Current multipath budget. Nonzero iff we have budget. */ + // The budget could be accessed by multiple threads, make it volatile to ensure the callers + // on a different thread will not see the stale value. + private volatile long mMultipathBudget; private final NetworkTemplate mNetworkTemplate; private final UsageCallback mUsageCallback; + private boolean mUsageCallbackRegistered = false; private NetworkCapabilities mNetworkCapabilities; private final NetworkStatsManager mStatsManager; @@ -234,7 +237,6 @@ public class MultipathPolicyTracker { @Override public void onThresholdReached(int networkType, String subscriberId) { if (DBG) Log.d(TAG, "onThresholdReached for network " + network); - mMultipathBudget = 0; updateMultipathBudget(); } }; @@ -376,9 +378,9 @@ public class MultipathPolicyTracker { if (DBG) { Log.d(TAG, "Setting callback for " + budget + " bytes on network " + network); } - registerUsageCallback(budget); + setMultipathBudget(budget); } else { - maybeUnregisterUsageCallback(); + clearMultipathBudget(); } } @@ -403,23 +405,30 @@ public class MultipathPolicyTracker { return mMultipathBudget > 0; } - private void registerUsageCallback(long budget) { + // Sets the budget and registers a usage callback for it. + private void setMultipathBudget(long budget) { maybeUnregisterUsageCallback(); + if (DBG) Log.d(TAG, "Registering callback, budget is " + mMultipathBudget); mStatsManager.registerUsageCallback(mNetworkTemplate, budget, (command) -> mHandler.post(command), mUsageCallback); + mUsageCallbackRegistered = true; mMultipathBudget = budget; } private void maybeUnregisterUsageCallback() { - if (haveMultipathBudget()) { - if (DBG) Log.d(TAG, "Unregistering callback, budget was " + mMultipathBudget); - mStatsManager.unregisterUsageCallback(mUsageCallback); - mMultipathBudget = 0; - } + if (!mUsageCallbackRegistered) return; + if (DBG) Log.d(TAG, "Unregistering callback, budget was " + mMultipathBudget); + mStatsManager.unregisterUsageCallback(mUsageCallback); + mUsageCallbackRegistered = false; } - void shutdown() { + private void clearMultipathBudget() { maybeUnregisterUsageCallback(); + mMultipathBudget = 0; + } + + void shutdown() { + clearMultipathBudget(); } } diff --git a/services/core/java/com/android/server/connectivity/PacProxyService.java b/services/core/java/com/android/server/connectivity/PacProxyService.java index 3a97765246c1..2e90a3d86161 100644 --- a/services/core/java/com/android/server/connectivity/PacProxyService.java +++ b/services/core/java/com/android/server/connectivity/PacProxyService.java @@ -44,6 +44,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.util.Log; +import android.webkit.URLUtil; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.TrafficStatsConstants; @@ -232,8 +233,22 @@ public class PacProxyService extends IPacProxyManager.Stub { * @throws IOException if the URL is malformed, or the PAC file is too big. */ private static String get(Uri pacUri) throws IOException { - URL url = new URL(pacUri.toString()); - URLConnection urlConnection = url.openConnection(java.net.Proxy.NO_PROXY); + if (!URLUtil.isValidUrl(pacUri.toString())) { + throw new IOException("Malformed URL:" + pacUri); + } + + final URL url = new URL(pacUri.toString()); + URLConnection urlConnection; + try { + urlConnection = url.openConnection(java.net.Proxy.NO_PROXY); + // Catch the possible exceptions and rethrow as IOException to not to crash the system + // for illegal input. + } catch (IllegalArgumentException e) { + throw new IOException("Incorrect proxy type for " + pacUri); + } catch (UnsupportedOperationException e) { + throw new IOException("Unsupported URL connection type for " + pacUri); + } + long contentLength = -1; try { contentLength = Long.parseLong(urlConnection.getHeaderField("Content-Length")); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 254a3226e6de..3551ff91f542 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -88,7 +88,10 @@ import android.net.ipsec.ike.IkeSession; import android.net.ipsec.ike.IkeSessionCallback; import android.net.ipsec.ike.IkeSessionParams; import android.net.ipsec.ike.IkeTunnelConnectionParams; +import android.net.ipsec.ike.exceptions.IkeNetworkLostException; +import android.net.ipsec.ike.exceptions.IkeNonProtocolException; import android.net.ipsec.ike.exceptions.IkeProtocolException; +import android.net.ipsec.ike.exceptions.IkeTimeoutException; import android.os.Binder; import android.os.Build.VERSION_CODES; import android.os.Bundle; @@ -186,6 +189,10 @@ public class Vpn { // the device idle allowlist during service launch and VPN bootstrap. private static final long VPN_LAUNCH_IDLE_ALLOWLIST_DURATION_MS = 60 * 1000; + // Length of time (in milliseconds) that an app registered for VpnManager events is placed on + // the device idle allowlist each time the a VpnManager event is fired. + private static final long VPN_MANAGER_EVENT_ALLOWLIST_DURATION_MS = 30 * 1000; + private static final String LOCKDOWN_ALLOWLIST_SETTING_NAME = Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST; /** @@ -714,6 +721,14 @@ public class Vpn { intent.putExtra(VpnManager.EXTRA_ERROR_CLASS, errorClass); intent.putExtra(VpnManager.EXTRA_ERROR_CODE, errorCode); } + + // Allow VpnManager app to temporarily run background services to handle this error. + // If an app requires anything beyond this grace period, they MUST either declare + // themselves as a foreground service, or schedule a job/workitem. + DeviceIdleInternal idleController = mDeps.getDeviceIdleInternal(); + idleController.addPowerSaveTempWhitelistApp(Process.myUid(), packageName, + VPN_MANAGER_EVENT_ALLOWLIST_DURATION_MS, mUserId, false, REASON_VPN, + "VpnManager event"); try { return mUserIdContext.startService(intent) != null; } catch (RuntimeException e) { @@ -760,31 +775,36 @@ public class Vpn { // Also notify the new package if there was a provider change. final boolean shouldNotifyNewPkg = isVpnApp(packageName) && isPackageChanged; - if (setAlwaysOnPackageInternal(packageName, lockdown, lockdownAllowlist)) { - saveAlwaysOnPackage(); - // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from - // ConnectivityServiceTest. - if (shouldNotifyOldPkg && SdkLevel.isAtLeastT()) { - // If both of shouldNotifyOldPkg & isPackageChanged are true, which means the - // always-on of old package is disabled or the old package is replaced with the new - // package. In this case, VpnProfileState should be disconnected. - sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, - -1 /* errorClass */, -1 /* errorCode*/, oldPackage, - null /* sessionKey */, isPackageChanged ? makeDisconnectedVpnProfileState() - : makeVpnProfileStateLocked(), - null /* underlyingNetwork */, null /* nc */, null /* lp */); - } - // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from - // ConnectivityServiceTest. - if (shouldNotifyNewPkg && SdkLevel.isAtLeastT()) { - sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, - -1 /* errorClass */, -1 /* errorCode*/, packageName, - getSessionKeyLocked(), makeVpnProfileStateLocked(), - null /* underlyingNetwork */, null /* nc */, null /* lp */); - } + if (!setAlwaysOnPackageInternal(packageName, lockdown, lockdownAllowlist)) { + return false; + } + + saveAlwaysOnPackage(); + + // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from + // ConnectivityServiceTest. + if (!SdkLevel.isAtLeastT()) { return true; } - return false; + + if (shouldNotifyOldPkg) { + // If both of shouldNotifyOldPkg & isPackageChanged are true, that means the + // always-on of old package is disabled or the old package is replaced with the new + // package. In this case, VpnProfileState should be disconnected. + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, + -1 /* errorClass */, -1 /* errorCode*/, oldPackage, + null /* sessionKey */, isPackageChanged ? makeDisconnectedVpnProfileState() + : makeVpnProfileStateLocked(), + null /* underlyingNetwork */, null /* nc */, null /* lp */); + } + + if (shouldNotifyNewPkg) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, + -1 /* errorClass */, -1 /* errorCode*/, packageName, + getSessionKeyLocked(), makeVpnProfileStateLocked(), + null /* underlyingNetwork */, null /* nc */, null /* lp */); + } + return true; } /** @@ -2530,6 +2550,21 @@ public class Vpn { } } + @Nullable + protected synchronized NetworkCapabilities getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + NetworkCapabilities nc) { + if (nc == null) return null; + return mConnectivityManager.getRedactedNetworkCapabilitiesForPackage( + nc, mOwnerUID, mPackage); + } + + @Nullable + protected synchronized LinkProperties getRedactedLinkPropertiesOfUnderlyingNetwork( + LinkProperties lp) { + if (lp == null) return null; + return mConnectivityManager.getRedactedLinkPropertiesForPackage(lp, mOwnerUID, mPackage); + } + /** This class represents the common interface for all VPN runners. */ @VisibleForTesting abstract class VpnRunner extends Thread { @@ -2564,6 +2599,10 @@ public class Vpn { interface IkeV2VpnRunnerCallback { void onDefaultNetworkChanged(@NonNull Network network); + void onDefaultNetworkCapabilitiesChanged(@NonNull NetworkCapabilities nc); + + void onDefaultNetworkLinkPropertiesChanged(@NonNull LinkProperties lp); + void onChildOpened( @NonNull Network network, @NonNull ChildSessionConfiguration childConfig); @@ -2620,14 +2659,14 @@ public class Vpn { @Nullable private IpSecTunnelInterface mTunnelIface; @Nullable private IkeSession mSession; @Nullable private Network mActiveNetwork; + @Nullable private NetworkCapabilities mUnderlyingNetworkCapabilities; + @Nullable private LinkProperties mUnderlyingLinkProperties; private final String mSessionKey; IkeV2VpnRunner(@NonNull Ikev2VpnProfile profile) { super(TAG); mProfile = profile; mIpSecManager = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE); - // Pass mExecutor into Ikev2VpnNetworkCallback and make sure that IkeV2VpnRunnerCallback - // will be called by the mExecutor thread. mNetworkCallback = new VpnIkev2Utils.Ikev2VpnNetworkCallback(TAG, this, mExecutor); mSessionKey = UUID.randomUUID().toString(); } @@ -2849,6 +2888,16 @@ public class Vpn { } } + /** Called when the NetworkCapabilities of underlying network is changed */ + public void onDefaultNetworkCapabilitiesChanged(@NonNull NetworkCapabilities nc) { + mUnderlyingNetworkCapabilities = nc; + } + + /** Called when the LinkProperties of underlying network is changed */ + public void onDefaultNetworkLinkPropertiesChanged(@NonNull LinkProperties lp) { + mUnderlyingLinkProperties = lp; + } + /** Marks the state as FAILED, and disconnects. */ private void markFailedAndDisconnect(Exception exception) { synchronized (Vpn.this) { @@ -2879,28 +2928,120 @@ public class Vpn { return; } - if (exception instanceof IkeProtocolException) { - final IkeProtocolException ikeException = (IkeProtocolException) exception; - - switch (ikeException.getErrorType()) { - case IkeProtocolException.ERROR_TYPE_NO_PROPOSAL_CHOSEN: // Fallthrough - case IkeProtocolException.ERROR_TYPE_INVALID_KE_PAYLOAD: // Fallthrough - case IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED: // Fallthrough - case IkeProtocolException.ERROR_TYPE_SINGLE_PAIR_REQUIRED: // Fallthrough - case IkeProtocolException.ERROR_TYPE_FAILED_CP_REQUIRED: // Fallthrough - case IkeProtocolException.ERROR_TYPE_TS_UNACCEPTABLE: - // All the above failures are configuration errors, and are terminal - markFailedAndDisconnect(exception); - return; - // All other cases possibly recoverable. + synchronized (Vpn.this) { + if (exception instanceof IkeProtocolException) { + final IkeProtocolException ikeException = (IkeProtocolException) exception; + + switch (ikeException.getErrorType()) { + case IkeProtocolException.ERROR_TYPE_NO_PROPOSAL_CHOSEN: // Fallthrough + case IkeProtocolException.ERROR_TYPE_INVALID_KE_PAYLOAD: // Fallthrough + case IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED: // Fallthrough + case IkeProtocolException.ERROR_TYPE_SINGLE_PAIR_REQUIRED: // Fallthrough + case IkeProtocolException.ERROR_TYPE_FAILED_CP_REQUIRED: // Fallthrough + case IkeProtocolException.ERROR_TYPE_TS_UNACCEPTABLE: + // All the above failures are configuration errors, and are terminal + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_IKE_ERROR, + VpnManager.ERROR_CLASS_NOT_RECOVERABLE, + ikeException.getErrorType(), + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + markFailedAndDisconnect(exception); + return; + // All other cases possibly recoverable. + default: + // All the above failures are configuration errors, and are terminal + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_IKE_ERROR, + VpnManager.ERROR_CLASS_RECOVERABLE, + ikeException.getErrorType(), + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + } + } else if (exception instanceof IllegalArgumentException) { + // Failed to build IKE/ChildSessionParams; fatal profile configuration error + markFailedAndDisconnect(exception); + return; + } else if (exception instanceof IkeNetworkLostException) { + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR, + VpnManager.ERROR_CLASS_RECOVERABLE, + VpnManager.ERROR_CODE_NETWORK_LOST, + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + } else if (exception instanceof IkeNonProtocolException) { + if (exception.getCause() instanceof UnknownHostException) { + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR, + VpnManager.ERROR_CLASS_RECOVERABLE, + VpnManager.ERROR_CODE_NETWORK_UNKNOWN_HOST, + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + } else if (exception.getCause() instanceof IkeTimeoutException) { + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR, + VpnManager.ERROR_CLASS_RECOVERABLE, + VpnManager.ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT, + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + } else if (exception.getCause() instanceof IOException) { + // TODO(b/230548427): Remove SDK check once VPN related stuff are + // decoupled from ConnectivityServiceTest. + if (SdkLevel.isAtLeastT()) { + sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR, + VpnManager.ERROR_CLASS_RECOVERABLE, + VpnManager.ERROR_CODE_NETWORK_IO, + getPackage(), mSessionKey, makeVpnProfileStateLocked(), + mActiveNetwork, + getRedactedNetworkCapabilitiesOfUnderlyingNetwork( + mUnderlyingNetworkCapabilities), + getRedactedLinkPropertiesOfUnderlyingNetwork( + mUnderlyingLinkProperties)); + } + } + } else if (exception != null) { + Log.wtf(TAG, "onSessionLost: exception = " + exception); } - } else if (exception instanceof IllegalArgumentException) { - // Failed to build IKE/ChildSessionParams; fatal profile configuration error - markFailedAndDisconnect(exception); - return; } mActiveNetwork = null; + mUnderlyingNetworkCapabilities = null; + mUnderlyingLinkProperties = null; // Close all obsolete state, but keep VPN alive incase a usable network comes up. // (Mirrors VpnService behavior) @@ -2965,6 +3106,8 @@ public class Vpn { */ private void disconnectVpnRunner() { mActiveNetwork = null; + mUnderlyingNetworkCapabilities = null; + mUnderlyingLinkProperties = null; mIsRunning = false; resetIkeState(); diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java index 6982d6095689..17058282d947 100644 --- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java +++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java @@ -50,7 +50,9 @@ import android.net.InetAddresses; import android.net.IpPrefix; import android.net.IpSecAlgorithm; import android.net.IpSecTransform; +import android.net.LinkProperties; import android.net.Network; +import android.net.NetworkCapabilities; import android.net.RouteInfo; import android.net.eap.EapSessionConfig; import android.net.ipsec.ike.ChildSaProposal; @@ -86,7 +88,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; -import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executor; /** * Utility class to build and convert IKEv2/IPsec parameters. @@ -377,10 +379,10 @@ public class VpnIkev2Utils { static class Ikev2VpnNetworkCallback extends NetworkCallback { private final String mTag; private final Vpn.IkeV2VpnRunnerCallback mCallback; - private final ExecutorService mExecutor; + private final Executor mExecutor; Ikev2VpnNetworkCallback(String tag, Vpn.IkeV2VpnRunnerCallback callback, - ExecutorService executor) { + Executor executor) { mTag = tag; mCallback = callback; mExecutor = executor; @@ -393,6 +395,22 @@ public class VpnIkev2Utils { } @Override + public void onCapabilitiesChanged(@NonNull Network network, + @NonNull NetworkCapabilities networkCapabilities) { + Log.d(mTag, "NC changed for net " + network + " : " + networkCapabilities); + mExecutor.execute( + () -> mCallback.onDefaultNetworkCapabilitiesChanged(networkCapabilities)); + } + + @Override + public void onLinkPropertiesChanged(@NonNull Network network, + @NonNull LinkProperties linkProperties) { + Log.d(mTag, "LP changed for net " + network + " : " + linkProperties); + mExecutor.execute( + () -> mCallback.onDefaultNetworkLinkPropertiesChanged(linkProperties)); + } + + @Override public void onLost(@NonNull Network network) { Log.d(mTag, "Tearing down; lost network: " + network); mExecutor.execute(() -> mCallback.onSessionLost(network, null)); diff --git a/services/core/java/com/android/server/display/BrightnessSetting.java b/services/core/java/com/android/server/display/BrightnessSetting.java index ca7b789da47d..74486113dcf9 100644 --- a/services/core/java/com/android/server/display/BrightnessSetting.java +++ b/services/core/java/com/android/server/display/BrightnessSetting.java @@ -102,13 +102,15 @@ public class BrightnessSetting { return; } synchronized (mSyncRoot) { - if (brightness == mBrightness) { - return; + // If the brightness is the same, we still need to update any listeners as the act of + // setting the brightness alone has side effects, like clearing any temporary + // brightness. We can skip persisting to disk, however, since it hasn't actually + // changed. + if (brightness != mBrightness) { + mPersistentDataStore.setBrightness(mLogicalDisplay.getPrimaryDisplayDeviceLocked(), + brightness); } - mBrightness = brightness; - mPersistentDataStore.setBrightness(mLogicalDisplay.getPrimaryDisplayDeviceLocked(), - brightness); int toSend = Float.floatToIntBits(mBrightness); Message msg = mHandler.obtainMessage(MSG_BRIGHTNESS_CHANGED, toSend, 0); mHandler.sendMessage(msg); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index ec7ccc4843c9..6285ef1fdabd 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -3349,7 +3349,7 @@ public final class DisplayManagerService extends SystemService { synchronized (mSyncRoot) { DisplayPowerController dpc = mDisplayPowerControllers.get(displayId); if (dpc != null) { - dpc.putScreenBrightnessSetting(brightness); + dpc.setBrightness(brightness); } mPersistentDataStore.saveIfNeeded(); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index d13a9a3ec27e..a5bb716e67b7 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -472,6 +472,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private DisplayDeviceConfig mDisplayDeviceConfig; + // Identifiers for suspend blocker acuisition requests + private final String mSuspendBlockerIdUnfinishedBusiness; + private final String mSuspendBlockerIdOnStateChanged; + private final String mSuspendBlockerIdProxPositive; + private final String mSuspendBlockerIdProxNegative; + private final String mSuspendBlockerIdProxDebounce; + /** * Creates the display power controller. */ @@ -482,7 +489,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call Runnable onBrightnessChangeRunnable) { mLogicalDisplay = logicalDisplay; mDisplayId = mLogicalDisplay.getDisplayIdLocked(); - TAG = "DisplayPowerController[" + mDisplayId + "]"; + final String displayIdStr = "[" + mDisplayId + "]"; + TAG = "DisplayPowerController" + displayIdStr; + mSuspendBlockerIdUnfinishedBusiness = displayIdStr + "unfinished business"; + mSuspendBlockerIdOnStateChanged = displayIdStr + "on state changed"; + mSuspendBlockerIdProxPositive = displayIdStr + "prox positive"; + mSuspendBlockerIdProxNegative = displayIdStr + "prox negative"; + mSuspendBlockerIdProxDebounce = displayIdStr + "prox debounce"; + mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); mDisplayStatsId = mUniqueDisplayId.hashCode(); @@ -1084,7 +1098,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessThrottler.stop(); mHandler.removeCallbacksAndMessages(null); if (mUnfinishedBusiness) { - mCallbacks.releaseSuspendBlocker(); + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdUnfinishedBusiness); mUnfinishedBusiness = false; } @@ -1345,7 +1359,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mAppliedAutoBrightness && !autoBrightnessAdjustmentChanged) { slowChange = true; // slowly adapt to auto-brightness } - updateScreenBrightnessSetting = true; + updateScreenBrightnessSetting = mCurrentScreenBrightnessSetting != brightnessState; mAppliedAutoBrightness = true; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC); } else { @@ -1415,7 +1429,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // before applying the low power or dim transformations so that the slider // accurately represents the full possible range, even if they range changes what // it means in absolute terms. - putScreenBrightnessSetting(brightnessState, /* updateCurrent */ true); + updateScreenBrightnessSetting(brightnessState); } // Apply dimming by at least some minimum amount when user activity @@ -1650,7 +1664,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (DEBUG) { Slog.d(TAG, "Unfinished business..."); } - mCallbacks.acquireSuspendBlocker(); + mCallbacks.acquireSuspendBlocker(mSuspendBlockerIdUnfinishedBusiness); mUnfinishedBusiness = true; } @@ -1675,7 +1689,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call Slog.d(TAG, "Finished business..."); } mUnfinishedBusiness = false; - mCallbacks.releaseSuspendBlocker(); + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdUnfinishedBusiness); } // Record if dozing for future comparison. @@ -2228,19 +2242,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private void clearPendingProximityDebounceTime() { if (mPendingProximityDebounceTime >= 0) { mPendingProximityDebounceTime = -1; - mCallbacks.releaseSuspendBlocker(); // release wake lock + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdProxDebounce); } } private void setPendingProximityDebounceTime(long debounceTime) { if (mPendingProximityDebounceTime < 0) { - mCallbacks.acquireSuspendBlocker(); // acquire wake lock + mCallbacks.acquireSuspendBlocker(mSuspendBlockerIdProxDebounce); } mPendingProximityDebounceTime = debounceTime; } private void sendOnStateChangedWithWakelock() { - mCallbacks.acquireSuspendBlocker(); + mCallbacks.acquireSuspendBlocker(mSuspendBlockerIdOnStateChanged); mHandler.post(mOnStateChangedRunnable); } @@ -2288,17 +2302,18 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return clampScreenBrightnessForVr(brightnessFloat); } - void putScreenBrightnessSetting(float brightnessValue) { - putScreenBrightnessSetting(brightnessValue, false); + void setBrightness(float brightnessValue) { + // Update the setting, which will eventually call back into DPC to have us actually update + // the display with the new value. + mBrightnessSetting.setBrightness(brightnessValue); } - private void putScreenBrightnessSetting(float brightnessValue, boolean updateCurrent) { - if (!isValidBrightnessValue(brightnessValue)) { + private void updateScreenBrightnessSetting(float brightnessValue) { + if (!isValidBrightnessValue(brightnessValue) + || brightnessValue == mCurrentScreenBrightnessSetting) { return; } - if (updateCurrent) { - setCurrentScreenBrightness(brightnessValue); - } + setCurrentScreenBrightness(brightnessValue); mBrightnessSetting.setBrightness(brightnessValue); } @@ -2400,12 +2415,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Override public void run() { mCallbacks.onStateChanged(); - mCallbacks.releaseSuspendBlocker(); + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdOnStateChanged); } }; private void sendOnProximityPositiveWithWakelock() { - mCallbacks.acquireSuspendBlocker(); + mCallbacks.acquireSuspendBlocker(mSuspendBlockerIdProxPositive); mHandler.post(mOnProximityPositiveRunnable); } @@ -2413,12 +2428,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Override public void run() { mCallbacks.onProximityPositive(); - mCallbacks.releaseSuspendBlocker(); + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdProxPositive); } }; private void sendOnProximityNegativeWithWakelock() { - mCallbacks.acquireSuspendBlocker(); + mCallbacks.acquireSuspendBlocker(mSuspendBlockerIdProxNegative); mHandler.post(mOnProximityNegativeRunnable); } @@ -2426,7 +2441,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Override public void run() { mCallbacks.onProximityNegative(); - mCallbacks.releaseSuspendBlocker(); + mCallbacks.releaseSuspendBlocker(mSuspendBlockerIdProxNegative); } }; diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java index 2eba080e369e..59daee9ea2ff 100644 --- a/services/core/java/com/android/server/display/PersistentDataStore.java +++ b/services/core/java/com/android/server/display/PersistentDataStore.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.graphics.Point; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.WifiDisplay; +import android.os.Handler; import android.util.AtomicFile; import android.util.Slog; import android.util.SparseArray; @@ -31,12 +32,14 @@ import android.util.Xml; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.XmlUtils; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParserException; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -141,13 +144,22 @@ final class PersistentDataStore { // The interface for methods which should be replaced by the test harness. private Injector mInjector; + private final Handler mHandler; + private final Object mFileAccessLock = new Object(); + public PersistentDataStore() { this(new Injector()); } @VisibleForTesting PersistentDataStore(Injector injector) { + this(injector, BackgroundThread.getHandler()); + } + + @VisibleForTesting + PersistentDataStore(Injector injector, Handler handler) { mInjector = injector; + mHandler = handler; } public void saveIfNeeded() { @@ -418,45 +430,60 @@ final class PersistentDataStore { } private void load() { - clearState(); + synchronized (mFileAccessLock) { + clearState(); - final InputStream is; - try { - is = mInjector.openRead(); - } catch (FileNotFoundException ex) { - return; - } + final InputStream is; + try { + is = mInjector.openRead(); + } catch (FileNotFoundException ex) { + return; + } - TypedXmlPullParser parser; - try { - parser = Xml.resolvePullParser(is); - loadFromXml(parser); - } catch (IOException ex) { - Slog.w(TAG, "Failed to load display manager persistent store data.", ex); - clearState(); - } catch (XmlPullParserException ex) { - Slog.w(TAG, "Failed to load display manager persistent store data.", ex); - clearState(); - } finally { - IoUtils.closeQuietly(is); + TypedXmlPullParser parser; + try { + parser = Xml.resolvePullParser(is); + loadFromXml(parser); + } catch (IOException ex) { + Slog.w(TAG, "Failed to load display manager persistent store data.", ex); + clearState(); + } catch (XmlPullParserException ex) { + Slog.w(TAG, "Failed to load display manager persistent store data.", ex); + clearState(); + } finally { + IoUtils.closeQuietly(is); + } } } private void save() { - final OutputStream os; + final ByteArrayOutputStream os; try { - os = mInjector.startWrite(); - boolean success = false; - try { - TypedXmlSerializer serializer = Xml.resolveSerializer(os); - saveToXml(serializer); - serializer.flush(); - success = true; - } finally { - mInjector.finishWrite(os, success); - } + os = new ByteArrayOutputStream(); + + TypedXmlSerializer serializer = Xml.resolveSerializer(os); + saveToXml(serializer); + serializer.flush(); + + mHandler.removeCallbacksAndMessages(/* token */ null); + mHandler.post(() -> { + synchronized (mFileAccessLock) { + OutputStream fileOutput = null; + try { + fileOutput = mInjector.startWrite(); + os.writeTo(fileOutput); + fileOutput.flush(); + } catch (IOException ex) { + Slog.w(TAG, "Failed to save display manager persistent store data.", ex); + } finally { + if (fileOutput != null) { + mInjector.finishWrite(fileOutput, true); + } + } + } + }); } catch (IOException ex) { - Slog.w(TAG, "Failed to save display manager persistent store data.", ex); + Slog.w(TAG, "Failed to process the XML serializer.", ex); } } diff --git a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java index 2e1aaf85d25a..aba7572ee1a0 100644 --- a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java +++ b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java @@ -599,6 +599,7 @@ class GnssNetworkConnectivityHandler { SUPL_NETWORK_REQUEST_TIMEOUT_MILLIS); } catch (RuntimeException e) { Log.e(TAG, "Failed to request network.", e); + mSuplConnectivityCallback = null; handleReleaseSuplConnection(GPS_AGPS_DATA_CONN_FAILED); } } diff --git a/services/core/java/com/android/server/notification/toast/TextToastRecord.java b/services/core/java/com/android/server/notification/toast/TextToastRecord.java index 7b36db2fe38c..559798a34662 100644 --- a/services/core/java/com/android/server/notification/toast/TextToastRecord.java +++ b/services/core/java/com/android/server/notification/toast/TextToastRecord.java @@ -62,7 +62,8 @@ public class TextToastRecord extends ToastRecord { Slog.w(TAG, "StatusBar not available to show text toast for package " + pkg); return false; } - mStatusBar.showToast(uid, pkg, token, text, windowToken, getDuration(), mCallback); + mStatusBar.showToast(uid, pkg, token, text, windowToken, getDuration(), mCallback, + displayId); return true; } diff --git a/services/core/java/com/android/server/pm/FileInstallArgs.java b/services/core/java/com/android/server/pm/FileInstallArgs.java index e3ceccd1abb8..85c3cc91ecf0 100644 --- a/services/core/java/com/android/server/pm/FileInstallArgs.java +++ b/services/core/java/com/android/server/pm/FileInstallArgs.java @@ -172,22 +172,9 @@ class FileInstallArgs extends InstallArgs { return false; } - if (onIncremental) { - Slog.i(TAG, PackageManagerServiceUtils.SELINUX_BUG - + ": Skipping restorecon for Incremental install of " + beforeCodeFile); - } else { - try { - if (!SELinux.restoreconRecursive(afterCodeFile)) { - Slog.w(TAG, "Failed to restorecon"); - return false; - } - PackageManagerServiceUtils.verifySelinuxLabels(afterCodeFile.getAbsolutePath()); - } catch (Exception e) { - Slog.e(TAG, - PackageManagerServiceUtils.SELINUX_BUG + ": Exception from restorecon on " - + beforeCodeFile, e); - throw e; - } + if (!onIncremental && !SELinux.restoreconRecursive(afterCodeFile)) { + Slog.w(TAG, "Failed to restorecon"); + return false; } // Reflect the rename internally diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index c710120ca437..e62f35d591fa 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -653,10 +653,6 @@ final class InstallPackageHelper { Log.v(TAG, "restoreAndPostInstall userId=" + userId + " package=" + res.mPkg); } - if (res.mPkg != null) { - PackageManagerServiceUtils.verifySelinuxLabels(res.mPkg.getPath()); - } - // A restore should be requested at this point if (a) the install // succeeded, (b) the operation is not an update. final boolean update = res.mRemovedInfo != null @@ -3580,7 +3576,6 @@ final class InstallPackageHelper { @ParsingPackageUtils.ParseFlags int parseFlags, @PackageManagerService.ScanFlags int scanFlags, @Nullable UserHandle user) throws PackageManagerException { - PackageManagerServiceUtils.verifySelinuxLabels(parsedPackage.getPath()); final Pair<ScanResult, Boolean> scanResultPair = scanSystemPackageLI( parsedPackage, parseFlags, scanFlags, user); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 621ad5223de2..4f8c792d3b49 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -803,6 +803,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService private AndroidPackage mPlatformPackage; ComponentName mCustomResolverComponentName; + // Recorded overlay paths configuration for the Android app info. + private String[] mPlatformPackageOverlayPaths = null; + private String[] mPlatformPackageOverlayResourceDirs = null; + // And the same paths for the replaced resolver activity package + private String[] mReplacedResolverPackageOverlayPaths = null; + private String[] mReplacedResolverPackageOverlayResourceDirs = null; + private boolean mResolverReplaced = false; @NonNull @@ -6562,11 +6569,61 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } + if (userId == UserHandle.USER_SYSTEM) { + // Keep the overlays in the system application info (and anything special cased as well) + // up to date to make sure system ui is themed correctly. + maybeUpdateSystemOverlays(targetPackageName, newOverlayPaths); + } + invalidatePackageInfoCache(); return true; } + private void maybeUpdateSystemOverlays(String targetPackageName, OverlayPaths newOverlayPaths) { + if (!mResolverReplaced) { + if (targetPackageName.equals("android")) { + if (newOverlayPaths == null) { + mPlatformPackageOverlayPaths = null; + mPlatformPackageOverlayResourceDirs = null; + } else { + mPlatformPackageOverlayPaths = newOverlayPaths.getOverlayPaths().toArray( + new String[0]); + mPlatformPackageOverlayResourceDirs = newOverlayPaths.getResourceDirs().toArray( + new String[0]); + } + applyUpdatedSystemOverlayPaths(); + } + } else { + if (targetPackageName.equals(mResolveActivity.applicationInfo.packageName)) { + if (newOverlayPaths == null) { + mReplacedResolverPackageOverlayPaths = null; + mReplacedResolverPackageOverlayResourceDirs = null; + } else { + mReplacedResolverPackageOverlayPaths = + newOverlayPaths.getOverlayPaths().toArray(new String[0]); + mReplacedResolverPackageOverlayResourceDirs = + newOverlayPaths.getResourceDirs().toArray(new String[0]); + } + applyUpdatedSystemOverlayPaths(); + } + } + } + + private void applyUpdatedSystemOverlayPaths() { + if (mAndroidApplication == null) { + Slog.i(TAG, "Skipped the AndroidApplication overlay paths update - no app yet"); + } else { + mAndroidApplication.overlayPaths = mPlatformPackageOverlayPaths; + mAndroidApplication.resourceDirs = mPlatformPackageOverlayResourceDirs; + } + if (mResolverReplaced) { + mResolveActivity.applicationInfo.overlayPaths = mReplacedResolverPackageOverlayPaths; + mResolveActivity.applicationInfo.resourceDirs = + mReplacedResolverPackageOverlayResourceDirs; + } + } + private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions( @NonNull String message) { if (mContext.checkCallingOrSelfPermission( @@ -7043,6 +7100,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } PackageManagerService.onChanged(); } + applyUpdatedSystemOverlayPaths(); } ApplicationInfo getCoreAndroidApplication() { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 719c3b767b46..3443d455ee82 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -36,6 +36,7 @@ import static com.android.server.pm.PackageManagerService.TAG; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.app.ActivityManager; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.Context; @@ -61,7 +62,6 @@ import android.os.Debug; import android.os.Environment; import android.os.FileUtils; import android.os.Process; -import android.os.SELinux; import android.os.SystemProperties; import android.os.incremental.IncrementalManager; import android.os.incremental.IncrementalStorage; @@ -1089,12 +1089,6 @@ public class PackageManagerServiceUtils { PlatformCompat compat, ComponentResolverApi resolver, List<ResolveInfo> resolveInfos, boolean isReceiver, Intent intent, String resolvedType, int filterCallingUid) { - // Do not enforce filter matching when the caller is system or root. - // see ActivityManager#checkComponentPermission(String, int, int, boolean) - if (filterCallingUid == Process.ROOT_UID || filterCallingUid == Process.SYSTEM_UID) { - return; - } - final Printer logPrinter = DEBUG_INTENT_MATCHING ? new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM) : null; @@ -1102,8 +1096,9 @@ public class PackageManagerServiceUtils { for (int i = resolveInfos.size() - 1; i >= 0; --i) { final ComponentInfo info = resolveInfos.get(i).getComponentInfo(); - // Do not enforce filter matching when the caller is the same app - if (info.applicationInfo.uid == filterCallingUid) { + // Do not enforce filter matching when the caller is system, root, or the same app + if (ActivityManager.checkComponentPermission(null, filterCallingUid, + info.applicationInfo.uid, false) == PackageManager.PERMISSION_GRANTED) { continue; } @@ -1407,28 +1402,4 @@ public class PackageManagerServiceUtils { } } } - - // TODO(b/231951809): remove this workaround after figuring out why apk_tmp_file labels stay - // on the installed apps instead of the correct apk_data_file ones - - public static final String SELINUX_BUG = "b/231951809"; - - /** - * A workaround for b/231951809: - * Verifies the SELinux labels of the passed path, and tries to correct them if detects them - * wrong or missing. - */ - public static void verifySelinuxLabels(String path) { - final String expectedCon = SELinux.fileSelabelLookup(path); - final String actualCon = SELinux.getFileContext(path); - Slog.i(TAG, SELINUX_BUG + ": checking selinux labels for " + path + " expected / actual: " - + expectedCon + " / " + actualCon); - if (expectedCon == null || !expectedCon.equals(actualCon)) { - Slog.w(TAG, SELINUX_BUG + ": labels don't match, reapplying for " + path); - if (!SELinux.restoreconRecursive(new File(path))) { - Slog.w(TAG, SELINUX_BUG + ": Failed to reapply restorecon"); - } - // well, if it didn't work now after not working at first, not much else can be done - } - } } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index fa0c6c393cdc..0c601bfde05a 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -706,7 +706,7 @@ class ShortcutPackage extends ShortcutPackageItem { } pinnedShortcuts.addAll(pinned); }); - // Then, update the pinned state if necessary. + // Secondly, update the pinned state if necessary. final List<ShortcutInfo> pinned = findAll(pinnedShortcuts); if (pinned != null) { pinned.forEach(si -> { @@ -720,6 +720,8 @@ class ShortcutPackage extends ShortcutPackageItem { si.clearFlags(ShortcutInfo.FLAG_PINNED); } }); + // Then, schedule a background job to persist the pinned states. + mShortcutUser.forAllLaunchers(ShortcutPackageItem::scheduleSave); // Lastly, remove the ones that are no longer pinned, cached nor dynamic. removeOrphans(); 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 a83cb5e37ba2..2c1be72e02f0 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -966,8 +966,14 @@ public class PermissionManagerService extends IPermissionManager.Stub { final PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); - if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, - UserHandle.getUserId(callingUid)) != source.getUid()) { + + // TODO(b/234653108): Clean up this UID/package & cross-user check. + // If calling from the system process, allow registering attribution for package from + // any user + int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? source.getUid() + : callingUid)); + if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, userId) + != source.getUid()) { throw new SecurityException("Cannot register attribution source for package:" + source.getPackageName() + " from uid:" + callingUid); } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 3c13abf4403c..8c52717b1a20 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -94,7 +94,9 @@ import android.service.dreams.DreamManagerInternal; import android.service.vr.IVrManager; import android.service.vr.IVrStateCallbacks; import android.sysprop.InitProperties; +import android.util.ArrayMap; import android.util.KeyValueListParser; +import android.util.LongArray; import android.util.PrintWriterPrinter; import android.util.Slog; import android.util.SparseArray; @@ -135,8 +137,10 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; @@ -274,6 +278,11 @@ public final class PowerManagerService extends SystemService */ private static final long ENHANCED_DISCHARGE_PREDICTION_BROADCAST_MIN_DELAY_MS = 60 * 1000L; + /** Reason ID for holding display suspend blocker. */ + private static final String HOLDING_DISPLAY_SUSPEND_BLOCKER = "holding display"; + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); + private final Context mContext; private final ServiceThread mHandlerThread; private final Handler mHandler; @@ -1134,7 +1143,7 @@ public final class PowerManagerService extends SystemService mHoldingBootingSuspendBlocker = true; } if (mDisplaySuspendBlocker != null) { - mDisplaySuspendBlocker.acquire(); + mDisplaySuspendBlocker.acquire(HOLDING_DISPLAY_SUSPEND_BLOCKER); mHoldingDisplaySuspendBlocker = true; } mHalAutoSuspendModeEnabled = false; @@ -3529,13 +3538,13 @@ public final class PowerManagerService extends SystemService } @Override - public void acquireSuspendBlocker() { - mDisplaySuspendBlocker.acquire(); + public void acquireSuspendBlocker(String name) { + mDisplaySuspendBlocker.acquire(name); } @Override - public void releaseSuspendBlocker() { - mDisplaySuspendBlocker.release(); + public void releaseSuspendBlocker(String name) { + mDisplaySuspendBlocker.release(name); } }; @@ -3579,7 +3588,7 @@ public final class PowerManagerService extends SystemService mHoldingWakeLockSuspendBlocker = true; } if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) { - mDisplaySuspendBlocker.acquire(); + mDisplaySuspendBlocker.acquire(HOLDING_DISPLAY_SUSPEND_BLOCKER); mHoldingDisplaySuspendBlocker = true; } @@ -3609,7 +3618,7 @@ public final class PowerManagerService extends SystemService mHoldingWakeLockSuspendBlocker = false; } if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) { - mDisplaySuspendBlocker.release(); + mDisplaySuspendBlocker.release(HOLDING_DISPLAY_SUSPEND_BLOCKER); mHoldingDisplaySuspendBlocker = false; } @@ -5234,10 +5243,15 @@ public final class PowerManagerService extends SystemService } private final class SuspendBlockerImpl implements SuspendBlocker { + private static final String UNKNOWN_ID = "unknown"; private final String mName; private final String mTraceName; private int mReferenceCount; + // Maps suspend blocker IDs to a list (LongArray) of open acquisitions for the suspend + // blocker. Each value is a timestamp of when the acquisition was made. + private final ArrayMap<String, LongArray> mOpenReferenceTimes = new ArrayMap<>(); + public SuspendBlockerImpl(String name) { mName = name; mTraceName = "SuspendBlocker (" + name + ")"; @@ -5260,7 +5274,13 @@ public final class PowerManagerService extends SystemService @Override public void acquire() { + acquire(UNKNOWN_ID); + } + + @Override + public void acquire(String id) { synchronized (this) { + recordReferenceLocked(id); mReferenceCount += 1; if (mReferenceCount == 1) { if (DEBUG_SPEW) { @@ -5274,7 +5294,13 @@ public final class PowerManagerService extends SystemService @Override public void release() { + release(UNKNOWN_ID); + } + + @Override + public void release(String id) { synchronized (this) { + removeReferenceLocked(id); mReferenceCount -= 1; if (mReferenceCount == 0) { if (DEBUG_SPEW) { @@ -5293,7 +5319,32 @@ public final class PowerManagerService extends SystemService @Override public String toString() { synchronized (this) { - return mName + ": ref count=" + mReferenceCount; + StringBuilder builder = new StringBuilder(); + builder.append(mName); + builder.append(": ref count=").append(mReferenceCount); + builder.append(" ["); + int size = mOpenReferenceTimes.size(); + for (int i = 0; i < size; i++) { + String id = mOpenReferenceTimes.keyAt(i); + LongArray times = mOpenReferenceTimes.valueAt(i); + if (times == null || times.size() == 0) { + continue; + } + + if (i > 0) { + builder.append(", "); + } + builder.append(id).append(": ("); + for (int j = 0; j < times.size(); j++) { + if (j > 0) { + builder.append(", "); + } + builder.append(DATE_FORMAT.format(new Date(times.get(j)))); + } + builder.append(")"); + } + builder.append("]"); + return builder.toString(); } } @@ -5305,6 +5356,22 @@ public final class PowerManagerService extends SystemService } proto.end(sbToken); } + + private void recordReferenceLocked(String id) { + LongArray times = mOpenReferenceTimes.get(id); + if (times == null) { + times = new LongArray(); + mOpenReferenceTimes.put(id, times); + } + times.add(System.currentTimeMillis()); + } + + private void removeReferenceLocked(String id) { + LongArray times = mOpenReferenceTimes.get(id); + if (times != null && times.size() > 0) { + times.remove(times.size() - 1); + } + } } static final class UidState { diff --git a/services/core/java/com/android/server/power/SuspendBlocker.java b/services/core/java/com/android/server/power/SuspendBlocker.java index 565263f8ffaf..55c6a4937a90 100644 --- a/services/core/java/com/android/server/power/SuspendBlocker.java +++ b/services/core/java/com/android/server/power/SuspendBlocker.java @@ -35,6 +35,17 @@ interface SuspendBlocker { void acquire(); /** + * Acquires the suspend blocker. + * Prevents the CPU from going to sleep. + * + * Calls to acquire() nest and must be matched by the same number + * of calls to release(). + * + * @param id Identifier for this particular acquire. Used for tracking/logging. + */ + void acquire(String id); + + /** * Releases the suspend blocker. * Allows the CPU to go to sleep if no other suspend blockers are held. * @@ -43,5 +54,16 @@ interface SuspendBlocker { */ void release(); + /** + * Releases the suspend blocker. + * Allows the CPU to go to sleep if no other suspend blockers are held. + * + * It is an error to call release() if the suspend blocker has not been acquired. + * The system may crash. + * + * @param id Identifier for this particular release. Used for tracking/logging. + */ + void release(String id); + void dumpDebug(ProtoOutputStream proto, long fieldId); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 11fd99cf5b68..b00d8b47906a 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -144,11 +144,11 @@ public interface StatusBarManagerInternal { /** * @see com.android.internal.statusbar.IStatusBar#showToast(String, IBinder, CharSequence, - * IBinder, int, ITransientNotificationCallback) + * IBinder, int, ITransientNotificationCallback, int) */ void showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, - @Nullable ITransientNotificationCallback textCallback); + @Nullable ITransientNotificationCallback textCallback, int displayId); /** @see com.android.internal.statusbar.IStatusBar#hideToast(String, IBinder) */ void hideToast(String packageName, IBinder token); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index d48f26332017..46e7574e1c8a 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -631,10 +631,11 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, - @Nullable ITransientNotificationCallback callback) { + @Nullable ITransientNotificationCallback callback, int displayId) { if (mBar != null) { try { - mBar.showToast(uid, packageName, token, text, windowToken, duration, callback); + mBar.showToast(uid, packageName, token, text, windowToken, duration, callback, + displayId); } catch (RemoteException ex) { } } } diff --git a/services/core/java/com/android/server/testharness/OWNERS b/services/core/java/com/android/server/testharness/OWNERS new file mode 100644 index 000000000000..ffbbeb9312b9 --- /dev/null +++ b/services/core/java/com/android/server/testharness/OWNERS @@ -0,0 +1 @@ +williamhester@google.com diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java index 8b2b8b1cfbac..b6a413524c5c 100644 --- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java +++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java @@ -69,8 +69,8 @@ import java.util.Set; * automatic updates, etc.) are all disabled by default but may be re-enabled by the user. */ public class TestHarnessModeService extends SystemService { + public static final String TEST_HARNESS_MODE_PROPERTY = "persist.sys.test_harness"; private static final String TAG = TestHarnessModeService.class.getSimpleName(); - private static final String TEST_HARNESS_MODE_PROPERTY = "persist.sys.test_harness"; private PersistentDataBlockManagerInternal mPersistentDataBlockManagerInternal; @@ -168,9 +168,9 @@ public class TestHarnessModeService extends SystemService { Slog.d(TAG, "Restarted adbd"); } - // Disable the TTL for ADB keys before enabling ADB + // Disable the TTL for ADB keys before ADB is enabled as a part of AdbService's + // initialization. Settings.Global.putLong(cr, Settings.Global.ADB_ALLOWED_CONNECTION_TIME, 0); - Settings.Global.putInt(cr, Settings.Global.ADB_ENABLED, 1); Settings.Global.putInt(cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); Settings.Global.putInt(cr, Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 0); Settings.Global.putInt( diff --git a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java index 6e5011dacd82..3b4aa8e6b701 100644 --- a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java +++ b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java @@ -154,7 +154,7 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { for (InputWindowHandle window : windowHandles) { final boolean visible = (window.inputConfig & InputConfig.NOT_VISIBLE) == 0; - if (visible && window.getWindow() != null) { + if (visible && window.getWindow() != null && !window.isClone) { tempVisibleWindows.add(window); } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d73746c077ca..859b4df3baa6 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -670,9 +670,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * from the style of activity. Because we don't want {@link WindowContainer#getOrientation()} * to be affected by the temporal state of {@link ActivityClientController#convertToTranslucent} * when running ANIM_SCENE_TRANSITION. - * @see WindowContainer#fillsParent() + * @see WindowContainer#providesOrientation() */ - private final boolean mFillsParent; + private final boolean mStyleFillsParent; // The input dispatching timeout for this application token in milliseconds. long mInputDispatchingTimeoutMillis = DEFAULT_DISPATCHING_TIMEOUT_MILLIS; @@ -1971,10 +1971,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // This style is propagated to the main window attributes with // FLAG_SHOW_WALLPAPER from PhoneWindow#generateLayout. || ent.array.getBoolean(R.styleable.Window_windowShowWallpaper, false); - mFillsParent = mOccludesParent; + mStyleFillsParent = mOccludesParent; noDisplay = ent.array.getBoolean(R.styleable.Window_windowNoDisplay, false); } else { - mFillsParent = mOccludesParent = true; + mStyleFillsParent = mOccludesParent = true; noDisplay = false; } @@ -2880,8 +2880,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } @Override + boolean providesOrientation() { + return mStyleFillsParent; + } + + @Override boolean fillsParent() { - return mFillsParent; + return occludesParent(true /* includingFinishing */); } /** Returns true if this activity is not finishing, is opaque and fills the entire space of diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 7723a469aaa9..fb87576ba809 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -192,6 +192,7 @@ class ActivityStarter { private Task mInTask; private TaskFragment mInTaskFragment; + private TaskFragment mAddingToTaskFragment; @VisibleForTesting boolean mAddingToTask; @@ -2254,20 +2255,27 @@ class ActivityStarter { // In this situation we want to remove all activities from the task up to the one // being started. In most cases this means we are resetting the task to its initial // state. - final ActivityRecord top = targetTask.performClearTop(mStartActivity, mLaunchFlags); + final ActivityRecord clearTop = targetTask.performClearTop(mStartActivity, + mLaunchFlags); - if (top != null) { - if (top.isRootOfTask()) { + if (clearTop != null && !clearTop.finishing) { + if (clearTop.isRootOfTask()) { // Activity aliases may mean we use different intents for the top activity, // so make sure the task now has the identity of the new intent. - top.getTask().setIntent(mStartActivity); + clearTop.getTask().setIntent(mStartActivity); } - deliverNewIntent(top, intentGrants); + deliverNewIntent(clearTop, intentGrants); } else { // A special case: we need to start the activity because it is not currently // running, and the caller has asked to clear the current task to have this // activity at the top. mAddingToTask = true; + // Adding the new activity to the same embedded TF of the clear-top activity if + // possible. + if (clearTop != null && clearTop.getTaskFragment() != null + && clearTop.getTaskFragment().isEmbedded()) { + mAddingToTaskFragment = clearTop.getTaskFragment(); + } if (targetTask.getRootTask() == null) { // Target root task got cleared when we all activities were removed above. // Go ahead and reset it. @@ -2892,14 +2900,19 @@ class ActivityStarter { newParent = mInTaskFragment; } } else { - final ActivityRecord top = task.topRunningActivity(false /* focusableOnly */, - false /* includingEmbeddedTask */); - final TaskFragment taskFragment = top != null ? top.getTaskFragment() : null; - if (taskFragment != null && taskFragment.isEmbedded() - && canEmbedActivity(taskFragment, mStartActivity, false /* newTask */, task)) { + TaskFragment candidateTf = mAddingToTaskFragment != null ? mAddingToTaskFragment : null; + if (candidateTf == null) { + final ActivityRecord top = task.topRunningActivity(false /* focusableOnly */, + false /* includingEmbeddedTask */); + if (top != null) { + candidateTf = top.getTaskFragment(); + } + } + if (candidateTf != null && candidateTf.isEmbedded() + && canEmbedActivity(candidateTf, mStartActivity, false /* newTask */, task)) { // Use the embedded TaskFragment of the top activity as the new parent if the // activity can be embedded. - newParent = top.getTaskFragment(); + newParent = candidateTf; } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 95de040551b1..35f977de8290 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -146,6 +146,7 @@ import com.android.internal.util.function.pooled.PooledConsumer; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; +import com.android.server.am.HostingRecord; import com.android.server.am.UserState; import com.android.server.utils.Slogf; import com.android.server.wm.ActivityMetricsLogger.LaunchingState; @@ -1056,7 +1057,9 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { r.notifyUnknownVisibilityLaunchedForKeyguardTransition(); final boolean isTop = andResume && r.isTopRunningActivity(); - mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity"); + mService.startProcessAsync(r, knownToBeDead, isTop, + isTop ? HostingRecord.HOSTING_TYPE_TOP_ACTIVITY + : HostingRecord.HOSTING_TYPE_ACTIVITY); } boolean checkStartAnyActivityPermission(Intent intent, ActivityInfo aInfo, String resultWho, diff --git a/services/core/java/com/android/server/wm/PinnedTaskController.java b/services/core/java/com/android/server/wm/PinnedTaskController.java index 1ddeee9f46d9..4378b4f17b5b 100644 --- a/services/core/java/com/android/server/wm/PinnedTaskController.java +++ b/services/core/java/com/android/server/wm/PinnedTaskController.java @@ -172,7 +172,7 @@ class PinnedTaskController { */ void deferOrientationChangeForEnteringPipFromFullScreenIfNeeded() { final ActivityRecord topFullscreen = mDisplayContent.getActivity( - a -> a.fillsParent() && !a.getTask().inMultiWindowMode()); + a -> a.providesOrientation() && !a.getTask().inMultiWindowMode()); if (topFullscreen == null || topFullscreen.hasFixedRotationTransform()) { return; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 1bec2a5d68fa..bf5246f2339a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1644,7 +1644,7 @@ class Task extends TaskFragment { * activities on top of it and return the instance. * * @param newR Description of the new activity being started. - * @return Returns the old activity that should be continued to be used, + * @return Returns the existing activity in the task that performs the clear-top operation, * or {@code null} if none was found. */ private ActivityRecord clearTopActivities(ActivityRecord newR, int launchFlags) { @@ -1663,7 +1663,6 @@ class Task extends TaskFragment { && !ActivityStarter.isDocumentLaunchesIntoExisting(launchFlags)) { if (!r.finishing) { r.finishIfPossible("clear-task-top", false /* oomAdj */); - return null; } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 324f0296c5dd..eca0fd77fcb9 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -96,6 +96,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledPredicate; +import com.android.server.am.HostingRecord; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.FileDescriptor; @@ -1147,7 +1148,8 @@ class TaskFragment extends WindowContainer<WindowContainer> { // for the current activity to be paused. final boolean isTop = this == taskDisplayArea.getFocusedRootTask(); mAtmService.startProcessAsync(next, false /* knownToBeDead */, isTop, - isTop ? "pre-top-activity" : "pre-activity"); + isTop ? HostingRecord.HOSTING_TYPE_NEXT_TOP_ACTIVITY + : HostingRecord.HOSTING_TYPE_NEXT_ACTIVITY); } if (lastResumed != null) { lastResumed.setWillCloseOrEnterPip(true); @@ -2061,9 +2063,15 @@ class TaskFragment extends WindowContainer<WindowContainer> { final boolean inPipTransition = windowingMode == WINDOWING_MODE_PINNED && !mTmpFullBounds.isEmpty() && mTmpFullBounds.equals(parentBounds); if (WindowConfiguration.isFloating(windowingMode) && !inPipTransition) { - // For floating tasks, calculate the smallest width from the bounds of the task + // For floating tasks, calculate the smallest width from the bounds of the + // task, because they should not be affected by insets. inOutConfig.smallestScreenWidthDp = (int) ( Math.min(mTmpFullBounds.width(), mTmpFullBounds.height()) / density); + } else if (isEmbedded()) { + // For embedded TFs, the smallest width should be updated. Otherwise, inherit + // from the parent task would result in applications loaded wrong resource. + inOutConfig.smallestScreenWidthDp = + Math.min(inOutConfig.screenWidthDp, inOutConfig.screenHeightDp); } // otherwise, it will just inherit } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index f9d19e22ddc7..d7257180f01b 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1495,8 +1495,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< */ int getOrientation(int candidate) { mLastOrientationSource = null; - if (!fillsParent()) { - // Ignore containers that don't completely fill their parents. + if (!providesOrientation()) { return SCREEN_ORIENTATION_UNSET; } @@ -1530,8 +1529,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< continue; } - if (wc.fillsParent() || orientation != SCREEN_ORIENTATION_UNSPECIFIED) { - // Use the orientation if the container fills its parent or requested an explicit + if (wc.providesOrientation() || orientation != SCREEN_ORIENTATION_UNSPECIFIED) { + // Use the orientation if the container can provide or requested an explicit // orientation that isn't SCREEN_ORIENTATION_UNSPECIFIED. ProtoLog.v(WM_DEBUG_ORIENTATION, "%s is requesting orientation %d (%s)", wc.toString(), orientation, @@ -1560,6 +1559,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< return source; } + boolean providesOrientation() { + return fillsParent(); + } + /** * Returns true if this container is opaque and fills all the space made available by its parent * container. diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 870257802608..cb78ad834541 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -9290,22 +9290,39 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return poComponent; } } - final String supervisor = mContext.getResources().getString( - com.android.internal.R.string.config_defaultSupervisionProfileOwnerComponent); - if (supervisor == null) { - return null; + + // Check profile owner first as that is what most likely is set. + if (isSupervisionComponent(poComponent)) { + return poComponent; } - final ComponentName supervisorComponent = ComponentName.unflattenFromString(supervisor); - if (supervisorComponent == null) { - return null; + + if (isSupervisionComponent(doComponent)) { + return doComponent; } - if (supervisorComponent.equals(doComponent) || supervisorComponent.equals( - poComponent)) { - return supervisorComponent; - } else { - return null; + + return null; + } + } + + private boolean isSupervisionComponent(@Nullable ComponentName who) { + if (who == null) { + return false; + } + + final String configComponent = mContext.getResources().getString( + com.android.internal.R.string.config_defaultSupervisionProfileOwnerComponent); + if (configComponent != null) { + final ComponentName componentName = ComponentName.unflattenFromString(configComponent); + if (who.equals(componentName)) { + return true; } } + + // Check the system supervision role. + final String configPackage = mContext.getResources().getString( + com.android.internal.R.string.config_systemSupervision); + + return who.getPackageName().equals(configPackage); } @Override @@ -9491,22 +9508,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { "Cannot set the profile owner on a user which is already set-up"); if (!mIsWatch) { - final String supervisionRolePackage = mContext.getResources().getString( - com.android.internal.R.string.config_systemSupervision); - // Only the default supervision profile owner or supervision role holder - // can be set as profile owner after SUW - final String supervisor = mContext.getResources().getString( - com.android.internal.R.string - .config_defaultSupervisionProfileOwnerComponent); - if (supervisor == null && supervisionRolePackage == null) { - throw new IllegalStateException("Unable to set profile owner post-setup, no" - + "default supervisor profile owner defined"); - } - - final ComponentName supervisorComponent = ComponentName.unflattenFromString( - supervisor); - if (!owner.equals(supervisorComponent) - && !owner.getPackageName().equals(supervisionRolePackage)) { + if (!isSupervisionComponent(owner)) { throw new IllegalStateException("Unable to set non-default profile owner" + " post-setup " + owner); } @@ -12100,7 +12102,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { synchronized (getLockObject()) { // Allow testOnly admins to bypass supervision config requirement. Preconditions.checkCallAuthorization(isAdminTestOnlyLocked(who, caller.getUserId()) - || isDefaultSupervisor(caller), "Admin %s is not the " + || isSupervisionComponent(caller.getComponentName()), "Admin %s is not the " + "default supervision component", caller.getComponentName()); DevicePolicyData policy = getUserData(caller.getUserId()); policy.mSecondaryLockscreenEnabled = enabled; @@ -12119,16 +12121,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return isProfileOwner(caller) && isManagedProfile(caller.getUserId()); } - private boolean isDefaultSupervisor(CallerIdentity caller) { - final String supervisor = mContext.getResources().getString( - com.android.internal.R.string.config_defaultSupervisionProfileOwnerComponent); - if (supervisor == null) { - return false; - } - final ComponentName supervisorComponent = ComponentName.unflattenFromString(supervisor); - return caller.getComponentName().equals(supervisorComponent); - } - @Override public void setPreferentialNetworkServiceConfigs( List<PreferentialNetworkServiceConfig> preferentialNetworkServiceConfigs) { @@ -13012,16 +13004,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } - final String supervisionString = mContext.getResources().getString( - com.android.internal.R.string - .config_defaultSupervisionProfileOwnerComponent); - if (supervisionString == null) { - return false; - } - - final ComponentName supervisorComponent = ComponentName.unflattenFromString( - supervisionString); - return admin.info.getComponent().equals(supervisorComponent); + return isSupervisionComponent(admin.info.getComponent()); } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index ec6b67450a1a..8014d2502f48 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -3322,19 +3322,48 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - public void testIsActiveSupervisionApp() throws Exception { - when(mServiceContext.resources - .getString(R.string.config_defaultSupervisionProfileOwnerComponent)) - .thenReturn(admin1.flattenToString()); + public void testSupervisionConfig() throws Exception { + final int uid = UserHandle.getUid(15, 19436); + addManagedProfile(admin1, uid, admin1); + mContext.binder.callingUid = uid; - final int PROFILE_USER = 15; - final int PROFILE_ADMIN = UserHandle.getUid(PROFILE_USER, 19436); - addManagedProfile(admin1, PROFILE_ADMIN, admin1); - mContext.binder.callingUid = PROFILE_ADMIN; + verifySupervisionConfig(uid, null, null); + verifySupervisionConfig(uid, "", null); + verifySupervisionConfig(uid, null, ""); + verifySupervisionConfig(uid, "", ""); + + verifySupervisionConfig(uid, admin1.flattenToString(), null); + verifySupervisionConfig(uid, admin1.flattenToString(), ""); + + verifySupervisionConfig(uid, null, admin1.getPackageName()); + verifySupervisionConfig(uid, "", admin1.getPackageName()); + } + + private void verifySupervisionConfig( + int uid , String configComponentName, String configPackageName) { + final boolean isAdmin = admin1.flattenToString().equals(configComponentName) + || admin1.getPackageName().equals(configPackageName); + final UserHandle user = UserHandle.getUserHandleForUid(uid); final DevicePolicyManagerInternal dpmi = LocalServices.getService(DevicePolicyManagerInternal.class); - assertThat(dpmi.isActiveSupervisionApp(PROFILE_ADMIN)).isTrue(); + + when(mServiceContext.resources + .getString(R.string.config_defaultSupervisionProfileOwnerComponent)) + .thenReturn(configComponentName); + + when(mServiceContext.resources + .getString(R.string.config_systemSupervision)) + .thenReturn(configPackageName); + + if (isAdmin) { + assertThat(dpmi.isActiveSupervisionApp(uid)).isTrue(); + assertThat(dpm.getProfileOwnerOrDeviceOwnerSupervisionComponent(user)) + .isEqualTo(admin1); + } else { + assertThat(dpmi.isActiveSupervisionApp(uid)).isFalse(); + assertThat(dpm.getProfileOwnerOrDeviceOwnerSupervisionComponent(user)).isNull(); + } } // Test if lock timeout on managed profile is handled correctly depending on whether profile diff --git a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java index 57a9cb278c80..9fe8609c85a1 100644 --- a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java +++ b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java @@ -24,6 +24,8 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.hardware.display.BrightnessConfiguration; +import android.os.Handler; +import android.os.test.TestLooper; import android.util.Pair; import androidx.test.InstrumentationRegistry; @@ -47,11 +49,14 @@ import java.nio.charset.StandardCharsets; public class PersistentDataStoreTest { private PersistentDataStore mDataStore; private TestInjector mInjector; + private TestLooper mTestLooper; @Before public void setUp() { mInjector = new TestInjector(); - mDataStore = new PersistentDataStore(mInjector); + mTestLooper = new TestLooper(); + Handler handler = new Handler(mTestLooper.getLooper()); + mDataStore = new PersistentDataStore(mInjector, handler); } @Test @@ -147,7 +152,7 @@ public class PersistentDataStoreTest { } @Test - public void testStoreAndReloadOfDisplayBrightnessConfigurations() { + public void testStoreAndReloadOfDisplayBrightnessConfigurations() throws InterruptedException { final String uniqueDisplayId = "test:123"; int userSerial = 0; String packageName = "pdsTestPackage"; @@ -178,6 +183,7 @@ public class PersistentDataStoreTest { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); mInjector.setWriteStream(baos); mDataStore.saveIfNeeded(); + mTestLooper.dispatchAll(); assertTrue(mInjector.wasWriteSuccessful()); TestInjector newInjector = new TestInjector(); PersistentDataStore newDataStore = new PersistentDataStore(newInjector); @@ -222,7 +228,7 @@ public class PersistentDataStoreTest { } @Test - public void testStoreAndReloadOfBrightnessConfigurations() { + public void testStoreAndReloadOfBrightnessConfigurations() throws InterruptedException { final float[] lux = { 0f, 10f }; final float[] nits = {1f, 100f }; final BrightnessConfiguration config = new BrightnessConfiguration.Builder(lux, nits) @@ -238,6 +244,7 @@ public class PersistentDataStoreTest { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); mInjector.setWriteStream(baos); mDataStore.saveIfNeeded(); + mTestLooper.dispatchAll(); assertTrue(mInjector.wasWriteSuccessful()); TestInjector newInjector = new TestInjector(); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 0d56975f51d0..22721a1bcc92 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -6227,13 +6227,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // first time trying to show the toast, showToast gets called nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); verify(mStatusBar, times(1)) - .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), anyInt()); // second time trying to show the same toast, showToast isn't called again (total number of // invocations stays at one) nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); verify(mStatusBar, times(1)) - .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), anyInt()); } @Test @@ -6255,7 +6255,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); verify(mStatusBar, times(0)) - .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), anyInt()); } @Test @@ -6277,7 +6277,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); verify(mStatusBar, times(1)) - .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), anyInt()); } @Test @@ -6297,7 +6297,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { INotificationManager nmService = (INotificationManager) mService.mService; nmService.enqueueTextToast(testPackage, token, "Text", 2000, 0, null); - verify(mStatusBar).showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + verify(mStatusBar).showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), + anyInt()); } @Test @@ -6326,7 +6327,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // but never shown verify(mStatusBar, times(0)) - .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + .showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), anyInt()); // and removed when rate limited verify(mWindowManagerInternal) @@ -6417,7 +6418,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // enqueue toast -> no toasts enqueued ((INotificationManager) mService.mService).enqueueTextToast(testPackage, new Binder(), "Text", 2000, 0, null); - verify(mStatusBar).showToast(anyInt(), any(), any(), any(), any(), anyInt(), any()); + verify(mStatusBar).showToast(anyInt(), any(), any(), any(), any(), anyInt(), any(), + anyInt()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 12e565394926..8c4a4c9ea284 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -756,8 +756,8 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityRecord activity = createActivityWithTask(); ActivityRecord topActivity = new ActivityBuilder(mAtm).setTask(activity.getTask()).build(); topActivity.setOccludesParent(false); - // The requested occluding state doesn't affect whether it fills parent. - assertTrue(topActivity.fillsParent()); + // The requested occluding state doesn't affect whether it can decide orientation. + assertTrue(topActivity.providesOrientation()); activity.setState(STOPPED, "Testing"); activity.setVisibility(true); activity.makeActiveIfNeeded(null /* activeActivity */); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 9304761fc1c9..202168bae869 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -266,7 +266,7 @@ public class TaskTests extends WindowTestsBase { // Detach from process so the activities can be removed from hierarchy when finishing. activity1.detachFromProcess(); activity2.detachFromProcess(); - assertNull(task.performClearTop(activity1, 0 /* launchFlags */)); + assertTrue(task.performClearTop(activity1, 0 /* launchFlags */).finishing); assertFalse(task.hasChild()); // In real case, the task should be preserved for adding new activity. assertTrue(task.isAttached()); diff --git a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java index 7e3990d95915..7d5be8ea9a79 100644 --- a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java +++ b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java @@ -23,15 +23,23 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager.ProcessState; +import android.app.role.OnRoleHoldersChangedListener; +import android.app.role.RoleManager; import android.app.usage.BroadcastResponseStats; +import android.content.Context; +import android.content.pm.PackageManager; import android.os.SystemClock; import android.os.UserHandle; +import android.permission.PermissionManager; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.LongArrayQueue; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; +import com.android.internal.os.BackgroundThread; +import com.android.internal.util.CollectionUtils; import com.android.internal.util.IndentingPrintWriter; import java.lang.annotation.Retention; @@ -71,14 +79,33 @@ class BroadcastResponseStatsTracker { private SparseArray<SparseArray<UserBroadcastResponseStats>> mUserResponseStats = new SparseArray<>(); + /** + * Cache of package names holding exempted roles. + * + * Contains the mapping of userId -> {roleName -> <packages>} data. + */ + // TODO: Use SparseArrayMap to simplify the logic. + @GuardedBy("mLock") + private SparseArray<ArrayMap<String, List<String>>> mExemptedRoleHoldersCache = + new SparseArray<>(); + private final OnRoleHoldersChangedListener mRoleHoldersChangedListener = + this::onRoleHoldersChanged; + private AppStandbyInternal mAppStandby; private BroadcastResponseStatsLogger mLogger; + private RoleManager mRoleManager; BroadcastResponseStatsTracker(@NonNull AppStandbyInternal appStandby) { mAppStandby = appStandby; mLogger = new BroadcastResponseStatsLogger(); } + void onSystemServicesReady(Context context) { + mRoleManager = context.getSystemService(RoleManager.class); + mRoleManager.addOnRoleHoldersChangedListenerAsUser(BackgroundThread.getExecutor(), + mRoleHoldersChangedListener, UserHandle.ALL); + } + // TODO (206518114): Move all callbacks handling to a handler thread. void reportBroadcastDispatchEvent(int sourceUid, @NonNull String targetPackage, UserHandle targetUser, long idForResponseEvent, @@ -86,10 +113,19 @@ class BroadcastResponseStatsTracker { mLogger.logBroadcastDispatchEvent(sourceUid, targetPackage, targetUser, idForResponseEvent, timestampMs, targetUidProcState); if (targetUidProcState <= mAppStandby.getBroadcastResponseFgThresholdState()) { - // No need to track the broadcast response state while the target app is + // No need to track the broadcast response stats while the target app is // in the foreground. return; } + if (doesPackageHoldExemptedRole(targetPackage, targetUser)) { + // Package holds an exempted role, so no need to track the broadcast response stats. + return; + } + if (doesPackageHoldExemptedPermission(targetPackage, targetUser)) { + // Package holds an exempted permission, so no need to track the broadcast response + // stats + return; + } synchronized (mLock) { final ArraySet<BroadcastEvent> broadcastEvents = getOrCreateBroadcastEventsLocked(targetPackage, targetUser); @@ -253,6 +289,62 @@ class BroadcastResponseStatsTracker { } } + boolean doesPackageHoldExemptedRole(@NonNull String packageName, @NonNull UserHandle user) { + final List<String> exemptedRoles = mAppStandby.getBroadcastResponseExemptedRoles(); + synchronized (mLock) { + for (int i = exemptedRoles.size() - 1; i >= 0; --i) { + final String roleName = exemptedRoles.get(i); + final List<String> roleHolders = getRoleHoldersLocked(roleName, user); + if (CollectionUtils.contains(roleHolders, packageName)) { + return true; + } + } + } + return false; + } + + boolean doesPackageHoldExemptedPermission(@NonNull String packageName, + @NonNull UserHandle user) { + final List<String> exemptedPermissions = mAppStandby + .getBroadcastResponseExemptedPermissions(); + for (int i = exemptedPermissions.size() - 1; i >= 0; --i) { + final String permissionName = exemptedPermissions.get(i); + if (PermissionManager.checkPackageNamePermission(permissionName, packageName, + user.getIdentifier()) == PackageManager.PERMISSION_GRANTED) { + return true; + } + } + return false; + } + + @GuardedBy("mLock") + @Nullable + private List<String> getRoleHoldersLocked(@NonNull String roleName, @NonNull UserHandle user) { + ArrayMap<String, List<String>> roleHoldersForUser = mExemptedRoleHoldersCache.get( + user.getIdentifier()); + if (roleHoldersForUser == null) { + roleHoldersForUser = new ArrayMap<>(); + mExemptedRoleHoldersCache.put(user.getIdentifier(), roleHoldersForUser); + } + List<String> roleHolders = roleHoldersForUser.get(roleName); + if (roleHolders == null && mRoleManager != null) { + roleHolders = mRoleManager.getRoleHoldersAsUser(roleName, user); + roleHoldersForUser.put(roleName, roleHolders); + } + return roleHolders; + } + + private void onRoleHoldersChanged(@NonNull String roleName, @NonNull UserHandle user) { + synchronized (mLock) { + final ArrayMap<String, List<String>> roleHoldersForUser = + mExemptedRoleHoldersCache.get(user.getIdentifier()); + if (roleHoldersForUser == null) { + return; + } + roleHoldersForUser.remove(roleName); + } + } + void onUserRemoved(@UserIdInt int userId) { synchronized (mLock) { mUserBroadcastEvents.remove(userId); @@ -260,6 +352,7 @@ class BroadcastResponseStatsTracker { for (int i = mUserResponseStats.size() - 1; i >= 0; --i) { mUserResponseStats.valueAt(i).remove(userId); } + mExemptedRoleHoldersCache.remove(userId); } } @@ -373,6 +466,8 @@ class BroadcastResponseStatsTracker { ipw.println(); dumpResponseStatsLocked(ipw); ipw.println(); + dumpRoleHoldersLocked(ipw); + ipw.println(); mLogger.dumpLogs(ipw); } @@ -417,5 +512,32 @@ class BroadcastResponseStatsTracker { } ipw.decreaseIndent(); } + + @GuardedBy("mLock") + private void dumpRoleHoldersLocked(@NonNull IndentingPrintWriter ipw) { + ipw.println("Role holders:"); + ipw.increaseIndent(); + for (int userIdx = 0; userIdx < mExemptedRoleHoldersCache.size(); ++userIdx) { + final int userId = mExemptedRoleHoldersCache.keyAt(userIdx); + final ArrayMap<String, List<String>> roleHoldersForUser = + mExemptedRoleHoldersCache.valueAt(userIdx); + ipw.println("User " + userId + ":"); + ipw.increaseIndent(); + for (int roleIdx = 0; roleIdx < roleHoldersForUser.size(); ++roleIdx) { + final String roleName = roleHoldersForUser.keyAt(roleIdx); + final List<String> holders = roleHoldersForUser.valueAt(roleIdx); + ipw.print(roleName + ": "); + for (int holderIdx = 0; holderIdx < holders.size(); ++holderIdx) { + if (holderIdx > 0) { + ipw.print(", "); + } + ipw.print(holders.get(holderIdx)); + } + ipw.println(); + } + ipw.decreaseIndent(); + } + ipw.decreaseIndent(); + } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 078177b3a89f..ef13cd964f6c 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -357,6 +357,7 @@ public class UsageStatsService extends SystemService implements getDpmInternal(); // initialize mShortcutServiceInternal getShortcutServiceInternal(); + mResponseStatsTracker.onSystemServicesReady(getContext()); if (ENABLE_KERNEL_UPDATES && KERNEL_COUNTER_FILE.exists()) { try { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 055864834b3b..39a6868169a7 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -70,6 +70,7 @@ import com.android.internal.app.IHotwordRecognitionStatusCallback; import com.android.internal.app.IVoiceActionCheckCallback; import com.android.internal.app.IVoiceInteractionSessionShowCallback; import com.android.internal.app.IVoiceInteractor; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; import com.android.server.wm.ActivityAssistInfo; import com.android.server.wm.ActivityTaskManagerInternal; @@ -86,10 +87,14 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne final static String CLOSE_REASON_VOICE_INTERACTION = "voiceinteraction"; + /** The delay time for retrying to request DirectActions. */ + private static final long REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS = 200; + final boolean mValid; final Context mContext; final Handler mHandler; + final Handler mDirectActionsHandler; final VoiceInteractionManagerService.VoiceInteractionManagerServiceStub mServiceStub; final int mUser; final ComponentName mComponent; @@ -184,6 +189,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne int userHandle, ComponentName service) { mContext = context; mHandler = handler; + mDirectActionsHandler = new Handler(true); mServiceStub = stub; mUser = userHandle; mComponent = service; @@ -343,7 +349,10 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne .getAttachedNonFinishingActivityForTask(taskId, null); if (tokens == null || tokens.getAssistToken() != assistToken) { Slog.w(TAG, "Unknown activity to query for direct actions"); - callback.sendResult(null); + mDirectActionsHandler.sendMessageDelayed(PooledLambda.obtainMessage( + VoiceInteractionManagerServiceImpl::retryRequestDirectActions, + VoiceInteractionManagerServiceImpl.this, token, taskId, assistToken, + cancellationCallback, callback), REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS); } else { try { tokens.getApplicationThread().requestDirectActions(tokens.getActivityToken(), @@ -355,6 +364,33 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne } } + private void retryRequestDirectActions(@NonNull IBinder token, int taskId, + @NonNull IBinder assistToken, @Nullable RemoteCallback cancellationCallback, + @NonNull RemoteCallback callback) { + synchronized (mServiceStub) { + if (mActiveSession == null || token != mActiveSession.mToken) { + Slog.w(TAG, "retryRequestDirectActions does not match active session"); + callback.sendResult(null); + return; + } + final ActivityTokens tokens = LocalServices.getService( + ActivityTaskManagerInternal.class) + .getAttachedNonFinishingActivityForTask(taskId, null); + if (tokens == null || tokens.getAssistToken() != assistToken) { + Slog.w(TAG, "Unknown activity to query for direct actions during retrying"); + callback.sendResult(null); + } else { + try { + tokens.getApplicationThread().requestDirectActions(tokens.getActivityToken(), + mActiveSession.mInteractor, cancellationCallback, callback); + } catch (RemoteException e) { + Slog.w("Unexpected remote error", e); + callback.sendResult(null); + } + } + } + } + void performDirectActionLocked(@NonNull IBinder token, @NonNull String actionId, @Nullable Bundle arguments, int taskId, IBinder assistToken, @Nullable RemoteCallback cancellationCallback, |