diff options
364 files changed, 7579 insertions, 3125 deletions
diff --git a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt index d5ed95f18f93..90dca25b3b70 100644 --- a/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt +++ b/apct-tests/perftests/core/src/android/os/PackageParsingPerfTest.kt @@ -159,7 +159,15 @@ class PackageParsingPerfTest { PARALLEL_MAX_THREADS, "package-parsing-test", Process.THREAD_PRIORITY_FOREGROUND) - fun submit(file: File) = service.submit { queue.put(parse(file)) } + fun submit(file: File) { + service.submit { + try { + queue.put(parse(file)) + } catch (e: Exception) { + queue.put(e) + } + } + } fun take() = queue.poll(QUEUE_POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS) diff --git a/core/api/current.txt b/core/api/current.txt index 39d0b8c6bf1a..1299ce59253d 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -174,6 +174,7 @@ package android { field public static final String USE_FULL_SCREEN_INTENT = "android.permission.USE_FULL_SCREEN_INTENT"; field public static final String USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER = "android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER"; field public static final String USE_SIP = "android.permission.USE_SIP"; + field public static final String UWB_RANGING = "android.permission.UWB_RANGING"; field public static final String VIBRATE = "android.permission.VIBRATE"; field public static final String WAKE_LOCK = "android.permission.WAKE_LOCK"; field public static final String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 696494b0248c..3f2aa79da3fc 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -5274,7 +5274,7 @@ package android.media { method @NonNull public java.util.List<android.media.MediaRoute2Info> getAllRoutes(); method @Nullable public String getClientPackageName(); method @Nullable public android.media.MediaRouter2.RoutingController getController(@NonNull String); - method @Nullable public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String); + method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String); method public void setRouteVolume(@NonNull android.media.MediaRoute2Info, int); method public void startScan(); method public void stopScan(); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 6ce0b2283603..5a35bbed3fa4 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1223,8 +1223,11 @@ public class AppOpsManager { public static final int OP_MANAGE_MEDIA = AppProtoEnums.APP_OP_MANAGE_MEDIA; /** @hide */ + public static final int OP_UWB_RANGING = AppProtoEnums.APP_OP_UWB_RANGING; + + /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public static final int _NUM_OP = 112; + public static final int _NUM_OP = 113; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1637,6 +1640,8 @@ public class AppOpsManager { * @hide */ public static final String OPSTR_MANAGE_MEDIA = "android:manage_media"; + /** @hide */ + public static final String OPSTR_UWB_RANGING = "android:uwb_ranging"; /** {@link #sAppOpsToNote} not initialized yet for this op */ private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0; @@ -1706,6 +1711,7 @@ public class AppOpsManager { // Nearby devices OP_BLUETOOTH_SCAN, OP_BLUETOOTH_CONNECT, + OP_UWB_RANGING, // APPOP PERMISSIONS OP_ACCESS_NOTIFICATIONS, @@ -1846,6 +1852,7 @@ public class AppOpsManager { OP_COARSE_LOCATION, // OP_COARSE_LOCATION_SOURCE OP_MANAGE_MEDIA, // MANAGE_MEDIA OP_BLUETOOTH_CONNECT, // OP_BLUETOOTH_CONNECT + OP_UWB_RANGING, // OP_UWB_RANGING }; /** @@ -1964,6 +1971,7 @@ public class AppOpsManager { OPSTR_COARSE_LOCATION_SOURCE, OPSTR_MANAGE_MEDIA, OPSTR_BLUETOOTH_CONNECT, + OPSTR_UWB_RANGING, }; /** @@ -2083,6 +2091,7 @@ public class AppOpsManager { "COARSE_LOCATION_SOURCE", "MANAGE_MEDIA", "BLUETOOTH_CONNECT", + "UWB_RANGING" }; /** @@ -2203,6 +2212,7 @@ public class AppOpsManager { null, // no permission for OP_ACCESS_COARSE_LOCATION_SOURCE, Manifest.permission.MANAGE_MEDIA, Manifest.permission.BLUETOOTH_CONNECT, + Manifest.permission.UWB_RANGING, }; /** @@ -2323,6 +2333,7 @@ public class AppOpsManager { null, // ACCESS_COARSE_LOCATION_SOURCE null, // MANAGE_MEDIA null, // BLUETOOTH_CONNECT + null, // UWB_RANGING }; /** @@ -2442,6 +2453,7 @@ public class AppOpsManager { null, // ACCESS_COARSE_LOCATION_SOURCE null, // MANAGE_MEDIA null, // BLUETOOTH_CONNECT + null, // UWB_RANGING }; /** @@ -2560,6 +2572,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // ACCESS_COARSE_LOCATION_SOURCE AppOpsManager.MODE_DEFAULT, // MANAGE_MEDIA AppOpsManager.MODE_ALLOWED, // BLUETOOTH_CONNECT + AppOpsManager.MODE_ALLOWED, // UWB_RANGING }; /** @@ -2682,6 +2695,7 @@ public class AppOpsManager { false, // ACCESS_COARSE_LOCATION_SOURCE false, // MANAGE_MEDIA false, // BLUETOOTH_CONNECT + false, // UWB_RANGING }; /** diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index d64e1f98517e..92f707e543c8 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -9148,9 +9148,12 @@ public class Notification implements Parcelable * </pre> */ public static class CallStyle extends Style { - private static final int CALL_TYPE_INCOMING = 1; - private static final int CALL_TYPE_ONGOING = 2; - private static final int CALL_TYPE_SCREENING = 3; + /** @hide */ + public static final int CALL_TYPE_INCOMING = 1; + /** @hide */ + public static final int CALL_TYPE_ONGOING = 2; + /** @hide */ + public static final int CALL_TYPE_SCREENING = 3; /** * This is a key used privately on the action.extras to give spacing priority diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index 7696cbe0b631..7ecb11248d23 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -42,7 +42,6 @@ import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import libcore.io.IoUtils; @@ -162,20 +161,18 @@ public abstract class RegisteredServicesCache<V> { intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); intentFilter.addDataScheme("package"); - Handler handler = BackgroundThread.getHandler(); - mContext.registerReceiverAsUser( - mPackageReceiver, UserHandle.ALL, intentFilter, null, handler); + mContext.registerReceiverAsUser(mPackageReceiver, UserHandle.ALL, intentFilter, null, null); // Register for events related to sdcard installation. IntentFilter sdFilter = new IntentFilter(); sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); - mContext.registerReceiver(mExternalReceiver, sdFilter, null, handler); + mContext.registerReceiver(mExternalReceiver, sdFilter); // Register for user-related events IntentFilter userFilter = new IntentFilter(); sdFilter.addAction(Intent.ACTION_USER_REMOVED); - mContext.registerReceiver(mUserRemovedReceiver, userFilter, null, handler); + mContext.registerReceiver(mUserRemovedReceiver, userFilter); } private void handlePackageEvent(Intent intent, int userId) { @@ -268,7 +265,7 @@ public abstract class RegisteredServicesCache<V> { public void setListener(RegisteredServicesCacheListener<V> listener, Handler handler) { if (handler == null) { - handler = BackgroundThread.getHandler(); + handler = new Handler(mContext.getMainLooper()); } synchronized (this) { mHandler = handler; diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 726bca4d1cd2..1e62a15772e9 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -1382,6 +1382,8 @@ public final class CameraManager { // devices going offline (in real world scenarios, these permissions aren't // changeable). Future calls to getCameraIdList() will reflect the changes in // the camera id list after getCameraIdListNoLazy() is called. + // We need to remove the torch ids which may have been associated with the + // devices removed as well. This is the same situation. cameraStatuses = mCameraService.addListener(testListener); mCameraService.removeListener(testListener); for (CameraStatus c : cameraStatuses) { @@ -1400,6 +1402,7 @@ public final class CameraManager { } for (String id : deviceIdsToRemove) { onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, id); + mTorchStatus.remove(id); } } catch (ServiceSpecificException e) { // Unexpected failure diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java index d09094cee1bf..344b20c036a0 100644 --- a/core/java/android/net/vcn/VcnManager.java +++ b/core/java/android/net/vcn/VcnManager.java @@ -437,7 +437,7 @@ public class VcnManager { * Invoked when status of the VCN for this callback's subscription group changes. * * @param statusCode the code for the status change encountered by this {@link - * VcnStatusCallback}'s subscription group. + * VcnStatusCallback}'s subscription group. This value will be one of VCN_STATUS_CODE_*. */ public abstract void onStatusChanged(@VcnStatusCode int statusCode); @@ -449,7 +449,8 @@ public class VcnManager { * encountering an error. This will match the name for exactly one {@link * VcnGatewayConnectionConfig} for the {@link VcnConfig} configured for this callback's * subscription group - * @param errorCode the code to indicate the error that occurred + * @param errorCode the code to indicate the error that occurred. This value will be one of + * VCN_ERROR_CODE_*. * @param detail Throwable to provide additional information about the error, or {@code * null} if none */ diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java index 2b6f336848c3..033148379041 100644 --- a/core/java/android/os/BatteryConsumer.java +++ b/core/java/android/os/BatteryConsumer.java @@ -124,6 +124,30 @@ public abstract class BatteryConsumer { public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999; + /** + * Identifiers of models used for power estimation. + * + * @hide + */ + @IntDef(prefix = {"POWER_MODEL_"}, value = { + POWER_MODEL_POWER_PROFILE, + POWER_MODEL_MEASURED_ENERGY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PowerModel { + } + + /** + * Power model that is based on average consumption rates that hardware components + * consume in various states. + */ + public static final int POWER_MODEL_POWER_PROFILE = 0; + + /** + * Power model that is based on energy consumption measured by on-device power monitors. + */ + public static final int POWER_MODEL_MEASURED_ENERGY = 1; + private final PowerComponents mPowerComponents; protected BatteryConsumer(@NonNull PowerComponents powerComponents) { @@ -149,6 +173,16 @@ public abstract class BatteryConsumer { } /** + * Returns the ID of the model that was used for power estimation. + * + * @param componentId The ID of the power component, e.g. + * {@link BatteryConsumer#POWER_COMPONENT_CPU}. + */ + public @PowerModel int getPowerModel(@BatteryConsumer.PowerComponent int componentId) { + return mPowerComponents.getPowerModel(componentId); + } + + /** * Returns the amount of drain attributed to the specified custom drain type. * * @param componentId The ID of the custom power component. @@ -188,9 +222,10 @@ public abstract class BatteryConsumer { protected abstract static class BaseBuilder<T extends BaseBuilder<?>> { final PowerComponents.Builder mPowerComponentsBuilder; - public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount) { + public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount, + boolean includePowerModels) { mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount, - customTimeComponentCount); + customTimeComponentCount, includePowerModels); } /** @@ -200,10 +235,23 @@ public abstract class BatteryConsumer { * {@link BatteryConsumer#POWER_COMPONENT_CPU}. * @param componentPower Amount of consumed power in mAh. */ - @SuppressWarnings("unchecked") @NonNull public T setConsumedPower(@PowerComponent int componentId, double componentPower) { - mPowerComponentsBuilder.setConsumedPower(componentId, componentPower); + return setConsumedPower(componentId, componentPower, POWER_MODEL_POWER_PROFILE); + } + + /** + * Sets the amount of drain attributed to the specified drain type, e.g. CPU, WiFi etc. + * + * @param componentId The ID of the power component, e.g. + * {@link BatteryConsumer#POWER_COMPONENT_CPU}. + * @param componentPower Amount of consumed power in mAh. + */ + @SuppressWarnings("unchecked") + @NonNull + public T setConsumedPower(@PowerComponent int componentId, double componentPower, + @PowerModel int powerModel) { + mPowerComponentsBuilder.setConsumedPower(componentId, componentPower, powerModel); return (T) this; } diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index bcd00b21e97d..f2887748f460 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -261,6 +261,7 @@ public final class BatteryUsageStats implements Parcelable { public static final class Builder { private final int mCustomPowerComponentCount; private final int mCustomTimeComponentCount; + private final boolean mIncludePowerModels; private long mStatsStartTimestampMs; private int mDischargePercentage; private double mDischargedPowerLowerBoundMah; @@ -277,8 +278,14 @@ public final class BatteryUsageStats implements Parcelable { private List<BatteryStats.HistoryTag> mHistoryTagPool; public Builder(int customPowerComponentCount, int customTimeComponentCount) { + this(customPowerComponentCount, customTimeComponentCount, false); + } + + public Builder(int customPowerComponentCount, int customTimeComponentCount, + boolean includePowerModels) { mCustomPowerComponentCount = customPowerComponentCount; mCustomTimeComponentCount = customTimeComponentCount; + mIncludePowerModels = includePowerModels; } /** @@ -360,7 +367,7 @@ public final class BatteryUsageStats implements Parcelable { UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid); if (builder == null) { builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount, - mCustomTimeComponentCount, batteryStatsUid); + mCustomTimeComponentCount, mIncludePowerModels, batteryStatsUid); mUidBatteryConsumerBuilders.put(uid, builder); } return builder; @@ -376,7 +383,7 @@ public final class BatteryUsageStats implements Parcelable { SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType); if (builder == null) { builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount, - mCustomTimeComponentCount, drainType); + mCustomTimeComponentCount, mIncludePowerModels, drainType); mSystemBatteryConsumerBuilders.put(drainType, builder); } return builder; @@ -391,7 +398,7 @@ public final class BatteryUsageStats implements Parcelable { UserBatteryConsumer.Builder builder = mUserBatteryConsumerBuilders.get(userId); if (builder == null) { builder = new UserBatteryConsumer.Builder(mCustomPowerComponentCount, - mCustomTimeComponentCount, userId); + mCustomTimeComponentCount, mIncludePowerModels, userId); mUserBatteryConsumerBuilders.put(userId, builder); } return builder; diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 85861bc1d2aa..50804422e92f 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -60,6 +60,12 @@ public final class BatteryUsageStatsQuery implements Parcelable { */ public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY = 2; + /** + * Indicates that identifiers of power models used for computations of power + * consumption should be included in the BatteryUsageStats. + */ + public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS = 4; + private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000; private final int mFlags; @@ -187,6 +193,17 @@ public final class BatteryUsageStatsQuery implements Parcelable { } /** + * Requests to return identifiers of models that were used for estimation + * of power consumption. + * + * Should only be used for testing and debugging. + */ + public Builder includePowerModels() { + mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS; + return this; + } + + /** * Set the client's tolerance for stale battery stats. The data may be up to * this many milliseconds out-of-date. */ diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java index d239b23b6ff6..238f4518b7d3 100644 --- a/core/java/android/os/PowerComponents.java +++ b/core/java/android/os/PowerComponents.java @@ -33,12 +33,14 @@ class PowerComponents { private final double[] mPowerComponentsMah; private final long[] mTimeComponentsMs; private final int mCustomPowerComponentCount; + private final byte[] mPowerModels; PowerComponents(@NonNull Builder builder) { mCustomPowerComponentCount = builder.mCustomPowerComponentCount; mPowerComponentsMah = builder.mPowerComponentsMah; mTimeComponentsMs = builder.mTimeComponentsMs; mTotalConsumedPowerMah = builder.getTotalPower(); + mPowerModels = builder.mPowerModels; } PowerComponents(@NonNull Parcel source) { @@ -46,6 +48,12 @@ class PowerComponents { mCustomPowerComponentCount = source.readInt(); mPowerComponentsMah = source.createDoubleArray(); mTimeComponentsMs = source.createLongArray(); + if (source.readBoolean()) { + mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT]; + source.readByteArray(mPowerModels); + } else { + mPowerModels = null; + } } /** Writes contents to Parcel */ @@ -54,6 +62,12 @@ class PowerComponents { dest.writeInt(mCustomPowerComponentCount); dest.writeDoubleArray(mPowerComponentsMah); dest.writeLongArray(mTimeComponentsMs); + if (mPowerModels != null) { + dest.writeBoolean(true); + dest.writeByteArray(mPowerModels); + } else { + dest.writeBoolean(false); + } } /** @@ -103,6 +117,15 @@ class PowerComponents { } } + @BatteryConsumer.PowerModel + int getPowerModel(@BatteryConsumer.PowerComponent int component) { + if (mPowerModels == null) { + throw new IllegalStateException( + "Power model IDs were not requested in the BatteryUsageStatsQuery"); + } + return mPowerModels[component]; + } + /** * Returns the amount of time used by the specified component, e.g. CPU, WiFi etc. * @@ -148,14 +171,21 @@ class PowerComponents { private final double[] mPowerComponentsMah; private final int mCustomPowerComponentCount; private final long[] mTimeComponentsMs; + private final byte[] mPowerModels; - Builder(int customPowerComponentCount, int customTimeComponentCount) { + Builder(int customPowerComponentCount, int customTimeComponentCount, + boolean includePowerModels) { mCustomPowerComponentCount = customPowerComponentCount; int powerComponentCount = BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount; mPowerComponentsMah = new double[powerComponentCount]; mTimeComponentsMs = new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount]; + if (includePowerModels) { + mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT]; + } else { + mPowerModels = null; + } } /** @@ -167,7 +197,7 @@ class PowerComponents { */ @NonNull public Builder setConsumedPower(@BatteryConsumer.PowerComponent int componentId, - double componentPower) { + double componentPower, @BatteryConsumer.PowerModel int powerModel) { if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) { throw new IllegalArgumentException( "Unsupported power component ID: " + componentId); @@ -178,6 +208,9 @@ class PowerComponents { throw new IllegalArgumentException( "Unsupported power component ID: " + componentId); } + if (mPowerModels != null) { + mPowerModels[componentId] = (byte) powerModel; + } return this; } diff --git a/core/java/android/os/SystemBatteryConsumer.java b/core/java/android/os/SystemBatteryConsumer.java index 5f35332f4818..e973e4c1044e 100644 --- a/core/java/android/os/SystemBatteryConsumer.java +++ b/core/java/android/os/SystemBatteryConsumer.java @@ -141,8 +141,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable private List<UidBatteryConsumer.Builder> mUidBatteryConsumers; Builder(int customPowerComponentCount, int customTimeComponentCount, - @DrainType int drainType) { - super(customPowerComponentCount, customTimeComponentCount); + boolean includePowerModels, @DrainType int drainType) { + super(customPowerComponentCount, customTimeComponentCount, includePowerModels); mDrainType = drainType; } diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index dfa0c396485d..87c263b3dd38 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -140,8 +140,8 @@ public final class UidBatteryConsumer extends BatteryConsumer implements Parcela private boolean mExcludeFromBatteryUsageStats; public Builder(int customPowerComponentCount, int customTimeComponentCount, - @NonNull BatteryStats.Uid batteryStatsUid) { - super(customPowerComponentCount, customTimeComponentCount); + boolean includePowerModels, @NonNull BatteryStats.Uid batteryStatsUid) { + super(customPowerComponentCount, customTimeComponentCount, includePowerModels); mBatteryStatsUid = batteryStatsUid; mUid = batteryStatsUid.getUid(); } diff --git a/core/java/android/os/UserBatteryConsumer.java b/core/java/android/os/UserBatteryConsumer.java index 94e567f368b0..78322088a3a4 100644 --- a/core/java/android/os/UserBatteryConsumer.java +++ b/core/java/android/os/UserBatteryConsumer.java @@ -77,8 +77,9 @@ public class UserBatteryConsumer extends BatteryConsumer implements Parcelable { private final int mUserId; private List<UidBatteryConsumer.Builder> mUidBatteryConsumers; - Builder(int customPowerComponentCount, int customTimeComponentCount, int userId) { - super(customPowerComponentCount, customTimeComponentCount); + Builder(int customPowerComponentCount, int customTimeComponentCount, + boolean includePowerModels, int userId) { + super(customPowerComponentCount, customTimeComponentCount, includePowerModels); mUserId = userId; } diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java index 047c05a8734b..7fb9ae0d86cc 100644 --- a/core/java/android/os/incremental/IncrementalManager.java +++ b/core/java/android/os/incremental/IncrementalManager.java @@ -25,6 +25,7 @@ import android.content.pm.DataLoaderParams; import android.content.pm.IPackageLoadingProgressCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; @@ -285,7 +286,7 @@ public final class IncrementalManager { * Unbinds the target dir and deletes the corresponding storage instance. * Deletes the package name and associated storage id from maps. */ - public void onPackageRemoved(@NonNull File codeFile) { + public void rmPackageDir(@NonNull File codeFile) { try { final String codePath = codeFile.getAbsolutePath(); final IncrementalStorage storage = openStorage(codePath); @@ -294,11 +295,9 @@ public final class IncrementalManager { } mLoadingProgressCallbacks.cleanUpCallbacks(storage); unregisterHealthListener(codePath); - - // Parent since we bind-mount a folder one level above. - mService.deleteBindMount(storage.getId(), codeFile.getParent()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + storage.unBind(codePath); + } catch (IOException e) { + Slog.w(TAG, "Failed to remove code path", e); } } diff --git a/core/java/android/view/SurfaceControlHdrLayerInfoListener.java b/core/java/android/view/SurfaceControlHdrLayerInfoListener.java new file mode 100644 index 000000000000..13d68d021e31 --- /dev/null +++ b/core/java/android/view/SurfaceControlHdrLayerInfoListener.java @@ -0,0 +1,102 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.annotation.RequiresPermission; +import android.os.IBinder; +import android.util.ArrayMap; + +import libcore.util.NativeAllocationRegistry; + +import java.util.Objects; + +/** + * Allows for the monitoring of layers with HDR content + * + * @hide */ +public abstract class SurfaceControlHdrLayerInfoListener { + private static final NativeAllocationRegistry sRegistry = + NativeAllocationRegistry.createMalloced( + SurfaceControlHdrLayerInfoListener.class.getClassLoader(), nGetDestructor()); + + /** + * Callback when the HDR information about the given display has changed + * + * @param displayToken The display this callback is about + * @param numberOfHdrLayers How many HDR layers are visible on the display + * @param maxW The width of the HDR layer with the largest area + * @param maxH The height of the HDR layer with the largest area + * @param flags Additional metadata flags, currently always 0 + * TODO(b/182312559): Add some flags + * + * @hide */ + public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers, + int maxW, int maxH, int flags); + + /** + * Registers this as an HDR info listener on the provided display + * @param displayToken + */ + @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + public void register(IBinder displayToken) { + Objects.requireNonNull(displayToken); + synchronized (this) { + if (mRegisteredListeners.containsKey(displayToken)) { + return; + } + long nativePtr = nRegister(displayToken); + Runnable destructor = sRegistry.registerNativeAllocation(this, nativePtr); + mRegisteredListeners.put(displayToken, destructor); + } + } + + /** + * Unregisters this as an HDR info listener on the provided display + * @param displayToken + */ + @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + public void unregister(IBinder displayToken) { + Objects.requireNonNull(displayToken); + final Runnable destructor; + synchronized (this) { + destructor = mRegisteredListeners.remove(displayToken); + } + if (destructor != null) { + destructor.run(); + } + } + + /** + * Unregisters this on all previously registered displays + */ + @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + public void unregisterAll() { + final ArrayMap<IBinder, Runnable> toDestroy; + synchronized (this) { + toDestroy = mRegisteredListeners; + mRegisteredListeners = new ArrayMap<>(); + } + for (Runnable destructor : toDestroy.values()) { + destructor.run(); + } + } + + private ArrayMap<IBinder, Runnable> mRegisteredListeners = new ArrayMap<>(); + + private static native long nGetDestructor(); + private native long nRegister(IBinder displayToken); +} diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1ff625d39249..0df26b2592ec 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1193,8 +1193,7 @@ public final class ViewRootImpl implements ViewParent, Looper.myLooper()); if (mAttachInfo.mThreadedRenderer != null) { - InputMetricsListener listener = - new InputMetricsListener(mInputEventReceiver); + InputMetricsListener listener = new InputMetricsListener(); mHardwareRendererObserver = new HardwareRendererObserver( listener, listener.data, mHandler, true /*waitForPresentTime*/); mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver); @@ -1390,6 +1389,9 @@ public final class ViewRootImpl implements ViewParent, if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested = true; + if (mHardwareRendererObserver != null) { + mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver); + } } } } @@ -8075,6 +8077,9 @@ public final class ViewRootImpl implements ViewParent, ThreadedRenderer hardwareRenderer = mAttachInfo.mThreadedRenderer; if (hardwareRenderer != null) { + if (mHardwareRendererObserver != null) { + hardwareRenderer.removeObserver(mHardwareRendererObserver); + } if (mView != null) { hardwareRenderer.destroyHardwareResources(mView); } @@ -8576,18 +8581,12 @@ public final class ViewRootImpl implements ViewParent, super.dispose(); } } - WindowInputEventReceiver mInputEventReceiver; + private WindowInputEventReceiver mInputEventReceiver; final class InputMetricsListener implements HardwareRendererObserver.OnFrameMetricsAvailableListener { public long[] data = new long[FrameMetrics.Index.FRAME_STATS_COUNT]; - private InputEventReceiver mReceiver; - - InputMetricsListener(InputEventReceiver receiver) { - mReceiver = receiver; - } - @Override public void onFrameMetricsAvailable(int dropCountSinceLastInvocation) { final int inputEventId = (int) data[FrameMetrics.Index.INPUT_EVENT_ID]; @@ -8600,6 +8599,11 @@ public final class ViewRootImpl implements ViewParent, // available, we cannot compute end-to-end input latency metrics. return; } + final long gpuCompletedTime = data[FrameMetrics.Index.GPU_COMPLETED]; + if (mInputEventReceiver == null) { + return; + } + mInputEventReceiver.reportTimeline(inputEventId, gpuCompletedTime, presentTime); } } HardwareRendererObserver mHardwareRendererObserver; diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java index 586607e413d9..2f4958223270 100644 --- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java @@ -44,14 +44,15 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(measuredEnergyUC, query); final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); - final double powerMah = getMeasuredOrEstimatedPower( - batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(), - mPowerEstimator, durationMs, query.shouldForceUsePowerProfileModel()); + final double powerMah = getMeasuredOrEstimatedPower(powerModel, + measuredEnergyUC, mPowerEstimator, durationMs); builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah, powerModel) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs); } @@ -64,10 +65,12 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { @Override public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { + final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(); final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); - final double powerMah = getMeasuredOrEstimatedPower( + final int powerModel = getPowerModel(measuredEnergyUC); + final double powerMah = getMeasuredOrEstimatedPower(powerModel, batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(), - mPowerEstimator, durationMs, false); + mPowerEstimator, durationMs); if (powerMah > 0) { BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0); bs.usagePowerMah = powerMah; diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index f8ae0c1858f8..49c564b8a737 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -132,9 +132,12 @@ public class BatteryUsageStatsProvider { // TODO(b/174186358): read extra time component number from configuration final int customTimeComponentCount = 0; - final BatteryUsageStats.Builder batteryUsageStatsBuilder = - new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount) - .setStatsStartTimestamp(mStats.getStartClockTime()); + final boolean includePowerModels = (query.getFlags() + & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0; + + final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder( + customPowerComponentCount, customTimeComponentCount, includePowerModels); + batteryUsageStatsBuilder.setStatsStartTimestamp(mStats.getStartClockTime()); SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats(); for (int i = uidStats.size() - 1; i >= 0; i--) { diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java index 75a98133a8f3..a418dfff5d8f 100644 --- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java +++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java @@ -15,8 +15,6 @@ */ package com.android.internal.os; -import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE; - import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryStats.ControllerActivityCounter; @@ -75,12 +73,13 @@ public class BluetoothPowerCalculator extends PowerCalculator { } } - final long measuredChargeUC = query.shouldForceUsePowerProfileModel() ? - POWER_DATA_UNAVAILABLE : batteryStats.getBluetoothMeasuredBatteryConsumptionUC(); + final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(measuredChargeUC, query); final ControllerActivityCounter activityCounter = batteryStats.getBluetoothControllerActivity(); final long systemDurationMs = calculateDuration(activityCounter); - final double systemPowerMah = calculatePowerMah(measuredChargeUC, activityCounter); + final double systemPowerMah = + calculatePowerMah(powerModel, measuredChargeUC, activityCounter); // Subtract what the apps used, but clamp to 0. final long systemComponentDurationMs = Math.max(0, systemDurationMs - total.durationMs); @@ -92,23 +91,22 @@ public class BluetoothPowerCalculator extends PowerCalculator { .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, systemComponentDurationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, - Math.max(systemPowerMah, total.powerMah)) + Math.max(systemPowerMah, total.powerMah), powerModel) .setPowerConsumedByApps(total.powerMah); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, BatteryUsageStatsQuery query) { - - final long measuredChargeUC = query.shouldForceUsePowerProfileModel() ? - POWER_DATA_UNAVAILABLE : + final long measuredChargeUC = app.getBatteryStatsUid().getBluetoothMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(measuredChargeUC, query); final ControllerActivityCounter activityCounter = app.getBatteryStatsUid().getBluetoothControllerActivity(); final long durationMs = calculateDuration(activityCounter); - final double powerMah = calculatePowerMah(measuredChargeUC, activityCounter); + final double powerMah = calculatePowerMah(powerModel, measuredChargeUC, activityCounter); app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, durationMs) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerMah); + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerMah, powerModel); total.durationMs += durationMs; total.powerMah += powerMah; @@ -132,10 +130,12 @@ public class BluetoothPowerCalculator extends PowerCalculator { BatterySipper bs = new BatterySipper(BatterySipper.DrainType.BLUETOOTH, null, 0); final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(measuredChargeUC); final ControllerActivityCounter activityCounter = batteryStats.getBluetoothControllerActivity(); final long systemDurationMs = calculateDuration(activityCounter); - final double systemPowerMah = calculatePowerMah(measuredChargeUC, activityCounter); + final double systemPowerMah = + calculatePowerMah(powerModel, measuredChargeUC, activityCounter); // Subtract what the apps used, but clamp to 0. final double powerMah = Math.max(0, systemPowerMah - total.powerMah); @@ -165,9 +165,10 @@ public class BluetoothPowerCalculator extends PowerCalculator { PowerAndDuration total) { final long measuredChargeUC = u.getBluetoothMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(measuredChargeUC); final ControllerActivityCounter activityCounter = u.getBluetoothControllerActivity(); final long durationMs = calculateDuration(activityCounter); - final double powerMah = calculatePowerMah(measuredChargeUC, activityCounter); + final double powerMah = calculatePowerMah(powerModel, measuredChargeUC, activityCounter); app.bluetoothRunningTimeMs = durationMs; app.bluetoothPowerMah = powerMah; @@ -189,10 +190,12 @@ public class BluetoothPowerCalculator extends PowerCalculator { } /** Returns bluetooth power usage based on the best data available. */ - private double calculatePowerMah(long measuredChargeUC, ControllerActivityCounter counter) { - if (measuredChargeUC != POWER_DATA_UNAVAILABLE) { + private double calculatePowerMah(@BatteryConsumer.PowerModel int powerModel, + long measuredChargeUC, ControllerActivityCounter counter) { + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { return uCtoMah(measuredChargeUC); } + if (counter == null) { return 0; } diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index b15543a26b4c..4aafec555182 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -91,10 +91,12 @@ public class CpuPowerCalculator extends PowerCalculator { private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, BatteryUsageStatsQuery query, Result result) { - calculatePowerAndDuration(u, BatteryStats.STATS_SINCE_CHARGED, - query.shouldForceUsePowerProfileModel(), result); + final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculatePowerAndDuration(u, powerModel, consumptionUC, BatteryStats.STATS_SINCE_CHARGED, + result); - app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, result.powerMah) + app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, result.powerMah, powerModel) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, result.durationMs) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, result.durationFgMs) @@ -114,7 +116,9 @@ public class CpuPowerCalculator extends PowerCalculator { } private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, Result result) { - calculatePowerAndDuration(u, statsType, false, result); + final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculatePowerAndDuration(u, powerModel, consumptionUC, statsType, result); app.cpuPowerMah = result.powerMah; app.cpuTimeMs = result.durationMs; @@ -122,16 +126,20 @@ public class CpuPowerCalculator extends PowerCalculator { app.packageWithHighestDrain = result.packageWithHighestDrain; } - private void calculatePowerAndDuration(BatteryStats.Uid u, int statsType, - boolean forceUsePowerProfileModel, Result result) { + private void calculatePowerAndDuration(BatteryStats.Uid u, + @BatteryConsumer.PowerModel int powerModel, long consumptionUC, int statsType, + Result result) { long durationMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000; final double powerMah; - final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC(); - if (forceUsePowerProfileModel || consumptionUC == BatteryStats.POWER_DATA_UNAVAILABLE) { - powerMah = calculateUidModeledPowerMah(u, statsType); - } else { - powerMah = uCtoMah(consumptionUC); + switch(powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + powerMah = uCtoMah(consumptionUC); + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + powerMah = calculateUidModeledPowerMah(u, statsType); + break; } if (DEBUG && (durationMs != 0 || powerMah != 0)) { diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java index 97c4fd8b7b7a..0e0870de4f5f 100644 --- a/core/java/com/android/internal/os/GnssPowerCalculator.java +++ b/core/java/com/android/internal/os/GnssPowerCalculator.java @@ -52,28 +52,30 @@ public class GnssPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); - calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs, rawUptimeUs, query, - averageGnssPowerMa); + final long consumptionUC = + app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculateApp(app, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, + averageGnssPowerMa, consumptionUC); } } private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, - long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query, - double averageGnssPowerMa) { + @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs, + double averageGnssPowerMa, long measuredChargeUC) { final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); - - final long measuredChargeUC = u.getGnssMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable = !query.shouldForceUsePowerProfileModel() - && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE; - final double powerMah; - if (isMeasuredPowerAvailable) { - powerMah = uCtoMah(measuredChargeUC); - } else { - powerMah = computePower(durationMs, averageGnssPowerMa); + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + powerMah = uCtoMah(measuredChargeUC); + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + powerMah = computePower(durationMs, averageGnssPowerMa); } + app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS, durationMs) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah); + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah, powerModel); } @Override @@ -83,24 +85,28 @@ public class GnssPowerCalculator extends PowerCalculator { for (int i = sippers.size() - 1; i >= 0; i--) { final BatterySipper app = sippers.get(i); if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(app, app.uidObj, rawRealtimeUs, statsType, averageGnssPowerMa, false); + final long consumptionUC = + app.uidObj.getGnssMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculateApp(app, app.uidObj, powerModel, rawRealtimeUs, averageGnssPowerMa, + consumptionUC); } } } - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - int statsType, double averageGnssPowerMa, boolean shouldForceUsePowerProfileModel) { + private void calculateApp(BatterySipper app, BatteryStats.Uid u, + @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs, + double averageGnssPowerMa, long measuredChargeUC) { final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); - final long measuredChargeUC = u.getGnssMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable = shouldForceUsePowerProfileModel - && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE; - final double powerMah; - if (isMeasuredPowerAvailable) { - powerMah = uCtoMah(measuredChargeUC); - } else { - powerMah = computePower(durationMs, averageGnssPowerMa); + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + powerMah = uCtoMah(measuredChargeUC); + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + powerMah = computePower(durationMs, averageGnssPowerMa); } app.gpsTimeMs = durationMs; diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index f6ef30cba369..d441d4529aca 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -97,37 +97,41 @@ public class MobileRadioPowerCalculator extends PowerCalculator { for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); final BatteryStats.Uid uid = app.getBatteryStatsUid(); - calculateApp(app, uid, powerPerPacketMah, total, - query.shouldForceUsePowerProfileModel()); + calculateApp(app, uid, powerPerPacketMah, total, query); } - calculateRemaining(total, batteryStats, rawRealtimeUs, - query.shouldForceUsePowerProfileModel()); + final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC); if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) { builder.getOrCreateSystemBatteryConsumerBuilder( - SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO) + SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, - total.remainingPowerMah + total.totalAppPowerMah) + total.remainingPowerMah + total.totalAppPowerMah, + powerModel) .setPowerConsumedByApps(total.totalAppPowerMah); } } private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, double powerPerPacketMah, PowerAndDuration total, - boolean shouldForceUsePowerProfileModel) { + BatteryUsageStatsQuery query) { final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED); total.totalAppDurationMs += radioActiveDurationMs; - final double powerMah = calculatePower(u, powerPerPacketMah, radioActiveDurationMs, - shouldForceUsePowerProfileModel); + final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + final double powerMah = calculatePower(u, powerModel, powerPerPacketMah, + radioActiveDurationMs, consumptionUC); total.totalAppPowerMah += powerMah; app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, - radioActiveDurationMs) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah); + radioActiveDurationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah, + powerModel); } @Override @@ -140,12 +144,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { final BatterySipper app = sippers.get(i); if (app.drainType == BatterySipper.DrainType.APP) { final BatteryStats.Uid u = app.uidObj; - calculateApp(app, u, statsType, mobilePowerPerPacket, total, false); + calculateApp(app, u, statsType, mobilePowerPerPacket, total); } } BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0); - calculateRemaining(total, batteryStats, rawRealtimeUs, false); + final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC); if (total.remainingPowerMah != 0) { if (total.signalDurationMs != 0) { radio.noCoveragePercent = @@ -162,12 +168,13 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, - double powerPerPacketMah, PowerAndDuration total, - boolean shouldForceUsePowerProfileModel) { + double powerPerPacketMah, PowerAndDuration total) { app.mobileActive = calculateDuration(u, statsType); - app.mobileRadioPowerMah = calculatePower(u, powerPerPacketMah, app.mobileActive, - shouldForceUsePowerProfileModel); + final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + app.mobileRadioPowerMah = calculatePower(u, powerModel, powerPerPacketMah, app.mobileActive, + consumptionUC); total.totalAppDurationMs += app.mobileActive; // Add cost of mobile traffic. @@ -193,13 +200,9 @@ public class MobileRadioPowerCalculator extends PowerCalculator { return u.getMobileRadioActiveTime(statsType) / 1000; } - private double calculatePower(BatteryStats.Uid u, double powerPerPacketMah, - long radioActiveDurationMs, boolean shouldForceUsePowerProfileModel) { - - final long measuredChargeUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable = !shouldForceUsePowerProfileModel - && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE; - if (isMeasuredPowerAvailable) { + private double calculatePower(BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, + double powerPerPacketMah, long radioActiveDurationMs, long measuredChargeUC) { + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { return uCtoMah(measuredChargeUC); } @@ -220,23 +223,20 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } } - private void calculateRemaining(MobileRadioPowerCalculator.PowerAndDuration total, - BatteryStats batteryStats, long rawRealtimeUs, - boolean shouldForceUsePowerProfileModel) { + private void calculateRemaining(PowerAndDuration total, + @BatteryConsumer.PowerModel int powerModel, BatteryStats batteryStats, + long rawRealtimeUs, long consumptionUC) { long signalTimeMs = 0; double powerMah = 0; - final long measuredChargeUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable = !shouldForceUsePowerProfileModel - && measuredChargeUC != BatteryStats.POWER_DATA_UNAVAILABLE; - if (isMeasuredPowerAvailable) { - powerMah = uCtoMah(measuredChargeUC); + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + powerMah = uCtoMah(consumptionUC); } for (int i = 0; i < NUM_SIGNAL_STRENGTH_LEVELS; i++) { long strengthTimeMs = batteryStats.getPhoneSignalStrengthTime(i, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED) / 1000; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { final double p = calcIdlePowerAtSignalStrengthMah(strengthTimeMs, i); if (DEBUG && p != 0) { Log.d(TAG, "Cell strength #" + i + ": time=" + strengthTimeMs + " power=" @@ -256,7 +256,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator { BatteryStats.STATS_SINCE_CHARGED) / 1000; long remainingActiveTimeMs = radioActiveTimeMs - total.totalAppDurationMs; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { final double p = calcScanTimePowerMah(scanningTimeMs); if (DEBUG && p != 0) { Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + formatCharge( diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java index 72385e273cf0..d139b4f0aa9a 100644 --- a/core/java/com/android/internal/os/PowerCalculator.java +++ b/core/java/com/android/internal/os/PowerCalculator.java @@ -15,6 +15,8 @@ */ package com.android.internal.os; +import android.annotation.NonNull; +import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; @@ -114,19 +116,48 @@ public abstract class PowerCalculator { public void reset() { } + protected static @BatteryConsumer.PowerModel int getPowerModel( + long measuredEnergyUC, @NonNull BatteryUsageStatsQuery query) { + if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE + && !query.shouldForceUsePowerProfileModel()) { + return BatteryConsumer.POWER_MODEL_MEASURED_ENERGY; + } + return BatteryConsumer.POWER_MODEL_POWER_PROFILE; + } + + protected static @BatteryConsumer.PowerModel int getPowerModel(long measuredEnergyUC) { + return measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE + ? BatteryConsumer.POWER_MODEL_MEASURED_ENERGY + : BatteryConsumer.POWER_MODEL_POWER_PROFILE; + } + /** * Returns either the measured energy converted to mAh or a usage-based estimate. */ - protected static double getMeasuredOrEstimatedPower(long measuredEnergyUC, - UsageBasedPowerEstimator powerEstimator, long durationMs, - boolean forceUsePowerProfileModel) { - if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE - && !forceUsePowerProfileModel) { + protected static double getMeasuredOrEstimatedPower(@BatteryConsumer.PowerModel int powerModel, + long measuredEnergyUC, UsageBasedPowerEstimator powerEstimator, long durationMs) { + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + return uCtoMah(measuredEnergyUC); + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + return powerEstimator.calculatePower(durationMs); + } + } + + /** + * Returns either the measured energy converted to mAh or a usage-based estimate. + */ + protected static double getMeasuredOrEstimatedPower( + long measuredEnergyUC, UsageBasedPowerEstimator powerEstimator, long durationMs) { + if (measuredEnergyUC != BatteryStats.POWER_DATA_UNAVAILABLE) { return uCtoMah(measuredEnergyUC); + } else { + return powerEstimator.calculatePower(durationMs); } - return powerEstimator.calculatePower(durationMs); } + /** * Converts charge in mAh to string. */ diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index ad574440f216..0267def918c2 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -62,9 +62,10 @@ public class ScreenPowerCalculator extends PowerCalculator { long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration totalPowerAndDuration = new PowerAndDuration(); - final boolean useEnergyData = calculateTotalDurationAndPower(totalPowerAndDuration, - batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, - query.shouldForceUsePowerProfileModel()); + final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats, + rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, consumptionUC); double totalAppPower = 0; @@ -73,29 +74,32 @@ public class ScreenPowerCalculator extends PowerCalculator { // but the method depends on the data source. final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); - if (useEnergyData) { - final PowerAndDuration appPowerAndDuration = new PowerAndDuration(); - for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { - final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); - calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.getBatteryStatsUid(), + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + final PowerAndDuration appPowerAndDuration = new PowerAndDuration(); + for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { + final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); + calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.getBatteryStatsUid(), + rawRealtimeUs); + app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, + appPowerAndDuration.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, + appPowerAndDuration.powerMah, powerModel); + totalAppPower += appPowerAndDuration.powerMah; + } + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration, rawRealtimeUs); - app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, - appPowerAndDuration.durationMs) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, - appPowerAndDuration.powerMah); - totalAppPower += appPowerAndDuration.powerMah; - } - } else { - smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration, - rawRealtimeUs); - totalAppPower = totalPowerAndDuration.powerMah; + totalAppPower = totalPowerAndDuration.powerMah; } builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, totalPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, - Math.max(totalPowerAndDuration.powerMah, totalAppPower)) + Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel) .setPowerConsumedByApps(totalAppPower); } @@ -106,8 +110,10 @@ public class ScreenPowerCalculator extends PowerCalculator { public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { final PowerAndDuration totalPowerAndDuration = new PowerAndDuration(); - final boolean useEnergyData = calculateTotalDurationAndPower(totalPowerAndDuration, - batteryStats, rawRealtimeUs, statsType, false); + final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats, + rawRealtimeUs, statsType, consumptionUC); if (totalPowerAndDuration.powerMah == 0) { return; } @@ -121,41 +127,42 @@ public class ScreenPowerCalculator extends PowerCalculator { // Now deal with each app's BatterySipper. The results are stored in the screenPowerMah // field, which is considered smeared, but the method depends on the data source. - if (useEnergyData) { - final PowerAndDuration appPowerAndDuration = new PowerAndDuration(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj, rawRealtimeUs); - app.screenPowerMah = appPowerAndDuration.powerMah; + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + final PowerAndDuration appPowerAndDuration = new PowerAndDuration(); + for (int i = sippers.size() - 1; i >= 0; i--) { + final BatterySipper app = sippers.get(i); + if (app.drainType == BatterySipper.DrainType.APP) { + calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj, + rawRealtimeUs); + app.screenPowerMah = appPowerAndDuration.powerMah; + } } - } - } else { - smearScreenBatterySipper(sippers, bs, rawRealtimeUs); + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + smearScreenBatterySipper(sippers, bs, rawRealtimeUs); } } /** - * Stores duration and power information in totalPowerAndDuration and returns true if measured - * energy data is available and should be used by the model. + * Stores duration and power information in totalPowerAndDuration. */ - private boolean calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration, - BatteryStats batteryStats, long rawRealtimeUs, int statsType, - boolean forceUsePowerProfileModel) { + private void calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration, + @BatteryConsumer.PowerModel int powerModel, BatteryStats batteryStats, + long rawRealtimeUs, int statsType, long consumptionUC) { totalPowerAndDuration.durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); - if (!forceUsePowerProfileModel) { - final long chargeUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC(); - if (chargeUC != BatteryStats.POWER_DATA_UNAVAILABLE) { - totalPowerAndDuration.powerMah = uCtoMah(chargeUC); - return true; - } + switch (powerModel) { + case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: + totalPowerAndDuration.powerMah = uCtoMah(consumptionUC); + break; + case BatteryConsumer.POWER_MODEL_POWER_PROFILE: + default: + totalPowerAndDuration.powerMah = calculateTotalPowerFromBrightness(batteryStats, + rawRealtimeUs, statsType, totalPowerAndDuration.durationMs); } - - totalPowerAndDuration.powerMah = calculateTotalPowerFromBrightness(batteryStats, - rawRealtimeUs, statsType, totalPowerAndDuration.durationMs); - return false; } private void calculateAppUsingMeasuredEnergy(PowerAndDuration appPowerAndDuration, @@ -245,7 +252,8 @@ public class ScreenPowerCalculator extends PowerCalculator { final long durationMs = activityTimeArray.get(app.getUid(), 0); final double powerMah = totalScreenPowerMah * durationMs / totalActivityTimeMs; app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, durationMs) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah); + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, + BatteryConsumer.POWER_MODEL_POWER_PROFILE); } } } diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java index d95506b00677..11219eccddad 100644 --- a/core/java/com/android/internal/os/WifiPowerCalculator.java +++ b/core/java/com/android/internal/os/WifiPowerCalculator.java @@ -15,8 +15,6 @@ */ package com.android.internal.os; -import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE; - import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; @@ -92,10 +90,12 @@ public class WifiPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); - calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), rawRealtimeUs, - BatteryStats.STATS_SINCE_CHARGED, - batteryStats.hasWifiActivityReporting(), - query.shouldForceUsePowerProfileModel()); + final long consumptionUC = + app.getBatteryStatsUid().getWifiMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel, + rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, + batteryStats.hasWifiActivityReporting(), consumptionUC); totalAppDurationMs += powerDurationAndTraffic.durationMs; totalAppPowerMah += powerDurationAndTraffic.powerMah; @@ -103,7 +103,7 @@ public class WifiPowerCalculator extends PowerCalculator { app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI, powerDurationAndTraffic.durationMs); app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, - powerDurationAndTraffic.powerMah); + powerDurationAndTraffic.powerMah, powerModel); if (app.getUid() == Process.WIFI_UID) { systemBatteryConsumerBuilder.addUidBatteryConsumer(app); @@ -111,17 +111,17 @@ public class WifiPowerCalculator extends PowerCalculator { } } - calculateRemaining(powerDurationAndTraffic, batteryStats, rawRealtimeUs, - BatteryStats.STATS_SINCE_CHARGED, - batteryStats.hasWifiActivityReporting(), - query.shouldForceUsePowerProfileModel(), - totalAppDurationMs, totalAppPowerMah); + final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs, + BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(), + totalAppDurationMs, totalAppPowerMah, consumptionUC); systemBatteryConsumerBuilder .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI, powerDurationAndTraffic.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, - totalAppPowerMah + powerDurationAndTraffic.powerMah) + totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel) .setPowerConsumedByApps(totalAppPowerMah); } @@ -144,8 +144,11 @@ public class WifiPowerCalculator extends PowerCalculator { for (int i = sippers.size() - 1; i >= 0; i--) { final BatterySipper app = sippers.get(i); if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(powerDurationAndTraffic, app.uidObj, rawRealtimeUs, statsType, - batteryStats.hasWifiActivityReporting(), /* force use power model*/ false); + final long consumptionUC = + app.uidObj.getWifiMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculateApp(powerDurationAndTraffic, app.uidObj, powerModel, rawRealtimeUs, + statsType, batteryStats.hasWifiActivityReporting(), consumptionUC); totalAppDurationMs += powerDurationAndTraffic.durationMs; totalAppPowerMah += powerDurationAndTraffic.powerMah; @@ -164,9 +167,11 @@ public class WifiPowerCalculator extends PowerCalculator { } } - calculateRemaining(powerDurationAndTraffic, batteryStats, rawRealtimeUs, statsType, - batteryStats.hasWifiActivityReporting(), /* force use power model*/ false, - totalAppDurationMs, totalAppPowerMah); + final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC); + calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs, + statsType, batteryStats.hasWifiActivityReporting(), totalAppDurationMs, + totalAppPowerMah, consumptionUC); bs.wifiRunningTimeMs += powerDurationAndTraffic.durationMs; bs.wifiPowerMah += powerDurationAndTraffic.powerMah; @@ -176,9 +181,10 @@ public class WifiPowerCalculator extends PowerCalculator { } } - private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic, BatteryStats.Uid u, - long rawRealtimeUs, int statsType, - boolean hasWifiActivityReporting, boolean shouldForceUsePowerProfileModel) { + private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic, + BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, + long rawRealtimeUs, int statsType, boolean hasWifiActivityReporting, + long consumptionUC) { powerDurationAndTraffic.wifiRxPackets = u.getNetworkActivityPackets( BatteryStats.NETWORK_WIFI_RX_DATA, @@ -193,11 +199,8 @@ public class WifiPowerCalculator extends PowerCalculator { BatteryStats.NETWORK_WIFI_TX_DATA, statsType); - final long measuredChargeUC = u.getWifiMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable - = !shouldForceUsePowerProfileModel && measuredChargeUC != POWER_DATA_UNAVAILABLE; - if (isMeasuredPowerAvailable) { - powerDurationAndTraffic.powerMah = uCtoMah(measuredChargeUC); + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (hasWifiActivityReporting && mHasWifiPowerController) { @@ -208,7 +211,7 @@ public class WifiPowerCalculator extends PowerCalculator { final long rxTime = counter.getRxTimeCounter().getCountLocked(statsType); powerDurationAndTraffic.durationMs = idleTime + rxTime + txTime; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { powerDurationAndTraffic.powerMah = calcPowerFromControllerDataMah(rxTime, txTime, idleTime); } @@ -223,7 +226,7 @@ public class WifiPowerCalculator extends PowerCalculator { final long wifiRunningTime = u.getWifiRunningTime(rawRealtimeUs, statsType) / 1000; powerDurationAndTraffic.durationMs = wifiRunningTime; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { final long wifiScanTimeMs = u.getWifiScanTime(rawRealtimeUs, statsType) / 1000; long batchTimeMs = 0; for (int bin = 0; bin < BatteryStats.Uid.NUM_WIFI_BATCHED_SCAN_BINS; bin++) { @@ -243,19 +246,17 @@ public class WifiPowerCalculator extends PowerCalculator { } private void calculateRemaining(PowerDurationAndTraffic powerDurationAndTraffic, - BatteryStats stats, long rawRealtimeUs, int statsType, - boolean hasWifiActivityReporting, boolean shouldForceUsePowerProfileModel, - long totalAppDurationMs, double totalAppPowerMah) { + @BatteryConsumer.PowerModel int powerModel, BatteryStats stats, long rawRealtimeUs, + int statsType, boolean hasWifiActivityReporting, long totalAppDurationMs, + double totalAppPowerMah, long consumptionUC) { long totalDurationMs; double totalPowerMah = 0; - final long measuredChargeUC = stats.getWifiMeasuredBatteryConsumptionUC(); - final boolean isMeasuredPowerAvailable - = !shouldForceUsePowerProfileModel && measuredChargeUC != POWER_DATA_UNAVAILABLE; - if (isMeasuredPowerAvailable) { - totalPowerMah = uCtoMah(measuredChargeUC); + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + totalPowerMah = uCtoMah(consumptionUC); } + if (hasWifiActivityReporting && mHasWifiPowerController) { final BatteryStats.ControllerActivityCounter counter = stats.getWifiControllerActivity(); @@ -266,7 +267,7 @@ public class WifiPowerCalculator extends PowerCalculator { totalDurationMs = idleTimeMs + rxTimeMs + txTimeMs; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { totalPowerMah = counter.getPowerCounter().getCountLocked(statsType) / (double) (1000 * 60 * 60); if (totalPowerMah == 0) { @@ -276,7 +277,7 @@ public class WifiPowerCalculator extends PowerCalculator { } } else { totalDurationMs = stats.getGlobalWifiRunningTime(rawRealtimeUs, statsType) / 1000; - if (!isMeasuredPowerAvailable) { + if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { totalPowerMah = calcGlobalPowerWithoutControllerDataMah(totalDurationMs); } } diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java index f71b31493035..4d2266b2eba5 100644 --- a/core/java/com/android/internal/os/ZygoteServer.java +++ b/core/java/com/android/internal/os/ZygoteServer.java @@ -547,7 +547,7 @@ class ZygoteServer { try { ZygoteConnection connection = peers.get(pollIndex); boolean multipleForksOK = !isUsapPoolEnabled() - && ZygoteHooks.indefiniteThreadSuspensionOK(); + && ZygoteHooks.isIndefiniteThreadSuspensionSafe(); final Runnable command = connection.processCommand(this, multipleForksOK); diff --git a/core/java/com/android/internal/widget/RecyclerView.java b/core/java/com/android/internal/widget/RecyclerView.java index 17ce75e63b6f..9ed5eb1d144e 100644 --- a/core/java/com/android/internal/widget/RecyclerView.java +++ b/core/java/com/android/internal/widget/RecyclerView.java @@ -2049,17 +2049,19 @@ public class RecyclerView extends ViewGroup implements ScrollingView, NestedScro } if (!dispatchNestedPreFling(velocityX, velocityY)) { - final View firstChild = mLayout.getChildAt(0); - final View lastChild = mLayout.getChildAt(mLayout.getChildCount() - 1); boolean consumed = false; - if (velocityY < 0) { - consumed = getChildAdapterPosition(firstChild) > 0 - || firstChild.getTop() < getPaddingTop(); - } + if (mLayout.getChildCount() > 0) { + final View firstChild = mLayout.getChildAt(0); + final View lastChild = mLayout.getChildAt(mLayout.getChildCount() - 1); + if (velocityY < 0) { + consumed = getChildAdapterPosition(firstChild) > 0 + || firstChild.getTop() < getPaddingTop(); + } - if (velocityY > 0) { - consumed = getChildAdapterPosition(lastChild) < mAdapter.getItemCount() - 1 - || lastChild.getBottom() > getHeight() - getPaddingBottom(); + if (velocityY > 0) { + consumed = getChildAdapterPosition(lastChild) < mAdapter.getItemCount() - 1 + || lastChild.getBottom() > getHeight() - getPaddingBottom(); + } } dispatchNestedFling(velocityX, velocityY, consumed); diff --git a/core/jni/Android.bp b/core/jni/Android.bp index de85ff93ccb2..1f805c94d51c 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -70,7 +70,10 @@ cc_library_shared { "libz", ], - static_libs: ["libnativehelper_lazy", "libziparchive_for_incfs", ], + static_libs: [ + "libnativehelper_lazy", + "libziparchive_for_incfs", + ], export_include_dirs: [ ".", @@ -121,6 +124,7 @@ cc_library_shared { "android_view_Surface.cpp", "android_view_SurfaceControl.cpp", "android_view_SurfaceControlFpsListener.cpp", + "android_view_SurfaceControlHdrLayerInfoListener.cpp", "android_graphics_BLASTBufferQueue.cpp", "android_view_SurfaceSession.cpp", "android_view_TextureView.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 6636b1f6327b..916ecd6bb3d2 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -122,6 +122,7 @@ extern int register_android_view_InputWindowHandle(JNIEnv* env); extern int register_android_view_Surface(JNIEnv* env); extern int register_android_view_SurfaceControl(JNIEnv* env); extern int register_android_view_SurfaceControlFpsListener(JNIEnv* env); +extern int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env); extern int register_android_view_SurfaceSession(JNIEnv* env); extern int register_android_view_CompositionSamplingListener(JNIEnv* env); extern int register_android_view_TextureView(JNIEnv* env); @@ -1515,6 +1516,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_view_Surface), REG_JNI(register_android_view_SurfaceControl), REG_JNI(register_android_view_SurfaceControlFpsListener), + REG_JNI(register_android_view_SurfaceControlHdrLayerInfoListener), REG_JNI(register_android_view_SurfaceSession), REG_JNI(register_android_view_CompositionSamplingListener), REG_JNI(register_android_view_TextureView), diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 6f9a3815a302..7c4c97036bd8 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -26,6 +26,7 @@ #include <nativehelper/JNIHelp.h> #include "core_jni_helpers.h" +#include <android/media/AudioVibratorInfo.h> #include <audiomanager/AudioManager.h> #include <media/AudioPolicy.h> #include <media/AudioSystem.h> @@ -176,10 +177,15 @@ static struct { jmethodID postRoutingUpdatedFromNative; } gAudioPolicyEventHandlerMethods; -static struct { jmethodID add; } gListMethods; +jclass gListClass; +static struct { + jmethodID add; + jmethodID get; + jmethodID size; +} gListMethods; static jclass gAudioDescriptorClass; -static jmethodID gAudiODescriptorCstor; +static jmethodID gAudioDescriptorCstor; // // JNI Initialization for OpenSLES routing @@ -195,6 +201,13 @@ jclass gClsAudioRecordRoutingProxy; jclass gAudioProfileClass; jmethodID gAudioProfileCstor; +jclass gVibratorClass; +static struct { + jmethodID getId; + jmethodID getResonantFrequency; + jmethodID getQFactor; +} gVibratorMethods; + static Mutex gLock; enum AudioError { @@ -1351,7 +1364,7 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, reinterpret_cast<const jbyte *>(extraAudioDescriptor.descriptor)); jAudioDescriptor = ScopedLocalRef<jobject>(env, - env->NewObject(gAudioDescriptorClass, gAudiODescriptorCstor, + env->NewObject(gAudioDescriptorClass, gAudioDescriptorCstor, standard, encapsulationType, jDescriptor.get())); env->CallBooleanMethod(jAudioDescriptors, gArrayListMethods.add, jAudioDescriptor.get()); @@ -2627,6 +2640,29 @@ android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobject thiz, return jStatus; } +static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz, + jobject jVibrators) { + if (!env->IsInstanceOf(jVibrators, gListClass)) { + return (jint)AUDIO_JAVA_BAD_VALUE; + } + const jint size = env->CallIntMethod(jVibrators, gListMethods.size); + std::vector<media::AudioVibratorInfo> vibratorInfos; + for (jint i = 0; i < size; ++i) { + ScopedLocalRef<jobject> jVibrator(env, + env->CallObjectMethod(jVibrators, gListMethods.get, i)); + if (!env->IsInstanceOf(jVibrator.get(), gVibratorClass)) { + return (jint)AUDIO_JAVA_BAD_VALUE; + } + media::AudioVibratorInfo vibratorInfo; + vibratorInfo.id = env->CallIntMethod(jVibrator.get(), gVibratorMethods.getId); + vibratorInfo.resonantFrequency = + env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getResonantFrequency); + vibratorInfo.qFactor = env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getQFactor); + vibratorInfos.push_back(vibratorInfo); + } + return (jint)check_AudioSystem_Command(AudioSystem::setVibratorInfos(vibratorInfos)); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gMethods[] = @@ -2757,7 +2793,9 @@ static const JNINativeMethod gMethods[] = (void *)android_media_AudioSystem_setUserIdDeviceAffinities}, {"removeUserIdDeviceAffinities", "(I)I", (void *)android_media_AudioSystem_removeUserIdDeviceAffinities}, - {"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid}}; + {"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid}, + {"setVibratorInfos", "(Ljava/util/List;)I", + (void *)android_media_AudioSystem_setVibratorInfos}}; static const JNINativeMethod gEventHandlerMethods[] = { {"native_setup", @@ -2959,7 +2997,10 @@ int register_android_media_AudioSystem(JNIEnv *env) android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V"); jclass listClass = FindClassOrDie(env, "java/util/List"); + gListClass = MakeGlobalRefOrDie(env, listClass); gListMethods.add = GetMethodIDOrDie(env, listClass, "add", "(Ljava/lang/Object;)Z"); + gListMethods.get = GetMethodIDOrDie(env, listClass, "get", "(I)Ljava/lang/Object;"); + gListMethods.size = GetMethodIDOrDie(env, listClass, "size", "()I"); jclass audioProfileClass = FindClassOrDie(env, "android/media/AudioProfile"); gAudioProfileClass = MakeGlobalRefOrDie(env, audioProfileClass); @@ -2967,7 +3008,14 @@ int register_android_media_AudioSystem(JNIEnv *env) jclass audioDescriptorClass = FindClassOrDie(env, "android/media/AudioDescriptor"); gAudioDescriptorClass = MakeGlobalRefOrDie(env, audioDescriptorClass); - gAudiODescriptorCstor = GetMethodIDOrDie(env, audioDescriptorClass, "<init>", "(II[B)V"); + gAudioDescriptorCstor = GetMethodIDOrDie(env, audioDescriptorClass, "<init>", "(II[B)V"); + + jclass vibratorClass = FindClassOrDie(env, "android/os/Vibrator"); + gVibratorClass = MakeGlobalRefOrDie(env, vibratorClass); + gVibratorMethods.getId = GetMethodIDOrDie(env, vibratorClass, "getId", "()I"); + gVibratorMethods.getResonantFrequency = + GetMethodIDOrDie(env, vibratorClass, "getResonantFrequency", "()F"); + gVibratorMethods.getQFactor = GetMethodIDOrDie(env, vibratorClass, "getQFactor", "()F"); AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback); diff --git a/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp new file mode 100644 index 000000000000..adbd7916a3f4 --- /dev/null +++ b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp @@ -0,0 +1,136 @@ +/* + * Copyright 2021 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. + */ + +#define LOG_TAG "SurfaceControlHdrLayerInfoListener" + +#include <android/gui/BnHdrLayerInfoListener.h> +#include <android_runtime/Log.h> +#include <gui/ISurfaceComposer.h> +#include <gui/SurfaceComposerClient.h> +#include <log/log.h> +#include <nativehelper/JNIHelp.h> +#include <utils/RefBase.h> + +#include "android_util_Binder.h" +#include "core_jni_helpers.h" + +namespace android { + +namespace { + +struct { + jclass mClass; + jmethodID mOnHdrInfoChanged; +} gListenerClassInfo; + +struct SurfaceControlHdrLayerInfoListener : public gui::BnHdrLayerInfoListener { + SurfaceControlHdrLayerInfoListener(JNIEnv* env, jobject listener, jobject displayToken) + : mListener(env->NewGlobalRef(listener)), mDisplayToken(env->NewGlobalRef(displayToken)) { + LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm"); + } + + binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH, + int flags) override { + JNIEnv* env = requireEnv(); + + env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken, + numberOfHdrLayers, maxW, maxH, flags); + + if (env->ExceptionCheck()) { + ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed."); + LOGE_EX(env); + env->ExceptionClear(); + } + return binder::Status::ok(); + } + + status_t startListening() { + auto token = ibinderForJavaObject(requireEnv(), mDisplayToken); + return SurfaceComposerClient::addHdrLayerInfoListener(token, this); + } + + status_t stopListening() { + auto token = ibinderForJavaObject(requireEnv(), mDisplayToken); + return SurfaceComposerClient::removeHdrLayerInfoListener(token, this); + } + +protected: + virtual ~SurfaceControlHdrLayerInfoListener() { + JNIEnv* env = requireEnv(); + env->DeleteGlobalRef(mListener); + env->DeleteGlobalRef(mDisplayToken); + } + + JNIEnv* requireEnv() { + JNIEnv* env = nullptr; + if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { + if (mVm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) { + LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!"); + } + } + return env; + } + +private: + jobject mListener; + jobject mDisplayToken; + JavaVM* mVm; +}; + +jlong nRegister(JNIEnv* env, jobject jthis, jobject jbinderToken) { + auto callback = sp<SurfaceControlHdrLayerInfoListener>::make(env, jthis, jbinderToken); + status_t err = callback->startListening(); + if (err != OK) { + auto errStr = statusToString(err); + jniThrowExceptionFmt(env, "java/lang/IllegalStateException", + "Failed to register HdrLayerInfoListener, err = %d (%s)", err, + errStr.c_str()); + return 0; + } + SurfaceControlHdrLayerInfoListener* ret = callback.get(); + ret->incStrong(0); + return static_cast<jlong>(reinterpret_cast<intptr_t>(ret)); +} + +static void destroy(SurfaceControlHdrLayerInfoListener* listener) { + listener->stopListening(); + listener->decStrong(0); +} + +static jlong nGetDestructor(JNIEnv* env, jobject clazz) { + return static_cast<jlong>(reinterpret_cast<intptr_t>(&destroy)); +} + +const JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + {"nGetDestructor", "()J", (void*)nGetDestructor}, + {"nRegister", "(Landroid/os/IBinder;)J", (void*)nRegister}}; + +} // namespace + +int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env) { + int res = jniRegisterNativeMethods(env, "android/view/SurfaceControlHdrLayerInfoListener", + gMethods, NELEM(gMethods)); + LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods."); + + jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener"); + gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz); + gListenerClassInfo.mOnHdrInfoChanged = + env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIII)V"); + return 0; +} + +} // namespace android diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index c144451c1b94..c67bfedb9174 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1954,6 +1954,14 @@ android:label="@string/permlab_bluetooth_connect" android:protectionLevel="dangerous" /> + <!-- Required to be able to range to devices using uwb. + <p>Protection level: dangerous --> + <permission android:name="android.permission.UWB_RANGING" + android:permissionGroup="android.permission-group.UNDEFINED" + android:description="@string/permdesc_uwb_ranging" + android:label="@string/permlab_uwb_ranging" + android:protectionLevel="dangerous" /> + <!-- @SystemApi @TestApi Allows an application to suspend other apps, which will prevent the user from using them until they are unsuspended. @hide diff --git a/core/res/res/drawable/perm_group_camera.xml b/core/res/res/drawable/perm_group_camera.xml index e65501c4efcc..c47d8540c76e 100644 --- a/core/res/res/drawable/perm_group_camera.xml +++ b/core/res/res/drawable/perm_group_camera.xml @@ -20,11 +20,6 @@ android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> - - <path - android:fillColor="#000000" - android:pathData="M20,5h-3.17L15,3H9L7.17,5H4C2.9,5 2,5.9 2,7v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V7C22,5.9 21.1,5 20,5zM20,19H4V7h16V19z"/> - <path - android:fillColor="#000000" - android:pathData="M12,9c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4s4,-1.79 4,-4C16,10.79 14.21,9 12,9z"/> + <path android:fillColor="@android:color/white" + android:pathData="M18,10.48L18,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4.48l4,3.98v-11l-4,3.98zM16,9.69L16,18L4,18L4,6h12v3.69z"/> </vector> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 32732170e92b..af595a43e0d1 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -59,7 +59,6 @@ <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item> <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item> <item><xliff:g id="id">@string/status_bar_no_calling</xliff:g></item> - <item><xliff:g id="id">@string/status_bar_call_strength</xliff:g></item> <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item> <item><xliff:g id="id">@string/status_bar_sensors_off</xliff:g></item> </string-array> @@ -97,7 +96,6 @@ <string translatable="false" name="status_bar_camera">camera</string> <string translatable="false" name="status_bar_airplane">airplane</string> <string translatable="false" name="status_bar_no_calling">no_calling</string> - <string translatable="false" name="status_bar_call_strength">call_strength</string> <string translatable="false" name="status_bar_sensors_off">sensors_off</string> <string translatable="false" name="status_bar_screen_record">screen_record</string> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 58fa8de4970e..61e766e36de5 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1485,6 +1485,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]--> <string name="permdesc_bluetooth_connect" product="default">Allows the app to connect to paired Bluetooth devices</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50]--> + <string name="permlab_uwb_ranging">range to devices using ultra-wideband</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]--> + <string name="permdesc_uwb_ranging" product="default">Allows the app to range to devices using ultra-wideband</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_preferredPaymentInfo">Preferred NFC Payment Service Information</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e607b11e5297..92d857d07353 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2973,7 +2973,6 @@ <java-symbol type="string" name="status_bar_clock" /> <java-symbol type="string" name="status_bar_airplane" /> <java-symbol type="string" name="status_bar_no_calling" /> - <java-symbol type="string" name="status_bar_call_strength" /> <java-symbol type="string" name="status_bar_mobile" /> <java-symbol type="string" name="status_bar_ethernet" /> <java-symbol type="string" name="status_bar_vpn" /> diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java index dbe5773a3107..0f3bb1db6ed9 100644 --- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java @@ -16,261 +16,99 @@ package com.android.frameworks.core.batterystatsloadtests; -import android.os.Process; - -import com.android.internal.os.BatterySipper; -import com.android.internal.os.BatteryStatsHelper; +import android.os.BatteryConsumer; +import android.os.BatteryUsageStats; +import android.os.UidBatteryConsumer; +import android.util.DebugUtils; +import android.util.Range; import java.util.ArrayList; import java.util.List; public class PowerMetrics { - private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar"; - private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media"; - private static final String PACKAGE_SYSTEMUI = "com.android.systemui"; - private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER, - PACKAGE_CALENDAR_PROVIDER, PACKAGE_SYSTEMUI}; enum MetricKind { POWER, DURATION, } - public static final String METRIC_APP_POWER = "appPower"; - public static final String METRIC_APP_POWER_EXCLUDE_SYSTEM_FROM_TOTAL = "appPowerExcludeSystem"; - public static final String METRIC_APP_POWER_EXCLUDE_SMEARED = "appPowerExcludeSmeared"; - public static final String METRIC_SCREEN_POWER = "screenPower"; - public static final String METRIC_WIFI_POWER = "wifiPower"; - public static final String METRIC_SYSTEM_SERVICE_CPU_POWER = "systemService"; - public static final String METRIC_OTHER_POWER = "otherPower"; - public static final String METRIC_CPU_POWER = "cpuPower"; - public static final String METRIC_RAM_POWER = "ramPower"; - public static final String METRIC_WAKELOCK_POWER = "wakelockPower"; - public static final String METRIC_MOBILE_RADIO_POWER = "mobileRadioPower"; - public static final String METRIC_BLUETOOTH_POWER = "bluetoothPower"; - public static final String METRIC_GPS_POWER = "gpsPower"; - public static final String METRIC_CAMERA_POWER = "cameraPower"; - public static final String METRIC_FLASHLIGHT_POWER = "flashlightPower"; - public static final String METRIC_SENSORS_POWER = "sensorsPower"; - public static final String METRIC_AUDIO_POWER = "audioPower"; - public static final String METRIC_VIDEO_POWER = "videoPower"; - public static final String METRIC_CPU_TIME = "cpuTime"; - public static final String METRIC_CPU_FOREGROUND_TIME = "cpuForegroundTime"; - public static final String METRIC_WAKELOCK_TIME = "wakelockTime"; - public static final String METRIC_WIFI_RUNNING_TIME = "wifiRunningTime"; - public static final String METRIC_BLUETOOTH_RUNNING_TIME = "bluetoothRunningTime"; - public static final String METRIC_GPS_TIME = "gpsTime"; - public static final String METRIC_CAMERA_TIME = "cameraTime"; - public static final String METRIC_FLASHLIGHT_TIME = "flashlightTime"; - public static final String METRIC_AUDIO_TIME = "audioTime"; - public static final String METRIC_VIDEO_TIME = "videoTime"; - public static class Metric { - public String metricType; + public String metricName; public MetricKind metricKind; - public String title; + public String statusKeyPrefix; public double value; public double total; } - private final double mMinDrainedPower; - private final double mMaxDrainedPower; + private final double mDrainedPower; private List<Metric> mMetrics = new ArrayList<>(); - public PowerMetrics(BatteryStatsHelper batteryStatsHelper, int uid) { - mMinDrainedPower = batteryStatsHelper.getMinDrainedPower(); - mMaxDrainedPower = batteryStatsHelper.getMaxDrainedPower(); - - List<BatterySipper> usageList = batteryStatsHelper.getUsageList(); + public PowerMetrics(BatteryUsageStats batteryUsageStats, int uid) { + final Range<Double> dischargedPowerRange = batteryUsageStats.getDischargedPowerRange(); + mDrainedPower = (dischargedPowerRange.getLower() + dischargedPowerRange.getUpper()) / 2; + double[] totalPowerPerComponentMah = new double[BatteryConsumer.POWER_COMPONENT_COUNT]; + long[] totalDurationPerComponentMs = new long[BatteryConsumer.POWER_COMPONENT_COUNT]; - double totalPowerMah = 0; - double totalSmearedPowerMah = 0; - double totalPowerExcludeSystemMah = 0; - double totalScreenPower = 0; - double totalProportionalSmearMah = 0; - double totalCpuPowerMah = 0; - double totalSystemServiceCpuPowerMah = 0; - double totalUsagePowerMah = 0; - double totalWakeLockPowerMah = 0; - double totalMobileRadioPowerMah = 0; - double totalWifiPowerMah = 0; - double totalBluetoothPowerMah = 0; - double totalGpsPowerMah = 0; - double totalCameraPowerMah = 0; - double totalFlashlightPowerMah = 0; - double totalSensorPowerMah = 0; - double totalAudioPowerMah = 0; - double totalVideoPowerMah = 0; - - long totalCpuTimeMs = 0; - long totalCpuFgTimeMs = 0; - long totalWakeLockTimeMs = 0; - long totalWifiRunningTimeMs = 0; - long totalBluetoothRunningTimeMs = 0; - long totalGpsTimeMs = 0; - long totalCameraTimeMs = 0; - long totalFlashlightTimeMs = 0; - long totalAudioTimeMs = 0; - long totalVideoTimeMs = 0; - - BatterySipper uidSipper = null; - for (BatterySipper sipper : usageList) { - if (sipper.drainType == BatterySipper.DrainType.SCREEN) { - totalScreenPower = sipper.sumPower(); + UidBatteryConsumer selectedBatteryConsumer = null; + for (UidBatteryConsumer uidBatteryConsumer : batteryUsageStats.getUidBatteryConsumers()) { + if (uidBatteryConsumer.getUid() == uid) { + selectedBatteryConsumer = uidBatteryConsumer; } - if (isHiddenDrainType(sipper.drainType)) { - continue; + for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; + component++) { + totalPowerPerComponentMah[component] += uidBatteryConsumer.getConsumedPower( + component); } - if (sipper.drainType == BatterySipper.DrainType.APP && sipper.getUid() == uid) { - uidSipper = sipper; + for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) { + totalDurationPerComponentMs[component] += + uidBatteryConsumer.getUsageDurationMillis(component); } - - totalPowerMah += sipper.sumPower(); - totalSmearedPowerMah += sipper.totalSmearedPowerMah; - totalProportionalSmearMah += sipper.proportionalSmearMah; - - if (!isSystemSipper(sipper)) { - totalPowerExcludeSystemMah += sipper.totalSmearedPowerMah; - } - - totalCpuPowerMah += sipper.cpuPowerMah; - totalSystemServiceCpuPowerMah += sipper.systemServiceCpuPowerMah; - totalUsagePowerMah += sipper.usagePowerMah; - totalWakeLockPowerMah += sipper.wakeLockPowerMah; - totalMobileRadioPowerMah += sipper.mobileRadioPowerMah; - totalWifiPowerMah += sipper.wifiPowerMah; - totalBluetoothPowerMah += sipper.bluetoothPowerMah; - totalGpsPowerMah += sipper.gpsPowerMah; - totalCameraPowerMah += sipper.cameraPowerMah; - totalFlashlightPowerMah += sipper.flashlightPowerMah; - totalSensorPowerMah += sipper.sensorPowerMah; - totalAudioPowerMah += sipper.audioPowerMah; - totalVideoPowerMah += sipper.videoPowerMah; - - totalCpuTimeMs += sipper.cpuTimeMs; - totalCpuFgTimeMs += sipper.cpuFgTimeMs; - totalWakeLockTimeMs += sipper.wakeLockTimeMs; - totalWifiRunningTimeMs += sipper.wifiRunningTimeMs; - totalBluetoothRunningTimeMs += sipper.bluetoothRunningTimeMs; - totalGpsTimeMs += sipper.gpsTimeMs; - totalCameraTimeMs += sipper.cameraTimeMs; - totalFlashlightTimeMs += sipper.flashlightTimeMs; - totalAudioTimeMs += sipper.audioTimeMs; - totalVideoTimeMs += sipper.videoTimeMs; } - if (uidSipper == null) { + if (selectedBatteryConsumer == null) { return; } - addMetric(METRIC_APP_POWER, MetricKind.POWER, "Total power", - uidSipper.totalSmearedPowerMah, totalSmearedPowerMah); - addMetric(METRIC_APP_POWER_EXCLUDE_SYSTEM_FROM_TOTAL, MetricKind.POWER, - "Total power excluding system", - uidSipper.totalSmearedPowerMah, totalPowerExcludeSystemMah); - addMetric(METRIC_SCREEN_POWER, MetricKind.POWER, "Screen, smeared", - uidSipper.screenPowerMah, totalScreenPower); - addMetric(METRIC_OTHER_POWER, MetricKind.POWER, "Other, smeared", - uidSipper.proportionalSmearMah, totalProportionalSmearMah); - addMetric(METRIC_APP_POWER_EXCLUDE_SMEARED, MetricKind.POWER, "Excluding smeared", - uidSipper.totalPowerMah, totalPowerMah); - addMetric(METRIC_CPU_POWER, MetricKind.POWER, "CPU", - uidSipper.cpuPowerMah, totalCpuPowerMah); - addMetric(METRIC_SYSTEM_SERVICE_CPU_POWER, MetricKind.POWER, "System services", - uidSipper.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah); - addMetric(METRIC_RAM_POWER, MetricKind.POWER, "RAM", - uidSipper.usagePowerMah, totalUsagePowerMah); - addMetric(METRIC_WAKELOCK_POWER, MetricKind.POWER, "Wake lock", - uidSipper.wakeLockPowerMah, totalWakeLockPowerMah); - addMetric(METRIC_MOBILE_RADIO_POWER, MetricKind.POWER, "Mobile radio", - uidSipper.mobileRadioPowerMah, totalMobileRadioPowerMah); - addMetric(METRIC_WIFI_POWER, MetricKind.POWER, "WiFi", - uidSipper.wifiPowerMah, totalWifiPowerMah); - addMetric(METRIC_BLUETOOTH_POWER, MetricKind.POWER, "Bluetooth", - uidSipper.bluetoothPowerMah, totalBluetoothPowerMah); - addMetric(METRIC_GPS_POWER, MetricKind.POWER, "GPS", - uidSipper.gpsPowerMah, totalGpsPowerMah); - addMetric(METRIC_CAMERA_POWER, MetricKind.POWER, "Camera", - uidSipper.cameraPowerMah, totalCameraPowerMah); - addMetric(METRIC_FLASHLIGHT_POWER, MetricKind.POWER, "Flashlight", - uidSipper.flashlightPowerMah, totalFlashlightPowerMah); - addMetric(METRIC_SENSORS_POWER, MetricKind.POWER, "Sensors", - uidSipper.sensorPowerMah, totalSensorPowerMah); - addMetric(METRIC_AUDIO_POWER, MetricKind.POWER, "Audio", - uidSipper.audioPowerMah, totalAudioPowerMah); - addMetric(METRIC_VIDEO_POWER, MetricKind.POWER, "Video", - uidSipper.videoPowerMah, totalVideoPowerMah); - - addMetric(METRIC_CPU_TIME, MetricKind.DURATION, "CPU time", - uidSipper.cpuTimeMs, totalCpuTimeMs); - addMetric(METRIC_CPU_FOREGROUND_TIME, MetricKind.DURATION, "CPU foreground time", - uidSipper.cpuFgTimeMs, totalCpuFgTimeMs); - addMetric(METRIC_WAKELOCK_TIME, MetricKind.DURATION, "Wake lock time", - uidSipper.wakeLockTimeMs, totalWakeLockTimeMs); - addMetric(METRIC_WIFI_RUNNING_TIME, MetricKind.DURATION, "WiFi running time", - uidSipper.wifiRunningTimeMs, totalWifiRunningTimeMs); - addMetric(METRIC_BLUETOOTH_RUNNING_TIME, MetricKind.DURATION, "Bluetooth time", - uidSipper.bluetoothRunningTimeMs, totalBluetoothRunningTimeMs); - addMetric(METRIC_GPS_TIME, MetricKind.DURATION, "GPS time", - uidSipper.gpsTimeMs, totalGpsTimeMs); - addMetric(METRIC_CAMERA_TIME, MetricKind.DURATION, "Camera time", - uidSipper.cameraTimeMs, totalCameraTimeMs); - addMetric(METRIC_FLASHLIGHT_TIME, MetricKind.DURATION, "Flashlight time", - uidSipper.flashlightTimeMs, totalFlashlightTimeMs); - addMetric(METRIC_AUDIO_TIME, MetricKind.DURATION, "Audio time", - uidSipper.audioTimeMs, totalAudioTimeMs); - addMetric(METRIC_VIDEO_TIME, MetricKind.DURATION, "Video time", - uidSipper.videoTimeMs, totalVideoTimeMs); - } + for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; component++) { + addMetric(getPowerMetricName(component), MetricKind.POWER, + selectedBatteryConsumer.getConsumedPower(component), + totalPowerPerComponentMah[component]); + } - public List<Metric> getMetrics() { - return mMetrics; + for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) { + addMetric(getTimeMetricName(component), MetricKind.DURATION, + selectedBatteryConsumer.getUsageDurationMillis(component), + totalDurationPerComponentMs[component]); + } } - public double getMinDrainedPower() { - return mMinDrainedPower; + static String getTimeMetricName(int componentId) { + return "TIME_" + DebugUtils.constantToString(BatteryConsumer.class, + "TIME_COMPONENT_", componentId); } - public double getMaxDrainedPower() { - return mMaxDrainedPower; + static String getPowerMetricName(int componentId) { + return "POWER_" + DebugUtils.constantToString(BatteryConsumer.class, + "POWER_COMPONENT_", componentId); } - protected boolean isHiddenDrainType(BatterySipper.DrainType drainType) { - return drainType == BatterySipper.DrainType.IDLE - || drainType == BatterySipper.DrainType.CELL - || drainType == BatterySipper.DrainType.SCREEN - || drainType == BatterySipper.DrainType.UNACCOUNTED - || drainType == BatterySipper.DrainType.OVERCOUNTED - || drainType == BatterySipper.DrainType.BLUETOOTH - || drainType == BatterySipper.DrainType.WIFI; + public List<Metric> getMetrics() { + return mMetrics; } - private boolean isSystemSipper(BatterySipper sipper) { - final int uid = sipper.uidObj == null ? -1 : sipper.getUid(); - if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) { - return true; - } else if (sipper.mPackages != null) { - for (final String packageName : sipper.mPackages) { - for (final String systemPackage : PACKAGES_SYSTEM) { - if (systemPackage.equals(packageName)) { - return true; - } - } - } - } - - return false; + public double getDrainedPower() { + return mDrainedPower; } - private void addMetric(String metricType, MetricKind metricKind, String title, double amount, + private void addMetric(String metricType, MetricKind metricKind, double amount, double totalAmount) { Metric metric = new Metric(); - metric.metricType = metricType; + metric.metricName = metricType; metric.metricKind = metricKind; - metric.title = title; + metric.statusKeyPrefix = metricKind.toString().toLowerCase(); metric.value = amount; metric.total = totalAmount; mMetrics.add(metric); diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java index 254458cc8935..5b5da603b199 100644 --- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java @@ -19,47 +19,43 @@ package com.android.frameworks.core.batterystatsloadtests; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import android.app.Activity; import android.app.Instrumentation; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.BatteryConsumer; import android.os.BatteryManager; -import android.os.BatteryStats; +import android.os.BatteryStatsManager; import android.os.Bundle; +import android.os.ConditionVariable; import android.os.Process; import android.os.SystemClock; -import android.os.UserManager; +import android.util.IndentingPrintWriter; import android.util.Log; import android.util.TimeUtils; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.compatibility.common.util.SystemUtil; -import com.android.internal.os.BatteryStatsHelper; -import com.android.internal.os.LoggingPrintStream; - import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; -import java.io.PrintStream; +import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; public class PowerMetricsCollector implements TestRule { private final String mTag; private final float mBatteryDrainThresholdPct; private final int mTimeoutMillis; + private final Instrumentation mInstrumentation; private final Context mContext; - private final UserManager mUserManager; private final int mUid; - private final BatteryStatsHelper mStatsHelper; - private final CountDownLatch mSuspendingBatteryInput = new CountDownLatch(1); + private final ConditionVariable mSuspendingBatteryInput = new ConditionVariable(); private long mStartTime; private volatile float mInitialBatteryLevel; @@ -68,29 +64,34 @@ public class PowerMetricsCollector implements TestRule { private PowerMetrics mInitialPowerMetrics; private PowerMetrics mFinalPowerMetrics; private List<PowerMetrics.Metric> mPowerMetricsDelta; - private Intent mBatteryStatus; + private final BatteryStatsManager mBatteryStatsManager; + private final BroadcastReceiver mBatteryLevelReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + handleBatteryStatus(intent); + } + }; + private final Bundle mStatus = new Bundle(); + private final StringWriter mReportStringWriter = new StringWriter(); + private final IndentingPrintWriter mReportWriter = + new IndentingPrintWriter(mReportStringWriter); @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - BroadcastReceiver batteryBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - handleBatteryStatus(intent); - } - }; - mBatteryStatus = mContext.registerReceiver(batteryBroadcastReceiver, - new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); disableCharger(); try { - prepareBatteryLevelMonitor(); mStartTime = SystemClock.uptimeMillis(); + mContext.registerReceiver(mBatteryLevelReceiver, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); base.evaluate(); captureFinalPowerStatsData(); + mStatus.putString("report", mReportStringWriter.toString()); + mInstrumentation.sendStatus(Activity.RESULT_OK, mStatus); } finally { - mContext.unregisterReceiver(batteryBroadcastReceiver); + mContext.unregisterReceiver(mBatteryLevelReceiver); enableCharger(); } } @@ -102,35 +103,41 @@ public class PowerMetricsCollector implements TestRule { mBatteryDrainThresholdPct = batteryDrainThresholdPct; mTimeoutMillis = timeoutMillis; - Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); - mContext = instrumentation.getContext(); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); + mContext = mInstrumentation.getContext(); mUid = Process.myUid(); - mUserManager = mContext.getSystemService(UserManager.class); - // TODO(b/175324611): Use BatteryUsageStats instead - mStatsHelper = new BatteryStatsHelper(mContext, false /* collectBatteryBroadcast */); - mStatsHelper.create((Bundle) null); + mBatteryStatsManager = mContext.getSystemService(BatteryStatsManager.class); } - private void disableCharger() throws InterruptedException { - SystemUtil.runShellCommand("dumpsys battery suspend_input"); - final boolean success = mSuspendingBatteryInput.await(10, TimeUnit.SECONDS); - assertTrue("Timed out waiting for battery input to be suspended", success); + private void disableCharger() { + final BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (!isCharging(intent)) { + mInitialBatteryLevel = mCurrentBatteryLevel = getBatteryLevel(intent); + mSuspendingBatteryInput.open(); + } + } + }; + final Intent intent = mContext.registerReceiver( + receiver, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + if (isCharging(intent)) { + mBatteryStatsManager.suspendBatteryInput(); + final boolean success = mSuspendingBatteryInput.block(10000); + assertTrue("Timed out waiting for battery input to be suspended", success); + } + + mContext.unregisterReceiver(receiver); } private void enableCharger() { - SystemUtil.runShellCommand("dumpsys battery reset"); + mBatteryStatsManager.resetBattery(/* forceUpdate */false); } private PowerMetrics readBatteryStatsData() { - mStatsHelper.clearStats(); - mStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, - mUserManager.getUserProfiles()); - return new PowerMetrics(mStatsHelper, mUid); - } - - protected void prepareBatteryLevelMonitor() { - handleBatteryStatus(mBatteryStatus); - mInitialBatteryLevel = mCurrentBatteryLevel; + return new PowerMetrics(mBatteryStatsManager.getBatteryUsageStats(), mUid); } protected void handleBatteryStatus(Intent intent) { @@ -138,36 +145,35 @@ public class PowerMetricsCollector implements TestRule { return; } - final boolean isCharging = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0; - - if (mSuspendingBatteryInput.getCount() > 0) { - if (!isCharging) { - mSuspendingBatteryInput.countDown(); - } - return; - } - - if (isCharging) { + if (isCharging(intent)) { fail("Device must remain disconnected from the power source " + "for the duration of the test"); } - int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); - int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); - - mCurrentBatteryLevel = level * 100 / (float) scale; + mCurrentBatteryLevel = getBatteryLevel(intent); Log.i(mTag, "Battery level = " + mCurrentBatteryLevel); // We delay tracking until the battery level drops. If the resolution of // battery level is 1%, and the initially reported level is 73, we don't know whether // it's 73.1 or 73.7. Once it drops to 72, we can be confident that the real battery - // level it is very close to 72.0 and can start tracking. + // level is very close to 72.0 and can start tracking. if (mInitialPowerMetrics == null && mCurrentBatteryLevel < mInitialBatteryLevel) { mInitialBatteryLevel = mCurrentBatteryLevel; mInitialPowerMetrics = readBatteryStatsData(); } } + private boolean isCharging(Intent intent) { + return intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0; + } + + private float getBatteryLevel(Intent intent) { + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + + return level * 100 / (float) scale; + } + private void captureFinalPowerStatsData() { if (mFinalPowerMetrics != null) { return; @@ -181,7 +187,7 @@ public class PowerMetricsCollector implements TestRule { for (PowerMetrics.Metric initialMetric : initialPowerMetrics) { PowerMetrics.Metric finalMetric = null; for (PowerMetrics.Metric metric : finalPowerMetrics) { - if (metric.title.equals(initialMetric.title)) { + if (metric.metricName.equals(initialMetric.metricName)) { finalMetric = metric; break; } @@ -189,9 +195,9 @@ public class PowerMetricsCollector implements TestRule { if (finalMetric != null) { PowerMetrics.Metric delta = new PowerMetrics.Metric(); - delta.metricType = initialMetric.metricType; + delta.metricName = initialMetric.metricName; delta.metricKind = initialMetric.metricKind; - delta.title = initialMetric.title; + delta.statusKeyPrefix = initialMetric.statusKeyPrefix; delta.total = finalMetric.total - initialMetric.total; delta.value = finalMetric.value - initialMetric.value; mPowerMetricsDelta.add(delta); @@ -230,73 +236,80 @@ public class PowerMetricsCollector implements TestRule { return mIterations; } - public void dumpMetrics() { - dumpMetrics(new LoggingPrintStream() { - @Override - protected void log(String line) { - Log.i(mTag, line); - } - }); + public void report(String line) { + mReportWriter.println(line); } - public void dumpMetrics(PrintStream out) { + public void reportMetrics() { List<PowerMetrics.Metric> initialPowerMetrics = mInitialPowerMetrics.getMetrics(); List<PowerMetrics.Metric> finalPowerMetrics = mFinalPowerMetrics.getMetrics(); - out.println("== Power metrics at test start"); - dumpPowerStatsData(out, initialPowerMetrics); + mReportWriter.println("Power metrics at test start"); + mReportWriter.increaseIndent(); + reportPowerStatsData(initialPowerMetrics); + mReportWriter.decreaseIndent(); - out.println("== Power metrics at test end"); - dumpPowerStatsData(out, finalPowerMetrics); + mReportWriter.println("Power metrics at test end"); + mReportWriter.increaseIndent(); + reportPowerStatsData(finalPowerMetrics); + mReportWriter.decreaseIndent(); - out.println("== Power metrics delta"); - dumpPowerStatsData(out, mPowerMetricsDelta); + mReportWriter.println("Power metrics delta"); + mReportWriter.increaseIndent(); + reportPowerStatsData(mPowerMetricsDelta); + mReportWriter.decreaseIndent(); } - protected void dumpPowerStatsData(PrintStream out, List<PowerMetrics.Metric> metrics) { + protected void reportPowerStatsData(List<PowerMetrics.Metric> metrics) { Locale locale = Locale.getDefault(); for (PowerMetrics.Metric metric : metrics) { double proportion = metric.total != 0 ? metric.value * 100 / metric.total : 0; switch (metric.metricKind) { case POWER: - out.println( - String.format(locale, " %-30s %7.1f mAh %4.1f%%", metric.title, + mReportWriter.println( + String.format(locale, "%-40s %7.1f mAh %4.1f%%", metric.metricName, metric.value, proportion)); break; case DURATION: - out.println( - String.format(locale, " %-30s %,7d ms %4.1f%%", metric.title, + mReportWriter.println( + String.format(locale, "%-40s %,7d ms %4.1f%%", metric.metricName, (long) metric.value, proportion)); break; } } } - public void dumpMetricAsPercentageOfDrainedPower(String metricType) { - double minDrainedPower = - mFinalPowerMetrics.getMinDrainedPower() - mInitialPowerMetrics.getMinDrainedPower(); - double maxDrainedPower = - mFinalPowerMetrics.getMaxDrainedPower() - mInitialPowerMetrics.getMaxDrainedPower(); + public void reportMetricAsPercentageOfDrainedPower( + @BatteryConsumer.PowerComponent int component) { + double drainedPower = + mFinalPowerMetrics.getDrainedPower() - mInitialPowerMetrics.getDrainedPower(); - PowerMetrics.Metric metric = getMetric(metricType); + PowerMetrics.Metric metric = getPowerMetric(component); double metricDelta = metric.value; - if (maxDrainedPower - minDrainedPower < 0.1f) { - Log.i(mTag, String.format(Locale.getDefault(), - "%s power consumed by the test: %.1f of %.1f mAh (%.1f%%)", - metric.title, metricDelta, maxDrainedPower, - metricDelta / maxDrainedPower * 100)); - } else { - Log.i(mTag, String.format(Locale.getDefault(), - "%s power consumed by the test: %.1f of %.1f - %.1f mAh (%.1f%% - %.1f%%)", - metric.title, metricDelta, minDrainedPower, maxDrainedPower, - metricDelta / minDrainedPower * 100, metricDelta / maxDrainedPower * 100)); + final double percent = metricDelta / drainedPower * 100; + mStatus.putDouble(metric.statusKeyPrefix, metricDelta); + mStatus.putDouble(metric.statusKeyPrefix + "_pct", percent); + + mReportWriter.println(String.format(Locale.getDefault(), + "%s power consumed by the test: %.1f of %.1f mAh (%.1f%%)", + metric.metricName, metricDelta, drainedPower, percent)); + } + + public PowerMetrics.Metric getPowerMetric(@BatteryConsumer.PowerComponent int component) { + final String name = PowerMetrics.getPowerMetricName(component); + for (PowerMetrics.Metric metric : mPowerMetricsDelta) { + if (metric.metricName.equals(name)) { + return metric; + } } + return null; } - public PowerMetrics.Metric getMetric(String metricType) { + public PowerMetrics.Metric getTimeMetric(@BatteryConsumer.TimeComponent int component) { + final String name = PowerMetrics.getTimeMetricName(component); for (PowerMetrics.Metric metric : mPowerMetricsDelta) { - if (metric.metricType.equals(metricType)) { + if (metric.metricName.equals(name)) { return metric; } } diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java index 488469d54f29..1ebc7435f9fd 100644 --- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java @@ -23,7 +23,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; -import android.util.Log; +import android.os.BatteryConsumer; import androidx.test.platform.app.InstrumentationRegistry; @@ -58,12 +58,12 @@ public class SystemServiceCallLoadTest { assertNotNull(resolveInfo); } - mPowerMetricsCollector.dumpMetrics(); + mPowerMetricsCollector.reportMetrics(); - Log.i(TAG, "=="); - Log.i(TAG, "Total system server calls made " + mPowerMetricsCollector.getIterationCount()); + mPowerMetricsCollector.report( + "Total system server calls made: " + mPowerMetricsCollector.getIterationCount()); - mPowerMetricsCollector.dumpMetricAsPercentageOfDrainedPower( - PowerMetrics.METRIC_SYSTEM_SERVICE_CPU_POWER); + mPowerMetricsCollector.reportMetricAsPercentageOfDrainedPower( + BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES); } } diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java index 27495da8d839..15bb3fc0c20a 100644 --- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java @@ -16,7 +16,7 @@ package com.android.frameworks.core.batterystatsloadtests; -import android.util.Log; +import android.os.BatteryConsumer; import org.junit.Rule; import org.junit.Test; @@ -59,14 +59,15 @@ public class WiFiLoadTest { } } - mPowerMetricsCollector.dumpMetrics(); + mPowerMetricsCollector.reportMetrics(); - Log.i(TAG, "=="); - Log.i(TAG, "WiFi running time: " + (long) mPowerMetricsCollector.getMetric( - PowerMetrics.METRIC_WIFI_RUNNING_TIME).value); - Log.i(TAG, "Total bytes read over WiFi: " + totalBytesRead); + mPowerMetricsCollector.report( + "WiFi running time: " + (long) mPowerMetricsCollector.getTimeMetric( + BatteryConsumer.POWER_COMPONENT_WIFI).value); - mPowerMetricsCollector.dumpMetricAsPercentageOfDrainedPower( - PowerMetrics.METRIC_WIFI_POWER); + mPowerMetricsCollector.report("Total bytes read over WiFi: " + totalBytesRead); + + mPowerMetricsCollector.reportMetricAsPercentageOfDrainedPower( + BatteryConsumer.POWER_COMPONENT_WIFI); } } diff --git a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java index c67f90136992..cf47efddddd9 100644 --- a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java @@ -19,7 +19,6 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.SystemBatteryConsumer; import android.view.Display; @@ -71,6 +70,8 @@ public class AmbientDisplayPowerCalculatorTest { // 100,000,00 uC / 1000 (micro-/milli-) / 360 (seconds/hour) = 27.777778 mAh assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE)) .isWithin(PRECISION).of(27.777778); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } @Test @@ -85,8 +86,7 @@ public class AmbientDisplayPowerCalculatorTest { AmbientDisplayPowerCalculator calculator = new AmbientDisplayPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); SystemBatteryConsumer consumer = mStatsRule.getSystemBatteryConsumer( @@ -95,5 +95,7 @@ public class AmbientDisplayPowerCalculatorTest { .isEqualTo(90 * MINUTE_IN_MS); assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE)) .isWithin(PRECISION).of(15.0); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java index 80ab36ec84cf..1e614c480bde 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java @@ -43,6 +43,12 @@ import org.mockito.stubbing.Answer; import java.util.Arrays; public class BatteryUsageStatsRule implements TestRule { + public static final BatteryUsageStatsQuery POWER_PROFILE_MODEL_ONLY = + new BatteryUsageStatsQuery.Builder() + .powerProfileModeledOnly() + .includePowerModels() + .build(); + private final PowerProfile mPowerProfile; private final MockClocks mMockClocks = new MockClocks(); private final MockBatteryStatsImpl mBatteryStats = new MockBatteryStatsImpl(mMockClocks) { @@ -156,7 +162,8 @@ public class BatteryUsageStatsRule implements TestRule { } BatteryUsageStats apply(PowerCalculator... calculators) { - return apply(BatteryUsageStatsQuery.DEFAULT, calculators); + return apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(), + calculators); } BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) { @@ -165,8 +172,10 @@ public class BatteryUsageStatsRule implements TestRule { final int customMeasuredEnergiesCount = customMeasuredEnergiesMicroJoules != null ? customMeasuredEnergiesMicroJoules.length : 0; + final boolean includePowerModels = (query.getFlags() + & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0; BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder( - customMeasuredEnergiesCount, 0); + customMeasuredEnergiesCount, 0, includePowerModels); SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats(); for (int i = 0; i < uidStats.size(); i++) { builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i)); diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java index 2769b163ecd2..1a87c1084fe0 100644 --- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java @@ -19,6 +19,8 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; import android.annotation.Nullable; +import android.bluetooth.BluetoothActivityEnergyInfo; +import android.bluetooth.UidTraffic; import android.os.BatteryConsumer; import android.os.BatteryUsageStatsQuery; import android.os.Process; @@ -41,7 +43,8 @@ public class BluetoothPowerCalculatorTest { public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_IDLE, 10.0) .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_RX, 50.0) - .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_TX, 100.0); + .setAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_TX, 100.0) + .initMeasuredEnergyStatsLocked(0); @Test public void testTimerBasedModel() { @@ -60,16 +63,15 @@ public class BluetoothPowerCalculatorTest { BluetoothPowerCalculator calculator = new BluetoothPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull(); assertBluetoothPowerAndDuration( mStatsRule.getUidBatteryConsumer(APP_UID), - 0.24722, 15000); + 0.24722, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertBluetoothPowerAndDuration( mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH), - 0.51944, 9000, 0.51944, 0.36111); + 0.51944, 9000, 0.51944, 0.36111, BatteryConsumer.POWER_MODEL_POWER_PROFILE); } @Test @@ -89,16 +91,40 @@ public class BluetoothPowerCalculatorTest { BluetoothPowerCalculator calculator = new BluetoothPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); + + assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull(); + assertBluetoothPowerAndDuration( + mStatsRule.getUidBatteryConsumer(APP_UID), + 0.2, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE); + assertBluetoothPowerAndDuration( + mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH), + 0.45, 9000, 0.45, 0.3, BatteryConsumer.POWER_MODEL_POWER_PROFILE); + } + + @Test + public void testMeasuredEnergyBasedModel() { + final BluetoothActivityEnergyInfo info = new BluetoothActivityEnergyInfo(1000, + BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 7000, 5000, 0, 100000); + info.setUidTraffic(new UidTraffic[]{ + new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000), + new UidTraffic(APP_UID, 3000, 4000) + }); + mStatsRule.getBatteryStats().updateBluetoothStateLocked(info, 1200000, 1000, 1000); + + final BluetoothPowerCalculator calculator = + new BluetoothPowerCalculator(mStatsRule.getPowerProfile()); + + mStatsRule.apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(), calculator); assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull(); assertBluetoothPowerAndDuration( mStatsRule.getUidBatteryConsumer(APP_UID), - 0.2, 15000); + 0.22950, 8416, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertBluetoothPowerAndDuration( mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH), - 0.45, 9000, 0.45, 0.3); + 0.43712, 3584, 0.43712, 0.33329, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } private void setDurationsAndPower( @@ -111,12 +137,14 @@ public class BluetoothPowerCalculatorTest { } private void assertBluetoothPowerAndDuration(@Nullable BatteryConsumer batteryConsumer, - double powerMah, int durationMs) { + double powerMah, int durationMs, @BatteryConsumer.PowerModel int powerModel) { assertThat(batteryConsumer).isNotNull(); double consumedPower = batteryConsumer.getConsumedPower( BatteryConsumer.POWER_COMPONENT_BLUETOOTH); assertThat(consumedPower).isWithin(PRECISION).of(powerMah); + assertThat(batteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_BLUETOOTH)) + .isEqualTo(powerModel); long usageDurationMillis = batteryConsumer.getUsageDurationMillis( BatteryConsumer.TIME_COMPONENT_BLUETOOTH); @@ -125,8 +153,9 @@ public class BluetoothPowerCalculatorTest { } private void assertBluetoothPowerAndDuration(@Nullable SystemBatteryConsumer batteryConsumer, - double powerMah, int durationMs, double consumedPower, double attributedPower) { - assertBluetoothPowerAndDuration(batteryConsumer, powerMah, durationMs); + double powerMah, int durationMs, double consumedPower, double attributedPower, + @BatteryConsumer.PowerModel int powerModel) { + assertBluetoothPowerAndDuration(batteryConsumer, powerMah, durationMs, powerModel); assertThat(batteryConsumer.getConsumedPower()) .isWithin(PRECISION).of(consumedPower); diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java index 13d529cfed26..a181bc8ba4da 100644 --- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java @@ -186,6 +186,7 @@ public class BstatsCpuTimesValidationTest { sPerProcStateTimesAvailable = fgCpuTimes != null; } + @SkipPresubmit("b/184201598 flaky") @Test public void testCpuFreqTimes() throws Exception { if (!sCpuFreqTimesAvailable) { @@ -214,6 +215,7 @@ public class BstatsCpuTimesValidationTest { batteryOffScreenOn(); } + @SkipPresubmit("b/184201598 flaky") @Test public void testCpuFreqTimes_screenOff() throws Exception { if (!sCpuFreqTimesAvailable) { @@ -276,6 +278,7 @@ public class BstatsCpuTimesValidationTest { batteryOffScreenOn(); } + @SkipPresubmit("b/184201598 flaky") @Test public void testCpuFreqTimes_stateTop() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { @@ -309,6 +312,7 @@ public class BstatsCpuTimesValidationTest { batteryOffScreenOn(); } + @SkipPresubmit("b/184201598 flaky") @Test public void testIsolatedCpuFreqTimes_stateService() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { @@ -450,6 +454,7 @@ public class BstatsCpuTimesValidationTest { batteryOff(); } + @SkipPresubmit("b/184201598 flaky") @Test public void testCpuFreqTimes_stateBg() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { @@ -516,6 +521,7 @@ public class BstatsCpuTimesValidationTest { batteryOffScreenOn(); } + @SkipPresubmit("b/184201598 flaky") @Test public void testCpuFreqTimes_trackingDisabled() throws Exception { if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) { diff --git a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java index 496415a43a6a..31abbc20a090 100644 --- a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.UidBatteryConsumer; @@ -142,14 +141,15 @@ public class CpuPowerCalculatorTest { CpuPowerCalculator calculator = new CpuPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); UidBatteryConsumer uidConsumer1 = mStatsRule.getUidBatteryConsumer(APP_UID1); assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU)) .isEqualTo(3333); assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU)) .isWithin(PRECISION).of(1.092233); + assertThat(uidConsumer1.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar"); UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2); @@ -157,6 +157,8 @@ public class CpuPowerCalculatorTest { .isEqualTo(7777); assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU)) .isWithin(PRECISION).of(2.672322); + assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull(); } @@ -210,6 +212,8 @@ public class CpuPowerCalculatorTest { .isEqualTo(3333); assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU)) .isWithin(PRECISION).of(3.18877); + assertThat(uidConsumer1.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar"); UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2); @@ -217,6 +221,8 @@ public class CpuPowerCalculatorTest { .isEqualTo(7777); assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU)) .isWithin(PRECISION).of(7.44072); + assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull(); } } diff --git a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java index eed61cb0afe7..95c3b4ed8a40 100644 --- a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java @@ -19,7 +19,6 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.UidBatteryConsumer; @@ -54,14 +53,15 @@ public class GnssPowerCalculatorTest { GnssPowerCalculator calculator = new GnssPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID); assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS)) .isEqualTo(1000); assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS)) .isWithin(PRECISION).of(0.1); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); } @Test @@ -87,11 +87,15 @@ public class GnssPowerCalculatorTest { .isEqualTo(1000); assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS)) .isWithin(PRECISION).of(2.77777); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); UidBatteryConsumer consumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2); assertThat(consumer2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS)) .isEqualTo(2000); assertThat(consumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS)) .isWithin(PRECISION).of(5.55555); + assertThat(consumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } } diff --git a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java index 813bc9f43662..3505e8c34027 100644 --- a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.when; import android.net.NetworkCapabilities; import android.net.NetworkStats; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; @@ -99,13 +98,14 @@ public class MobileRadioPowerCalculatorTest { MobileRadioPowerCalculator calculator = new MobileRadioPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); SystemBatteryConsumer consumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO); assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isWithin(PRECISION).of(2.2444); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(consumer.getConsumedPower()) .isWithin(PRECISION).of(2.2444); assertThat(consumer.getPowerConsumedByApps()) @@ -114,6 +114,8 @@ public class MobileRadioPowerCalculatorTest { UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isWithin(PRECISION).of(0.8); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); } @Test @@ -163,11 +165,15 @@ public class MobileRadioPowerCalculatorTest { // 100000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) + 1.53934 (apps)= 4.31711 mAh assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isWithin(PRECISION).of(4.31711); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(consumer.getPowerConsumedByApps()) .isWithin(PRECISION).of(1.53934); UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isWithin(PRECISION).of(1.53934); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } } diff --git a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java index d296afa00dbc..9cd6ea8a6a3b 100644 --- a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import android.app.ActivityManager; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; @@ -91,6 +90,8 @@ public class ScreenPowerCalculatorTest { // 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) = 166.66666 mAh assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE)) .isWithin(PRECISION).of(166.66666); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(consumer.getConsumedPower()) .isWithin(PRECISION).of(166.66666); assertThat(consumer.getPowerConsumedByApps()) @@ -105,6 +106,8 @@ public class ScreenPowerCalculatorTest { // Uid1 charge = 200000000 + 5 / 45 * 300000000 mAs = 64.81 mAh assertThat(uid1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)) .isWithin(PRECISION).of(64.81481); + assertThat(uid1.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2); assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN)) @@ -115,6 +118,8 @@ public class ScreenPowerCalculatorTest { // Uid2 charge = 40 / 45 * 300000000 + 100000000 mAs = 101.85 mAh assertThat(uid2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)) .isWithin(PRECISION).of(101.85185); + assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } @Test @@ -144,8 +149,7 @@ public class ScreenPowerCalculatorTest { ScreenPowerCalculator calculator = new ScreenPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); SystemBatteryConsumer consumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN); @@ -153,6 +157,8 @@ public class ScreenPowerCalculatorTest { .isEqualTo(80 * MINUTE_IN_MS); assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE)) .isWithin(PRECISION).of(92.0); + assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(consumer.getConsumedPower()) .isWithin(PRECISION).of(92.0); assertThat(consumer.getPowerConsumedByApps()) @@ -166,6 +172,8 @@ public class ScreenPowerCalculatorTest { // Uid1 charge = 20 / 80 * 92.0 = 23.0 mAh assertThat(uid1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)) .isWithin(PRECISION).of(23.0); + assertThat(uid1.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2); assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN)) @@ -175,6 +183,8 @@ public class ScreenPowerCalculatorTest { // Uid2 charge = 60 / 80 * 92.0 = 69.0 mAh assertThat(uid2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)) .isWithin(PRECISION).of(69.0); + assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); } private void setProcState(int uid, int procState, boolean resumed, long realtimeMs, diff --git a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java index 5df91dd00f59..2e501dbe355e 100644 --- a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java @@ -24,7 +24,6 @@ import static com.google.common.truth.Truth.assertThat; import android.net.NetworkCapabilities; import android.net.NetworkStats; import android.os.BatteryConsumer; -import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; @@ -85,14 +84,15 @@ public class WifiPowerCalculatorTest { batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000); WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI)) .isEqualTo(1423); assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(0.2214666); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI); @@ -100,6 +100,8 @@ public class WifiPowerCalculatorTest { .isEqualTo(5577); assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(1.11153); + assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(systemConsumer.getPowerConsumedByApps()) .isWithin(PRECISION).of(0.466333); } @@ -120,6 +122,8 @@ public class WifiPowerCalculatorTest { /* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */ assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(0.2214666 / (0.2214666 + 0.645200) * 1_000_000 / 3600000); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI); @@ -128,6 +132,8 @@ public class WifiPowerCalculatorTest { /* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */ assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(1.11153 / (0.2214666 + 0.645200) * 1_000_000 / 3600000); + assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(systemConsumer.getPowerConsumedByApps()) .isWithin(PRECISION).of(0.14946); } @@ -153,14 +159,15 @@ public class WifiPowerCalculatorTest { batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000); WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile()); - mStatsRule.apply(new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build(), - calculator); + mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator); UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI)) .isEqualTo(1000); assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(0.8231573); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI); @@ -168,6 +175,8 @@ public class WifiPowerCalculatorTest { .isEqualTo(2222); assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(2.575000); + assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE); assertThat(systemConsumer.getPowerConsumedByApps()) .isWithin(PRECISION).of(1.69907); } @@ -189,6 +198,8 @@ public class WifiPowerCalculatorTest { /* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */ assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(0.8231573 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000); + assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI); @@ -197,6 +208,8 @@ public class WifiPowerCalculatorTest { /* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */ assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI)) .isWithin(PRECISION).of(2.575000 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000); + assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI)) + .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); assertThat(systemConsumer.getPowerConsumedByApps()) .isWithin(PRECISION).of(0.277777); } diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java index 94d5c2265372..fb089741dfb2 100644 --- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java +++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java @@ -49,23 +49,12 @@ public final class RippleAnimationSession { private Runnable mOnUpdate; private long mStartTime; private boolean mForceSoftware; - private final ValueAnimator mSparkle = ValueAnimator.ofFloat(0, 1); + private boolean mAnimateSparkle; RippleAnimationSession(@NonNull AnimationProperties<Float, Paint> properties, boolean forceSoftware) { mProperties = properties; mForceSoftware = forceSoftware; - - mSparkle.addUpdateListener(anim -> { - final long now = AnimationUtils.currentAnimationTimeMillis(); - final long elapsed = now - mStartTime - ENTER_ANIM_DURATION; - final float phase = (float) elapsed / 800; - mProperties.getShader().setNoisePhase(phase); - notifyUpdate(); - }); - mSparkle.setDuration(ENTER_ANIM_DURATION); - mSparkle.setInterpolator(LINEAR_INTERPOLATOR); - mSparkle.setRepeatCount(ValueAnimator.INFINITE); } @NonNull RippleAnimationSession enter(Canvas canvas) { @@ -99,6 +88,16 @@ public final class RippleAnimationSession { return this; } + public boolean shouldAnimateSparkle() { + return mAnimateSparkle; + } + + public float getSparklePhase() { + final long now = AnimationUtils.currentAnimationTimeMillis(); + final long elapsed = now - mStartTime; + return (float) elapsed / 800; + } + private boolean isHwAccelerated(Canvas canvas) { return canvas.isHardwareAccelerated() && !mForceSoftware; } @@ -115,7 +114,7 @@ public final class RippleAnimationSession { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - mSparkle.end(); + mAnimateSparkle = false; Consumer<RippleAnimationSession> onEnd = mOnSessionEnd; if (onEnd != null) onEnd.accept(RippleAnimationSession.this); } @@ -149,7 +148,7 @@ public final class RippleAnimationSession { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - mSparkle.end(); + mAnimateSparkle = false; Consumer<RippleAnimationSession> onEnd = mOnSessionEnd; if (onEnd != null) onEnd.accept(RippleAnimationSession.this); } @@ -176,9 +175,7 @@ public final class RippleAnimationSession { expand.addListener(new AnimatorListener(this)); expand.setInterpolator(FAST_OUT_LINEAR_IN); expand.start(); - if (!mSparkle.isRunning()) { - mSparkle.start(); - } + mAnimateSparkle = true; } private void enterSoftware() { diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 3bd0a43652d2..8b8cbbc8a9a6 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -48,7 +48,6 @@ import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.Shader; import android.os.Build; -import android.os.SystemProperties; import android.util.AttributeSet; import android.view.animation.LinearInterpolator; @@ -152,8 +151,7 @@ public class RippleDrawable extends LayerDrawable { private static final int MAX_RIPPLES = 10; private static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); /** Temporary flag for teamfood. **/ - private static final boolean FORCE_PATTERNED_STYLE = - SystemProperties.getBoolean("persist.material.patternedripple", false); + private static final boolean FORCE_PATTERNED_STYLE = true; private final Rect mTempRect = new Rect(); @@ -861,6 +859,15 @@ public class RippleDrawable extends LayerDrawable { } for (int i = 0; i < mRunningAnimations.size(); i++) { RippleAnimationSession s = mRunningAnimations.get(i); + if (s.shouldAnimateSparkle()) { + final float phase = s.getSparklePhase(); + if (useCanvasProps) { + s.getCanvasProperties().getShader().setNoisePhase(phase); + } else { + s.getProperties().getShader().setNoisePhase(phase); + } + invalidateSelf(); + } if (useCanvasProps) { RippleAnimationSession.AnimationProperties<CanvasProperty<Float>, CanvasProperty<Paint>> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java index af4ccadae538..5c3af3ee5330 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java @@ -42,7 +42,7 @@ import java.lang.annotation.RetentionPolicy; * Controller class of PiP animations (both from and to PiP mode). */ public class PipAnimationController { - private static final float FRACTION_START = 0f; + static final float FRACTION_START = 0f; private static final float FRACTION_END = 1f; public static final int ANIM_TYPE_BOUNDS = 0; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java index 702385ecc3d2..7b834b294bb9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java @@ -57,9 +57,10 @@ public class PipBoundsAlgorithm { private int mOverridableMinSize; private Point mScreenEdgeInsets; - public PipBoundsAlgorithm(Context context, @NonNull PipBoundsState pipBoundsState) { + public PipBoundsAlgorithm(Context context, @NonNull PipBoundsState pipBoundsState, + @NonNull PipSnapAlgorithm pipSnapAlgorithm) { mPipBoundsState = pipBoundsState; - mSnapAlgorithm = new PipSnapAlgorithm(); + mSnapAlgorithm = pipSnapAlgorithm; reloadResources(context); // Initialize the aspect ratio to the default aspect ratio. Don't do this in reload // resources as it would clobber mAspectRatio when entering PiP from fullscreen which diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java index 6afcc06aa1ae..3af0ff0dfb36 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java @@ -19,6 +19,8 @@ package com.android.wm.shell.pip; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import android.annotation.DrawableRes; +import android.annotation.StringRes; import android.app.PendingIntent; import android.app.RemoteAction; import android.content.BroadcastReceiver; @@ -49,6 +51,7 @@ import java.util.List; * when there is a media session from the top PiP activity. */ public class PipMediaController { + private static final String SYSTEMUI_PERMISSION = "com.android.systemui.permission.SELF"; private static final String ACTION_PLAY = "com.android.wm.shell.pip.PLAY"; private static final String ACTION_PAUSE = "com.android.wm.shell.pip.PAUSE"; @@ -87,18 +90,26 @@ public class PipMediaController { private RemoteAction mNextAction; private RemoteAction mPrevAction; - private BroadcastReceiver mPlayPauseActionReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mMediaActionReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (action.equals(ACTION_PLAY)) { - mMediaController.getTransportControls().play(); - } else if (action.equals(ACTION_PAUSE)) { - mMediaController.getTransportControls().pause(); - } else if (action.equals(ACTION_NEXT)) { - mMediaController.getTransportControls().skipToNext(); - } else if (action.equals(ACTION_PREV)) { - mMediaController.getTransportControls().skipToPrevious(); + if (mMediaController == null || mMediaController.getTransportControls() == null) { + // no active media session, bail early. + return; + } + switch (intent.getAction()) { + case ACTION_PLAY: + mMediaController.getTransportControls().play(); + break; + case ACTION_PAUSE: + mMediaController.getTransportControls().pause(); + break; + case ACTION_NEXT: + mMediaController.getTransportControls().skipToNext(); + break; + case ACTION_PREV: + mMediaController.getTransportControls().skipToPrevious(); + break; } } }; @@ -131,10 +142,19 @@ public class PipMediaController { mediaControlFilter.addAction(ACTION_PAUSE); mediaControlFilter.addAction(ACTION_NEXT); mediaControlFilter.addAction(ACTION_PREV); - mContext.registerReceiverForAllUsers(mPlayPauseActionReceiver, mediaControlFilter, - null /* permission */, mainHandler); + mContext.registerReceiverForAllUsers(mMediaActionReceiver, mediaControlFilter, + SYSTEMUI_PERMISSION, mainHandler); + + // Creates the standard media buttons that we may show. + mPauseAction = getDefaultRemoteAction(R.string.pip_pause, + R.drawable.pip_ic_pause_white, ACTION_PAUSE); + mPlayAction = getDefaultRemoteAction(R.string.pip_play, + R.drawable.pip_ic_play_arrow_white, ACTION_PLAY); + mNextAction = getDefaultRemoteAction(R.string.pip_skip_to_next, + R.drawable.pip_ic_skip_next_white, ACTION_NEXT); + mPrevAction = getDefaultRemoteAction(R.string.pip_skip_to_prev, + R.drawable.pip_ic_skip_previous_white, ACTION_PREV); - createMediaActions(); mMediaSessionManager = context.getSystemService(MediaSessionManager.class); } @@ -216,32 +236,15 @@ public class PipMediaController { return mediaActions; } - /** - * Creates the standard media buttons that we may show. - */ - private void createMediaActions() { - String pauseDescription = mContext.getString(R.string.pip_pause); - mPauseAction = new RemoteAction(Icon.createWithResource(mContext, - R.drawable.pip_ic_pause_white), pauseDescription, pauseDescription, - PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PAUSE), - FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE)); - - String playDescription = mContext.getString(R.string.pip_play); - mPlayAction = new RemoteAction(Icon.createWithResource(mContext, - R.drawable.pip_ic_play_arrow_white), playDescription, playDescription, - PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PLAY), - FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE)); - - String nextDescription = mContext.getString(R.string.pip_skip_to_next); - mNextAction = new RemoteAction(Icon.createWithResource(mContext, - R.drawable.pip_ic_skip_next_white), nextDescription, nextDescription, - PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_NEXT), - FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE)); - - String prevDescription = mContext.getString(R.string.pip_skip_to_prev); - mPrevAction = new RemoteAction(Icon.createWithResource(mContext, - R.drawable.pip_ic_skip_previous_white), prevDescription, prevDescription, - PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PREV), + /** @return Default {@link RemoteAction} sends broadcast back to SysUI. */ + private RemoteAction getDefaultRemoteAction(@StringRes int titleAndDescription, + @DrawableRes int icon, String action) { + final String titleAndDescriptionStr = mContext.getString(titleAndDescription); + final Intent intent = new Intent(action); + intent.setPackage(mContext.getPackageName()); + return new RemoteAction(Icon.createWithResource(mContext, icon), + titleAndDescriptionStr, titleAndDescriptionStr, + PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent, FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE)); } 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 99ec10049340..f6b63eb006ac 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 @@ -25,6 +25,7 @@ import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_PIP; import static com.android.wm.shell.ShellTaskOrganizer.taskListenerTypeToString; import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_ALPHA; import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_BOUNDS; +import static com.android.wm.shell.pip.PipAnimationController.FRACTION_START; import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_EXPAND_OR_UNEXPAND; import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP; import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN; @@ -352,9 +353,19 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, // updated right after applying the windowing mode change. final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( mPictureInPictureParams, destinationBounds); - scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds, + final PipAnimationController.PipTransitionAnimator<?> animator = + scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds, 0 /* startingAngle */, sourceHintRect, direction, animationDurationMs, null /* updateBoundsCallback */); + if (animator != null) { + // Even though the animation was started above, re-apply the transaction for the + // first frame using the SurfaceControl.Transaction supplied by the + // SyncTransactionQueue. This is necessary because the initial surface transform + // may not be applied until the next frame if a different Transaction than the one + // supplied is used, resulting in 1 frame not being cropped to the source rect + // hint during expansion that causes a visible jank/flash. See b/184166183. + animator.applySurfaceControlTransaction(mLeash, t, FRACTION_START); + } mState = State.EXITING_PIP; }); } @@ -768,22 +779,24 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, * Animates resizing of the pinned stack given the duration and start bounds. * This always animates the angle to zero from the starting angle. */ - private void scheduleAnimateResizePip(Rect currentBounds, Rect destinationBounds, - float startingAngle, Rect sourceHintRect, + private @Nullable PipAnimationController.PipTransitionAnimator<?> scheduleAnimateResizePip( + Rect currentBounds, Rect destinationBounds, float startingAngle, Rect sourceHintRect, @PipAnimationController.TransitionDirection int direction, int durationMs, Consumer<Rect> updateBoundsCallback) { if (!mState.isInPip()) { // TODO: tend to use shouldBlockResizeRequest here as well but need to consider // the fact that when in exitPip, scheduleAnimateResizePip is executed in the window // container transaction callback and we want to set the mState immediately. - return; + return null; } - animateResizePip(currentBounds, destinationBounds, sourceHintRect, direction, durationMs, + final PipAnimationController.PipTransitionAnimator<?> animator = animateResizePip( + currentBounds, destinationBounds, sourceHintRect, direction, durationMs, startingAngle); if (updateBoundsCallback != null) { updateBoundsCallback.accept(destinationBounds); } + return animator; } /** @@ -968,28 +981,26 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, destinationBounds.height()); mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest); - mMainExecutor.execute(() -> { - // Start animation to fade out the snapshot. - final ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f); - animator.setDuration(mEnterAnimationDuration); - animator.addUpdateListener(animation -> { - final float alpha = (float) animation.getAnimatedValue(); - final SurfaceControl.Transaction transaction = + // Start animation to fade out the snapshot. + final ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f); + animator.setDuration(mEnterAnimationDuration); + animator.addUpdateListener(animation -> { + final float alpha = (float) animation.getAnimatedValue(); + final SurfaceControl.Transaction transaction = + mSurfaceControlTransactionFactory.getTransaction(); + transaction.setAlpha(snapshotSurface, alpha); + transaction.apply(); + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); - transaction.setAlpha(snapshotSurface, alpha); - transaction.apply(); - }); - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - final SurfaceControl.Transaction tx = - mSurfaceControlTransactionFactory.getTransaction(); - tx.remove(snapshotSurface); - tx.apply(); - } - }); - animator.start(); + tx.remove(snapshotSurface); + tx.apply(); + } }); + animator.start(); }); } else { applyFinishBoundsResize(wct, direction); @@ -1050,26 +1061,28 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, return WINDOWING_MODE_UNDEFINED; } - private void animateResizePip(Rect currentBounds, Rect destinationBounds, Rect sourceHintRect, + private @Nullable PipAnimationController.PipTransitionAnimator<?> animateResizePip( + Rect currentBounds, Rect destinationBounds, Rect sourceHintRect, @PipAnimationController.TransitionDirection int direction, int durationMs, float startingAngle) { // Could happen when exitPip if (mToken == null || mLeash == null) { Log.w(TAG, "Abort animation, invalid leash"); - return; + return null; } final int rotationDelta = mWaitForFixedRotation ? ((mNextRotation - mPipBoundsState.getDisplayLayout().rotation()) + 4) % 4 : Surface.ROTATION_0; Rect baseBounds = direction == TRANSITION_DIRECTION_SNAP_AFTER_RESIZE ? mPipBoundsState.getBounds() : currentBounds; - mPipAnimationController + final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController .getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds, - sourceHintRect, direction, startingAngle, rotationDelta) - .setTransitionDirection(direction) + sourceHintRect, direction, startingAngle, rotationDelta); + animator.setTransitionDirection(direction) .setPipAnimationCallback(mPipAnimationCallback) .setDuration(durationMs) .start(); + return animator; } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index d474b6638e4a..f29d4f59493e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -53,7 +53,6 @@ import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipTaskOrganizer; -import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.pip.PipUiEventLogger; import java.io.PrintWriter; @@ -158,7 +157,7 @@ public class PipTouchHandler { PipBoundsAlgorithm pipBoundsAlgorithm, @NonNull PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, - PipTransitionController pipTransitionController, + PipMotionHelper pipMotionHelper, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger, ShellExecutor mainExecutor) { @@ -173,9 +172,7 @@ public class PipTouchHandler { mFloatingContentCoordinator = floatingContentCoordinator; mMenuController.addListener(new PipMenuListener()); mGesture = new DefaultPipTouchGesture(); - mMotionHelper = new PipMotionHelper(mContext, pipBoundsState, pipTaskOrganizer, - mMenuController, mPipBoundsAlgorithm.getSnapAlgorithm(), pipTransitionController, - floatingContentCoordinator); + mMotionHelper = pipMotionHelper; mPipDismissTargetHandler = new PipDismissTargetHandler(context, pipUiEventLogger, mMotionHelper, mainExecutor); mPipResizeGestureHandler = diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java index babfc5ca20cf..a0c6d1138698 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java @@ -24,7 +24,6 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableResources; import android.util.Size; -import android.view.Display; import android.view.DisplayInfo; import android.view.Gravity; @@ -58,11 +57,13 @@ public class PipBoundsAlgorithmTest extends ShellTestCase { private DisplayInfo mDefaultDisplayInfo; private PipBoundsState mPipBoundsState; + @Before public void setUp() throws Exception { initializeMockResources(); mPipBoundsState = new PipBoundsState(mContext); - mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); + mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState, + new PipSnapAlgorithm()); mPipBoundsState.setDisplayLayout( new DisplayLayout(mDefaultDisplayInfo, mContext.getResources(), true, true)); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java index d687e8d76d91..5df391f919a7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java @@ -88,7 +88,8 @@ public class PipTaskOrganizerTest extends ShellTestCase { mComponent1 = new ComponentName(mContext, "component1"); mComponent2 = new ComponentName(mContext, "component2"); mPipBoundsState = new PipBoundsState(mContext); - mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); + mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState, + new PipSnapAlgorithm()); mMainExecutor = new TestShellExecutor(); mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mMockSyncTransactionQueue, mPipBoundsState, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java index 75ea4ac94257..74519eaf3ebf 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTouchHandlerTest.java @@ -99,12 +99,14 @@ public class PipTouchHandlerTest extends ShellTestCase { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mPipBoundsState = new PipBoundsState(mContext); - mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); - mPipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm(); mPipSnapAlgorithm = new PipSnapAlgorithm(); + mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState, mPipSnapAlgorithm); + PipMotionHelper pipMotionHelper = new PipMotionHelper(mContext, mPipBoundsState, + mPipTaskOrganizer, mPhonePipMenuController, mPipSnapAlgorithm, + mMockPipTransitionController, mFloatingContentCoordinator); mPipTouchHandler = new PipTouchHandler(mContext, mPhonePipMenuController, mPipBoundsAlgorithm, mPipBoundsState, mPipTaskOrganizer, - mMockPipTransitionController, mFloatingContentCoordinator, mPipUiEventLogger, + pipMotionHelper, mFloatingContentCoordinator, mPipUiEventLogger, mMainExecutor); mPipTouchHandler.init(); mMotionHelper = Mockito.spy(mPipTouchHandler.getMotionHelper()); diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp index 0804e0aec278..bd1c154c6c5e 100644 --- a/libs/hwui/effects/StretchEffect.cpp +++ b/libs/hwui/effects/StretchEffect.cpp @@ -40,6 +40,8 @@ static const SkString stretchShader = SkString(R"( // scale intensity uniform float uDistanceStretchedX; uniform float uDistanceStretchedY; + uniform float uInverseDistanceStretchedX; + uniform float uInverseDistanceStretchedY; uniform float uDistDiffX; // Difference between the peak stretch amount and overscroll amount normalized @@ -58,14 +60,20 @@ static const SkString stretchShader = SkString(R"( uniform float viewportWidth; // target height in pixels uniform float viewportHeight; // target width in pixels + float easeInCubic(float t, float d) { + float tmp = t * d; + return tmp * tmp * tmp; + } + float computeOverscrollStart( float inPos, float overscroll, float uStretchAffectedDist, + float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = uStretchAffectedDist - inPos; - float posBasedVariation = smoothstep(0., uStretchAffectedDist, offsetPos); + float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = overscroll * posBasedVariation; return distanceStretched - (offsetPos / (1. + stretchIntensity)); } @@ -75,10 +83,11 @@ static const SkString stretchShader = SkString(R"( float overscroll, float reverseStretchDist, float uStretchAffectedDist, + float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = inPos - reverseStretchDist; - float posBasedVariation = (smoothstep(0., uStretchAffectedDist, offsetPos)); + float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = (-overscroll) * posBasedVariation; return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity))); } @@ -90,6 +99,7 @@ static const SkString stretchShader = SkString(R"( float inPos, float overscroll, float uStretchAffectedDist, + float uInverseStretchAffectedDist, float distanceStretched, float distanceDiff ) { @@ -100,6 +110,7 @@ static const SkString stretchShader = SkString(R"( inPos, overscroll, uStretchAffectedDist, + uInverseStretchAffectedDist, distanceStretched ); } else if (inPos >= distanceStretched) { @@ -114,6 +125,7 @@ static const SkString stretchShader = SkString(R"( overscroll, stretchAffectedDist, uStretchAffectedDist, + uInverseStretchAffectedDist, distanceStretched ); } else if (inPos < stretchAffectedDist) { @@ -139,6 +151,7 @@ static const SkString stretchShader = SkString(R"( inU, uOverscrollX, uStretchAffectedDistX, + uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX ); @@ -146,6 +159,7 @@ static const SkString stretchShader = SkString(R"( inV, uOverscrollY, uStretchAffectedDistY, + uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY ); @@ -155,6 +169,7 @@ static const SkString stretchShader = SkString(R"( })"); static const float ZERO = 0.f; +static const float CONTENT_DISTANCE_STRETCHED = 1.f; sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapshotImage) const { if (isEmpty()) { @@ -169,10 +184,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho float viewportHeight = stretchArea.height(); float normOverScrollDistX = mStretchDirection.x(); float normOverScrollDistY = mStretchDirection.y(); - float distanceStretchedX = maxStretchAmountX / (1 + abs(normOverScrollDistX)); - float distanceStretchedY = maxStretchAmountY / (1 + abs(normOverScrollDistY)); - float diffX = distanceStretchedX; - float diffY = distanceStretchedY; + float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX)); + float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY)); + float inverseDistanceStretchedX = 1.f / distanceStretchedX; + float inverseDistanceStretchedY = 1.f / distanceStretchedY; + float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED; + float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED; if (mBuilder == nullptr) { mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect()); @@ -180,10 +197,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho mBuilder->child("uContentTexture") = snapshotImage->makeShader( SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear)); - mBuilder->uniform("uStretchAffectedDistX").set(&maxStretchAmountX, 1); - mBuilder->uniform("uStretchAffectedDistY").set(&maxStretchAmountY, 1); + mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1); + mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1); mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1); mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1); + mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1); + mBuilder->uniform("uInverseDistanceStretchedY").set(&inverseDistanceStretchedY, 1); mBuilder->uniform("uDistDiffX").set(&diffX, 1); mBuilder->uniform("uDistDiffY").set(&diffY, 1); mBuilder->uniform("uOverscrollX").set(&normOverScrollDistX, 1); diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index acf4931d6144..474d2ccf8600 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -194,24 +194,25 @@ bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode outWindowInfo->bufferCount = static_cast<uint32_t>(query_value); } - outWindowInfo->dataspace = HAL_DATASPACE_V0_SRGB; - if (colorMode == ColorMode::WideColorGamut) { - skcms_Matrix3x3 surfaceGamut; - LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&surfaceGamut), - "Could not get gamut matrix from color space"); - if (memcmp(&surfaceGamut, &SkNamedGamut::kSRGB, sizeof(surfaceGamut)) == 0) { - outWindowInfo->dataspace = HAL_DATASPACE_V0_SCRGB; - } else if (memcmp(&surfaceGamut, &SkNamedGamut::kDisplayP3, sizeof(surfaceGamut)) == 0) { - outWindowInfo->dataspace = HAL_DATASPACE_DISPLAY_P3; - } else { - LOG_ALWAYS_FATAL("Unreachable: unsupported wide color space."); - } - } - outWindowInfo->bufferFormat = ColorTypeToBufferFormat(colorType); - VkFormat vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM; - if (outWindowInfo->bufferFormat == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT) { - vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT; + outWindowInfo->colorspace = colorSpace; + outWindowInfo->dataspace = ColorSpaceToADataSpace(colorSpace.get(), colorType); + LOG_ALWAYS_FATAL_IF(outWindowInfo->dataspace == HAL_DATASPACE_UNKNOWN, + "Unsupported colorspace"); + + VkFormat vkPixelFormat; + switch (colorType) { + case kRGBA_8888_SkColorType: + vkPixelFormat = VK_FORMAT_R8G8B8A8_UNORM; + break; + case kRGBA_F16_SkColorType: + vkPixelFormat = VK_FORMAT_R16G16B16A16_SFLOAT; + break; + case kRGBA_1010102_SkColorType: + vkPixelFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32; + break; + default: + LOG_ALWAYS_FATAL("Unsupported colorType: %d", (int)colorType); } LOG_ALWAYS_FATAL_IF(nullptr == vkManager.mGetPhysicalDeviceImageFormatProperties2, @@ -425,7 +426,7 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { if (bufferInfo->skSurface.get() == nullptr) { bufferInfo->skSurface = SkSurface::MakeFromAHardwareBuffer( mGrContext, ANativeWindowBuffer_getHardwareBuffer(bufferInfo->buffer.get()), - kTopLeft_GrSurfaceOrigin, DataSpaceToColorSpace(mWindowInfo.dataspace), nullptr); + kTopLeft_GrSurfaceOrigin, mWindowInfo.colorspace, nullptr); if (bufferInfo->skSurface.get() == nullptr) { ALOGE("SkSurface::MakeFromAHardwareBuffer failed"); mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h index 409921bdfdd7..7c2554583961 100644 --- a/libs/hwui/renderthread/VulkanSurface.h +++ b/libs/hwui/renderthread/VulkanSurface.h @@ -91,6 +91,7 @@ private: SkISize size; uint32_t bufferFormat; android_dataspace dataspace; + sk_sp<SkColorSpace> colorspace; int transform; size_t bufferCount; uint64_t windowUsageFlags; diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index 87512f0354c8..5d9f2297c15a 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -148,7 +148,19 @@ android_dataspace ColorSpaceToADataSpace(SkColorSpace* colorSpace, SkColorType c } skcms_TransferFunction fn; - LOG_ALWAYS_FATAL_IF(!colorSpace->isNumericalTransferFn(&fn)); + if (!colorSpace->isNumericalTransferFn(&fn)) { + // pq with the default white point + auto rec2020PQ = SkColorSpace::MakeRGB(GetPQSkTransferFunction(), SkNamedGamut::kRec2020); + if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) { + return HAL_DATASPACE_BT2020_PQ; + } + // standard PQ + rec2020PQ = SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, SkNamedGamut::kRec2020); + if (SkColorSpace::Equals(colorSpace, rec2020PQ.get())) { + return HAL_DATASPACE_BT2020_PQ; + } + LOG_ALWAYS_FATAL("Only select non-numerical transfer functions are supported"); + } skcms_Matrix3x3 gamut; LOG_ALWAYS_FATAL_IF(!colorSpace->toXYZD50(&gamut)); diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 8134d6f8352d..7220379e836b 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -27,6 +27,7 @@ import android.content.pm.PackageManager; import android.media.audiofx.AudioEffect; import android.media.audiopolicy.AudioMix; import android.os.Build; +import android.os.Vibrator; import android.telephony.TelephonyManager; import android.util.Log; import android.util.Pair; @@ -1937,6 +1938,14 @@ public class AudioSystem public static native int getDevicesForRoleAndCapturePreset( int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices); + /** + * @hide + * Set the vibrators' information. The value will be used to initialize HapticGenerator. + * @param vibrators a list of all available vibrators + * @return command completion status + */ + public static native int setVibratorInfos(@NonNull List<Vibrator> vibrators); + // Items shared with audio service /** diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index 4b8a8adade1f..f817a3c3c353 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -48,6 +48,7 @@ interface IMediaRouterService { // MediaRouterService.java for readability. // Methods for MediaRouter2 + void checkModifyAudioRoutingPermission(); List<MediaRoute2Info> getSystemRoutes(); RoutingSessionInfo getSystemSessionInfo(); diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 1f6855a4ae8e..90fa9a52f5cf 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -21,6 +21,7 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; import android.content.Context; @@ -159,9 +160,11 @@ public final class MediaRouter2 { * Finally, it will have no effect to call {@link #setOnGetControllerHintsListener}. * * @param clientPackageName the package name of the app to control + * @throws SecurityException if the caller doesn't have MODIFY_AUDIO_ROUTING permission. * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) @Nullable public static MediaRouter2 getInstance(@NonNull Context context, @NonNull String clientPackageName) { @@ -179,13 +182,20 @@ public final class MediaRouter2 { synchronized (sSystemRouterLock) { MediaRouter2 instance = sSystemMediaRouter2Map.get(clientPackageName); if (instance == null) { - // TODO: Add permission check here using MODIFY_AUDIO_ROUTING. if (sManager == null) { + IMediaRouterService serviceBinder = IMediaRouterService.Stub.asInterface( + ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE)); + try { + // MediaRouterService will throw a SecurityException if the caller + // doesn't have MODIFY_AUDIO_ROUTING permission. + serviceBinder.checkModifyAudioRoutingPermission(); + } catch (RemoteException e) { + e.rethrowAsRuntimeException(); + } sManager = MediaRouter2Manager.getInstance(context.getApplicationContext()); } instance = new MediaRouter2(context, clientPackageName); sSystemMediaRouter2Map.put(clientPackageName, instance); - // TODO: Remove router instance once it is not needed. instance.registerManagerCallbackForSystemRouter(); } return instance; @@ -281,9 +291,9 @@ public final class MediaRouter2 { mDiscoveryPreference = new RouteDiscoveryPreference.Builder( sManager.getPreferredFeatures(clientPackageName), true).build(); updateAllRoutesFromManager(); - mMediaRouterService = null; // TODO: Make this non-null and check permission. // Only used by non-system MediaRouter2. + mMediaRouterService = null; mPackageName = null; } diff --git a/native/android/OWNERS b/native/android/OWNERS index d414ed4cd5e2..6f7def8bc03a 100644 --- a/native/android/OWNERS +++ b/native/android/OWNERS @@ -2,3 +2,7 @@ per-file libandroid_net.map.txt, net.c = set noparent per-file libandroid_net.map.txt, net.c = codewiz@google.com, jchalard@google.com, junyulai@google.com per-file libandroid_net.map.txt, net.c = lorenzo@google.com, reminv@google.com, satk@google.com per-file system_fonts.cpp = file:/graphics/java/android/graphics/fonts/OWNERS + +per-file native_window_jni.cpp = file:/services/core/java/com/android/server/wm/OWNERS +per-file native_activity.cpp = file:/services/core/java/com/android/server/wm/OWNERS +per-file surface_control.cpp = file:/services/core/java/com/android/server/wm/OWNERS diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index a2fde4ecd3a2..4d137e0e1acc 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -252,6 +252,7 @@ LIBANDROID { ASurfaceTransaction_setColor; # introduced=29 ASurfaceTransaction_setDamageRegion; # introduced=29 ASurfaceTransaction_setDesiredPresentTime; # introduced=29 + ASurfaceTransaction_setEnableBackPressure; # introduced=31 ASurfaceTransaction_setFrameRate; # introduced=30 ASurfaceTransaction_setFrameRateWithChangeStrategy; # introduced=31 ASurfaceTransaction_setGeometry; # introduced=29 diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index 80cf663978a9..e0f637959cfb 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -656,3 +656,17 @@ void ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction* aSu sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy); } + +void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction, + ASurfaceControl* aSurfaceControl, + bool enableBackpressure) { + CHECK_NOT_NULL(aSurfaceControl); + CHECK_NOT_NULL(aSurfaceTransaction); + + sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); + Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); + + const uint32_t flags = enableBackpressure ? + layer_state_t::eEnableBackpressure : 0; + transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure); +} diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index 4f0f0f00bbb6..0bca4f4ad643 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakketinstalleerder"</string> <string name="install" msgid="711829760615509273">"Installeer"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Klaar"</string> <string name="cancel" msgid="1018267193425558088">"Kanselleer"</string> <string name="installing" msgid="4921993079741206516">"Installeer tans …"</string> <string name="installing_app" msgid="1165095864863849422">"Installeer tans <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Wil jy hierdie program installeer?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Wil jy \'n opdatering vir hierdie bestaande program installeer? Jou bestaande data sal nie verlore gaan nie."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Wil jy \'n opdatering vir hierdie ingeboude program installeer? Jou bestaande data sal nie verlore gaan nie."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Installeer- en deïnstalleerhandelinge word nie in Wear gesteun nie."</string> <string name="message_staging" msgid="8032722385658438567">"Voer tans program uit …"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Onbekend"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Jou tablet word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Jou TV word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Jou foon word vir jou veiligheid nie toegelaat om onbekende programme van hierdie bron af te installeer nie."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Jou foon en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou foon of verlies van data wat uit sy gebruik kan spruit."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Jou tablet en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou tablet of verlies van data wat uit sy gebruik kan spruit."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Jou TV en persoonlike data is meer kwesbaar vir aanvalle deur onbekende programme. Deur hierdie program te installeer, stem jy in dat jy verantwoordelik is vir enige skade aan jou TV of verlies van data wat uit sy gebruik kan spruit."</string> diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml index 0acab9e796c7..cf6e96f55d27 100644 --- a/packages/PackageInstaller/res/values-am/strings.xml +++ b/packages/PackageInstaller/res/values-am/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ጥቅል ጫኚ"</string> <string name="install" msgid="711829760615509273">"ጫን"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ለዚህ ነባር መተግበሪያ ዝማኔ መጫን ይፈልጋሉ? ነባሪ ውሂብዎ አይጠፋም።"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ለዚህ አብሮ ለተሠራ መተግበሪያ ዝማኔ መጫን ይፈልጋሉ? ነባር ውሂብዎ አይጠፋም።"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"በWear ላይ የመጫን/ማራገፍ እርምጃዎች አይደገፉም።"</string> <string name="message_staging" msgid="8032722385658438567">"መተግበሪያን በማዘጋጀት ላይ…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ያልታወቀ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ለእርስዎ ደህንነት ሲባል የእርስዎ ጡባዊ ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ለእርስዎ ደህንነት ሲባል የእርስዎ ቴሌቪዥን ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ለእርስዎ ደህንነት ሲባል የእርስዎ ስልክ ከዚህ ምንጭ የመጡ ያልታወቁ መተግበሪያዎችን እንዲጭን አልተፈቀደለትም።"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index c840374d3f6b..7cfa08a9e32c 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"أداة تثبيت الحزم"</string> <string name="install" msgid="711829760615509273">"تثبيت"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"هل تريد تثبيت هذا التطبيق؟"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"هل تريد تثبيت تحديث لهذا التطبيق الحالي؟ لن تفقد بياناتك الحالية."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"هل تريد تثبيت تحديث لهذا التطبيق المضمَّن؟ لن تفقد بياناتك الحالية."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"لا تتوافق إجراءات التثبيت/إلغاء التثبيت مع نظام Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"جارٍ الطرح المرحلي للتطبيق…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"غير معروف"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"لأغراض الأمان، غير مسموح لجهازك اللوحي بتثبيت تطبيقات غير معروفة من هذا المصدر."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"لأغراض الأمان، غير مسموح لجهاز التلفزيون الذي تستخدمه بتثبيت تطبيقات غير معروفة من هذا المصدر."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"لأغراض الأمان، غير مسموح لهاتفك بتثبيت تطبيقات غير معروفة من هذا المصدر."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index c900efdfb480..5c902f0a6b53 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"পেকেজ ইনষ্টলাৰ"</string> <string name="install" msgid="711829760615509273">"ইনষ্টল কৰক"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"আপুনি এই এপ্লিকেশ্বনটো ইনষ্টল কৰিব বিচাৰেনে?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"আপুনি আগৰে পৰা থকা এপ্লিকেশ্বন আপডে’ট কৰিব বিচাৰেনে? আপোনাৰ আগৰ ডেটা নেহেৰায়।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"আপুনি এই আগৰে পৰা থকা এপ্লিকেশ্বনটো আপডে’ট কৰিব বিচাৰেনে? আপোনাৰ আগৰ ডেটা নেহেৰায়।"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"এপটো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ৱেৰ-ত ইনষ্টল/আনইনষ্টল কৰিব পৰা নাযায়।"</string> <string name="message_staging" msgid="8032722385658438567">"এপৰ অন্তিম পর্যায়ৰ পৰীক্ষণ চলি আছে…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"অজ্ঞাত"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ টেবলেটত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ টিভিত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"আপোনাৰ সুৰক্ষাৰ বাবে এই উৎসৰ পৰা অজ্ঞাত এপসমূহ আপোনাৰ ফ\'নত ইনষ্টল কৰাৰ অনুমতি দিয়া হোৱা নাই।"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml index bc36123ed46a..485dd1612070 100644 --- a/packages/PackageInstaller/res/values-az/strings.xml +++ b/packages/PackageInstaller/res/values-az/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paket quraşdırıcı"</string> <string name="install" msgid="711829760615509273">"Quraşdırın"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Hazırdır"</string> <string name="cancel" msgid="1018267193425558088">"Ləğv edin"</string> <string name="installing" msgid="4921993079741206516">"Quraşdırılır..."</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> quraşdırılır…"</string> <string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu mövcud tətbiqdə güncəllənmə quraşdırmaq istəyirsiniz? Hazırkı datanız silinməyəcək."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu daxili tətbiqdə güncəllənmə quraşdırmaq istəyirsiniz? Hazırkı datanız silinməyəcək."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Yükləmə/Sistemdən silmə fəaliyyətləri Wear\'də dəstəklənmir."</string> <string name="message_staging" msgid="8032722385658438567">"Tətbiq hazırlanır..."</string> <string name="app_name_unknown" msgid="6881210203354323926">"Naməlum"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Təhlükəsizliyiniz üçün planşetə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Təhlükəsizliyiniz üçün TV-yə bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Təhlükəsizliyiniz üçün telefona bu mənbədən olan naməlum tətbiqləri quraşdırmağa icazə verilmir."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla telefona dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planşet və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla planşetə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verə biləcək data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tv və şəxsi data naməlum tətbiqlərin hücumuna qarşı daha həssasdır. Bu tətbiqi quraşdırmaqla Tv-yə dəyə biləcək zərər və ya onun istifadəsi nəticəsində baş verən data itkisinə görə məsuliyyət daşıdığınızı qəbul edirsiniz."</string> diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 44cfef05e32d..9a97dad86ea2 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Program za instal. paketa"</string> <string name="install" msgid="711829760615509273">"Instaliraj"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gotovo"</string> <string name="cancel" msgid="1018267193425558088">"Otkaži"</string> <string name="installing" msgid="4921993079741206516">"Instalira se..."</string> <string name="installing_app" msgid="1165095864863849422">"Instalira se <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Želite li da instalirate ovu aplikaciju?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li da instalirate ažuriranje za ovu postojeću aplikaciju? Postojeći podaci se neće izgubiti."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li da instalirate ažuriranje za ovu ugrađenu aplikaciju? Postojeći podaci se neće izgubiti."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Radnje Instaliraj/Deinstaliraj nisu podržane u Wear-u."</string> <string name="message_staging" msgid="8032722385658438567">"Aplikacija se priprema…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Tabletu iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Televizoru iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Telefonu iz bezbednosnih razloga nije dozvoljeno da instalira nepoznate aplikacije iz ovog izvora."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja telefona ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja tableta ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV i lični podaci su podložniji napadu nepoznatih aplikacija. Ako instalirate ovu aplikaciju, prihvatate da ste odgovorni za eventualna oštećenja TV-a ili gubitak podataka do kojih može da dođe zbog njenog korišćenja."</string> diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml index e7cbf06624e3..ceca8a2bc4d1 100644 --- a/packages/PackageInstaller/res/values-be/strings.xml +++ b/packages/PackageInstaller/res/values-be/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Усталёўшчык пакетаў"</string> <string name="install" msgid="711829760615509273">"Усталяваць"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Хочаце ўсталяваць гэту праграму?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Хочаце ўсталяваць абнаўленне для гэтай праграмы? Існуючыя даныя не будуць страчаны."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Хочаце ўсталяваць абнаўленне для ўбудаванай праграмы? Існуючыя даныя не будуць страчаны."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дзеянні па ўсталяванні або выдаленні не падтрымліваюцца на Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Праграма падрыхтоўваецца…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Невядома"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"У мэтах бяспекі вашаму планшэту забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"У мэтах бяспекі вашаму тэлевізару забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"У мэтах бяспекі вашаму тэлефону забаронена ўсталёўваць невядомыя праграмы з гэтай крыніцы."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml index 12ba3ef413e8..17aa400f66b7 100644 --- a/packages/PackageInstaller/res/values-bg/strings.xml +++ b/packages/PackageInstaller/res/values-bg/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Пакети: Инстал. програма"</string> <string name="install" msgid="711829760615509273">"Инсталиране"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Искате ли да инсталирате това приложение?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Искате ли да инсталирате актуализация за това съществуващо приложение? Съществуващите ви данни няма да бъдат загубени."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Искате ли да инсталирате актуализация за това вградено приложение? Съществуващите ви данни няма да бъдат загубени."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Действията инсталиране и деинсталиране не се поддържат на устройства с Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Приложението се подготвя…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Неизвестно"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"От съображения за сигурност на таблета ви не могат да се инсталират неизвестни приложения от този източник."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"От съображения за сигурност на телевизора ви не могат да се инсталират неизвестни приложения от този източник."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"От съображения за сигурност на телефона ви не могат да се инсталират неизвестни приложения от този източник."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml index 80255529c821..54f67c0fe2f2 100644 --- a/packages/PackageInstaller/res/values-bn/strings.xml +++ b/packages/PackageInstaller/res/values-bn/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"প্যাকেজ ইনস্টলার"</string> <string name="install" msgid="711829760615509273">"ইনস্টল করুন"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"আপনি কি এই অ্যাপ্লিকেশনটি ইনস্টল করতে চান?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"আগে থেকেই থাকা এই অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"এই বিল্ট-ইন অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-এ ইনস্টল/আনইনস্টল করা সমর্থিত নয়।"</string> <string name="message_staging" msgid="8032722385658438567">"অ্যাপ স্টেজ করা হচ্ছে…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"অজানা"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার ট্যাবলেটের অ্যাপ ইনস্টল করার অনুমতি নেই।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার টিভির অ্যাপ ইনস্টল করার অনুমতি নেই।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"আপনার নিরাপত্তার জন্য, এই অজানা উৎস থেকে আপনার ফোনের অ্যাপ ইনস্টল করার অনুমতি নেই।"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml index a099147072bc..22b85dd61b6d 100644 --- a/packages/PackageInstaller/res/values-bs/strings.xml +++ b/packages/PackageInstaller/res/values-bs/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Alat za instalir. paketa"</string> <string name="install" msgid="711829760615509273">"Instaliraj"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gotovo"</string> <string name="cancel" msgid="1018267193425558088">"Otkaži"</string> <string name="installing" msgid="4921993079741206516">"Instaliranje…"</string> <string name="installing_app" msgid="1165095864863849422">"Instaliranje paketa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Želite li instalirati ovu aplikaciju?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li instalirati ažuriranje za ovu postojeću aplikaciju? Vaši postojeći podaci neće biti izgubljeni."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li instalirati ažuriranje za ovu ugrađenu aplikaciju? Vaš postojeći podaci neće biti izgubljeni."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instaliranje/deinstaliranje nije podržano na Wearu."</string> <string name="message_staging" msgid="8032722385658438567">"Pripremanje aplikacije…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Vašem tabletu iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Vašem TV-u iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Vašem telefonu iz sigurnosnih razloga nije dopušteno instaliranje nepoznatih aplikacija iz ovog izvora."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Vaši podaci na telefonu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na telefonu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Vaši podaci na tabletu i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na tabletu ili gubitak podataka do kojih može doći korištenjem aplikacije."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Vaši podaci na TV-u i vaši lični podaci izloženiji su napadima nepoznatih aplikacija. Instaliranjem ove aplikacije, saglasni ste da ste vi odgovorni za bilo kakvu štetu na TV-u ili gubitak podataka do kojih može doći korištenjem aplikacije."</string> diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index b25b37bec795..4daf205d3589 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instal·lador de paquets"</string> <string name="install" msgid="711829760615509273">"Instal·la"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Fet"</string> <string name="cancel" msgid="1018267193425558088">"Cancel·la"</string> <string name="installing" msgid="4921993079741206516">"S\'està instal·lant…"</string> <string name="installing_app" msgid="1165095864863849422">"S\'està instal·lant <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Vols instal·lar aquesta aplicació?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vols instal·lar una actualització en aquesta aplicació? Les teves dades no es perdran."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vols instal·lar una actualització en aquesta aplicació integrada? Les teves dades no es perdran."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear."</string> <string name="message_staging" msgid="8032722385658438567">"S\'està preparant la instal·lació de l\'aplicació…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconeguda"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Per la teva seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Per la teva seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Per la teva seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"El telèfon i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al telèfon o de la pèrdua de dades que pugui resultar del seu ús."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"La tauleta i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi a la tauleta o de la pèrdua de dades que pugui resultar del seu ús."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"El televisor i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al televisor o de la pèrdua de dades que pugui resultar del seu ús."</string> diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml index e250c7bf6ff3..041a37557f8c 100644 --- a/packages/PackageInstaller/res/values-cs/strings.xml +++ b/packages/PackageInstaller/res/values-cs/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalátor balíčků"</string> <string name="install" msgid="711829760615509273">"Instalovat"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Hotovo"</string> <string name="cancel" msgid="1018267193425558088">"Zrušit"</string> <string name="installing" msgid="4921993079741206516">"Instalace…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalace balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Chcete tuto aplikaci nainstalovat?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Chcete nainstalovat aktualizaci této existující aplikace? Stávající data nebudou ztracena."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Chcete nainstalovat aktualizaci této integrované aplikace? Stávající data nebudou ztracena."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Akce instalace/odinstalace nejsou v zařízení Wear podporovány."</string> <string name="message_staging" msgid="8032722385658438567">"Příprava instalace…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Neznámé"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Z bezpečnostních důvodů do tabletu není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Z bezpečnostních důvodů do televize není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Z bezpečnostních důvodů do telefonu není dovoleno instalovat neznámé aplikace z tohoto zdroje."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na telefonu nebo ztrátu dat, která může být používáním aplikace způsobena."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na tabletu nebo ztrátu dat, která může být používáním aplikace způsobena."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televize a osobní údaje jsou zranitelnější vůči útoku ze strany neznámých aplikací. Instalací této aplikace přijímáte odpovědnost za případné škody na televizi nebo ztrátu dat, která může být používáním aplikace způsobena."</string> diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml index ca9f37e64cde..231ada111557 100644 --- a/packages/PackageInstaller/res/values-da/strings.xml +++ b/packages/PackageInstaller/res/values-da/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakkeinstallationsprogram"</string> <string name="install" msgid="711829760615509273">"Installer"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Udfør"</string> <string name="cancel" msgid="1018267193425558088">"Annuller"</string> <string name="installing" msgid="4921993079741206516">"Installerer…"</string> <string name="installing_app" msgid="1165095864863849422">"Installerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Vil du installere denne app?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vil du installere en opdatering til denne eksisterende app? Du mister ikke dine eksisterende data."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vil du installere en opdatering til denne indbyggede app? Du mister ikke dine eksisterende data."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Det er ikke muligt at installere/afinstallere på Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Forbereder appen…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Ukendt"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Din tablet har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Dit fjernsyn har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Din telefon har af sikkerhedshensyn ikke tilladelse til at installere ukendte apps fra denne kilde."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Din telefon og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på din telefon eller tab af data, der kan skyldes brug af appen."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Din tablet og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på din tablet eller tab af data, der kan skyldes brug af appen."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Dit fjernsyn og dine personlige data er mere sårbare over for angreb fra ukendte apps. Når du installerer denne app, accepterer du, at du er ansvarlig for skader på dit fjernsyn eller tab af data, der kan skyldes brug af appen."</string> diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml index 7826cebf10a0..257f66211adf 100644 --- a/packages/PackageInstaller/res/values-de/strings.xml +++ b/packages/PackageInstaller/res/values-de/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paketinstallation"</string> <string name="install" msgid="711829760615509273">"Installieren"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Fertig"</string> <string name="cancel" msgid="1018267193425558088">"Abbrechen"</string> <string name="installing" msgid="4921993079741206516">"Wird installiert…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> wird installiert…"</string> <string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Möchtest du diese App installieren?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Möchtest du ein Update dieser vorhandenen App installieren? Deine bisherigen Daten gehen dabei nicht verloren."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Möchtest du ein Update dieser integrierten App installieren? Deine bisherigen Daten gehen dabei nicht verloren."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Installations-/Deinstallationsaktion auf Android Wear nicht unterstützt."</string> <string name="message_staging" msgid="8032722385658438567">"App wird vorbereitet…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unbekannt"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Aus Sicherheitsgründen kannst du auf dem Tablet keine unbekannten Apps aus dieser Quelle installieren."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Aus Sicherheitsgründen kannst du auf dem Fernseher keine unbekannten Apps aus dieser Quelle installieren."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Aus Sicherheitsgründen kannst du auf dem Smartphone keine unbekannten Apps aus dieser Quelle installieren."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Unbekannte Apps können gefährlich für dein Smartphone und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Smartphone und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Unbekannte Apps können gefährlich für dein Tablet und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Tablet und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Unbekannte Apps können gefährlich für deinen Fernseher und deine personenbezogenen Daten sein. Wenn du diese App installierst, erklärst du dich damit einverstanden, dass du die Verantwortung für alle Schäden an deinem Fernseher und jegliche Datenverluste trägst, die aus der Verwendung dieser App entstehen können."</string> diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml index 2be6207f2f65..fd6bf6a07074 100644 --- a/packages/PackageInstaller/res/values-el/strings.xml +++ b/packages/PackageInstaller/res/values-el/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Πρόγρ. εγκατάστ. πακέτου"</string> <string name="install" msgid="711829760615509273">"Εγκατάσταση"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Θέλετε να εγκαταστήσετε μια ενημέρωση σε αυτήν την υπάρχουσα εφαρμογή; Τα υπάρχοντα δεδομένα σας δεν θα χαθούν."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Θέλετε να εγκαταστήσετε μια ενημέρωση σε αυτήν την ενσωματωμένη εφαρμογή; Τα υπάρχοντα δεδομένα σας δεν θα χαθούν."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Οι ενέργειες εγκατάστασης/απεγκατάστασης δεν υποστηρίζονται στο Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Σταδιακή διάθεση εφαρμογής…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Άγνωστη"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο tablet σας."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στην τηλεόρασή σας."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Για λόγους ασφάλειας, δεν επιτρέπεται η εγκατάσταση άγνωστων εφαρμογών από αυτήν την πηγή στο τηλέφωνό σας."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Το τηλέφωνό σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο τηλέφωνο ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Το tablet σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στο tablet ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Η τηλεόρασή σας και τα προσωπικά δεδομένα σας είναι πιο ευάλωτα σε επιθέσεις από άγνωστες εφαρμογές. Με την εγκατάσταση αυτής της εφαρμογής, συμφωνείτε ότι είστε υπεύθυνοι για τυχόν βλάβη που μπορεί να προκληθεί στην τηλεόρασή ή απώλεια δεδομένων που μπορεί να προκύψει από τη χρήση τους."</string> diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml index 84cde474caa0..24b0aa78efe8 100644 --- a/packages/PackageInstaller/res/values-en-rAU/strings.xml +++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package installer"</string> <string name="install" msgid="711829760615509273">"Install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Done"</string> <string name="cancel" msgid="1018267193425558088">"Cancel"</string> <string name="installing" msgid="4921993079741206516">"Installing…"</string> <string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installed."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Staging app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string> diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml index 84cde474caa0..24b0aa78efe8 100644 --- a/packages/PackageInstaller/res/values-en-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package installer"</string> <string name="install" msgid="711829760615509273">"Install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Done"</string> <string name="cancel" msgid="1018267193425558088">"Cancel"</string> <string name="installing" msgid="4921993079741206516">"Installing…"</string> <string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installed."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Staging app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string> diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml index 84cde474caa0..24b0aa78efe8 100644 --- a/packages/PackageInstaller/res/values-en-rGB/strings.xml +++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package installer"</string> <string name="install" msgid="711829760615509273">"Install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Done"</string> <string name="cancel" msgid="1018267193425558088">"Cancel"</string> <string name="installing" msgid="4921993079741206516">"Installing…"</string> <string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installed."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Staging app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string> diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml index 84cde474caa0..24b0aa78efe8 100644 --- a/packages/PackageInstaller/res/values-en-rIN/strings.xml +++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package installer"</string> <string name="install" msgid="711829760615509273">"Install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Done"</string> <string name="cancel" msgid="1018267193425558088">"Cancel"</string> <string name="installing" msgid="4921993079741206516">"Installing…"</string> <string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installed."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/uninstall actions not supported on Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Staging app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string> diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml index 128cbaefd5e1..79136ee00a6d 100644 --- a/packages/PackageInstaller/res/values-en-rXC/strings.xml +++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package installer"</string> <string name="install" msgid="711829760615509273">"Install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Done"</string> <string name="cancel" msgid="1018267193425558088">"Cancel"</string> <string name="installing" msgid="4921993079741206516">"Installing…"</string> <string name="installing_app" msgid="1165095864863849422">"Installing <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installed."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Do you want to install this application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Do you want to install an update to this existing application? Your existing data will not be lost."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Do you want to install an update to this built-in application? Your existing data will not be lost."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Install/Uninstall actions not supported on Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Staging app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Unknown"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"For your security, your tablet is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"For your security, your TV is not allowed to install unknown apps from this source."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"For your security, your phone is not allowed to install unknown apps from this source."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Your phone and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your phone or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Your tablet and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your tablet or loss of data that may result from its use."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Your TV and personal data are more vulnerable to attack by unknown apps. By installing this app, you agree that you are responsible for any damage to your TV or loss of data that may result from its use."</string> diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml index 117c9f64f2ee..8144516c10d3 100644 --- a/packages/PackageInstaller/res/values-es-rUS/strings.xml +++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador del paquete"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Listo"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"Instalando…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"¿Deseas instalar esta aplicación?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"¿Quieres instalar una actualización de esta app? No se perderán los datos."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"¿Quieres instalar una actualización de esta app integrada? No se perderán los datos."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear no admite las acciones de instalación y desinstalación"</string> <string name="message_staging" msgid="8032722385658438567">"Preparando app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconocido"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por tu seguridad, la tablet no tiene permitido instalar apps desconocidas de esta fuente."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por tu seguridad, la TV no tiene permitido instalar apps desconocidas de esta fuente."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por tu seguridad, el teléfono no tiene permitido instalar apps desconocidas de esta fuente."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"El teléfono y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra el teléfono y de la pérdida de datos que pueda ocasionar su uso."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"La tablet y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra la tablet y de la pérdida de datos que pueda ocasionar su uso."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"La TV y tus datos personales son más vulnerables a los ataques de apps desconocidas. Si instalas esta app, serás responsable de los daños que sufra la TV y de la pérdida de datos que pueda ocasionar su uso."</string> diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index fa738734c598..a43b55096100 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Listo"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"Instalando…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Se ha instalado la aplicación."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"¿Quieres instalar esta aplicación?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"¿Quieres instalar una actualización de esta aplicación? Tus datos no se perderán."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"¿Quieres instalar una actualización de esta aplicación integrada? Tus datos no se perderán."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Las acciones de instalar y desinstalar no pueden realizarse en Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconocida"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por motivos de seguridad, tu tablet no puede instalar aplicaciones desconocidas de esta fuente."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por motivos de seguridad, tu TV no puede instalar aplicaciones desconocidas de esta fuente."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por motivos de seguridad, tu teléfono no puede instalar aplicaciones desconocidas de esta fuente."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tu teléfono y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu teléfono o la pérdida de datos que se pueda derivar de su uso."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tu tablet y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu tablet o la pérdida de datos que se pueda derivar de su uso."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tu TV y tus datos personales son más vulnerables a los ataques de aplicaciones desconocidas. Al instalar esta aplicación, aceptas ser responsable de cualquier daño que sufra tu TV o la pérdida de datos que se pueda derivar de su uso."</string> diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml index b6387807a2d8..97f1c67cd609 100644 --- a/packages/PackageInstaller/res/values-et/strings.xml +++ b/packages/PackageInstaller/res/values-et/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paketi installiprogramm"</string> <string name="install" msgid="711829760615509273">"Installi"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Valmis"</string> <string name="cancel" msgid="1018267193425558088">"Tühista"</string> <string name="installing" msgid="4921993079741206516">"Installimine …"</string> <string name="installing_app" msgid="1165095864863849422">"Paketi <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installimine …"</string> <string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Kas soovite selle rakenduse installida?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Kas soovite olemasoleva rakenduse värskenduse installida? Teie olemasolevad andmed jäävad alles."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Kas soovite sisseehitatud rakenduse värskenduse installida? Teie olemasolevad andmed jäävad alles."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei toeta installimist/desinstallimist."</string> <string name="message_staging" msgid="8032722385658438567">"Rakenduse koondamine …"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Teadmata"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Teie turvalisuse huvides ei ole tahvelarvutil lubatud installida sellest allikast tundmatuid rakendusi."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Teie turvalisuse huvides ei ole teleril lubatud installida sellest allikast tundmatuid rakendusi."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Teie turvalisuse huvides ei ole telefonil lubatud installida sellest allikast tundmatuid rakendusi."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Teie telefon ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate telefoni kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Teie tahvelarvuti ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate tahvelarvuti kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Teie teler ja isiklikud andmed on tundmatute rakenduste rünnakute suhtes haavatavamad. Selle rakenduse installimisel nõustute, et vastutate teleri kahjude ja andmekao eest, mis võivad tuleneda selliste rakenduste kasutamisest."</string> diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index 65e75cdba405..a62e9ba2f42e 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakete-instalatzailea"</string> <string name="install" msgid="711829760615509273">"Instalatu"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Eginda"</string> <string name="cancel" msgid="1018267193425558088">"Utzi"</string> <string name="installing" msgid="4921993079741206516">"Instalatzen…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalatzen…"</string> <string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Aplikazio hau instalatu nahi duzu?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Aplikazioaren eguneratzea instalatu nahi duzu? Lehendik dauden datuak ez dira galduko."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Aplikazio integratu honen eguneratzea instalatu nahi duzu? Lehendik dauden datuak ez dira galduko."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ezin dira gauzatu instalatzeko eta desinstalatzeko ekintzak Wear gailuetan."</string> <string name="message_staging" msgid="8032722385658438567">"Aplikazioa prestatzen…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Ezezaguna"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml index d08409e284ac..8824a18284da 100644 --- a/packages/PackageInstaller/res/values-fa/strings.xml +++ b/packages/PackageInstaller/res/values-fa/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"نصبکننده بسته"</string> <string name="install" msgid="711829760615509273">"نصب"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"میخواهید این برنامه را نصب کنید؟"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"آیا میخواهید بهروزرسانی این برنامه کنونی را نصب کنید؟ داده کنونی شما از بین نمیرود."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"آیا میخواهید بهروزرسانی این برنامه داخلی را نصب کنید؟ دادههای کنونی شما از بین نمیرود."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"کنشهای نصب/حذف نصب در Wear پشتیبانی نمیشود."</string> <string name="message_staging" msgid="8032722385658438567">"مرحلهبندی برنامه…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"نامشخص"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"برای امنیت شما، رایانه لوحیتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"برای امنیت شما، تلویزیونتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"برای امنیت شما، تلفنتان اجازه نمیدهد از این منبع برنامههای ناشناس نصب شود."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml index d52eddf82998..e7b3de750dc7 100644 --- a/packages/PackageInstaller/res/values-fi/strings.xml +++ b/packages/PackageInstaller/res/values-fi/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paketin asentaja"</string> <string name="install" msgid="711829760615509273">"Asenna"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Valmis"</string> <string name="cancel" msgid="1018267193425558088">"Peruuta"</string> <string name="installing" msgid="4921993079741206516">"Asennetaan…"</string> <string name="installing_app" msgid="1165095864863849422">"Asennetaan <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Haluatko asentaa tämän sovelluksen?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Haluatko asentaa päivityksen tähän asennettuun sovellukseen? Aiempi data ei katoa."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Haluatko asentaa päivityksen tähän valmiiksi asennettuun sovellukseen? Aiempi data ei katoa."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ei tue asennus- ja poistotoimintoja."</string> <string name="message_staging" msgid="8032722385658438567">"Valmistellaan sovellusta…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Tuntematon"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Turvallisuussyistä tabletti ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Turvallisuussyistä televisiosi ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Turvallisuussyistä puhelin ei voi asentaa tuntemattomia sovelluksia tästä lähteestä."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Tuntemattomat sovellukset voivat helpommin kaapata puhelimesi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa puhelimellesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tuntemattomat sovellukset voivat helpommin kaapata tablettisi ja henkilökohtaiset tietosi. Lataamalla sovelluksia tästä lähteestä hyväksyt, että olet itse vastuussa tabletillesi aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tuntemattomat sovellukset voivat helpommin kaapata televisiosi ja henkilökohtaiset tietosi. Lataamalla sovelluksen hyväksyt, että olet itse vastuussa mahdollisista televisiolle aiheutuvista vahingoista tai tietojen menetyksestä, jotka voivat johtua sovellusten käytöstä."</string> diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml index 365493f8bbb9..bc9bad932d7b 100644 --- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Progr. d\'inst. de paquet"</string> <string name="install" msgid="711829760615509273">"Installer"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Terminé"</string> <string name="cancel" msgid="1018267193425558088">"Annuler"</string> <string name="installing" msgid="4921993079741206516">"Installation en cours…"</string> <string name="installing_app" msgid="1165095864863849422">"Installation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> en cours…"</string> <string name="install_done" msgid="5987363587661783896">"Application installée."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Voulez-vous installer cette application?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Voulez-vous installer une mise à jour pour cette application existante? Vos données existantes ne seront pas perdues."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Voulez-vous installer une mise à jour pour cette application intégrée? Vos données existantes ne seront pas perdues."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Les actions d\'installation et de désinstallation ne sont pas prises en charge par Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Pré-production de l\'application en cours…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Inconnue"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur cette tablette."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléphone."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données personnelles sont plus vulnérables aux attaques provenant d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données personnelles sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string> diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml index 462c60ed748a..b9fb05d21ddd 100644 --- a/packages/PackageInstaller/res/values-fr/strings.xml +++ b/packages/PackageInstaller/res/values-fr/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Programme installation kit"</string> <string name="install" msgid="711829760615509273">"Installer"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"OK"</string> <string name="cancel" msgid="1018267193425558088">"Annuler"</string> <string name="installing" msgid="4921993079741206516">"Installation…"</string> <string name="installing_app" msgid="1165095864863849422">"Installation du package <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Application installée."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Voulez-vous installer cette application ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Voulez-vous mettre à jour cette application ? Vos données actuelles ne seront pas perdues."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Voulez-vous mettre à jour cette application intégrée ? Vos données actuelles ne seront pas perdues."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Opérations d\'installation et de désinstallation impossibles sur Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Préparation de l\'installation de l\'appli…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Inconnu"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur cette tablette."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléviseur."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"À des fins de sécurité, l\'installation d\'applications inconnues provenant de cette source n\'est pas autorisée sur ce téléphone."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Votre téléphone et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de son utilisation."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Votre tablette et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de son utilisation."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Votre téléviseur et vos données à caractère personnel sont plus vulnérables aux attaques d\'applications inconnues. En installant cette application, vous acceptez d\'être le seul responsable de tout dommage causé à votre téléviseur ou de toute perte de données pouvant découler de son utilisation."</string> diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml index 1ad1174eacad..16ad2a3c701a 100644 --- a/packages/PackageInstaller/res/values-gl/strings.xml +++ b/packages/PackageInstaller/res/values-gl/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Feito"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"Instalando…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Queres instalar esta aplicación?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Queres instalar unha actualización para esta aplicación? Non se perderán os datos que teñas."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Queres instalar unha actualización para esta aplicación integrada? Non se perderán os datos que teñas."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As accións de instalar e desinstalar non son compatibles con Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Preparando aplicación…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nome descoñecido"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Por cuestións de seguranza, na tableta non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Por cuestións de seguranza, na televisión non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Por cuestións de seguranza, no teléfono non se poden instalar aplicacións descoñecidas procedentes desta fonte."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O teléfono e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados no teléfono ou da perda dos datos que se poidan derivar do seu uso."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"A tableta e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na tableta ou da perda dos datos que se poidan derivar do seu uso."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A televisión e os datos persoais son máis vulnerables aos ataques de aplicacións descoñecidas. Ao instalar esta aplicación, aceptas que es responsable dos danos ocasionados na televisión ou da perda dos datos que se poidan derivar do seu uso."</string> diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml index 20fbafe0e78a..804658147c15 100644 --- a/packages/PackageInstaller/res/values-gu/strings.xml +++ b/packages/PackageInstaller/res/values-gu/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"પૅકેજ ઇન્સ્ટૉલર"</string> <string name="install" msgid="711829760615509273">"ઇન્સ્ટૉલ કરો"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"શું તમે આ ઍપ્લિકેશન ઇન્સ્ટૉલ કરવા માંગો છો?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"શું તમે આ અસ્તિત્વમાંની ઍપ્લિકેશનના અપડેટને ઇન્સ્ટૉલ કરવા માગો છો? તમારો અસ્તિત્વમાંનો ડેટા ગુમ થશે નહીં."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"શું તમે આ બિલ્ટ-ઇન ઍપ્લિકેશનના અપડેટને ઇન્સ્ટૉલ કરવા માગો છો? તમારો અસ્તિત્વમાંનો ડેટા ગુમ થશે નહીં."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear પર ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ ક્રિયાઓ સમર્થિત નથી."</string> <string name="message_staging" msgid="8032722385658438567">"ઍપ્લિકેશનની પ્રક્રિયા ચાલુ છે…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"અજાણ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"તમારી સુરક્ષા માટે, તમારા ટૅબ્લેટને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"તમારી સુરક્ષા માટે, તમારા ટીવીને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"તમારી સુરક્ષા માટે, તમારા ફોનને આ સ્રોત પરથી અજાણી ઍપ્લિકેશનો ઇન્સ્ટૉલ કરવાની મંજૂરી નથી."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml index 47f83019594f..290a21167c61 100644 --- a/packages/PackageInstaller/res/values-hi/strings.xml +++ b/packages/PackageInstaller/res/values-hi/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"पैकेज इंस्टॉलर"</string> <string name="install" msgid="711829760615509273">"इंस्टॉल करें"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"क्या आप इस ऐप्लिकेशन को इंस्टॉल करना चाहते हैं?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"क्या आप इस मौजूदा ऐप्लिकेशन को अपडेट करना चाहते हैं? आपका मौजूदा डेटा बचा रहेगा."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"क्या आप इस बिल्ट-इन ऐप्लिकेशन को अपडेट करना चाहते हैं? आपका मौजूदा डेटा बचा रहेगा."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear पर ऐप्लिकेशन इंस्टॉल या अनइंस्टॉल नहीं किए जा सकते."</string> <string name="message_staging" msgid="8032722385658438567">"ऐप्लिकेशन तैयार किया जा रहा है…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"अनजान"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"आपकी सुरक्षा के लिए, आपके टैबलेट को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"आपकी सुरक्षा के लिए, आपके टीवी को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"आपकी सुरक्षा के लिए, आपके फ़ोन को इस स्रोत से अनजान ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml index ba5d3784376a..dc8a93e16033 100644 --- a/packages/PackageInstaller/res/values-hr/strings.xml +++ b/packages/PackageInstaller/res/values-hr/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Alat za inst. paketa"</string> <string name="install" msgid="711829760615509273">"Instaliraj"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gotovo"</string> <string name="cancel" msgid="1018267193425558088">"Otkaži"</string> <string name="installing" msgid="4921993079741206516">"Instaliranje…"</string> <string name="installing_app" msgid="1165095864863849422">"Instaliranje paketa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Želite li instalirati tu aplikaciju?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Želite li instalirati ažuriranje postojeće aplikacije? Vaši postojeći podaci neće se izgubiti."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Želite li instalirati ažuriranje za ovu ugrađenu aplikaciju? Vaši postojeći podaci neće se izgubiti."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Radnje instaliranja i deinstaliranja nisu podržane na Wearu."</string> <string name="message_staging" msgid="8032722385658438567">"Postavljanje aplikacije…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nepoznato"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Iz sigurnosnih razloga tablet nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Iz sigurnosnih razloga televizor nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Iz sigurnosnih razloga telefon nema dopuštenje za instaliranje nepoznatih aplikacija iz ovog izvora."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Vaš telefon i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje telefona ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Vaš tablet i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje tableta ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Vaš TV i osobni podaci podložniji su napadima nepoznatih aplikacija. Instaliranjem te aplikacije prihvaćate odgovornost za oštećenje televizora ili gubitak podataka do kojih može doći uslijed njezine upotrebe."</string> diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml index 2b951de645d3..c8517faaa9c8 100644 --- a/packages/PackageInstaller/res/values-hu/strings.xml +++ b/packages/PackageInstaller/res/values-hu/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Csomagtelepítő"</string> <string name="install" msgid="711829760615509273">"Telepítés"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Kész"</string> <string name="cancel" msgid="1018267193425558088">"Mégse"</string> <string name="installing" msgid="4921993079741206516">"Telepítés…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> telepítése…"</string> <string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Telepíti ezt az alkalmazást?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Telepíti a meglévő alkalmazás frissítését? Meglévő adatai nem vesznek el."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Telepíti a beépített alkalmazás frissítését? Meglévő adatai nem vesznek el."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"A Wear nem támogatja a telepítés/eltávolítás műveletet."</string> <string name="message_staging" msgid="8032722385658438567">"Alkalmazás fokozatos közzététele…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Ismeretlen"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Az Ön biztonsága érdekében táblagépe nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Az Ön biztonsága érdekében tévéje nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Az Ön biztonsága érdekében telefonja nem telepíthet ebből a forrásból származó ismeretlen alkalmazásokat."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonja és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a telefont ért károkért."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Táblagépe és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a táblagépet ért károkért."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Tévéje és személyes adatai fokozott kockázatnak vannak kitéve az ismeretlen alkalmazások támadásaival szemben. Az alkalmazás telepítésével elfogadja, hogy Ön a felelős az alkalmazás használatából eredő esetleges adatvesztésért és a tévét ért károkért."</string> diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml index c05040b147c0..82cd089c3a7b 100644 --- a/packages/PackageInstaller/res/values-hy/strings.xml +++ b/packages/PackageInstaller/res/values-hy/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Package Installer"</string> <string name="install" msgid="711829760615509273">"Տեղադրել"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Տեղադրե՞լ այս հավելվածը:"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Տեղադրե՞լ այս հավելվածի թարմացումը: Ձեր տվյալները կպահպանվեն:"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Տեղադրե՞լ այս ներկառուցված հավելվածի թարմացումը: Ձեր տվյալները կպահպանվեն:"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Տեղադրման/ապատեղադրման գործողությունները Android Wear-ում չեն աջակցվում:"</string> <string name="message_staging" msgid="8032722385658438567">"Սպասեք…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Անհայտ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Անվտանգության նկատառումներից ելնելով՝ ձեր պլանշետին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռուստացույցին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Անվտանգության նկատառումներից ելնելով՝ ձեր հեռախոսին չի թույլատրվում այս աղբյուրից տեղադրել անհայտ հավելվածներ:"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml index 52aa3c061928..db5954d93cdc 100644 --- a/packages/PackageInstaller/res/values-in/strings.xml +++ b/packages/PackageInstaller/res/values-in/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Installer paket"</string> <string name="install" msgid="711829760615509273">"Instal"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Selesai"</string> <string name="cancel" msgid="1018267193425558088">"Batal"</string> <string name="installing" msgid="4921993079741206516">"Menginstal..."</string> <string name="installing_app" msgid="1165095864863849422">"Menginstal <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Anda ingin menginstal aplikasi ini?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Apakah Anda ingin menginstal update ke aplikasi yang sudah ada? Data Anda yang ada saat ini tidak akan hilang."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Apakah Anda ingin menginstal update ke aplikasi bawaan? Data Anda yang ada saat ini tidak akan hilang."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan Instal/Uninstal tidak didukung di Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Menyiapkan aplikasi..."</string> <string name="app_name_unknown" msgid="6881210203354323926">"Tidak dikenal"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Demi keamanan, TV Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Demi keamanan, TV Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Demi keamanan, ponsel Anda tidak diizinkan menginstal aplikasi yang tidak dikenal dari sumber ini."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Ponsel dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan ponsel atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan tablet atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data pribadi Anda lebih rentan terhadap serangan oleh aplikasi yang tidak dikenal. Dengan menginstal aplikasi ini, Anda setuju bahwa Anda bertanggung jawab atas kerusakan TV atau kehilangan data yang mungkin diakibatkan oleh penggunaannya."</string> diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml index 82d10d3d5aaf..9fc4d70342b5 100644 --- a/packages/PackageInstaller/res/values-is/strings.xml +++ b/packages/PackageInstaller/res/values-is/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Uppsetningarforrit pakka"</string> <string name="install" msgid="711829760615509273">"Setja upp"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Lokið"</string> <string name="cancel" msgid="1018267193425558088">"Hætta við"</string> <string name="installing" msgid="4921993079741206516">"Setur upp…"</string> <string name="installing_app" msgid="1165095864863849422">"Setur <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> upp…"</string> <string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Viltu setja þetta forrit upp?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Viltu setja upp uppfærslu á þessu uppsetta forriti? Eldri gögn glatast ekki."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Viltu setja upp uppfærslu á þessu innbyggða forriti? Eldri gögn glatast ekki."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Aðgerðir til að setja upp / fjarlægja eru ekki studdar í Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Setur upp forrit…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Óþekkt"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Til að tryggja öryggi þitt er ekki heimild í spjaldtölvunni þinni fyrir uppsetningu óþekktra forrita frá þessari veitu."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Til að tryggja öryggi þitt er ekki heimild í sjónvarpinu þínu fyrir uppsetningu óþekktra forrita frá þessari veitu."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Til að tryggja öryggi þitt er ekki heimild í símanum þínum fyrir uppsetningu óþekktra forrita frá þessari veitu."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Síminn þinn og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á símanum eða gagnatapi sem leiða kann af notkun þess."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Spjaldtölvan þín og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á spjaldtölvunni eða gagnatapi sem leiða kann af notkun þess."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sjónvarpið þitt og persónuleg gögn eru berskjaldaðri fyrir árásum forrita af óþekktum uppruna. Með uppsetningu þessa forrits samþykkirðu að bera fulla ábyrgð á hverju því tjóni sem verða kann á sjónvarpinu eða gagnatapi sem leiða kann af notkun þess."</string> diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index cee14bc66d95..672a39207011 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Installazione pacchetti"</string> <string name="install" msgid="711829760615509273">"Installa"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Fine"</string> <string name="cancel" msgid="1018267193425558088">"Annulla"</string> <string name="installing" msgid="4921993079741206516">"Installazione…"</string> <string name="installing_app" msgid="1165095864863849422">"Installazione di <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App installata."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Installare questa applicazione?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vuoi installare un aggiornamento a questa applicazione esistente? I tuoi dati non andranno persi."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vuoi installare un aggiornamento per questa applicazione integrata? I tuoi dati non andranno persi."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App non installata."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Le azioni di installazione/disinstallazione non sono supportate su Wear."</string> <string name="message_staging" msgid="8032722385658438567">"App in preparazione…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Sconosciuto"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Per sicurezza, il tuo tablet non è autorizzato a installare app sconosciute da questa origine."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Per sicurezza, la tua TV non è autorizzata a installare app sconosciute da questa origine."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Per sicurezza, il tuo telefono non è autorizzato a installare app sconosciute da questa origine."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"I dati del telefono e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni al telefono o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"I dati del tablet e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni al tablet o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"I dati della TV e i dati personali sono più vulnerabili agli attacchi di app sconosciute. Se installi questa app, accetti di essere responsabile degli eventuali danni alla TV o dell\'eventuale perdita di dati derivanti dall\'uso dell\'app."</string> diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index e5e219559c62..430e25fcb95b 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -18,19 +18,22 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"מתקין החבילה"</string> <string name="install" msgid="711829760615509273">"התקנה"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"סיום"</string> <string name="cancel" msgid="1018267193425558088">"ביטול"</string> - <string name="installing" msgid="4921993079741206516">"מתקין…"</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="8176284075816604590">"להתקין את האפליקציה הזו?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"להתקין עדכון עבור האפליקציה הזו? הנתונים הקיימים שלך לא יאבדו."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"האם ברצונך להתקין עדכון עבור אפליקציה מובנית זו? הנתונים הקיימים שלך לא יאבדו."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string> <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטאבלט."</string> - <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"האפליקציה הזו אינה תואמת לטלוויזיה שלך."</string> + <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"האפליקציה הזו לא תואמת לטלוויזיה שלך."</string> <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"האפליקציה לא הותקנה כי היא לא תואמת לטלפון."</string> <string name="install_failed_invalid_apk" msgid="8581007676422623930">"האפליקציה לא הותקנה כי נראה שהחבילה לא תקפה."</string> <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g> בטאבלט שלך."</string> @@ -42,7 +45,7 @@ <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"למשתמש הזה אין הרשאה להתקין אפליקציות"</string> <string name="ok" msgid="7871959885003339302">"אישור"</string> <string name="manage_applications" msgid="5400164782453975580">"ניהול אפליקציות"</string> - <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק שטח"</string> + <string name="out_of_space_dlg_title" msgid="4156690013884649502">"אין מספיק מקום"</string> <string name="out_of_space_dlg_text" msgid="8727714096031856231">"לא ניתן להתקין את <xliff:g id="APP_NAME">%1$s</xliff:g>. יש לפנות מקום אחסון ולנסות שוב."</string> <string name="app_not_found_dlg_title" msgid="5107924008597470285">"האפליקציה לא נמצאה"</string> <string name="app_not_found_dlg_text" msgid="5219983779377811611">"האפליקציה לא נמצאת ברשימת האפליקציות המותקנות."</string> @@ -56,7 +59,7 @@ <string name="uninstall_application_text" msgid="3816830743706143980">"האם ברצונך להסיר את ההתקנה של אפליקציה זו?"</string> <string name="uninstall_application_text_all_users" msgid="575491774380227119">"להסיר את האפליקציה הזו עבור "<b>"כל"</b>" המשתמשים? האפליקציה והנתונים שלה יוסרו עבור "<b>"כל"</b>" המשתמשים במכשיר."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"להסיר את ההתקנה של האפליקציה הזו עבור <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> - <string name="uninstall_update_text" msgid="863648314632448705">"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו."</string> + <string name="uninstall_update_text" msgid="863648314632448705">"להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו."</string> <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו. הפעולה תשפיע על כל משתמשי המכשיר, כולל משתמשים בעלי פרופיל עבודה."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"שמירת <xliff:g id="SIZE">%1$s</xliff:g> מנתוני האפליקציה."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"התקנות בתהליכי הסרה"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"פעולות התקנה/הסרת התקנה אינן נתמכות ב-Wear."</string> <string name="message_staging" msgid="8032722385658438567">"מכין אפליקציה להתקנה…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"לא ידוע"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"לצורכי אבטחה, הטאבלט שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"לצורכי אבטחה, מכשיר הטלוויזיה שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"לצורכי אבטחה, הטלפון שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index 1ba36e7745c2..535c1ae2876e 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"パッケージ インストーラ"</string> <string name="install" msgid="711829760615509273">"インストール"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"このアプリをインストールしますか?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"この既存のアプリへのアップデートをインストールしてもよろしいですか?既存のデータは失われません。"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"この内蔵アプリへのアップデートをインストールしてもよろしいですか?既存のデータは失われません。"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ではインストールやアンインストールはできません。"</string> <string name="message_staging" msgid="8032722385658438567">"アプリを準備しています…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"不明"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"セキュリティ上の理由から、お使いのタブレットではこの提供元からの不明なアプリをインストールすることはできません。"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"セキュリティ上の理由から、お使いのテレビではこの提供元からの不明なアプリをインストールすることはできません。"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"セキュリティ上の理由から、お使いのスマートフォンではこの提供元からの不明なアプリをインストールすることはできません。"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml index 779fa0e11c8d..c8b440193f15 100644 --- a/packages/PackageInstaller/res/values-ka/strings.xml +++ b/packages/PackageInstaller/res/values-ka/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"პაკეტის ინსტალატორი"</string> <string name="install" msgid="711829760615509273">"ინსტალაცია"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"გსურთ ამ აპლიკაციის ინსტალაცია?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"გსურთ ამ არსებული აპლიკაციის განახლების ინსტალაცია? არსებული მონაცემები არ დაიკარგება."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"გსურთ ამ ჩაშენებული აპლიკაციის განახლების ინსტალაცია? არსებული მონაცემები არ დაიკარგება."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ინსტალაცია/დეინსტალაცია მხარდაუჭერელია Wear-ზე."</string> <string name="message_staging" msgid="8032722385658438567">"მიმდინარეობს აპის შუალედური შენახვა…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"უცნობი"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"თქვენივე უსაფრთხოებისთვის, ტაბლეტს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"თქვენივე უსაფრთხოებისთვის, ტელევიზორს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"თქვენივე უსაფრთხოებისთვის, ტელეფონს არ აქვს ამ წყაროდან უცნობი აპების ინსტალაციის უფლება."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml index 3e6d25d29ba7..badfa4e346d6 100644 --- a/packages/PackageInstaller/res/values-kk/strings.xml +++ b/packages/PackageInstaller/res/values-kk/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Пакет орнатқыш"</string> <string name="install" msgid="711829760615509273">"Орнату"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Осы қолданба орнатылсын ба?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Қолданбаның жаңартылған нұсқасы орнатылсын ба? Бұрыннан бар деректер сақталады."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Орнатылған қолданбаның жаңартылған нұсқасы орнатылсын ба? Бұрыннан бар деректер сақталады."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear жүйесінде \"Орнату/Жою\" әрекеттері қолданылмайды."</string> <string name="message_staging" msgid="8032722385658438567">"Қолданба дайындалуда…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Белгісіз"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Қауіпсіздік үшін планшетке бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Қауіпсіздік үшін теледидарға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Қауіпсіздік үшін телефонға бұл дереккөзден белгісіз қолданбаларды орнатуға рұқсат берілмейді."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml index af7ef0b9f314..eb13774c7367 100644 --- a/packages/PackageInstaller/res/values-km/strings.xml +++ b/packages/PackageInstaller/res/values-km/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"កម្មវិធីដំឡើងកញ្ចប់"</string> <string name="install" msgid="711829760615509273">"ដំឡើង"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"តើអ្នកចង់ដំឡើងកំណែថ្មីសម្រាប់កម្មវិធីដែលមានស្រាប់នេះដែរទេ? ទិន្នន័យដែលមានស្រាប់របស់អ្នកនឹងមិនបាត់បង់ទេ។"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"តើអ្នកចង់ដំឡើងកំណែថ្មីសម្រាប់កម្មវិធីដែលភ្ជាប់មកជាមួយនេះដែរទេ? ទិន្នន័យដែលមានស្រាប់របស់អ្នកនឹងមិនបាត់បង់ទេ។"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"សកម្មភាពដំឡើង/លុបចេញមិនអាចប្រើនៅលើ Wear បានទេ។"</string> <string name="message_staging" msgid="8032722385658438567">"កំពុងសាកល្បងកម្មវិធី…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"មិនស្គាល់"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ថេប្លេតរបស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ទូរទស្សន៍របស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ដើម្បីសុវតិ្ថភាពរបស់អ្នក ទូរសព្ទរបស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យដំឡើងកម្មវិធីដែលមិនស្គាល់ពីប្រភពនេះទេ។"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml index fa93f0d71fd6..66df526e5c9b 100644 --- a/packages/PackageInstaller/res/values-kn/strings.xml +++ b/packages/PackageInstaller/res/values-kn/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ಪ್ಯಾಕೇಜ್ ಇನ್ಸ್ಟಾಲರ್"</string> <string name="install" msgid="711829760615509273">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ನೀವು ಈ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ ಆದ ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ನೀವು ಈ ಅಂತನಿರ್ಮಿತ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ ಆದ ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿಕೊಳ್ಳಲು ಬಯಸುವಿರಾ? ಈಗಿರುವ ನಿಮ್ಮ ಡೇಟಾ ಕಳೆದು ಹೋಗುವುದಿಲ್ಲ. ಇದಕ್ಕೆ ಯಾವುದೇ ವಿಶೇಷ ಪ್ರವೇಶದ ಅಗತ್ಯವಿಲ್ಲ."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ನಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್/ಅನ್ಇನ್ಸ್ಟಾಲ್ ಕ್ರಿಯೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string> <string name="message_staging" msgid="8032722385658438567">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಿದ್ಧವಿರುವ ಆ್ಯಪ್…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ಅಪರಿಚಿತ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಅಪರಿಚಿತ ಮೂಲಗಳಿಂದ ಪಡೆದುಕೊಳ್ಳುವ ಆ್ಯಪ್ಗಳನ್ನು ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಅನುಮತಿಯಿಲ್ಲ."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ದೃಷ್ಟಿಯಿಂದ, ಈ ಮೂಲದಿಂದ ಬಂದಿರುವ ಅಪರಿಚಿತ ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index 2f11159f82c2..2eada005bfbe 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"패키지 설치 프로그램"</string> <string name="install" msgid="711829760615509273">"설치"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"이 애플리케이션을 설치하시겠습니까?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"이 기존 애플리케이션에 대한 업데이트를 설치하시겠습니까? 기존 데이터는 유지됩니다."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"이 내장 애플리케이션에 대한 업데이트를 설치하시겠습니까? 기존 데이터는 유지됩니다."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear에서 지원되지 않는 설치/제거 작업"</string> <string name="message_staging" msgid="8032722385658438567">"앱 준비 중…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"알 수 없음"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"보안상의 이유로 이 소스의 알 수 없는 앱을 태블릿에 설치할 수 없습니다."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"보안상의 이유로 이 소스의 알 수 없는 앱을 TV에 설치할 수 없습니다."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"보안상의 이유로 이 소스의 알 수 없는 앱을 휴대전화에 설치할 수 없습니다."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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">"TV와 개인 데이터는 알 수 없는 앱의 공격에 더욱 취약합니다. 이 앱을 설치하면 앱 사용으로 인해 발생할 수 있는 모든 TV 손상이나 데이터 손실에 사용자가 책임을 진다는 것에 동의하게 됩니다."</string> diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml index 822c548bc139..ef652915cd39 100644 --- a/packages/PackageInstaller/res/values-ky/strings.xml +++ b/packages/PackageInstaller/res/values-ky/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Топтомду орноткуч"</string> <string name="install" msgid="711829760615509273">"Орнотуу"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Бул колдонмону орнотоюн деп жатасызбы?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Учурдагы колдонмону жаңыртканы жатасызбы? Буга чейин сакталган дайын-даректериңиз өчүрүлбөйт."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Учурдагы алдын ала орнотулган колдонмону жаңыртканы жатасызбы? Буга чейин сакталган дайын-даректериңиз өчүрүлбөйт."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Орнотуу/чыгарып салуу аракеттери Android Wear\'де колдоого алынбайт."</string> <string name="message_staging" msgid="8032722385658438567">"Күтө туруңуз…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Белгисиз"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Коопсуздукту сактоо максатында, планшетиңизге бул булактан колдонмолорду орнотууга уруксат жок."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Коопсуздукту сактоо максатында, сыналгыңызга бул булактан колдонмолорду орнотууга уруксат жок."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Коопсуздукту сактоо максатында, телефонуңузга бул булактан колдонмолорду орнотууга уруксат жок."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml index c52f5090d388..78209bfa4f04 100644 --- a/packages/PackageInstaller/res/values-lo/strings.xml +++ b/packages/PackageInstaller/res/values-lo/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ຕົວຕິດຕັ້ງແພັກເກດ"</string> <string name="install" msgid="711829760615509273">"ຕິດຕັ້ງ"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບພລິເຄຊັນນີ້ບໍ່?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ທ່ານຕ້ອງການຕິດຕັ້ງອັບເດດຫາແອັບພລິເຄຊັນທີ່ມີຢູ່ກ່ອນແລ້ວນີ້ບໍ່? ຂໍ້ມູນເກົ່າຂອງທ່ານຈະບໍ່ເສຍໄປໃສ."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ທ່ານຕ້ອງການຕິດຕັ້ງອັບເດດໃສ່ແອັບພລິເຄຊັນແບບມີມາໃນຕົວນີ້ບໍ່? ຂໍ້ມູນເກົ່າຂອງທ່ານຈະບໍ່ເສຍໄປໃສ."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ຕິດຕັ້ງ/ຖອນການຕິດຕັ້ງ ຄຳສັ່ງທີ່ບໍ່ຮອງຮັບຢູ່ Wear."</string> <string name="message_staging" msgid="8032722385658438567">"ກຳລັງຮຽງແອັບ…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ບໍ່ຮູ້ຈັກ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ແທັບເລັດຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ໂທລະທັດຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ໂທລະສັບຂອງທ່ານບໍ່ສາມາດຕິດຕັ້ງແອັບຈາກແຫລ່ງຂໍ້ມູນນີ້ໄດ້."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml index e88bde45ba45..b0bff20a2502 100644 --- a/packages/PackageInstaller/res/values-lt/strings.xml +++ b/packages/PackageInstaller/res/values-lt/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paketo diegimo programa"</string> <string name="install" msgid="711829760615509273">"Įdiegti"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Atlikta"</string> <string name="cancel" msgid="1018267193425558088">"Atšaukti"</string> <string name="installing" msgid="4921993079741206516">"Įdiegiama…"</string> <string name="installing_app" msgid="1165095864863849422">"Įdiegiamas paketas „<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>“…"</string> <string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Ar norite įdiegti šią programą?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Ar norite įdiegti šios esamos programos naujinį? Esamų duomenų neprarasite."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Ar norite įdiegti šios įtaisytos programos naujinį? Esamų duomenų neprarasite."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Diegimo / pašalinimo veiksmai nepalaikomi sistemoje „Wear“."</string> <string name="message_staging" msgid="8032722385658438567">"Programa pateikiama etapais…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nežinoma"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Saugos sumetimais planšetiniame kompiuteryje neleidžiama diegti nežinomų programų iš šio šaltinio."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Saugos sumetimais televizoriuje neleidžiama diegti nežinomų programų iš šio šaltinio."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Saugos sumetimais telefone neleidžiama diegti nežinomų programų iš šio šaltinio."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonas ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą telefonui arba prarastus duomenis dėl šios programos naudojimo."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planšetinis kompiuteris ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą planšetiniam kompiuteriui arba prarastus duomenis dėl šios programos naudojimo."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV ir asmens duomenys labiau pažeidžiami įdiegus nežinomų programų. Įdiegdami šią programą sutinkate, kad patys esate atsakingi už žalą TV arba prarastus duomenis dėl šios programos naudojimo."</string> diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml index fa1452794422..70ea5961a223 100644 --- a/packages/PackageInstaller/res/values-lv/strings.xml +++ b/packages/PackageInstaller/res/values-lv/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakotnes instalēš. progr."</string> <string name="install" msgid="711829760615509273">"Instalēt"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gatavs"</string> <string name="cancel" msgid="1018267193425558088">"Atcelt"</string> <string name="installing" msgid="4921993079741206516">"Notiek instalēšana…"</string> <string name="installing_app" msgid="1165095864863849422">"Notiek pakotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> instalēšana…"</string> <string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Vai vēlaties instalēt šo lietojumprogrammu?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vai vēlaties instalēt šīs lietojumprogrammas atjauninājumu? Esošie dati netiks zaudēti."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vai vēlaties instalēt šīs iebūvētās lietojumprogrammas atjauninājumu? Esošie dati netiks zaudēti."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Operētājsistēmā Wear netiek atbalstīta instalēšana/atinstalēšana."</string> <string name="message_staging" msgid="8032722385658438567">"Lietotne tiek izstādīta…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Nezināma"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Drošības nolūkos jūsu planšetdatorā ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Drošības nolūkos jūsu televizorā ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Drošības nolūkos jūsu tālrunī ir aizliegts instalēt no šī avota iegūtas nezināmas lietotnes."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Jūsu tālrunis un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par tālruņa bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Jūsu planšetdators un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par planšetdatora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Jūsu televizors un personas dati ir neaizsargātāki pret uzbrukumiem no nezināmām lietotnēm. Instalējot šo lietotni, jūs piekrītat, ka esat atbildīgs par televizora bojājumiem vai datu zudumu, kas var rasties lietotnes dēļ."</string> diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index 000e5d88553a..6152b398f0d1 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Инсталатор на пакет"</string> <string name="install" msgid="711829760615509273">"Инсталирај"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Дали сакате да ја инсталирате апликацијава?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Дали сакате да инсталирате ажурирање на оваа постоечка апликација? Постоечките податоци нема да се изгубат."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Дали сакате да инсталирате ажурирање на оваа вградена апликација? Постоечките податоци нема да се изгубат."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Дејствата „Инсталирај/деинсталирај“ не се поддржани на Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Апликацијата се поставува…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Непозната"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"За ваша безбедност, таблетот нема дозвола за инсталирање непознати апликации од изворов."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"За ваша безбедност, телевизорот нема дозвола за инсталирање непознати апликации од изворов."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"За ваша безбедност, телефонот нема дозвола за инсталирање непознати апликации од изворов."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml index c22ead4bc186..d66f4d6bc975 100644 --- a/packages/PackageInstaller/res/values-ml/strings.xml +++ b/packages/PackageInstaller/res/values-ml/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"പാക്കേജ് ഇൻസ്റ്റാളർ"</string> <string name="install" msgid="711829760615509273">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"നിലവിലുള്ള ഈ ആപ്പിന്റെ അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യണോ നിലവിലുള്ള ഡാറ്റ നഷ്ടപ്പെടില്ല."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ഈ അടങ്ങിയ ആപ്പിന് ഒരു അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യണോ? നിലവിലുള്ള ഡാറ്റ നഷ്ടപ്പെടില്ല."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ഇൻസ്റ്റാൾ/അൺഇൻസ്റ്റാൾ ചെയ്യുന്നത് Wear പിന്തുണയ്ക്കുന്നില്ല."</string> <string name="message_staging" msgid="8032722385658438567">"ആപ്പ് തയ്യാറാക്കുന്നു…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"അജ്ഞാതം"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ഡാബ്ലെറ്റിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ടിവിയിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"നിങ്ങളുടെ സുരക്ഷയ്ക്കായി, ഈ ഉറവിടത്തിൽ നിന്നുള്ള, അജ്ഞാത ആപ്പുകൾ ഫോണിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് അനുവദനീയമല്ല."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml index 61aba5746611..6cc992a8fa82 100644 --- a/packages/PackageInstaller/res/values-mn/strings.xml +++ b/packages/PackageInstaller/res/values-mn/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Багц суулгагч"</string> <string name="install" msgid="711829760615509273">"Суулгах"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Та одоо байгаа аппын шинэчлэлтийг суулгахыг хүсэж байна уу? Таны хуучин өгөгдөл устахгүй."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Та энэ үндсэн аппын шинэчлэлтийг суулгахыг хүсэж байна уу? Таны хуучин өгөгдөл устахгүй."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear-д суулгах/устгах үйлдлийг дэмждэггүй."</string> <string name="message_staging" msgid="8032722385658438567">"Аппыг байршуулж байна…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Тодорхойгүй"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Таны аюулгүй байдлыг хангахын тулд таны таблет энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Таны аюулгүй байдлыг хангахын тулд таны ТВ энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Таны аюулгүй байдлыг хангахын тулд таны утас энэ эх сурвалжаас тодорхойгүй апп суулгахыг зөвшөөрдөггүй."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml index da1c7a7d7cbf..844ed8171d30 100644 --- a/packages/PackageInstaller/res/values-mr/strings.xml +++ b/packages/PackageInstaller/res/values-mr/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"पॅकेज इंस्टॉलर"</string> <string name="install" msgid="711829760615509273">"इंस्टॉल करा"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"तुम्हाला हे ॲप्लिकेशन इंस्टॉल करायचे आहे का?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"तुम्हाच्या विद्यमान ॲप्लिकेशनवर अपडेट इंस्टॉल करायचे आहे का? तुमचा विद्यमान डेटा गमावणार नाही."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तुम्हाला या बिल्ट-इन ॲप्लिकेशनवर अपडेट इंस्टॉल करायचे आहे का? तुमचा विद्यमान डेटा गमावणार नाही."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"इंस्टॉल करा/अनइंस्टॉल करा क्रिया Wear वर सपोर्ट करत नाहीत."</string> <string name="message_staging" msgid="8032722385658438567">"अॅप सुरुवातीच्या स्थितीत आहे…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तुमच्या सुरक्षिततेसाठी, तुमच्या टॅबलेटला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तुमच्या सुरक्षिततेसाठी, तुमच्या टीव्हीला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तुमच्या सुरक्षिततेसाठी, तुमच्या फोनला या स्रोताकडील अज्ञात अॅप्स इंस्टॉल करण्याची अनुमती नाही."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml index 17815be1f4fd..ce251a5184c8 100644 --- a/packages/PackageInstaller/res/values-ms/strings.xml +++ b/packages/PackageInstaller/res/values-ms/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pemasang pakej"</string> <string name="install" msgid="711829760615509273">"Pasang"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Selesai"</string> <string name="cancel" msgid="1018267193425558088">"Batal"</string> <string name="installing" msgid="4921993079741206516">"Memasang…"</string> <string name="installing_app" msgid="1165095864863849422">"Memasang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Adakah anda ingin memasang aplikasi ini?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Adakah anda mahu memasang kemas kini pada aplikasi yang sedia ada? Data anda yang sedia ada tidak akan hilang."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Adakah anda mahu memasang kemas kini pada aplikasi terbina dalam ini? Data anda yang sedia ada tidak akan hilang."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Tindakan pasang/nyahpasang tidak disokong pada Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Pemeringkatan apl…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Tidak diketahui"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Untuk keselamatan, tablet anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Untuk keselamatan, TV anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Untuk keselamatan, telefon anda tidak dibenarkan memasang apl yang tidak diketahui daripada sumber ini."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefon dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada telefon anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tablet dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada tablet anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV dan data peribadi anda lebih mudah diserang oleh apl yang tidak diketahui. Dengan memasang apl ini, anda bersetuju bahawa anda bertanggungjawab atas sebarang kerosakan pada TV anda atau kehilangan data yang mungkin disebabkan oleh penggunaan apl tersebut."</string> diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml index 356c370c4e3d..3c3ed99459ef 100644 --- a/packages/PackageInstaller/res/values-my/strings.xml +++ b/packages/PackageInstaller/res/values-my/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ပက်ကေ့ဂျ်ထည့်သွင်းကိရိယာ"</string> <string name="install" msgid="711829760615509273">"ထည့်သွင်းရန်"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ဤအပလီကေးရှင်းကို ထည့်သွင်းလိုသလား။"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ဤလက်ရှိအပလီကေးရှင်းအတွက် အပ်ဒိတ်ကို ထည့်သွင်းလိုပါသလား။ သင်၏ လက်ရှိဒေတာများ ဆုံးရှုံးသွားမည် မဟုတ်ပါ။"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ဤနဂိုအသင့်ပါ အပလီကေးရှင်းအတွက် အပ်ဒိတ်ကို ထည့်သွင်းလိုပါသလား။ သင်၏ လက်ရှိဒေတာများ ဆုံးရှုံးသွားမည် မဟုတ်ပါ။"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear ပေါ်တွင် ထည့်သွင်းခြင်း/ဖယ်ရှားခြင်းများကို ပံ့ပိုးမထားပါ။"</string> <string name="message_staging" msgid="8032722385658438567">"အက်ပ်ကို ပြင်ဆင်နေသည်…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"အမည်မသိ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏တက်ဘလက်တွင် ထည့်သွင်းခွင့်မရှိပါ။"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏တီဗီတွင် ထည့်သွင်းခွင့်မရှိပါ။"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"လုံခြုံရေးအရ ဤနေရာမှရယူထားသည့် အမျိုးအမည်မသိသောအက်ပ်များကို သင်၏ဖုန်းတွင် ထည့်သွင်းခွင့်မရှိပါ။"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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">"သင်၏ TV နှင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များသည် အမျိုးအမည် မသိသောအက်ပ်များ၏ တိုက်ခိုက်ခြင်းကို ပိုမိုခံရနိုင်ပါသည်။ ဤအက်ပ်ကို ထည့်သွင်းအသုံးပြုခြင်းအားဖြင့် ဖြစ်ပေါ်လာနိုင်သော TV ပျက်စီးမှု သို့မဟုတ် ဒေတာဆုံးရှုံးမှုများအတွက် သင့်ထံ၌သာ တာဝန်ရှိကြောင်း သဘောတူရာရောက်ပါသည်။"</string> diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml index 6f2f11299823..e0faa8429ac8 100644 --- a/packages/PackageInstaller/res/values-nb/strings.xml +++ b/packages/PackageInstaller/res/values-nb/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakkeinstallasjon"</string> <string name="install" msgid="711829760615509273">"Installer"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Ferdig"</string> <string name="cancel" msgid="1018267193425558088">"Avbryt"</string> <string name="installing" msgid="4921993079741206516">"Installerer …"</string> <string name="installing_app" msgid="1165095864863849422">"Installerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="install_done" msgid="5987363587661783896">"Appen er installert."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Ønsker du å installere denne appen?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vil du installere en oppdatering for denne eksisterende appen? Du mister ikke de eksisterende dataene dine."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vil du installere en oppdatering for denne innebygde appen? Du mister ikke de eksisterende dataene dine."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Handlinger for å installere og avinstallere støttes ikke på Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Klargjør appen …"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Ukjent"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Nettbrettet ditt har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"TV-en din har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Telefonen din har ikke tillatelse til å installere ukjente apper fra denne kilden, for å ivareta sikkerheten din."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonen din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på telefonen eller tap av data som kan skyldes bruk av appen"</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Nettbrettet ditt og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på nettbrettet eller tap av data som kan skyldes bruk av appen."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV-en din og de personlige dataene dine er mer sårbare for angrep fra ukjente apper. Når du installerer denne appen, samtykker du i at du er ansvarlig for eventuelle skader på TV-en eller tap av data som kan skyldes bruk av appen."</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 0b73271a0f34..4405123283d5 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"प्याकेज स्थापनाकर्ता"</string> <string name="install" msgid="711829760615509273">"स्थापना गर्नु…"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"एप स्थापना गरियो।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"तपाईं यो एप स्थापना गर्न चाहनुहुन्छ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"तपाईं यो पहिलेदेखि नै विद्यमान एपको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"तपाईं यो अन्तर्निर्मित एपको साटो यसको अद्यावधिक संस्करण स्थापना गर्न चाहनुहुन्छ? तपाईंको विद्यमान डेटा गुम्ने छैन।"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear मा स्थापना/स्थापना रद्द गर्ने कारबाहीहरू समर्थित छैनन्।"</string> <string name="message_staging" msgid="8032722385658438567">"एप स्थापना गर्न तयारी गर्दै…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"अज्ञात"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"तपाईंको सुरक्षाका लागि, तपाईंको ट्याब्लेटलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"तपाईंको सुरक्षाका लागि, तपाईंको टिभी लाई यस स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"तपाईंको सुरक्षाका लागि, तपाईंको फोनलाई यो स्रोतबाट प्राप्त हुने अज्ञात एपहरू स्थापना गर्ने अनुमति छैन।"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index d3a958922d1c..3c26eecc97a4 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakket-installatie"</string> <string name="install" msgid="711829760615509273">"Installeren"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Klaar"</string> <string name="cancel" msgid="1018267193425558088">"Annuleren"</string> <string name="installing" msgid="4921993079741206516">"Installeren…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeren…"</string> <string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Wil je deze app installeren?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Wil je een update voor deze bestaande app installeren? Je huidige gegevens gaan niet verloren."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Wil je een update voor deze ingebouwde app installeren? Je huidige gegevens gaan niet verloren."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acties voor installeren/verwijderen niet ondersteund op Wear."</string> <string name="message_staging" msgid="8032722385658438567">"App uitvoeren…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Onbekend"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Uit veiligheidsoverwegingen heeft je tablet geen toestemming om onbekende apps van deze bron te installeren."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Uit veiligheidsoverwegingen heeft je tv geen toestemming om onbekende apps van deze bron te installeren."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Uit veiligheidsoverwegingen heeft je telefoon geen toestemming om onbekende apps van deze bron te installeren."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Je telefoon en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je telefoon of gegevensverlies als gevolg van het gebruik van de app."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Je tablet en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tablet of gegevensverlies als gevolg van het gebruik van de app."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Je tv en persoonsgegevens zijn kwetsbaarder voor aanvallen door onbekende apps. Als je deze app installeert, ga je ermee akkoord dat je verantwoordelijk bent voor eventuele schade aan je tv of gegevensverlies als gevolg van het gebruik van de app."</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index f3b97a98ccf4..e1617f4fcd57 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍ ଇନଷ୍ଟଲର୍"</string> <string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ଆପଣ ଏହି ଆପ୍ଲିକେଶନ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ପୂର୍ବରୁ ରହିଥିବା ଏହି ଆପ୍ଲିକେଶନ୍ରେ ଆପଣ ଅପ୍ଡେଟ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ଏହି ବିଲ୍ଟ-ଇନ୍ ଆପ୍ଲିକେଶନ୍ରେ ଆପଣ ଏକ ଅପ୍ଡେଟ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ୱିଅର୍ରେ ଇନଷ୍ଟଲ୍/ଅନଇନଷ୍ଟଲ୍ କାର୍ଯ୍ୟ ସପୋର୍ଟ କରେନାହିଁ।"</string> <string name="message_staging" msgid="8032722385658438567">"ଆପ୍ ପର୍ଯ୍ୟାୟଭୁକ୍ତ କରାଯାଉଛି…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ଅଜଣା"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟାବ୍ଲେଟ୍କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟିଭିକୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଫୋନ୍କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index 5a417af14733..ce56ab1038b4 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ਪੈਕੇਜ ਸਥਾਪਨਾਕਾਰ"</string> <string name="install" msgid="711829760615509273">"ਸਥਾਪਤ ਕਰੋ"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ਕੀ ਤੁਸੀਂ ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ਕੀ ਤੁਸੀਂ ਇਸ ਮੌਜੂਦਾ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇੱਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਨਸ਼ਟ ਨਹੀਂ ਹੋਵੇਗਾ।"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ਕੀ ਤੁਸੀਂ ਇਸ ਬਿਲਟ-ਇਨ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇੱਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਨਸ਼ਟ ਨਹੀਂ ਹੋਵੇਗਾ।"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear \'ਤੇ ਸਥਾਪਤ ਜਾਂ ਅਣਸਥਾਪਤ ਕਰਨ ਦੀਆਂ ਕਾਰਵਾਈਆਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।"</string> <string name="message_staging" msgid="8032722385658438567">"ਐਪ ਨੂੰ ਸਟੇਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ਅਗਿਆਤ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਟੀਵੀ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੂੰ ਇਸ ਸਰੋਤ ਤੋਂ ਅਗਿਆਤ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml index f67cb0838358..57ee7fea519f 100644 --- a/packages/PackageInstaller/res/values-pl/strings.xml +++ b/packages/PackageInstaller/res/values-pl/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalator pakietu"</string> <string name="install" msgid="711829760615509273">"Zainstaluj"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gotowe"</string> <string name="cancel" msgid="1018267193425558088">"Anuluj"</string> <string name="installing" msgid="4921993079741206516">"Instaluję…"</string> <string name="installing_app" msgid="1165095864863849422">"Instaluję pakiet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Czy zainstalować tę aplikację?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Czy chcesz zainstalować aktualizację posiadanej aplikacji? Dotychczasowe dane nie zostaną utracone."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Czy chcesz zainstalować aktualizację fabrycznej aplikacji? Dotychczasowe dane nie zostaną utracone."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nie obsługuje instalowania ani odinstalowywania."</string> <string name="message_staging" msgid="8032722385658438567">"Przygotowuję aplikację…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Inny"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Ze względów bezpieczeństwa na Twoim tablecie nie można instalować nieznanych aplikacji z tego źródła."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Ze względów bezpieczeństwa na Twoim telewizorze nie można instalować nieznanych aplikacji z tego źródła."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Ze względów bezpieczeństwa na Twoim telefonie nie można instalować nieznanych aplikacji z tego źródła."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Dane na telefonie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telefonu lub utratę danych w wyniku jej używania."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Dane na tablecie i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie tabletu lub utratę danych w wyniku jej używania."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Dane na telewizorze i prywatne są bardziej narażone na atak nieznanych aplikacji. Instalując tę aplikację, bierzesz na siebie odpowiedzialność za ewentualne uszkodzenie telewizora lub utratę danych w wyniku jej używania."</string> diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml index abeb72d458e9..cef7681c8324 100644 --- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Concluído"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"Instalando…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App instalado."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Quer instalar este aplicativo?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Quer instalar uma atualização para este aplicativo? Seus dados existentes não serão perdidos."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Quer instalar uma atualização para este aplicativo integrado? Seus dados existentes não serão perdidos."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Testando app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, seu tablet não tem permissão para instalar apps desconhecidos dessa fonte."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, sua TV não tem permissão para instalar apps desconhecidos dessa fonte."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, seu smartphone não tem permissão para instalar apps desconhecidos dessa fonte."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index d539f6f67874..0710aa3fb75f 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Concluído"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"A instalar…"</string> <string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App instalada."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Pretende instalar esta app?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Pretende instalar uma atualização para esta app existente? Os seus dados existentes não serão perdidos."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Pretende instalar uma atualização para esta app incorporada? Os seus dados existentes não serão perdidos."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"A preparar a app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconhecida"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, o tablet não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, a TV não está autorizada a instalar aplicações desconhecidas a partir desta fonte."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, o telemóvel não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O seu telemóvel e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao telemóvel ou pelas perdas de dados que possam resultar da utilização da mesma."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"O seu tablet e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao tablet ou pelas perdas de dados que possam resultar da utilização da mesma."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A sua TV e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados à TV ou pelas perdas de dados que possam resultar da utilização da mesma."</string> diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml index abeb72d458e9..cef7681c8324 100644 --- a/packages/PackageInstaller/res/values-pt/strings.xml +++ b/packages/PackageInstaller/res/values-pt/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instalador do pacote"</string> <string name="install" msgid="711829760615509273">"Instalar"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Concluído"</string> <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"Instalando…"</string> <string name="installing_app" msgid="1165095864863849422">"Instalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App instalado."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Quer instalar este aplicativo?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Quer instalar uma atualização para este aplicativo? Seus dados existentes não serão perdidos."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Quer instalar uma atualização para este aplicativo integrado? Seus dados existentes não serão perdidos."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Testando app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconhecido"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, seu tablet não tem permissão para instalar apps desconhecidos dessa fonte."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, sua TV não tem permissão para instalar apps desconhecidos dessa fonte."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, seu smartphone não tem permissão para instalar apps desconhecidos dessa fonte."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Seu smartphone e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu smartphone ou pela perda de dados que possa resultar do uso do app."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Seu tablet e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano causado ao seu tablet ou pela perda de dados que possa resultar do uso do app."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Sua TV e seus dados pessoais estão mais vulneráveis a ataques de apps desconhecidos. Ao instalar esse app, você concorda que é responsável por qualquer dano à sua TV ou pela perda de dados que possa resultar do uso do app."</string> diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 9c22fcd217fd..119860156e66 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Program de instalare a pachetelor"</string> <string name="install" msgid="711829760615509273">"Instalați"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Gata"</string> <string name="cancel" msgid="1018267193425558088">"Anulați"</string> <string name="installing" msgid="4921993079741206516">"Se instalează…"</string> <string name="installing_app" msgid="1165095864863849422">"Se instalează <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Doriți să instalați această aplicație?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Doriți să instalați o actualizare pentru această aplicație? Datele existente nu se vor pierde."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Doriți să instalați o actualizare pentru această aplicație încorporată? Datele existente nu se vor pierde."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Acțiunile de instalare și dezinstalare nu sunt acceptate pe Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Se pregătește aplicația…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Necunoscut"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Din motive de securitate, tableta dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Din motive de securitate, televizorul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Din motive de securitate, telefonul dvs. nu are permisiunea să instaleze aplicații necunoscute din această sursă."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea telefonului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableta și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați aplicația, acceptați că sunteți singura persoană responsabilă pentru deteriorarea tabletei sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizorul și datele dvs. personale sunt mai vulnerabile la un atac din partea aplicațiilor necunoscute. Dacă instalați această aplicație, acceptați că sunteți singura persoană responsabilă pentru deteriorarea televizorului sau pentru pierderea datelor, care pot avea loc în urma folosirii acesteia."</string> diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml index a9ae543518c7..b5477c1ba62b 100644 --- a/packages/PackageInstaller/res/values-ru/strings.xml +++ b/packages/PackageInstaller/res/values-ru/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Установщик пакетов"</string> <string name="install" msgid="711829760615509273">"Установить"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Приложение установлено."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Установить это приложение?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Установить обновление для этого приложения? Вы не потеряете связанные с ним данные."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Установить обновление для этого встроенного приложения? Вы не потеряете связанные с ним данные."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Установка и удаление не поддерживаются в Wear OS."</string> <string name="message_staging" msgid="8032722385658438567">"Подождите…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Неизвестное приложение"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"В целях безопасности ваш планшет блокирует установку приложений из неизвестных источников."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"В целях безопасности ваш телевизор блокирует установку приложений из неизвестных источников."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"В целях безопасности ваш телефон блокирует установку приложений из неизвестных источников."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml index 5fad69d02268..b517efaea30e 100644 --- a/packages/PackageInstaller/res/values-si/strings.xml +++ b/packages/PackageInstaller/res/values-si/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"පැකේජ ස්ථාපනකරු"</string> <string name="install" msgid="711829760615509273">"ස්ථාපනය කරන්න"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"මෙම යෙදුම සඳහා යාවත්කාලීන ස්ථාපනය කිරීමට ඔබට අවශ්යද? ඔබගේ පවතින දත්ත නැති වනු ඇත."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"මෙම ඇමිණූ යෙදුමට යාවත්කාලීන ස්ථාපනය කිරීමට ඔබට අවශ්යද? ඔබගේ පවතින දත්ත නැති වනු ඇත."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear මත ස්ථාපන/අස්ථාපනය ක්රියා සහාය දක්වන්නේ නැත."</string> <string name="message_staging" msgid="8032722385658438567">"යෙදුම වේදිකාගත කරමින්..."</string> <string name="app_name_unknown" msgid="6881210203354323926">"නොදනී"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ආරක්ෂාව සඳහා, ඔබගේ ටැබ්ලටය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ආරක්ෂාව සඳහා, ඔබගේ රූපවාහිනිය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ආරක්ෂාව සඳහා, ඔබගේ දුරකථනය මෙම මුලාශ්රයෙන් ලබාගත් නොදන්නා යෙදුම් ස්ථාපනය කිරීමට අවසර නැත."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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">"ඔබගේ TV සහ පුද්ගලික දත්තවලට නොදන්නා යෙදුම් මඟින් තර්ජන එල්ල කිරීමේ හැකියාව වැඩිය. මෙම යෙදුම් ස්ථාපනය කිරීමෙන් සහ භාවිත කිරීමෙන් ඔබ ඔබේ TV සඳහා සිදු වන යම් හානි හෝ එය භාවිත කිරීමේ ප්රතිඵලයක් ලෙස සිදු වන දත්ත හානි සඳහා ඔබ වගකිව යුතු බවට එකඟ වේ."</string> diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index ae914bd53aff..aa02eb483967 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Nástroj na inštaláciu balíkov"</string> <string name="install" msgid="711829760615509273">"Inštalovať"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Hotovo"</string> <string name="cancel" msgid="1018267193425558088">"Zrušiť"</string> <string name="installing" msgid="4921993079741206516">"Inštaluje sa…"</string> <string name="installing_app" msgid="1165095864863849422">"Inštaluje sa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Chcete túto aplikáciu nainštalovať?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Chcete nainštalovať aktualizáciu tejto existujúcej aplikácie? Existujúce údaje sa nestratia."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Chcete nainštalovať aktualizáciu tejto integrovanej aplikácie? Existujúce údaje sa nestratia."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear nepodporuje akciu inštalácie/odinštalovania."</string> <string name="message_staging" msgid="8032722385658438567">"Aplikácia je zavádzaná po etapách…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Neznáma"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Váš tablet nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Váš televízor nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Váš telefón nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Váš telefón a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie telefónu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Váš tablet a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie tabletu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Váš televízor a osobné údaje sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie televízora alebo stratu údajov, ktoré by mohli nastať pri jej používaní."</string> diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml index c123d69c4dd5..add57cf8c5b4 100644 --- a/packages/PackageInstaller/res/values-sl/strings.xml +++ b/packages/PackageInstaller/res/values-sl/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Namest. program za paket"</string> <string name="install" msgid="711829760615509273">"Namesti"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Končano"</string> <string name="cancel" msgid="1018267193425558088">"Prekliči"</string> <string name="installing" msgid="4921993079741206516">"Nameščanje …"</string> <string name="installing_app" msgid="1165095864863849422">"Nameščanje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Ali želite namestiti to aplikacijo?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Ali želite namestiti posodobitev te obstoječe aplikacije? Obstoječi podatki ne bodo izgubljeni."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Ali želite namestiti posodobitev te vgrajene aplikacije? Obstoječi podatki ne bodo izgubljeni."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Dejanja namestitve in odstranitve v sistemu Android Wear niso podprta."</string> <string name="message_staging" msgid="8032722385658438567">"Priprava aplikacije …"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Neznano"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Vaš tablični računalnik zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Vaš televizor zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Vaš telefon zaradi varnosti nima dovoljenja za nameščanje neznanih aplikacij iz tega vira."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Neznane aplikacije lahko resno ogrozijo varnost telefona in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v telefonu, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Neznane aplikacije lahko resno ogrozijo varnost tabličnega računalnika in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v tabličnem računalniku, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Neznane aplikacije lahko resno ogrozijo varnost televizorja in osebnih podatkov. Z namestitvijo te aplikacije se strinjate, da ste sami odgovorni za morebitno škodo, nastalo v televizorju, ali izgubo podatkov, do katerih lahko pride zaradi uporabe te aplikacije."</string> diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml index 0cde28ea2b5b..e5b8c0127983 100644 --- a/packages/PackageInstaller/res/values-sq/strings.xml +++ b/packages/PackageInstaller/res/values-sq/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Instaluesi i paketës"</string> <string name="install" msgid="711829760615509273">"Instalo"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"U krye"</string> <string name="cancel" msgid="1018267193425558088">"Anulo"</string> <string name="installing" msgid="4921993079741206516">"Po instalohet…"</string> <string name="installing_app" msgid="1165095864863849422">"Po instalohet <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Dëshiron ta instalosh këtë aplikacion?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Dëshiron të instalosh një përditësim të këtij aplikacioni ekzistues? Të dhënat e tua ekzistuese nuk do të humbasin."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Dëshiron të instalosh një përditësim të këtij aplikacioni ekzistues? Të dhënat e tua ekzistuese nuk do të humbasin."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Instalo/çinstalo veprimet që nuk mbështeten në Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Po vihet në përdorim aplikacioni..."</string> <string name="app_name_unknown" msgid="6881210203354323926">"I panjohur"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Për sigurinë tënde, tableti yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Për sigurinë tënde, televizori yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Për sigurinë tënde, telefoni yt nuk lejohet të instalojë aplikacione të panjohura nga ky burim."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoni dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj telefonit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tableti dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj tabletit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Televizori dhe të dhënat e tua personale janë më të cenueshme për t\'u sulmuar nga aplikacione të panjohura. Duke instaluar këtë aplikacion, ti pranon se je përgjegjës për çdo dëm ndaj televizorit tënd ose çdo humbje të dhënash që mund të rezultojë nga përdorimi i tij."</string> diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 2746284686e0..14ca7a439f71 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Програм за инстал. пакета"</string> <string name="install" msgid="711829760615509273">"Инсталирај"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Желите ли да инсталирате ову апликацију?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Желите ли да инсталирате ажурирање за ову постојећу апликацију? Постојећи подаци се неће изгубити."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Желите ли да инсталирате ажурирање за ову уграђену апликацију? Постојећи подаци се неће изгубити."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Радње Инсталирај/Деинсталирај нису подржане у Wear-у."</string> <string name="message_staging" msgid="8032722385658438567">"Апликација се припрема…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Непознато"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Таблету из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Телевизору из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Телефону из безбедносних разлога није дозвољено да инсталира непознате апликације из овог извора."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index 28ad6aafd77d..7252651a3b40 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paketinstallationsprogram"</string> <string name="install" msgid="711829760615509273">"Installera"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Klar"</string> <string name="cancel" msgid="1018267193425558088">"Avbryt"</string> <string name="installing" msgid="4921993079741206516">"Installerar …"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeras …"</string> <string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Vill du installera det här programmet?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Vill du installera en uppdatering till den här befintliga appen? Din befintliga data försvinner inte."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Vill du installera en uppdatering av den inbyggda appen? Din befintliga data försvinner inte."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Åtgärder för att installera/avinstallera stöds inte på Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Provkör appen …"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Okänd"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Av säkerhetsskäl får okända appar från den här källan inte installeras av surfplattan."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Av säkerhetsskäl får okända appar från den här källan inte installeras av TV:n."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Av säkerhetsskäl får okända appar från den här källan inte installeras av mobilen."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Din mobil och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på mobilen och för dataförlust som kan uppstå vid användning av denna app."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Din surfplatta och personliga data är mer sårbara för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på surfplattan och för dataförlust som kan uppstå vid användning av denna app."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Din tv och personliga data är mer sårbar för attacker från okända appar. Genom att installera denna app bekräftar du att du är ansvarig för eventuella skador på tv:n och för dataförlust som kan uppstå vid användning av denna app."</string> diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml index 7c1472b54ec8..dd301b02ea60 100644 --- a/packages/PackageInstaller/res/values-sw/strings.xml +++ b/packages/PackageInstaller/res/values-sw/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Kisakinishaji cha kifurushi"</string> <string name="install" msgid="711829760615509273">"Sakinisha"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Nimemaliza"</string> <string name="cancel" msgid="1018267193425558088">"Ghairi"</string> <string name="installing" msgid="4921993079741206516">"Inasakinisha…"</string> <string name="installing_app" msgid="1165095864863849422">"Inasakinisha <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Je, ungependa kusakinisha programu hii?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Je, ungependa kusakinisha sasisho la programu iliyopo? Data yako iliyopo haitapotea."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Je, ungependa kusakinisha sasisho la programu hii iliyopakiwa ndani? Data yako iliyopo haitapotea."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Huduma ya Android Wear haiwezi kutekeleza vitendo vya Kusakinisha au Kuondoa vipengee."</string> <string name="message_staging" msgid="8032722385658438567">"Inatayarisha programu…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Haijulikani"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Kwa sababu ya usalama wako, kompyuta yako kibao haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Kwa sababu ya usalama wako, TV yako haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Kwa sababu ya usalama wako, simu yako haina ruhusa ya kusakinisha programu ambazo hazijulikani, kutoka kwenye chanzo hiki."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Data yako ya binafsi na ya simu yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye simu yako au kupotea kwa data kutokana na matumizi yake."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Data yako ya binafsi na ya kompyuta yako kibao inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye kompyuta yako kibao au kupotea kwa data kutokana na matumizi yake."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Data yako ya binafsi na ya televisheni yako inaweza kuathiriwa na programu ambazo hazijulikani. Kwa kusakinisha programu hii, unakubali kuwajibikia uharibifu wowote kwenye televisheni yako au kupotea kwa data kutokana na matumizi yake."</string> diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml index a1307128b472..f070b45f5190 100644 --- a/packages/PackageInstaller/res/values-ta/strings.xml +++ b/packages/PackageInstaller/res/values-ta/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"தொகுப்பு நிறுவி"</string> <string name="install" msgid="711829760615509273">"நிறுவு"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"இந்த ஆப்ஸை நிறுவ விரும்புகிறீர்களா?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ஏற்கனவே உள்ள ஆப்ஸில் புதுப்பிப்பை நிறுவ விரும்புகிறீர்களா? ஏற்கனவே உள்ள உங்கள் தரவை இழக்கமாட்டீர்கள்."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"உள்ளமைக்கப்பட்ட ஆப்ஸில் புதுப்பிப்பை நிறுவ விரும்புகிறீர்களா? ஏற்கனவே உள்ள உங்கள் தரவை இழக்கமாட்டீர்கள்."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearரில் நிறுவல்கள்/நிறுவல் நீக்கங்கள் செய்ய இயலாது"</string> <string name="message_staging" msgid="8032722385658438567">"ஆப்ஸ் தயாராகிறது…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"அறியப்படாதது"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டேப்லெட்டில் நிறுவ அனுமதியில்லை."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டிவியில் நிறுவ அனுமதியில்லை."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை மொபைலில் நிறுவ அனுமதியில்லை."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index 5cbb268ad7fb..c4b0fc2ac284 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"ప్యాకేజీ ఇన్స్టాలర్"</string> <string name="install" msgid="711829760615509273">"ఇన్స్టాల్ చేయి"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"మీరు ఈ అప్లికేషన్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"మీరు ఇప్పటికే ఉన్న ఈ అప్లికేషన్కు అప్డేట్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా? ఇప్పటికే ఉన్న మీ డేటాను కోల్పోవడం సంభవించదు."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"మీరు ఈ అంతర్నిర్మిత అప్లికేషన్కు అప్డేట్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా? ఇప్పటికే ఉన్న మీ డేటాను కోల్పోవడం సంభవించదు."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearలో ఇన్స్టాల్/అన్ఇన్స్టాల్ చర్యలకు మద్దతు లేదు."</string> <string name="message_staging" msgid="8032722385658438567">"యాప్ను సిద్ధం చేస్తుంది…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"తెలియదు"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టాబ్లెట్ అనుమతించబడదు."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ టీవీ అనుమతించబడదు."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్లను ఇన్స్టాల్ చేయడానికి మీ ఫోన్ అనుమతించబడదు."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml index 9c1f02816a25..1a8e3a90dbdf 100644 --- a/packages/PackageInstaller/res/values-th/strings.xml +++ b/packages/PackageInstaller/res/values-th/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"โปรแกรมติดตั้งแพ็กเกจ"</string> <string name="install" msgid="711829760615509273">"ติดตั้ง"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"ต้องการติดตั้งแอปพลิเคชันนี้ไหม"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"ต้องการติดตั้งการอัปเดตของแอปพลิเคชันที่มีอยู่นี้ไหม ข้อมูลของคุณที่มีอยู่จะไม่สูญหาย"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ต้องการติดตั้งการอัปเดตของแอปพลิเคชันที่มีอยู่ในตัวนี้ไหม ข้อมูลของคุณที่มีอยู่จะไม่สูญหาย"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ติดตั้ง/ถอนการติดตั้งใน Wear ไม่ได้"</string> <string name="message_staging" msgid="8032722385658438567">"กำลังปรับสภาพแวดล้อมของแอป…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"ไม่ทราบ"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในแท็บเล็ต"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในทีวี"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"เพื่อความปลอดภัย ไม่อนุญาตให้ติดตั้งแอปที่ไม่รู้จักจากแหล่งที่มานี้ในโทรศัพท์"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml index 9fcc064ddacc..22a565efdc68 100644 --- a/packages/PackageInstaller/res/values-tl/strings.xml +++ b/packages/PackageInstaller/res/values-tl/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Installer ng package"</string> <string name="install" msgid="711829760615509273">"I-install"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Tapos na"</string> <string name="cancel" msgid="1018267193425558088">"Kanselahin"</string> <string name="installing" msgid="4921993079741206516">"Nag-i-install…"</string> <string name="installing_app" msgid="1165095864863849422">"Ini-install ang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Gusto mo bang i-install ang application na ito?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Gusto mo bang mag-install ng update sa dati nang application na ito? Hindi mawawala ang iyong dati nang data."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Gusto mo bang mag-install ng update sa built-in na application na ito? Hindi mawawala ang iyong dati nang data."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Ang mga pagkilos na I-install/I-uninstall ay hindi sinusuportahan sa Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Inihahanda ang app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Hindi Kilala"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sa iyong seguridad, hindi pinapayagan ang iyong tablet na mag-install ng mga hindi kilalang app mula sa source na ito."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sa iyong seguridad, hindi pinapayagan ang iyong TV na mag-install ng mga hindi kilalang app mula sa source na ito."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sa iyong seguridad, hindi pinapayagan ang iyong telepono na mag-install ng mga hindi kilalang app mula sa source na ito."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Mas nanganganib ang iyong telepono at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong telepono o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Mas nanganganib ang iyong tablet at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong tablet o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Mas nanganganib ang iyong TV at personal na data sa mga pag-atake mula sa mga hindi kilalang app. Sa pamamagitan ng pag-install ng app na ito, sumasang-ayon kang ikaw ang responsable sa anumang pinsala sa iyong TV o pagkawala ng data na maaaring magresulta mula sa paggamit nito."</string> diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml index c6e2d441e7ca..2bda646a00cc 100644 --- a/packages/PackageInstaller/res/values-tr/strings.xml +++ b/packages/PackageInstaller/res/values-tr/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paket yükleyici"</string> <string name="install" msgid="711829760615509273">"Yükle"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Bitti"</string> <string name="cancel" msgid="1018267193425558088">"İptal"</string> <string name="installing" msgid="4921993079741206516">"Yükleniyor…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> yükleniyor…"</string> <string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Bu uygulamayı yüklemek istiyor musunuz?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu mevcut uygulamaya ait güncellemeyi yüklemek istiyor musunuz? Mevcut verileriniz silinmez."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu yerleşik uygulamaya ait güncellemeyi yüklemek istiyor musunuz? Mevcut verileriniz silinmez."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Yükleme/Yüklemeyi kaldırma işlemleri Wear\'da desteklenmiyor."</string> <string name="message_staging" msgid="8032722385658438567">"Uygulama hazırlanıyor…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Bilinmiyor"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Güvenlik nedeniyle tabletinizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Güvenlik nedeniyle TV\'nizin bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Güvenlik nedeniyle telefonunuzun bu kaynaktan bilinmeyen uygulamalar yüklemesine izin verilmez."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonunuz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı telefonunuzda oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletiniz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı tabletinizde oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV\'niz ve kişisel verileriniz, bilinmeyen uygulamaların saldırılarına karşı daha savunmasızdır. Bu uygulamayı yükleyerek, uygulama kullanımından dolayı TV\'nizde oluşabilecek hasarın veya uğrayabileceğiniz veri kaybının sorumluluğunu kabul etmiş olursunuz."</string> diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml index 4c49bf4c1433..13fbf0ff1402 100644 --- a/packages/PackageInstaller/res/values-uk/strings.xml +++ b/packages/PackageInstaller/res/values-uk/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Програма встановлення пакета"</string> <string name="install" msgid="711829760615509273">"Установити"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"Програму встановлено."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Установити цю програму?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Установити оновлення для цього додатка? Наявні дані не буде втрачено."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Установити оновлення для цього вбудованого додатка? Наявні дані не буде втрачено."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Встановлення й видалення не підтримуються на пристроях Android Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Підготовка додатка…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Невідомо"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"З міркувань безпеки на вашому планшеті заборонено встановлювати невідомі додатки з цього джерела."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"З міркувань безпеки на вашому телевізорі заборонено встановлювати невідомі додатки з цього джерела."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"З міркувань безпеки на вашому телефоні заборонено встановлювати невідомі додатки з цього джерела."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml index d8f2c5086bb8..e122f3e29647 100644 --- a/packages/PackageInstaller/res/values-ur/strings.xml +++ b/packages/PackageInstaller/res/values-ur/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"پیکیج انسٹالر"</string> <string name="install" msgid="711829760615509273">"انسٹال کریں"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"کیا آپ یہ ایپلیکیشن انسٹال کرنا چاہتے ہیں؟"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"کیا آپ اس موجودہ ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"کیا آپ پہلے سے شامل اس ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"\'انسٹال/اَن انسٹال کی کارروائیاں\' Wear پر تعاون یافتہ نہیں ہیں۔"</string> <string name="message_staging" msgid="8032722385658438567">"ایپ کی ٹیسٹنگ ہو رہی ہے…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"نامعلوم"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"آپ کی سیکیورٹی کے مدنظر، آپ کے ٹیبلیٹ کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"آپ کی سیکیورٹی کے مدنظر، آپ کے TV کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"آپ کی سیکیورٹی کے مدنظر، آپ کے فون کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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">"آپ کے TV اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے TV کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string> diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml index 0c1871fae9d9..e862e7d6e7b2 100644 --- a/packages/PackageInstaller/res/values-uz/strings.xml +++ b/packages/PackageInstaller/res/values-uz/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Paket o‘rnatish vositasi"</string> <string name="install" msgid="711829760615509273">"O‘rnatish"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"OK"</string> <string name="cancel" msgid="1018267193425558088">"Bekor qilish"</string> <string name="installing" msgid="4921993079741206516">"O‘rnatilmoqda…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> o‘rnatilmoqda…"</string> <string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Bu ilovani o‘rnatmoqchimisiz?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Bu ilova uchun yangilanish o‘rnatilsinmi? Mavjud axborotlaringiz o‘chib ketmaydi."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bu ichki ilova uchun yangilanish o‘rnatilsinmi? Mavjud axborotlaringiz o‘chib ketmaydi."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear qurilmasi o‘rnatish/o‘chirish amallarini qo‘llab-quvvatlamaydi."</string> <string name="message_staging" msgid="8032722385658438567">"Kutib turing…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Noaniq"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Xavfsizlik yuzasidan, planshetingizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Xavfsizlik yuzasidan, televizoringizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Xavfsizlik yuzasidan, telefoningizga bu manbadan notanish ilovalarni o‘rnatishga ruxsat berilmagan."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefoningiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan telefoningizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Planshetingiz va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan planshetingizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV va shaxsiy axborotlaringiz notanish ilovalar hujumiga zaif bo‘ladi. Bu ilovani o‘rnatish bilan televizoringizga yetkaziladigan shikast va axborotlaringizni o‘chirib yuborilishiga javobgarlikni o‘z zimmangizga olasiz."</string> diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml index a1d6f8923038..13ddac5144c7 100644 --- a/packages/PackageInstaller/res/values-vi/strings.xml +++ b/packages/PackageInstaller/res/values-vi/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Trình cài đặt gói"</string> <string name="install" msgid="711829760615509273">"Cài đặt"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Xong"</string> <string name="cancel" msgid="1018267193425558088">"Hủy"</string> <string name="installing" msgid="4921993079741206516">"Đang cài đặt…"</string> <string name="installing_app" msgid="1165095864863849422">"Đang cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Bạn có muốn cài đặt ứng dụng này không?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Bạn có muốn cài đặt bản cập nhật cho ứng dụng hiện có này không? Dữ liệu hiện có của bạn sẽ không bị mất."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Bạn có muốn cài đặt bản cập nhật cho ứng dụng cài sẵn này không? Dữ liệu hiện có của bạn sẽ không bị mất."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Không hỗ trợ thao tác Cài đặt/Gỡ cài đặt trên ứng dụng Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Đang thử nghiệm ứng dụng…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Không xác định"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Để bảo mật, máy tính bảng của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Để bảo mật, TV của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Để bảo mật, điện thoại của bạn không được phép cài đặt các ứng dụng không xác định từ nguồn này."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Điện thoại và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với điện thoại của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Máy tính bảng và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với máy tính bảng của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"TV và dữ liệu cá nhân của bạn dễ bị các ứng dụng không xác định tấn công hơn. Bằng cách cài đặt ứng dụng này, bạn đồng ý tự chịu trách nhiệm cho mọi hỏng hóc đối với TV của mình hoặc mất mát dữ liệu có thể phát sinh do sử dụng ứng dụng này."</string> diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml index 6110938fb600..49e0b863f678 100644 --- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"软件包安装程序"</string> <string name="install" msgid="711829760615509273">"安装"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"已安装应用。"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"要安装此应用吗?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"要为此应用安装更新吗?您现有的数据将不会丢失。"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"要为此内置应用安装更新吗?您现有的数据将不会丢失。"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支持安装/卸载操作。"</string> <string name="message_staging" msgid="8032722385658438567">"正在准备安装应用…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"未知"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"出于安全考虑,已禁止您的平板电脑安装来自此来源的未知应用。"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"出于安全考虑,已禁止您的电视安装来自此来源的未知应用。"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"出于安全考虑,已禁止您的手机安装来自此来源的未知应用。"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml index 128f3714c1e4..7c1cc52fa95a 100644 --- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string> <string name="install" msgid="711829760615509273">"安裝"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"要安裝此應用程式嗎?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"您要為這個現有的應用程式安裝更新嗎?您不會遺失現有的資料。"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"您要為這個內置的應用程式安裝更新嗎?您不會遺失現有的資料。"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝/解除安裝操作。"</string> <string name="message_staging" msgid="8032722385658438567">"正在準備安裝應用程式…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"不明"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"為安全起見,您的平板電腦不得安裝此來源的不明應用程式。"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"為安全起見,您的電視不得安裝此來源的不明應用程式。"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"為安全起見,您的手機不得安裝此來源的不明應用程式。"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml index 507b5d4ad69f..9c089ddec1f8 100644 --- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"套件安裝程式"</string> <string name="install" msgid="711829760615509273">"安裝"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <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="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> - <string name="install_confirm_question" msgid="8176284075816604590">"要安裝這個應用程式嗎?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"要為這個現有的應用程式安裝更新嗎?你不會遺失現有的資料。"</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"要為這個內建的應用程式安裝更新嗎?你不會遺失現有的資料。"</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wear 不支援安裝及解除安裝操作。"</string> <string name="message_staging" msgid="8032722385658438567">"正在準備應用程式安裝程序…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"不明"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"為了安全起見,你的平板電腦禁止安裝這個來源提供的不明應用程式。"</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"為了安全起見,你的電視禁止安裝這個來源提供的不明應用程式。"</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"為了安全起見,你的手機禁止安裝這個來源提供的不明應用程式。"</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <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/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml index bdcb7e16765c..6f911bf49c9a 100644 --- a/packages/PackageInstaller/res/values-zu/strings.xml +++ b/packages/PackageInstaller/res/values-zu/strings.xml @@ -18,14 +18,17 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Isifaki sephakheji"</string> <string name="install" msgid="711829760615509273">"Faka"</string> + <!-- no translation found for update (3932142540719227615) --> + <skip /> <string name="done" msgid="6632441120016885253">"Kwenziwe"</string> <string name="cancel" msgid="1018267193425558088">"Khansela"</string> <string name="installing" msgid="4921993079741206516">"Iyafaka..."</string> <string name="installing_app" msgid="1165095864863849422">"Ifaka i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Ingabe ufuna ukufaka lolu hlelo lokusebenza?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Ingabe ufuna ukufaka lesi sibuyekezo kulolu hlelo lokusebenza olukhona? Idatha yakho ekhona ngeke ize ilahleke."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Uyafuna ukufaka isibuyekezo kulolu hlelo lokusebenza olwakhelwe ngaphakathi? Idatha yakho ekhona ngeke ize ilahleke."</string> + <!-- no translation found for install_confirm_question (7663733664476363311) --> + <skip /> + <!-- no translation found for install_confirm_question_update (3348888852318388584) --> + <skip /> <string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string> @@ -80,9 +83,12 @@ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Izenzo zokufaka/ukukhipha azisekelwe ku-Wear."</string> <string name="message_staging" msgid="8032722385658438567">"Ifaka kusiteji uhlelo lokusebenza…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Akwaziwa"</string> - <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Ukuze uvikelwe, ithebulethi yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza ezingaziwa kusukela kulo mthombo."</string> - <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Ukuze uvikelwe, i-TV yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza ezingaziwa kusukela kulo mthombo."</string> - <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Ukuze uvikelwe, ifoni yakho ayivunyelwe ukuthi ifake izinhlelo zokusebenza kusukela kulo mthombo."</string> + <!-- no translation found for untrusted_external_source_warning (7067510047443133095) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (7057271609532508035) --> + <skip /> + <!-- no translation found for untrusted_external_source_warning (8444191224459138919) --> + <skip /> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Idatha yakho yefoni neyohlelo lwakho lokusebenza isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kufoni yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Ithebulethi yakho nedatha yomuntu siqu zisengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala kuthebulethi yakho noma ukulahleka kwedatha okungabangelwa ukusetshenziswa kwayo."</string> <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Idatha yakho ye-TV neyomuntu siqu isengcupheni kakhulu ekuhlaselweni izinhlelo zokusebenza ezingaziwa. Ngokufaka lolu hlelo lokusebenza, uyavuma ukuthi unesibopho sanoma ikuphi ukonakala ku-TV yakho noma ukulahlekelwa kwedatha okungabangelwa ukusetshenziswa kwayo."</string> diff --git a/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml index 0c942bdf993c..413a3873f438 100644 --- a/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml +++ b/packages/SettingsLib/res/drawable/ic_3g_mobiledata.xml @@ -14,17 +14,14 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="12.35dp" - android:height="15dp" - android:viewportWidth="14" - android:viewportHeight="17"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M1.9,7.88h0.77c0.5,0,0.88-0.15,1.15-0.46s0.4-0.72,0.4-1.25c0-1.17-0.45-1.75-1.35-1.75c-0.43,0-0.77,0.16-1.02,0.47 S1.49,5.62,1.49,6.13h-1.2c0-0.8,0.24-1.46,0.73-1.97s1.11-0.78,1.86-0.78c0.78,0,1.41,0.25,1.87,0.73S5.43,5.31,5.43,6.2 c0,0.46-0.12,0.89-0.36,1.29S4.52,8.18,4.14,8.37c0.94,0.35,1.41,1.12,1.41,2.33c0,0.89-0.25,1.6-0.74,2.12 c-0.49,0.53-1.14,0.79-1.94,0.79c-0.79,0-1.43-0.25-1.91-0.75c-0.49-0.5-0.73-1.17-0.73-2.01h1.21c0,0.53,0.13,0.95,0.38,1.26 c0.26,0.31,0.6,0.47,1.05,0.47c0.45,0,0.81-0.15,1.08-0.46s0.4-0.77,0.4-1.39c0-1.21-0.57-1.81-1.72-1.81H1.9V7.88z" /> + android:width="21dp" + android:height="16dp" + android:viewportWidth="21.0" + android:viewportHeight="16.0"> <path - android:fillColor="#FFFFFFFF" - android:pathData="M13.77,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 C12.47,5.82,12.3,5.33,12,4.98s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.59,6.37,8.58,7.4v2.03c0,1,0.19,1.77,0.57,2.31 c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59H10.7V8.52h3.07V12.24z" /> + android:fillColor="#FF000000" + android:pathData="M5.29,13.22c-0.57,0 -1.09,-0.11 -1.57,-0.34c-0.47,-0.22 -0.85,-0.54 -1.16,-0.95C2.25,11.52 2.07,11.01 2,10.42l1.47,-0.34c0.07,0.51 0.27,0.92 0.59,1.23c0.32,0.31 0.73,0.46 1.23,0.46c0.52,0 0.94,-0.15 1.26,-0.46c0.33,-0.31 0.49,-0.71 0.49,-1.22c0,-0.51 -0.18,-0.92 -0.53,-1.22c-0.35,-0.31 -0.8,-0.46 -1.36,-0.46H4.37V7.06h0.73c0.47,0 0.86,-0.13 1.18,-0.38c0.32,-0.26 0.48,-0.63 0.48,-1.11c0,-0.42 -0.14,-0.77 -0.41,-1.04C6.08,4.27 5.7,4.14 5.21,4.14c-0.43,0 -0.79,0.13 -1.08,0.38C3.85,4.76 3.67,5.08 3.6,5.48L2.17,5.3C2.23,4.81 2.4,4.38 2.67,4c0.27,-0.38 0.62,-0.69 1.05,-0.91c0.44,-0.22 0.94,-0.34 1.5,-0.34c0.62,0 1.15,0.12 1.6,0.35c0.45,0.23 0.79,0.55 1.04,0.95C8.1,4.46 8.23,4.9 8.23,5.4C8.23,6 8.1,6.48 7.84,6.81C7.58,7.14 7.29,7.4 6.97,7.6v0.08c0.46,0.2 0.84,0.5 1.13,0.91c0.3,0.4 0.45,0.93 0.45,1.58c0,0.58 -0.14,1.1 -0.42,1.55c-0.27,0.46 -0.65,0.82 -1.15,1.09C6.5,13.09 5.93,13.22 5.29,13.22z"/> <path - android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" /> + android:fillColor="#FF000000" + android:pathData="M14.44,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83c-0.38,-0.79 -0.57,-1.71 -0.57,-2.76c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11L17.3,6.01c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6h-1.41v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.78,13.07 15.17,13.22 14.44,13.22z"/> </vector> diff --git a/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml index 535f3589ea6b..1de7d78ff5f2 100644 --- a/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml +++ b/packages/SettingsLib/res/drawable/ic_4g_mobiledata.xml @@ -14,17 +14,14 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="12.35dp" - android:height="15dp" - android:viewportWidth="14" - android:viewportHeight="17"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M5.07,10.13h1.11v1.03H5.07v2.31H3.86v-2.31H0.1v-0.75l3.7-6.9h1.27V10.13z M1.44,10.13h2.42V5.4L1.44,10.13z" /> + android:width="22dp" + android:height="16dp" + android:viewportWidth="22.0" + android:viewportHeight="16.0"> <path - android:fillColor="#FFFFFFFF" - android:pathData="M13.9,12.24l-0.22,0.27c-0.63,0.73-1.55,1.1-2.76,1.1c-1.08,0-1.92-0.36-2.53-1.07c-0.61-0.71-0.93-1.72-0.94-3.02V7.56 c0-1.39,0.28-2.44,0.84-3.13s1.39-1.04,2.51-1.04c0.95,0,1.69,0.26,2.23,0.79s0.83,1.28,0.89,2.26h-1.25 c-0.05-0.62-0.22-1.1-0.52-1.45s-0.74-0.52-1.34-0.52c-0.72,0-1.24,0.23-1.57,0.7S8.72,6.37,8.71,7.4v2.03 c0,1,0.19,1.77,0.57,2.31c0.38,0.54,0.93,0.8,1.65,0.8c0.67,0,1.19-0.16,1.54-0.49l0.18-0.17V9.59h-1.82V8.52h3.07V12.24z" /> + android:fillColor="#FF000000" + android:pathData="M2,10.98V9.81l4.28,-6.83h1.6v6.59h1.19v1.41H7.88V13H6.4v-2.02H2zM3.68,9.57H6.4V5.33H6.31L3.68,9.57z"/> <path - android:pathData="M 0 0 H 14 V 17 H 0 V 0 Z" /> + android:fillColor="#FF000000" + android:pathData="M15,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83c-0.38,-0.79 -0.57,-1.71 -0.57,-2.76c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27c-0.28,0.56 -0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6h-1.41v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C16.34,13.07 15.73,13.22 15,13.22z"/> </vector> diff --git a/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml index 2aa6e57f6f82..d961c6c2266f 100644 --- a/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml +++ b/packages/SettingsLib/res/drawable/ic_5g_mobiledata.xml @@ -14,14 +14,14 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="14dp" - android:height="17dp" - android:viewportWidth="14" - android:viewportHeight="17"> - <path - android:fillColor="#FF000000" - android:pathData="M13.9,12.24l-0.22,0.27c-0.63,0.73 -1.55,1.1 -2.76,1.1c-1.08,0 -1.92,-0.36 -2.53,-1.07s-0.93,-1.72 -0.94,-3.02V7.56c0,-1.39 0.28,-2.44 0.84,-3.13s1.39,-1.04 2.51,-1.04c0.95,0 1.69,0.26 2.23,0.79s0.83,1.28 0.89,2.26h-1.25c-0.05,-0.62 -0.22,-1.1 -0.52,-1.45s-0.74,-0.52 -1.34,-0.52c-0.72,0 -1.24,0.23 -1.57,0.7S8.72,6.37 8.71,7.4v2.03c0,1 0.19,1.77 0.57,2.31c0.38,0.54 0.93,0.8 1.65,0.8c0.67,0 1.19,-0.16 1.54,-0.49l0.18,-0.17V9.59h-1.82V8.52h3.07V12.24z"/> - <path - android:fillColor="#FF000000" - android:pathData="M1.15,8.47l0.43,-4.96h4.33v1.17H2.6L2.37,7.39C2.78,7.1 3.22,6.96 3.69,6.96c0.77,0 1.38,0.3 1.83,0.9s0.66,1.41 0.66,2.43c0,1.03 -0.24,1.84 -0.72,2.43S4.32,13.6 3.48,13.6c-0.75,0 -1.36,-0.24 -1.83,-0.73s-0.74,-1.16 -0.81,-2.02h1.13c0.07,0.57 0.23,1 0.49,1.29c0.26,0.29 0.59,0.43 1.01,0.43c0.47,0 0.84,-0.2 1.1,-0.61c0.26,-0.41 0.4,-0.96 0.4,-1.65c0,-0.65 -0.14,-1.18 -0.43,-1.59S3.88,8.09 3.4,8.09c-0.4,0 -0.72,0.1 -0.96,0.31L2.11,8.73L1.15,8.47z"/> + android:width="21dp" + android:height="16dp" + android:viewportWidth="21.0" + android:viewportHeight="16.0"> + <path + android:fillColor="#FF000000" + android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/> + <path + android:fillColor="#FF000000" + android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/> </vector> diff --git a/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml new file mode 100644 index 000000000000..93fcad298c3f --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_5g_uc_mobiledata.xml @@ -0,0 +1,33 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="27dp" + android:height="16dp" + android:viewportWidth="27.0" + android:viewportHeight="16.0"> + <path + android:fillColor="#FF000000" + android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/> + <path + android:fillColor="#FF000000" + android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/> + <path + android:fillColor="#FF000000" + android:pathData="M23,7.39c-0.53,0 -0.94,-0.16 -1.25,-0.47C21.45,6.6 21.3,6.16 21.3,5.6V3h0.8v2.66c0,0.3 0.08,0.54 0.23,0.71C22.48,6.54 22.7,6.62 23,6.62c0.3,0 0.52,-0.08 0.67,-0.25c0.15,-0.17 0.23,-0.41 0.23,-0.71V3h0.8v2.6c0,0.36 -0.07,0.67 -0.2,0.94s-0.33,0.48 -0.58,0.62C23.65,7.32 23.35,7.39 23,7.39z"/> + <path + android:fillColor="#FF000000" + android:pathData="M22.99,13.1c-0.39,0 -0.73,-0.09 -1.03,-0.28c-0.3,-0.19 -0.53,-0.45 -0.7,-0.79C21.08,11.7 21,11.3 21,10.85c0,-0.46 0.08,-0.85 0.25,-1.19c0.17,-0.34 0.41,-0.6 0.71,-0.78c0.3,-0.18 0.65,-0.28 1.04,-0.28c0.31,0 0.59,0.05 0.86,0.16c0.26,0.11 0.48,0.27 0.65,0.48c0.18,0.21 0.28,0.48 0.32,0.8l-0.83,0.14c-0.06,-0.26 -0.17,-0.46 -0.35,-0.6C23.49,9.44 23.27,9.37 23,9.37c-0.22,0 -0.42,0.06 -0.61,0.17c-0.18,0.11 -0.32,0.28 -0.43,0.5c-0.1,0.22 -0.16,0.49 -0.16,0.81c0,0.32 0.05,0.58 0.16,0.8s0.25,0.39 0.43,0.5c0.18,0.11 0.38,0.17 0.61,0.17c0.26,0 0.47,-0.07 0.65,-0.21c0.18,-0.14 0.3,-0.34 0.35,-0.59l0.85,0.09c-0.06,0.29 -0.17,0.54 -0.32,0.77c-0.15,0.22 -0.36,0.39 -0.61,0.52C23.66,13.03 23.35,13.1 22.99,13.1z"/> +</vector> diff --git a/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml new file mode 100644 index 000000000000..ca47b6ff2edb --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_5g_uw_mobiledata.xml @@ -0,0 +1,33 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="27dp" + android:height="16dp" + android:viewportWidth="27.0" + android:viewportHeight="16.0"> + <path + android:fillColor="#FF000000" + android:pathData="M5.3,13.22c-0.57,0 -1.1,-0.11 -1.58,-0.34c-0.48,-0.22 -0.87,-0.55 -1.18,-0.98C2.24,11.47 2.06,10.93 2,10.3l1.48,-0.2c0.07,0.5 0.25,0.92 0.56,1.25c0.32,0.32 0.74,0.48 1.26,0.48c0.57,0 1.02,-0.18 1.34,-0.55c0.33,-0.37 0.49,-0.87 0.49,-1.48c0,-0.61 -0.16,-1.09 -0.49,-1.46C6.32,7.96 5.88,7.78 5.32,7.78C5,7.78 4.7,7.85 4.42,8C4.15,8.14 3.93,8.33 3.76,8.56L2.28,7.92l0.6,-4.94h5.26v1.36H4.1L3.72,7.02l0.08,0.03C4,6.87 4.25,6.73 4.55,6.62c0.3,-0.12 0.63,-0.18 1.01,-0.18c0.6,0 1.13,0.14 1.6,0.41C7.62,7.11 7.98,7.5 8.24,8c0.27,0.5 0.41,1.1 0.41,1.79c0,0.66 -0.14,1.26 -0.43,1.78c-0.28,0.51 -0.67,0.92 -1.18,1.22C6.55,13.08 5.97,13.22 5.3,13.22z"/> + <path + android:fillColor="#FF000000" + android:pathData="M14.51,13.22c-0.88,0 -1.66,-0.21 -2.34,-0.64c-0.67,-0.44 -1.2,-1.05 -1.6,-1.83C10.19,9.95 10,9.03 10,7.99c0,-1.05 0.21,-1.96 0.62,-2.74c0.41,-0.79 0.97,-1.4 1.67,-1.83c0.7,-0.44 1.5,-0.66 2.39,-0.66c1.09,0 2.01,0.25 2.74,0.76c0.75,0.5 1.22,1.21 1.41,2.11l-1.47,0.39c-0.17,-0.56 -0.48,-1 -0.94,-1.32c-0.45,-0.33 -1.03,-0.49 -1.75,-0.49c-0.57,0 -1.09,0.14 -1.57,0.43c-0.48,0.29 -0.85,0.71 -1.13,1.27s-0.42,1.25 -0.42,2.07c0,0.81 0.14,1.5 0.41,2.07c0.28,0.56 0.65,0.98 1.11,1.27c0.47,0.29 0.98,0.43 1.54,0.43c0.57,0 1.06,-0.11 1.47,-0.34c0.42,-0.23 0.75,-0.55 0.99,-0.94c0.25,-0.4 0.41,-0.85 0.46,-1.36h-2.88V7.79h4.37c0,0.87 0,1.74 0,2.6c0,0.87 0,1.74 0,2.6H17.6v-1.4h-0.08c-0.28,0.49 -0.67,0.88 -1.18,1.18C15.85,13.07 15.24,13.22 14.51,13.22z"/> + <path + android:fillColor="#FF000000" + android:pathData="M23,7.39c-0.53,0 -0.94,-0.16 -1.25,-0.47C21.45,6.6 21.3,6.16 21.3,5.6V3h0.8v2.66c0,0.3 0.08,0.54 0.23,0.71C22.48,6.54 22.7,6.62 23,6.62c0.3,0 0.52,-0.08 0.67,-0.25c0.15,-0.17 0.23,-0.41 0.23,-0.71V3h0.8v2.6c0,0.36 -0.07,0.67 -0.2,0.94s-0.33,0.48 -0.58,0.62C23.65,7.32 23.35,7.39 23,7.39z"/> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,13L20.3,8.7h0.73l0.64,2.78l0.07,0.38h0.04l0.09,-0.38l0.81,-2.78h0.66l0.79,2.78l0.09,0.37h0.04l0.07,-0.37l0.65,-2.78h0.72L24.59,13H23.9l-0.78,-2.84l-0.1,-0.41h-0.04l-0.1,0.41L22.08,13H21.41z"/> +</vector> diff --git a/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml b/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml index ed9d85e3cbe4..22bcf7b8c8a3 100644 --- a/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml +++ b/packages/SettingsLib/res/drawable/ic_carrier_wifi.xml @@ -14,17 +14,14 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="38dp" - android:height="24dp" - android:viewportWidth="38.0" - android:viewportHeight="24.0"> + android:width="24dp" + android:height="16dp" + android:viewportWidth="24.0" + android:viewportHeight="16.0"> <path android:fillColor="#FF000000" - android:pathData="M9.45,14.48h1.8c-0.05,0.98 -0.24,1.82 -0.6,2.53c-0.35,0.7 -0.85,1.24 -1.51,1.62c-0.66,0.38 -1.48,0.57 -2.47,0.57c-0.71,0 -1.35,-0.14 -1.92,-0.42c-0.57,-0.28 -1.06,-0.68 -1.47,-1.2c-0.4,-0.53 -0.71,-1.16 -0.93,-1.89c-0.21,-0.74 -0.32,-1.56 -0.32,-2.48v-2.63c0,-0.91 0.11,-1.74 0.32,-2.47c0.22,-0.74 0.54,-1.36 0.95,-1.88C3.71,5.69 4.21,5.29 4.8,5.01c0.6,-0.28 1.28,-0.42 2.03,-0.42c0.92,0 1.71,0.19 2.34,0.56c0.64,0.36 1.14,0.9 1.48,1.61c0.35,0.7 0.55,1.57 0.59,2.59h-1.8C9.41,8.59 9.29,7.98 9.1,7.52C8.91,7.04 8.63,6.69 8.26,6.47C7.9,6.24 7.42,6.13 6.84,6.13c-0.52,0 -0.97,0.1 -1.36,0.31C5.1,6.65 4.79,6.95 4.54,7.34C4.3,7.72 4.12,8.19 3.99,8.74c-0.12,0.54 -0.18,1.15 -0.18,1.82v2.65c0,0.62 0.05,1.21 0.15,1.75c0.1,0.54 0.27,1.02 0.49,1.43c0.23,0.4 0.52,0.72 0.89,0.95c0.36,0.23 0.81,0.34 1.33,0.34c0.66,0 1.18,-0.11 1.56,-0.32c0.38,-0.21 0.67,-0.56 0.85,-1.03C9.27,15.85 9.39,15.23 9.45,14.48z"/> + android:pathData="M4.59,13L2,2.98h1.69l1.5,6.48l0.17,0.88h0.08l0.21,-0.88l1.89,-6.48h1.54l1.83,6.48l0.21,0.87h0.08l0.15,-0.87l1.51,-6.48h1.68L12.01,13H10.4L8.58,6.36L8.36,5.4H8.27L8.05,6.36L6.16,13H4.59z"/> <path android:fillColor="#FF000000" - android:pathData="M24.87,4.78l-1.74,9.72l-0.2,1.64l-0.29,-1.44l-2.21,-9.92l-0.2,0l-1.06,0l-0.22,0l-2.28,9.92l-0.28,1.4l-0.18,-1.59l-1.78,-9.73l-1.79,0l2.83,14.22l0.34,0l0.92,0l0.35,0l2.48,-10.36l0.14,-0.84l0.15,0.84l2.36,10.36l0.36,0l0.92,0l0.34,0l2.82,-14.22z"/> - <path - android:fillColor="#FF000000" - android:pathData="M35.72,6.32l0,-1.54l-5.61,0l-0.34,0l-1.45,0l0,14.22l1.79,0l0,-6.28l4.8,0l0,-1.54l-4.8,0l0,-4.86z"/> + android:pathData="M15.77,9.85V8.56h2.46V6.1h1.3v2.46H22v1.29h-2.46v2.46h-1.3V9.85H15.77z"/> </vector> diff --git a/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml b/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml index e6b4fb698242..739e29d886c2 100644 --- a/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml +++ b/packages/SettingsLib/res/drawable/ic_lte_mobiledata.xml @@ -14,20 +14,17 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="15.88dp" - android:height="15dp" - android:viewportWidth="18" - android:viewportHeight="17"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M1.34,12.4h3.9v1.07H0.08V3.52h1.26V12.4z" /> + android:width="26dp" + android:height="16dp" + android:viewportWidth="26.0" + android:viewportHeight="16.0"> <path - android:fillColor="#FFFFFFFF" - android:pathData="M11.1,4.6H8.48v8.88H7.23V4.6H4.62V3.52h6.48V4.6z" /> + android:fillColor="#FF000000" + android:pathData="M2,13V2.98h1.53v8.57H8.3V13H2z"/> <path - android:fillColor="#FFFFFFFF" - android:pathData="M17.34,8.88h-3.52v3.53h4.1v1.07h-5.35V3.52h5.28V4.6h-4.03V7.8h3.52V8.88z" /> + android:fillColor="#FF000000" + android:pathData="M11.24,13V4.43H8.19V2.98h7.63v1.46h-3.05V13H11.24z"/> <path - android:pathData="M 0 0 H 18 V 17 H 0 V 0 Z" /> + android:fillColor="#FF000000" + android:pathData="M17.41,13V2.98h6.36v1.46h-4.83v2.65h4.4v1.46h-4.4v3.01h4.83V13H17.41z"/> </vector> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java index 41ccb16f0374..8f7006e7dc83 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java @@ -26,7 +26,6 @@ import android.net.NetworkKey; import android.net.NetworkRequest; import android.net.NetworkScoreManager; import android.net.ScoredNetwork; -import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; @@ -81,6 +80,9 @@ public class WifiStatusTracker { @Override public void onCapabilitiesChanged( Network network, NetworkCapabilities networkCapabilities) { + if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) { + return; + } if (!mNetworks.contains(network.getNetId())) { // New network boolean isVcnOverWifi = @@ -115,6 +117,9 @@ public class WifiStatusTracker { @Override public void onLost(Network network) { + if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) { + return; + } String log = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") .append("onLost: ") @@ -346,14 +351,6 @@ public class WifiStatusTracker { if (ssid != null && !WifiManager.UNKNOWN_SSID.equals(ssid)) { return ssid; } - // OK, it's not in the connectionInfo; we have to go hunting for it - List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks(); - int length = networks.size(); - for (int i = 0; i < length; i++) { - if (networks.get(i).networkId == info.getNetworkId()) { - return networks.get(i).SSID; - } - } return null; } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 6cf2bb683517..b6b5ae5b6ce4 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -458,6 +458,9 @@ <!-- Permission required for CTS test - SystemMediaRouter2Test --> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> + <!-- Permission required for CTS test - CtsRotationResolverServiceDeviceTestCases --> + <uses-permission android:name="android.permission.MANAGE_ROTATION_RESOLVER" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 9f6ef962330e..c9bd370cd49c 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -762,6 +762,17 @@ android:visibleToInstantApps="true"> </activity> + <activity android:name=".wallet.ui.WalletActivity" + android:label="@string/wallet_title" + android:theme="@style/Wallet.Theme" + android:excludeFromRecents="true" + android:showWhenLocked="true" + android:showForAllUsers="true" + android:launchMode="singleInstance" + android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden" + android:visibleToInstantApps="true"> + </activity> + <receiver android:name=".controls.management.ControlsRequestReceiver" android:exported="true"> <intent-filter> diff --git a/packages/SystemUI/docs/falsing.md b/packages/SystemUI/docs/falsing.md index e224ca80616a..09215ac813b5 100644 --- a/packages/SystemUI/docs/falsing.md +++ b/packages/SystemUI/docs/falsing.md @@ -143,10 +143,10 @@ are ready to act on the owner's action, and then query the `FalsingManager`. The will update its belief in pocket dialing based only on the last call made, so multiple calls per gesture are not well defined. -The `FalsingManager` does not update its belief in pocket-dialing until a new -gesture starts. That is to say, if the owner makes a bad tap on your feature, -the belief in pocket dialing will not incorporate this new data until the -following gesture begins. +The `FalsingManager` does not update its belief in pocket-dialing until after a gesture completes. +That is to say, if the owner makes a bad tap on your feature, the "belief" in pocket dialing will +not incorporate this new data after processing on the final `ACTION_UP` or `ACTION_CANCEL` event +occurs. If you expect a mix of taps, double taps, and swipes on your feature, segment them accordingly. Figure out which `FalsingManager` method you need to call first, rather than relying diff --git a/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml b/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml new file mode 100644 index 000000000000..de4d882daf53 --- /dev/null +++ b/packages/SystemUI/res/drawable/circle_wallet_primary_50dp.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 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. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size + android:height="50dp" + android:width="50dp" /> + <solid android:color="#1A73E8" /> +</shape> diff --git a/packages/SystemUI/res/drawable/ic_fingerprint.xml b/packages/SystemUI/res/drawable/ic_fingerprint.xml index e5f33602164e..91d72a7902c0 100644 --- a/packages/SystemUI/res/drawable/ic_fingerprint.xml +++ b/packages/SystemUI/res/drawable/ic_fingerprint.xml @@ -15,45 +15,25 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32dp" - android:height="32dp" + android:width="72dp" + android:height="72dp" android:tint="?attr/wallpaperTextColor" - android:alpha=".75" - android:viewportHeight="32.0" - android:viewportWidth="32.0"> + android:viewportWidth="72" + android:viewportHeight="72"> <path - android:fillColor="#ffffff" - android:pathData="M23.7,5.9c-0.1,0.0 -0.2,0.0 -0.3,-0.1C21.0,4.5 18.6,3.9 16.0,3.9c-2.5,0.0 - -4.6,0.6 -6.9,1.9C8.8,6.0 8.3,5.9 8.1,5.5C7.9,5.2 8.0,4.7 8.4,4.5c2.5,-1.4 4.9,-2.1 7.7, - -2.1c2.8,0.0 5.4,0.7 8.0,2.1c0.4,0.2 0.5,0.6 0.3,1.0C24.2,5.7 24.0,5.9 23.7,5.9z" /> - <path - android:fillColor="#ffffff" - android:pathData="M5.3,13.2c-0.1,0.0 -0.3,0.0 -0.4,-0.1c-0.3,-0.2 -0.4,-0.7 -0.2,-1.0c1.3, - -1.9 2.9,-3.4 4.9,-4.5c4.1,-2.2 9.3,-2.2 13.4,0.0c1.9,1.1 3.6,2.5 4.9,4.4c0.2,0.3 0.1,0.8 - -0.2,1.0c-0.3,0.2 -0.8,0.1 -1.0,-0.2c-1.2,-1.7 -2.6,-3.0 -4.3,-4.0c-3.7,-2.0 -8.3,-2.0 - -12.0,0.0c-1.7,0.9 -3.2,2.3 -4.3,4.0C5.7,13.1 5.5,13.2 5.3,13.2z" /> - <path - android:fillColor="#ffffff" - android:pathData="M13.3,29.6c-0.2,0.0 -0.4,-0.1 -0.5,-0.2c-1.1,-1.2 -1.7,-2.0 -2.6, - -3.6c-0.9,-1.7 -1.4,-3.7 -1.4,-5.9c0.0,-4.1 3.3,-7.4 7.4,-7.4c4.1,0.0 7.4,3.3 7.4,7.4c0.0, - 0.4 -0.3,0.7 -0.7,0.7s-0.7,-0.3 -0.7,-0.7c0.0,-3.3 -2.7,-5.9 -5.9,-5.9c-3.3,0.0 -5.9, - 2.7 -5.9,5.9c0.0,2.0 0.4,3.8 1.2,5.2c0.8,1.6 1.4,2.2 2.4,3.3c0.3,0.3 0.3,0.8 0.0,1.0 - C13.7,29.5 13.5,29.6 13.3,29.6z" /> - <path - android:fillColor="#ffffff" - android:pathData="M22.6,27.1c-1.6,0.0 -2.9,-0.4 -4.1,-1.2c-1.9,-1.4 -3.1,-3.6 -3.1, - -6.0c0.0,-0.4 0.3,-0.7 0.7,-0.7s0.7,0.3 0.7,0.7c0.0,1.9 0.9,3.7 2.5,4.8c0.9,0.6 1.9, - 1.0 3.2,1.0c0.3,0.0 0.8,0.0 1.3,-0.1c0.4,-0.1 0.8,0.2 0.8,0.6c0.1,0.4 -0.2,0.8 -0.6, - 0.8C23.4,27.1 22.8,27.1 22.6,27.1z" /> - <path - android:fillColor="#ffffff" - android:pathData="M20.0,29.9c-0.1,0.0 -0.1,0.0 -0.2,0.0c-2.1,-0.6 -3.4,-1.4 -4.8,-2.9c-1.8, - -1.9 -2.8,-4.4 -2.8,-7.1c0.0,-2.2 1.8,-4.1 4.1,-4.1c2.2,0.0 4.1,1.8 4.1,4.1c0.0,1.4 1.2, - 2.6 2.6,2.6c1.4,0.0 2.6,-1.2 2.6,-2.6c0.0,-5.1 -4.2,-9.3 -9.3,-9.3c-3.6,0.0 -6.9,2.1 -8.4, - 5.4C7.3,17.1 7.0,18.4 7.0,19.8c0.0,1.1 0.1,2.7 0.9,4.9c0.1,0.4 -0.1,0.8 -0.4,0.9c-0.4, - 0.1 -0.8,-0.1 -0.9,-0.4c-0.6,-1.8 -0.9,-3.6 -0.9,-5.4c0.0,-1.6 0.3,-3.1 0.9,-4.4c1.7, - -3.8 5.6,-6.3 9.8,-6.3c5.9,0.0 10.7,4.8 10.7,10.7c0.0,2.2 -1.8,4.1 -4.1,4.1s-4.0, - -1.8 -4.0,-4.1c0.0,-1.4 -1.2,-2.6 -2.6,-2.6c-1.4,0.0 -2.6,1.2 -2.6,2.6c0.0,2.3 0.9, - 4.5 2.4,6.1c1.2,1.3 2.4,2.0 4.2,2.5c0.4,0.1 0.6,0.5 0.5,0.9C20.6,29.7 20.3,29.9 20.0, - 29.9z" /> + android:pathData= + "M25.5,16.3283C28.47,14.8433 31.9167,14 35.5834,14C39.2501,14 42.6968, + 14.8433 45.6668,16.3283 + M20,28.6669C22.7683,24.3402 28.7084,21.3335 35.5834,21.3335C42.4585, + 21.3335 48.3985,24.3402 51.1669,28.6669 + M22.8607,47.0002C21.834,44.3235 21.834,41.5002 21.834,41.5002C21.834, + 34.4051 27.7374,28.6667 35.5841,28.6667C43.4308,28.6667 49.3341,34.4051 49.3341,41.5002 + M49.3344,41.5003V42.0319C49.3344,44.7636 47.1161,47.0003 44.3661,47.0003C41.9461, + 47.0003 39.8744,45.2403 39.471,42.857L38.9577,39.7769C38.591,37.5953 36.7027, + 36.0002 34.5027,36.0002C26.5826,36.0002 29.846,49.1087 35.291,50.6487 + M44.9713,54.6267C42.5513,56.7167 39.2879,58.0001 35.5846,58.0001C32.2296, + 58.0001 29.2229,56.9551 26.8945,55.195" + android:strokeWidth="3" + android:strokeColor="#ffffff" + android:strokeLineCap="round"/> </vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/rounded_corners.xml b/packages/SystemUI/res/drawable/rounded_corners.xml new file mode 100644 index 000000000000..a84f57501b57 --- /dev/null +++ b/packages/SystemUI/res/drawable/rounded_corners.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 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 + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="#202124"/> + <corners android:radius="10dp"/> +</shape> diff --git a/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml b/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml index 1511659ea42f..48faeb22416f 100644 --- a/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml +++ b/packages/SystemUI/res/drawable/stat_sys_roaming_large.xml @@ -14,11 +14,11 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="@dimen/signal_icon_size" - android:height="@dimen/signal_icon_size" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:width="16dp" + android:height="16dp" + android:viewportWidth="16.0" + android:viewportHeight="16.0"> <path android:fillColor="#FF000000" - android:pathData="M14.21,12.81c0.36,-0.16 0.69,-0.36 0.97,-0.61c0.41,-0.38 0.72,-0.83 0.94,-1.37c0.21,-0.54 0.32,-1.14 0.32,-1.79c0,-0.92 -0.16,-1.7 -0.49,-2.33c-0.32,-0.64 -0.79,-1.12 -1.43,-1.45c-0.62,-0.33 -1.4,-0.49 -2.32,-0.49H8.23V19h1.8v-5.76h2.5L15.06,19h1.92v-0.12L14.21,12.81zM10.03,11.71V6.32h2.18c0.59,0 1.06,0.11 1.42,0.34c0.36,0.22 0.62,0.54 0.78,0.95c0.16,0.41 0.24,0.89 0.24,1.44c0,0.49 -0.09,0.93 -0.27,1.34c-0.18,0.4 -0.46,0.73 -0.82,0.97c-0.36,0.23 -0.82,0.35 -1.37,0.35H10.03z"/> + android:pathData="M4.5,13.02V3h3.93c0.97,0 1.75,0.27 2.34,0.81c0.6,0.53 0.9,1.28 0.9,2.25c0,0.63 -0.19,1.2 -0.56,1.74c-0.37,0.53 -0.95,0.91 -1.74,1.12l2.45,4.02v0.08h-1.69L7.75,9.09H6.03v3.93H4.5zM8.46,4.44H6.03v3.23h2.44c0.49,0 0.9,-0.14 1.2,-0.41c0.31,-0.28 0.46,-0.69 0.46,-1.22s-0.15,-0.93 -0.45,-1.2C9.38,4.58 8.98,4.44 8.46,4.44z"/> </vector> diff --git a/packages/SystemUI/res/drawable/wallet_button.xml b/packages/SystemUI/res/drawable/wallet_button.xml new file mode 100644 index 000000000000..bf7625fa956f --- /dev/null +++ b/packages/SystemUI/res/drawable/wallet_button.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="rectangle"> + <stroke + android:width="1dp" + android:color="@color/GM2_blue_600"/> + <solid android:color="@color/GM2_blue_600"/> + <corners android:radius="24dp"/> + </shape> + </item> +</selector> diff --git a/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml b/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml new file mode 100644 index 000000000000..f52889adaa53 --- /dev/null +++ b/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:attr/colorControlHighlight"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <solid android:color="#DADCE0" /> + <corners android:radius="@dimen/wallet_empty_state_corner_radius" /> + </shape> + </item> + <item> + <shape> + <stroke + android:width="1dp" + android:color="@color/GM2_grey_900" /> + <corners android:radius="@dimen/wallet_empty_state_corner_radius" /> + </shape> + </item> +</ripple> diff --git a/packages/SystemUI/res/layout/disabled_udfps_view.xml b/packages/SystemUI/res/layout/disabled_udfps_view.xml index aab86613ef45..13d3065d0860 100644 --- a/packages/SystemUI/res/layout/disabled_udfps_view.xml +++ b/packages/SystemUI/res/layout/disabled_udfps_view.xml @@ -16,9 +16,7 @@ --> <com.android.keyguard.DisabledUdfpsView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/disabled_udfps_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/circle_white" /> diff --git a/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml index 726e69f6e50c..343b398e3003 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml @@ -129,10 +129,10 @@ <com.android.systemui.statusbar.AlphaOptimizedImageView android:id="@+id/tuner_icon" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingStart="36dp" - android:paddingEnd="4dp" + android:layout_width="8dp" + android:layout_height="8dp" + android:layout_gravity="center_horizontal|bottom" + android:layout_marginBottom="@dimen/qs_footer_icon_padding" android:src="@drawable/tuner" android:tint="?android:attr/textColorTertiary" android:visibility="invisible" /> diff --git a/packages/SystemUI/res/layout/quick_access_wallet.xml b/packages/SystemUI/res/layout/quick_access_wallet.xml new file mode 100644 index 000000000000..688e1f252150 --- /dev/null +++ b/packages/SystemUI/res/layout/quick_access_wallet.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<com.android.systemui.wallet.ui.WalletView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/wallet_view" + android:layout_width="match_parent" + android:layout_height="match_parent"/> diff --git a/packages/SystemUI/res/layout/wallet_card_view.xml b/packages/SystemUI/res/layout/wallet_card_view.xml new file mode 100644 index 000000000000..5fd556d1fe25 --- /dev/null +++ b/packages/SystemUI/res/layout/wallet_card_view.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. +--> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <com.android.systemui.wallet.ui.WalletCardView + android:id="@+id/card" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginHorizontal="@dimen/card_margin" + android:foreground="?android:attr/selectableItemBackground" + app:cardBackgroundColor="@android:color/transparent" + app:cardElevation="12dp"> + <ImageView + android:id="@+id/card_image" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:adjustViewBounds="true" + android:contentDescription="@null" + android:scaleType="fitXY"/> + <ImageView + android:id="@+id/add_card_logo" + android:layout_width="28dp" + android:layout_height="28dp" + android:layout_gravity="center" + android:drawable="@drawable/ic_qs_plus" + android:contentDescription="@null" + android:scaleType="fitCenter" + android:visibility="gone"/> + </com.android.systemui.wallet.ui.WalletCardView> +</FrameLayout> diff --git a/packages/SystemUI/res/layout/wallet_empty_state.xml b/packages/SystemUI/res/layout/wallet_empty_state.xml new file mode 100644 index 000000000000..3ca0f73c81c8 --- /dev/null +++ b/packages/SystemUI/res/layout/wallet_empty_state.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2020, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + <LinearLayout + android:id="@+id/wallet_empty_state" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginHorizontal="16dp" + android:layout_marginTop="48dp" + android:background="@drawable/wallet_empty_state_bg" + android:orientation="vertical" + android:paddingVertical="52dp" + android:theme="@style/Wallet.Theme" + android:clipChildren="false" + android:visibility="gone"> + <ImageView + android:id="@+id/empty_state_icon" + android:layout_width="wrap_content" + android:layout_height="28dp" + android:layout_gravity="center" + android:layout_marginBottom="8dp" + android:contentDescription="@null" + android:scaleType="fitCenter"/> + <TextView + style="@style/Wallet.TextAppearance" + android:id="@+id/empty_state_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center"/> + </LinearLayout> +</merge> diff --git a/packages/SystemUI/res/layout/wallet_fullscreen.xml b/packages/SystemUI/res/layout/wallet_fullscreen.xml new file mode 100644 index 000000000000..dc678481ea6e --- /dev/null +++ b/packages/SystemUI/res/layout/wallet_fullscreen.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2021 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. +--> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipChildren="false"> + <LinearLayout + android:id="@+id/card_carousel_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginTop="36dp" + android:orientation="vertical"> + <ImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginVertical="10dp" + android:background="@drawable/circle_wallet_primary_50dp" + android:scaleType="center" + android:contentDescription="@null"/> + <TextView + android:id="@+id/label" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/Wallet.TextAppearance" + android:textAlignment="center"/> + + <com.android.systemui.wallet.ui.WalletCardCarousel + android:id="@+id/card_carousel" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:transitionName="dotIndicator" + android:clipChildren="false" + android:clipToPadding="false" + android:layout_marginVertical="24dp"/> + + <View + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1"/> + + <Button + android:id="@+id/wallet_button" + android:background="@drawable/wallet_button" + android:textColor="@color/wallet_white" + android:textAlignment="center" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingHorizontal="24dp" + android:paddingVertical="8dp" + android:layout_marginVertical="24dp" + android:layout_gravity="center_horizontal"/> + + </LinearLayout> + + <include layout="@layout/wallet_empty_state"/> + + <TextView + android:id="@+id/error_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="80dp" + android:layout_marginHorizontal="40dp" + android:textSize="14sp" + android:textColor="#DADCE0" + android:elevation="7dp" + android:background="@drawable/rounded_corners" + android:gravity="center" + android:visibility="gone"/> +</FrameLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index e2f407ed2d7d..df215fad7bf5 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die program of jou organisasie laat nie toe dat skermkiekies geneem word nie"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Wysig"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Wysig skermkiekie"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Vang meer vas"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Maak skermkiekie toe"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Boonste grens"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Keer kleure om"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Kleurregstellingmodus"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellings"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikerinstellings"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Maak toe"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Gekoppel"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Gekoppel, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Koppel tans …"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Hierdie toestel behoort aan <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> en is gekoppel aan VPN\'e"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jou organisasie kan netwerkverkeer in jou werkprofiel monitor"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan netwerkverkeer in jou werkprofiel monitor"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Jou IT-admin kan netwerkaktiwiteit op jou werkprofiel sien"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netwerk kan gemonitor word"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Hierdie toestel is gekoppel aan VPN\'e"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jou werkprofiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Maak gesprek oop"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Gespreklegstukke"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tik op \'n gesprek om dit by jou tuisskerm te voeg"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> gelede"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Minder as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string> <string name="over_timestamp" msgid="4765793502859358634">"Meer as <xliff:g id="DURATION">%1$s</xliff:g> gelede"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 335fa423dd92..da4431d01fcd 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"አርትዕ ያድርጉ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገጽ ዕይታን አርትዕ ያድርጉ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ተጨማሪ ይቅረጹ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገጽ ዕይታን አሰናብት"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"የላይኛው ወሰን"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ቀለማትን ግልብጥ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"የቀለም እርማት ሁነታ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ተጨማሪ ቅንብሮች"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"የተጠቃሚ ቅንብሮች"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ተከናውኗል"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ዝጋ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ተገናኝቷል"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ተገናኝቷል፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"በማገናኘት ላይ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ይህ መሳሪያ ንብረትነቱ የ<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ሲሆን ከቪፒኤን ጋር ተገናኝቷል"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"የእርስዎ ድርጅት በእርስዎ የሥራ መገለጫ ያለን የአውታረ መረብ ትራፊክን ሊቆጣጠር ይችል ይሆናል"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> በእርስዎ የሥራ መገለጫ ውስጥ የአውታረ መረብ ትራፊክ ላይ ክትትል ሊያደርግ ይችላል"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"የስራ መገለጫ አውታረ መረብ እንቅስቃሴ ለአይቲ አስተዳዳሪዎ ይታያል"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"አውታረ መረብ ክትትል የሚደረግበት ሊሆን ይችላል"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ይህ መሳሪያ ከቪፒኤን ጋር ተገናኝቷል"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"የእርስዎ የሥራ መገለጫ ከ<xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝቷል።"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ውይይት ይክፈቱ"</string> <string name="select_conversation_title" msgid="6716364118095089519">"የውይይት ምግብሮች"</string> <string name="select_conversation_text" msgid="3376048251434956013">"በመነሻ ማያ ገጽዎ ላይ ለማከል አንድ ውይይት መታ ያድርጉ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"ከ<xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string> <string name="over_timestamp" msgid="4765793502859358634">"ከ <xliff:g id="DURATION">%1$s</xliff:g> በፊት"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index dbf49ac1dd4d..d100430c4edf 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1124,6 +1124,14 @@ <string name="basic_status" msgid="2315371112182658176">"محادثة مفتوحة"</string> <string name="select_conversation_title" msgid="6716364118095089519">"أدوات المحادثة"</string> <string name="select_conversation_text" msgid="3376048251434956013">"انقر على محادثة لإضافتها إلى \"الشاشة الرئيسية\"."</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"قبل <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"قبل أقل من <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"قبل أكثر <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 279a29224121..08824be444e5 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"এপটোৱে বা আপোনাৰ প্ৰতিষ্ঠানে স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি নিদিয়ে"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"সম্পাদনা কৰক"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্ৰীনশ্বট সম্পাদনা কৰক"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"অধিক কেপচাৰ কৰক"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ওপৰৰ সীমাৰেখা"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ৰং ওলোটা কৰক"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ৰং শুধৰণী কৰা ম\'ড"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"অধিক ছেটিং"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যৱহাৰকাৰীৰ ছেটিং"</string> <string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন কৰা হ’ল"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"বন্ধ কৰক"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"সংযোগ কৰা হ’ল"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"সংযুক্ত, বেটাৰি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"সংযোগ কৰি থকা হৈছে..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ৰ আৰু এইটো VPNসমূহৰ সৈতে সংযুক্ত হৈ আছে"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"কৰ্মস্থানৰ প্ৰ’ফাইলৰ নেটৱৰ্কৰ কাৰ্যকলাপ আপোনাৰ আইটি প্ৰশাসকৰ বাবে দৃশ্যমান হয়"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"এই ডিভাইচটো VPNসমূহৰ সৈতে সংযুক্ত হৈ আছে"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলটো <xliff:g id="VPN_APP">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string> @@ -953,7 +949,7 @@ <string name="notification_channel_hints" msgid="7703783206000346876">"ইংগিতবোৰ"</string> <string name="instant_apps" msgid="8337185853050247304">"Instant Apps"</string> <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> চলি আছে"</string> - <string name="instant_apps_message" msgid="6112428971833011754">"ইনষ্ট\'ল নকৰাকৈয়েই এপটো খোলা হৈছে।"</string> + <string name="instant_apps_message" msgid="6112428971833011754">"এপ্টো ইনষ্ট\'ল নকৰাকৈ খোলা হৈছে।"</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"ইনষ্ট\'ল নকৰাকৈয়েই এপটো খোলা হৈছে। অধিক জানিবলৈ টিপক।"</string> <string name="app_info" msgid="5153758994129963243">"এপৰ তথ্য"</string> <string name="go_to_web" msgid="636673528981366511">"ব্ৰাউজাৰলৈ যাওক"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"বাৰ্তালাপ খোলক"</string> <string name="select_conversation_title" msgid="6716364118095089519">"বাৰ্তালাপ ৱিজেট"</string> <string name="select_conversation_text" msgid="3376048251434956013">"আপোনাৰ গৃহ স্ক্ৰীনত কোনো বাৰ্তালাপ যোগ দিবলৈ সেইটোত টিপক"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> পূৰ্বে"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ কম সময়ৰ পূৰ্বে"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>তকৈ বেছি সময়ৰ পূৰ্বে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 2b511430e1bb..eb2f7aa1d02d 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Skrinşot çəkməyə tətbiq və ya təşkilat tərəfindən icazə verilmir"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Redaktə edin"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinşota düzəliş edin"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Daha çoxunu əhatə edin"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Yuxarı hüdud"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Rəngləri çevirin"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Rəng korreksiyası rejimi"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Digər ayarlar"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"İstifadəçi ayarları"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hazır"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bağlayın"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Qoşulu"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Qoşuldu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Qoşulur..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> təşkilatına məxsusdur və VPN şəbəkəsinə qoşulub"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Təşkilat iş profilində şəbəkə ötürülməsinə nəzarət edə bilər"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> iş profilində şəbəkə ötürülməsinə nəzarət edə bilər"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"İş profili şəbəkəsi fəalliyyətini IT admini görə bilir"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Şəbəkəyə nəzarət edilə bilər"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu cihaz VPN şəbəkəsinə qoşulub"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"İş profiliniz <xliff:g id="VPN_APP">%1$s</xliff:g> şəbəkəsinə qoşulub"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Açıq söhbət"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Söhbət vidcetləri"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Əsas ekranınıza əlavə etmək üçün söhbətə toxunun"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Maksimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string> <string name="over_timestamp" msgid="4765793502859358634">"Minimum <xliff:g id="DURATION">%1$s</xliff:g> əvvəl"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 32a48d73fe45..2f2ca09c2d8d 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili organizacija ne dozvoljavaju pravljenje snimaka ekrana"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Izmeni"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Izmenite snimak ekrana"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite još"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Obrni boje"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekcije boje"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Još podešavanja"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisnička podešavanja"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Povezan"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezuje se..."</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je sa VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizacija može da prati mrežni saobraćaj na poslovnom profilu"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može da nadgleda mrežni saobraćaj na poslovnom profilu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivnost na mreži poslovnog profila je vidljiva IT administratoru"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža se možda nadgleda"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj uređaj je povezan sa VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Poslovni profil je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otvorite konverzaciju"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za konverzaciju"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite konverzaciju da biste je dodali na početni ekran"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Pre <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Pre manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Pre više od <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 11f7440c72ff..4386e554f729 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Рабіць здымкі экрана не дазваляе праграма ці ваша арганізацыя"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Змяніць"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Змяніць здымак экрана"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Зняць больш"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Адхіліць здымак экрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граніца"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Інвертаваць колеры"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Рэжым карэкцыі колеру"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Дадатковыя налады"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налады карыстальніка"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Гатова"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыць"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Падлучана"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Падключана, узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Падлучэнне..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Гэта прылада належыць арганізацыі \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" і падключана да VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ваша арганізацыя можа сачыць за сеткавым трафікам у вашым працоўным профілі"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> можа сачыць за сеткавым трафікам у вашым працоўным профілі"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Дзеянні працоўнага профілю ў сетцы бачныя IT-адміністратару"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"За сеткай могуць сачыць"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Гэта прылада падключана да VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш працоўны профіль падключаны да праграмы \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Адкрытая размова"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Віджэты размовы"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Націсніце на размову, каб дадаць яе на галоўны экран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> таму"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Менш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string> <string name="over_timestamp" msgid="4765793502859358634">"Больш за <xliff:g id="DURATION">%1$s</xliff:g> таму"</string> @@ -1126,8 +1130,7 @@ <string name="empty_user_name" msgid="3389155775773578300">"Сябры"</string> <string name="empty_status" msgid="5938893404951307749">"Паразмаўляем у чаце!"</string> <string name="missed_call" msgid="4228016077700161689">"Прапушчаны выклік"</string> - <!-- no translation found for messages_count_overflow_indicator (7850934067082006043) --> - <skip /> + <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string> <string name="people_tile_description" msgid="8154966188085545556">"Глядзець нядаўнія паведамленні, прапушчаныя выклікі і абнаўленні стану"</string> <string name="people_tile_title" msgid="6589377493334871272">"Размова"</string> <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Праблема з чытаннем індыкатара зараду акумулятара"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 01282f451424..929ec21526b0 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Правенето на екранни снимки не е разрешено от приложението или организацията ви"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Редактиране"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Редактиране на екранната снимка"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Заснемане на още"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отхвърляне на екранната снимка"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Инвертиране на цветовете"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим на коригиране на цветовете"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Още настройки"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Потребителски настройки"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затваряне"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Установена е връзка"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Свързано, батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Установява се връзка..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Това устройство принадлежи на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и е свързано с виртуални частни мрежи (VPN)"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Организацията ви може да наблюдава трафика в мрежата в служебния ви потребителски профил"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да наблюдава трафика в мрежата в служебния ви потребителски профил"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Мрежовата активност в служебния потребителски профил е видима за системния ви администратор"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежата може да се наблюдава"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Това устройство е свързано с виртуални частни мрежи (VPN)"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Служебният ви потребителски профил е свързан с(ъс) <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Отворен разговор"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Приспособления за разговор"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Докоснете разговор, за да го добавите към началния си екран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Преди <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Преди по-малко от <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Преди повече от <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 199c368f53ab..cf68ab7332b6 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1100,6 +1100,14 @@ <string name="basic_status" msgid="2315371112182658176">"খোলা কথোপকথন"</string> <string name="select_conversation_title" msgid="6716364118095089519">"কথোপকথন উইজেট"</string> <string name="select_conversation_text" msgid="3376048251434956013">"কোনও কথোপথন আপনার হোম স্ক্রিনে যোগ করার জন্য এতে ট্যাপ করুন"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ঘণ্টা আগে"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> থেকে কিছু কম সময় আগে"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> সপ্তাহেরও আগে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 650bc9cafcfd..e22790daac50 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ova aplikacija ili vaša organizacija ne dozvoljavaju snimanje ekrana"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Uredite snimak ekrana"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite više"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzija boja"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Način rada za ispravku boje"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Povezano"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija može pratiti mrežni saobraćaj na vašem profilu."</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može pratiti mrežni saobraćaj na vašem radnom profilu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Mrežna aktivnost radnog profila je vidljiva vašem IT administratoru"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža može biti nadzirana"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj uređaj je povezan VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vaš radni profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Vidžeti za razgovor"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da ga dodate na početni ekran"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 52dab8127382..7e523b429bee 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'aplicació o la teva organització no permeten fer captures de pantalla"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Edita"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Edita la captura de pantalla"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Captura més"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora la captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Marge superior"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverteix colors"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correcció de color"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Més opcions"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuració d\'usuari"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tanca"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Connectat"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connectat (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"S\'està connectant..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Aquest dispositiu pertany a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i està connectat a xarxes VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"És possible que la teva organització supervisi el trànsit de xarxa al teu perfil de treball"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"És possible que <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> supervisi el trànsit de xarxa del teu perfil de treball"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"L\'administrador de TI pot veure l\'activitat de la xarxa del perfil de treball"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"És possible que la xarxa estigui supervisada"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Aquest dispositiu està connectat a xarxes VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"El teu perfil de treball està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversa oberta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversa per afegir-la a la teva pantalla d\'inici"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Fa <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Fa menys de: <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Fa més de: <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index e3dcc5738619..5cde6bb096f7 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikace nebo organizace zakazuje pořizování snímků obrazovky"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Upravit"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Upravit snímek obrazovky"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zachytit více"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavřít snímek obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Horní hranice"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Převrátit barvy"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekce barev"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Další nastavení"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uživatelské nastavení"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavřít"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Připojeno"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Připojeno, baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Připojování..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je připojené k sítím VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizace může ve vašem pracovním profilu sledovat síťový provoz"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> může ve vašem pracovním profilu sledovat síťový provoz"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitu pracovního profilu na síti vidí administrátor IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Síť může být sledována"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Toto zařízení je připojené k sítím VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovní profil je připojen k síti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otevřít konverzaci"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgety konverzací"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Klepnutím na konverzaci ji přidáte na plochu"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Před <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Před méně než <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Před více než <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 5c236277a9bf..50a68f9b8992 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller din organisation tillader ikke, at du tager screenshots"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger screenshot"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Medtag mere"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Luk screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Øverste kant"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Byt om på farver"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Farvekorrigeringstilstand"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere indstillinger"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brugerindstillinger"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Udfør"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Luk"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Tilsluttet"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tilsluttet – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Opretter forbindelse…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Denne enhed tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og har forbindelse til VPN-netværk"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Din organisation kan overvåge netværkstrafikken på din arbejdsprofil"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan overvåge netværkstrafik på din arbejdsprofil"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Din it-administrator kan se netværksaktivitet på din arbejdsprofil"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netværket kan være overvåget"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Denne enhed har forbindelse til VPN-netværk"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Din arbejdsprofil har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Åben samtale"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Samtalewidgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tryk på en samtale for at føje den til din startskærm"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"For <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"For mindre end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> <string name="over_timestamp" msgid="4765793502859358634">"For mere end <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 971752c36ed8..ef3cf2130064 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Die App oder deine Organisation lässt das Erstellen von Screenshots nicht zu"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Bearbeiten"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bearbeiten"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mehr aufnehmen"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot schließen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Oberer Rand"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Farben umkehren"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Farbkorrekturmodus"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Weitere Einstellungen"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Nutzereinstellungen"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fertig"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Schließen"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Verbunden"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Verbindung wird hergestellt…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dieses Gerät gehört <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> und ist mit VPNs verbunden"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Deine Organisation kann den Netzwerkverkehr in deinem Arbeitsprofil überwachen"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kann den Netzwerkverkehr in deinem Arbeitsprofil überwachen"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Dein IT-Administrator kann die Netzwerkaktivitäten deines Arbeitsprofils sehen"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Das Netzwerk wird eventuell überwacht"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dieses Gerät ist mit VPNs verbunden"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Dein Arbeitsprofil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Offene Unterhaltung"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Unterhaltungs-Widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tippe auf eine Unterhaltung, um sie deinem Startbildschirm hinzuzufügen"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Vor <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Vor weniger als <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Vor über <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 818980894c29..a49b6498f44e 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Η λήψη στιγμιότυπων οθόνης δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Επεξεργασία"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Επεξεργασία στιγμιότυπου οθόνης"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Λήψη περισσότερων"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Παράβλεψη στιγμιότυπου οθόνης"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Προεπισκόπηση στιγμιότυπου οθόνης"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ανώτατο όριο"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Αντιστροφή χρωμάτων"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Λειτουργία διόρθωσης χρώματος"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Περισσότερες ρυθμίσεις"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ρυθμίσεις χρήστη"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Τέλος"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Κλείσιμο"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Συνδέθηκε"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Σύνδεση…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Αυτή η συσκευή ανήκει στον οργανισμό <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> και είναι συνδεδεμένη σε ορισμένα VPN."</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ο οργανισμός σας μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου στο προφίλ εργασίας σας"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Ο οργανισμός <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> μπορεί να παρακολουθεί την επισκεψιμότητα δικτύου στο προφίλ εργασίας σας"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Η δραστηριότητα δικτύου του προφίλ εργασίας είναι ορατή στον διαχειριστή IT σας"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Το δίκτυο ενδέχεται να παρακολουθείται"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Αυτή η συσκευή είναι συνδεδεμένη σε ορισμένα VPN."</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Το προφίλ εργασίας σας είναι συνδεδεμένο στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>."</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Άνοιγμα συνομιλίας"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Γραφικά στοιχεία συνομιλίας"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Πατήστε μια συνομιλία για να την προσθέσετε στην αρχική οθόνη"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> πριν"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Λιγότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string> <string name="over_timestamp" msgid="4765793502859358634">"Περισσότερο από <xliff:g id="DURATION">%1$s</xliff:g> πριν"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 6ce83ccec75c..bd9a0605cdeb 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -177,12 +177,9 @@ <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string> - <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) --> - <skip /> - <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) --> - <skip /> - <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) --> - <skip /> + <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> + <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string> + <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string> <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string> @@ -1096,6 +1093,10 @@ <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string> + <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string> + <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string> + <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string> + <string name="okay" msgid="6490552955618608554">"OK"</string> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 9c7ce8759999..2158ed849858 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -177,12 +177,9 @@ <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string> - <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) --> - <skip /> - <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) --> - <skip /> - <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) --> - <skip /> + <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> + <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string> + <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string> <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string> @@ -1096,6 +1093,10 @@ <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string> + <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string> + <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string> + <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string> + <string name="okay" msgid="6490552955618608554">"OK"</string> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 6ce83ccec75c..bd9a0605cdeb 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -177,12 +177,9 @@ <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string> - <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) --> - <skip /> - <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) --> - <skip /> - <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) --> - <skip /> + <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> + <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string> + <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string> <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string> @@ -1096,6 +1093,10 @@ <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string> + <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string> + <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string> + <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string> + <string name="okay" msgid="6490552955618608554">"OK"</string> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 6ce83ccec75c..bd9a0605cdeb 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -177,12 +177,9 @@ <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string> - <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) --> - <skip /> - <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) --> - <skip /> - <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) --> - <skip /> + <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> + <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string> + <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognise fingerprint. Use screen lock instead."</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string> <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string> @@ -1096,6 +1093,10 @@ <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string> + <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string> + <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string> + <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string> + <string name="okay" msgid="6490552955618608554">"OK"</string> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index c036c1bf0423..3ed7688ba9c0 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -177,12 +177,9 @@ <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Dismiss"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Fingerprint icon"</string> - <!-- no translation found for fingerprint_dialog_use_fingerprint_instead (6178228876763024452) --> - <skip /> - <!-- no translation found for fingerprint_dialog_use_fingerprint (923777032861374285) --> - <skip /> - <!-- no translation found for fingerprint_dialog_cant_recognize_fp_use_screenlock (4805522676254378353) --> - <skip /> + <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognize face. Use fingerprint instead."</string> + <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"Use your fingerprint to continue"</string> + <string name="fingerprint_dialog_cant_recognize_fp_use_screenlock" msgid="4805522676254378353">"Can’t recognize fingerprint. Use screen lock instead."</string> <string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Looking for you…"</string> <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Face icon"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Compatibility zoom button."</string> @@ -1096,6 +1093,10 @@ <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your Home screen"</string> + <string name="no_conversations_text" msgid="7362374212649891057">"Check back here once you get some messages"</string> + <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string> + <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string> + <string name="okay" msgid="6490552955618608554">"Okay"</string> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Less than <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Over <xliff:g id="DURATION">%1$s</xliff:g> ago"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 798448428215..6bb486da10f9 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La app o tu organización no permiten las capturas de pantalla"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Descartar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Límite superior"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de color"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Más configuraciones"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración del usuario"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectado. Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> y está conectado a VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tu organización puede controlar el tráfico de red en tu perfil de trabajo"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Es posible que <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> controle el tráfico de red en tu perfil de trabajo"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"El administrador de IT puede ver la actividad de la red de tu perfil de trabajo"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Es posible que la red esté supervisada"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversación"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Presiona una conversación para agregarla a tu pantalla principal"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Hace <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index c80482ca92d1..9d6e3fa85a92 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Margen superior"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertir colores"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de color"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Más ajustes"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ajustes de usuario"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Cerrar"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> y está conectado a varias VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tu organización puede supervisar el tráfico de red de tu perfil de trabajo"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> puede supervisar el tráfico de red de tu perfil de trabajo"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Tu administrador de TI puede ver la actividad de red del perfil de trabajo"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Puede que la red esté supervisada"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a varias VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversación abierta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversación"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toca una conversación para añadirla a la pantalla de inicio"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Hace <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Hace menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Hace más de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 1500a315457b..14aed4ef7efd 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Muutmine"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Ekraanipildi muutmine"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Jäädvustage rohkem"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekraanipildist loobumine"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ülempiir"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Vaheta värve"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Värviparandusrežiim"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Rohkem seadeid"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kasutaja seaded"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sule"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Ühendatud"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ühendatud, aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Ühenduse loomine ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"See seade kuulub organisatsioonile <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ja on ühendatud VPN-idega"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Teie organisatsioon võib jälgida teie tööprofiilil võrguliiklust"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> võib jälgida võrguliiklust teie tööprofiilil"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Tööprofiili võrgutegevused on teie IT-administraatorile nähtavad"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Võrku võidakse jälgida"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"See seade on ühendatud VPN-idega"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Teie tööprofiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Avage vestlus"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Vestlusvidinad"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Puudutage vestlust, et lisada see oma avakuvale"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Vähem kui <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string> <string name="over_timestamp" msgid="4765793502859358634">"Üle <xliff:g id="DURATION">%1$s</xliff:g> tagasi"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 9e921fe90f85..2f1c7a585c07 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editatu"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editatu pantaila-argazkia"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Atera eduki gehiago argazkian"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Goiko ertza"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Alderantzikatu koloreak"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Koloreen zuzenketa modua"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Ezarpen gehiago"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Erabiltzaile-ezarpenak"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Eginda"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Itxi"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Konektatuta"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Konektatzen…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Gailu hau <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundearena da, eta VPN sareetara dago konektatuta"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Baliteke erakundeak laneko profileko sareko trafikoa gainbegiratzea"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Baliteke <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundeak laneko profilaren sareko trafikoa gainbegiratzea"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IKT saileko administratzaileak laneko profilaren sarearen jarduera ikus dezake"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Baliteke sarea gainbegiratuta egotea"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Gailu hau VPN sareetara dago konektatuta"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"<xliff:g id="VPN_APP">%1$s</xliff:g> sarera konektatuta daukazu laneko profila"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Elkarrizketa irekia"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Elkarrizketa-widgetak"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Sakatu elkarrizketa bat hasierako pantailan gehitzeko"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Duela <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gutxiago"</string> <string name="over_timestamp" msgid="4765793502859358634">"Duela <xliff:g id="DURATION">%1$s</xliff:g> baino gehiago"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 20a4b831b9a5..6eba9af6690b 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"برنامه یا سازمان شما اجازه نمیدهند نماگرفت بگیرید."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ویرایش"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ویرایش نماگرفت"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ضبط محتوای بیشتر"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"رد کردن نماگرفت"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"پیشنمایش نماگرفت"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"مرز بالایی"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"برگردان رنگها"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"حالت تصحیح رنگ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"تنظیمات بیشتر"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"تنظیمات کاربر"</string> <string name="quick_settings_done" msgid="2163641301648855793">"تمام"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"بستن"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"متصل"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"متصل، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"در حال اتصال..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"این دستگاه به <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> تعلق دارد و به VPN متصل است"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ممکن است سازمان شما ترافیک شبکه را در نمایه کاریتان پایش کند"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ممکن است ترافیک شبکه را در نمایه کاری شما پایش کند"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"سرپرست سیستم میتواند فعالیت شبکه نمایه کاری را ببیند"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ممکن است شبکه پایش شود"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"این دستگاه به شبکههای VPN متصل است"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"نمایه کاری به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل است"</string> @@ -952,7 +948,7 @@ <string name="notification_channel_storage" msgid="2720725707628094977">"فضای ذخیرهسازی"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"نکات"</string> <string name="instant_apps" msgid="8337185853050247304">"برنامههای فوری"</string> - <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> درحال اجرا"</string> + <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> درحال اجرا"</string> <string name="instant_apps_message" msgid="6112428971833011754">"برنامه بدون نصب شدن باز شد."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"برنامه بدون نصب شدن باز شد. برای اطلاعات بیشتر ضربه بزنید."</string> <string name="app_info" msgid="5153758994129963243">"اطلاعات برنامه"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"باز کردن مکالمه"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ابزارکهای مکالمه"</string> <string name="select_conversation_text" msgid="3376048251434956013">"روی مکالمهای ضربه بزنید تا به «صفحه اصلی» اضافه شود"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> پیش"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"کمتر از <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string> <string name="over_timestamp" msgid="4765793502859358634">"بیشاز <xliff:g id="DURATION">%1$s</xliff:g> قبل"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 339355015a60..31a54baf396a 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Sovellus tai organisaatio ei salli kuvakaappauksien tallentamista."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Muuta"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Muokkaa kuvakaappausta"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Kuvaa enemmän"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hylkää kuvakaappaus"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Yläraja"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Käänteiset värit"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Värinkorjaustila"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Lisäasetukset"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Käyttäjäasetukset"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sulje"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Yhdistetty"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Yhdistetty, akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Yhdistetään…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> omistaa tämän laitteen, joka on yhdistetty VPN:iin"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisaatiosi voi valvoa työprofiilisi verkkoliikennettä."</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> voi valvoa työprofiilisi verkkoliikennettä."</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT-järjestelmänvalvoja näkee työprofiilin verkkotoiminnan"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Verkkoa saatetaan valvoa"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Tämä laite on yhdistetty VPN:iin"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Työprofiilisi on yhdistetty tähän: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Avaa keskustelu"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Keskusteluwidgetit"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Lisää keskustelu aloitusnäytölle napauttamalla sitä"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> sitten"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Alle <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string> <string name="over_timestamp" msgid="4765793502859358634">"Yli <xliff:g id="DURATION">%1$s</xliff:g> sitten"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 53ef194e8b8b..838b699b7882 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1100,6 +1100,14 @@ <string name="basic_status" msgid="2315371112182658176">"Ouvrir la conversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Touchez une conversation pour l\'ajouter à votre écran d\'accueil"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index f40d6aaba741..cba45cd19f50 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Les captures d\'écran ne sont pas autorisées par l\'application ni par votre organisation"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite supérieure"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverser les couleurs"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correction des couleurs"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string> <string name="quick_settings_done" msgid="2163641301648855793">"OK"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fermer"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Connecté"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connecté, batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Connexion en cours..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> et il est connecté à des VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Votre entreprise peut contrôler votre trafic réseau dans votre profil professionnel"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> peut contrôler votre trafic réseau dans votre profil professionnel"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Votre administrateur informatique peut voir l\'activité sur le réseau de votre profil professionnel"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Il est possible que le réseau soit surveillé"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Cet appareil est connecté à des VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversation ouverte"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversation"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Appuyez sur une conversation pour l\'ajouter à votre écran d\'accueil"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Il y a <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Il y a moins de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Il y a plus de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 2ba0738e5bbf..ac792e375f1e 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A aplicación ou a túa organización non permite realizar capturas de pantalla"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar a captura de pantalla"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar máis"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar a captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Bordo superior"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter cores"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de corrección de cor"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Máis opcións"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración de usuario"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Feito"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Pechar"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Conectado"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Dispositivo conectado. Nivel de batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertence a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> e está conectado a varias VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"A túa organización pode controlar o tráfico de rede do teu perfil de traballo"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> pode controlar o tráfico de rede do teu perfil de traballo"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"O teu administrador de TI pode ver a actividade que leves a cabo na rede co perfil de traballo"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"É posible que se controle a rede"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a varias VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"O teu perfil de traballo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -954,7 +950,7 @@ <string name="instant_apps" msgid="8337185853050247304">"Aplicacións Instantáneas"</string> <string name="instant_apps_title" msgid="8942706782103036910">"Estase executando <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="instant_apps_message" msgid="6112428971833011754">"Abriuse a aplicación sen ter que instalala."</string> - <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Abriuse a aplicación sen ter que instalala. Tocar para obter máis información."</string> + <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Abriuse a aplicación sen ter que instalala. Toca para obter máis información."</string> <string name="app_info" msgid="5153758994129963243">"Información da aplicación"</string> <string name="go_to_web" msgid="636673528981366511">"Ir ao navegador"</string> <string name="mobile_data" msgid="4564407557775397216">"Datos móbiles"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toca unha conversa para engadila á pantalla de inicio"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Hai <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Hai menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Hai máis de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index dbcfe5e2d129..e178bb4104be 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ઍપ્લિકેશન કે તમારી સંસ્થા દ્વારા સ્ક્રીનશૉટ લેવાની મંજૂરી નથી"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ફેરફાર કરો"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"સ્ક્રીનશૉટમાં ફેરફાર કરો"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"વધુ કૅપ્ચર કરો"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"સ્ક્રીનશૉટ છોડી દો"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"સ્ક્રીનશૉટની સૌથી ઉપરની બાજુની સીમા"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"રંગોને ઉલટાવો"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"રંગ સુધારણા મોડ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"વધુ સેટિંગ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"વપરાશકર્તા સેટિંગ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"થઈ ગયું"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"બંધ કરો"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"કનેક્ટ થયેલ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"કનેક્ટ કરેલ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"કનેક્ટ કરી રહ્યું છે..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"આ ડિવાઇસ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ની માલિકીનું છે અને VPNsથી કનેક્ટ કરેલું છે"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"તમારી સંસ્થા તમારી કાર્ય પ્રોફાઇલમાં નેટવર્ક ટ્રાફિકનું નિયમન કરી શકે છે"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> તમારી કાર્ય પ્રોફાઇલમાં નેટવર્ક ટ્રાફિકનું નિયમન કરી શકે છે"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ઑફિસ માટેની ઍપની નેટવર્ક પ્રવૃત્તિને તમારા IT વ્યવસ્થાપક જોઈ શકે છે"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"નેટવર્કનું નિયમન કરવામાં આવી શકે છે"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"આ ડિવાઇસ VPNsથી કનેક્ટ કરેલું છે"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"તમારી ઑફિસની પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g>થી કનેક્ટ કરેલી છે"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string> <string name="select_conversation_title" msgid="6716364118095089519">"વાતચીતના વિજેટ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"તમારી હોમ સ્ક્રીનમાં વાતચીત ઉમેરવા માટે તેના પર ટૅપ કરો"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> પહેલાં"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>થી ઓછા સમય પહેલાં"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> કરતાં વધુ સમય પહેલાં"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 53ea9dd0452c..54a56fcc8467 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ऐप्लिकेशन या आपका संगठन स्क्रीनशॉट लेने की अनुमति नहीं देता"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"बदलाव करें"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट में बदलाव करें"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा जानकारी कैप्चर करें"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"स्क्रीनशॉट को ऊपर से काटने की सीमा"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटें"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"रंग सुधार मोड"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"और सेटिंग"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"उपयोगकर्ता सेटिंग"</string> <string name="quick_settings_done" msgid="2163641301648855793">"हो गया"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करें"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"कनेक्ट है"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"कनेक्ट किया गया, बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट हो रहा है..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"इस डिवाइस का मालिकाना हक <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> के पास है. इस डिवाइस को वीपीएन से कनेक्ट किया गया है"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"आपका संगठन आपकी वर्क प्रोफ़ाइल में नेटवर्क ट्रैफ़िक की निगरानी कर सकता है"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपकी वर्क प्रोफ़ाइल में नेटवर्क ट्रैफ़िक की निगरानी कर सकता है"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"आपका आईटी एडमिन आपकी वर्क प्रोफ़ाइल के नेटवर्क से जुड़ी गतिविधि देख सकता है"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्क की निगरानी की जा सकती है"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"इस डिवाइस को वीपीएन से कनेक्ट किया गया है"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"आपकी वर्क प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट की गई है"</string> @@ -954,7 +950,7 @@ <string name="instant_apps" msgid="8337185853050247304">"Instant Apps"</string> <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> चल रहा है"</string> <string name="instant_apps_message" msgid="6112428971833011754">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है."</string> - <string name="instant_apps_message_with_help" msgid="1816952263531203932">"ऐप्लिकेशन इंस्टॉल किए बिना ही खुल गया है. ज़्यादा जानने के लिए टैप करें."</string> + <string name="instant_apps_message_with_help" msgid="1816952263531203932">"इस ऐप्लिकेशन को इंस्टॉल करने की ज़रूरत नहीं पड़ती. ज़्यादा जानकारी के लिए इस लिंक पर टैप करें."</string> <string name="app_info" msgid="5153758994129963243">"ऐप्लिकेशन की जानकारी"</string> <string name="go_to_web" msgid="636673528981366511">"ब्राउज़र पर जाएं"</string> <string name="mobile_data" msgid="4564407557775397216">"मोबाइल डेटा"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ऐसी बातचीत जिसमें इंटरैक्शन डेटा मौजूद नहीं है"</string> <string name="select_conversation_title" msgid="6716364118095089519">"बातचीत विजेट"</string> <string name="select_conversation_text" msgid="3376048251434956013">"किसी बातचीत को होम स्क्रीन पर जोड़ने के लिए, उस बातचीत पर टैप करें"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पहले"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> से थोड़ा पहले"</string> <string name="over_timestamp" msgid="4765793502859358634">"करीब <xliff:g id="DURATION">%1$s</xliff:g> से ज़्यादा"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index dfc2967560a7..abf4312302b8 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ili vaša organizacija ne dopuštaju snimanje zaslona"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Uređivanje snimke zaslona"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite više"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacivanje snimke zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimke zaslona"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Zamjena boja"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Način korekcije boje"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zatvori"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Povezano"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezivanje..."</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i povezan je s VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija može nadzirati mrežni promet na vašem radnom profilu"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može nadzirati mrežni promet na vašem radnom profilu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Mrežna aktivnost poslovnog profila vidljiva je vašem IT administratoru"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža se možda nadzire"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ovaj je uređaj povezan s VPN-ovima"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vaš poslovni profil povezan je s mrežom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otvoreni razgovor"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgeti razgovora"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Dodirnite razgovor da biste ga dodali na početni zaslon"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Prije <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Prije manje od <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Prije više od <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index e6a4e3ce6e74..bd75c0839d52 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Az alkalmazás vagy az Ön szervezete nem engedélyezi képernyőkép készítését"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Szerkesztés"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Képernyőkép szerkesztése"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Több rögzítése"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Képernyőkép elvetése"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Felső határ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Színek invertálása"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Színjavítás mód"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"További beállítások"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Felhasználói beállítások"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Kész"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Bezárás"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Csatlakoztatva"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Csatlakoztatva; az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Csatlakozás…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ez az eszköz a(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tulajdonában van, és VPN-ekhez van csatlakoztatva"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Szervezete figyelheti a munkaprofil hálózati forgalmát"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"A(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> figyelheti a munkaprofil hálózati forgalmát"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Munkaprofilja hálózati tevékenységét láthatja a rendszergazdája"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Elképzelhető, hogy a hálózatot figyelik"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ez az eszköz VPN-ekhez van csatlakoztatva"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Munkaprofilja össze van kapcsolva a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazással"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Beszélgetés megnyitása"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Beszélgetési modulok"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Koppintson a kívánt beszélgetésre a kezdőképernyőre való felvételhez"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Kevesebb, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Több, mint ennyi ideje: <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index b598f01a7fc8..282a2ae1111f 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Հավելվածը կամ ձեր կազմակերպությունը չի թույլատրում սքրինշոթի ստացումը"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Փոփոխել"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Փոփոխել սքրինշոթը"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Նկարեք ավելի մեծ տարածք"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Փակել սքրինշոթը"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Վերևի սահմանագիծ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Շրջել գույները"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Գունաշտկման ռեժիմ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Հավելյալ կարգավորումներ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Օգտատիրոջ կարգավորումներ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Փակել"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Միացված է"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Միացված է, մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Միանում է..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Այս սարքը պատկանում է «<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>» կազմակերպությանը և միացված է վիրտուալ մասնավոր ցանցերի"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ձեր կազմակերպությունը կարող է վերահսկել ձեր աշխատանքային պրոֆիլի ցանցային թրաֆիկը"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> կազմակերպությունը կարող է վերահսկել ձեր աշխատանքային պրոֆիլի ցանցային թրաֆիկը"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Աշխատանքային պրոֆիլով կատարված գործողությունները տեսանելի են ձեր ՏՏ ադմինիստրատորին"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Ցանցը կարող է վերահսկվել"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Այս սարքը միացված է վիրտուալ մասնավոր ցանցերի"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ձեր աշխատանքային պրոֆիլը միացված է <xliff:g id="VPN_APP">%1$s</xliff:g> ցանցին"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Բաց զրույց"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Զրույցի վիջեթներ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Հպեք զրույցին՝ այն հիմնական էկրանին ավելացնելու համար"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Առավելագույնը <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string> <string name="over_timestamp" msgid="4765793502859358634">"Ավելի քան <xliff:g id="DURATION">%1$s</xliff:g> առաջ"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a823822bb2e6..4872a6ebd7ed 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Mengambil screenshot tidak diizinkan oleh aplikasi atau organisasi"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Mengedit screenshot"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Rekam lagi"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Menutup screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Batas atas"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inversi warna"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode koreksi warna"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Setelan lainnya"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setelan pengguna"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Tersambung"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Perangkat ini milik <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dan terhubung ke VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasi dapat memantau traffic jaringan di profil kerja"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mungkin memantau traffic jaringan di profil kerja Anda"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitas jaringan profil kerja dapat dilihat oleh admin IT Anda"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Jaringan mungkin dipantau"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Perangkat ini terhubung ke VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profil kerja Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -952,7 +948,7 @@ <string name="notification_channel_storage" msgid="2720725707628094977">"Penyimpanan"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"Petunjuk"</string> <string name="instant_apps" msgid="8337185853050247304">"Aplikasi Instan"</string> - <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string> + <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan"</string> <string name="instant_apps_message" msgid="6112428971833011754">"Aplikasi dapat dibuka tanpa perlu diinstal."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Aplikasi dapat dibuka tanpa perlu diinstal. Ketuk untuk mempelajari lebih lanjut."</string> <string name="app_info" msgid="5153758994129963243">"Info aplikasi"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Membuka percakapan"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widget Percakapan"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Ketuk percakapan untuk menambahkannya ke Layar utama"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Kurang dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string> <string name="over_timestamp" msgid="4765793502859358634">"Lebih dari <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 3dd9dfab4d4b..5915c41c9cda 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Forritið eða fyrirtækið þitt leyfir ekki skjámyndatöku"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Breyta"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Breyta skjámynd"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mynda meira"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Loka skjámynd"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Efri mörk"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Umsnúa litum"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Litaleiðrétting"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Fleiri stillingar"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Notandastillingar"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Lokið"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Loka"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Tengt"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tengt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Tengist..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Þetta tæki tilheyrir <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er tengt við VPN-net"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Fyrirtækið þitt kann að fylgjast með netnotkun á vinnusniðinu þínu"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kann að fylgjast með netnotkun á vinnusniðinu þínu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Kerfisstjóri getur séð netvirkni á vinnusniðinu þínu"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Hugsanlega er fylgst með netinu"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Þetta tæki er tengt við VPN-net"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Vinnusniðið þitt er tengt við <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Opna samtal"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Samtalsgræjur"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Ýttu á samtal til að bæta því á heimaskjáinn"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Fyrir <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Fyrir minna en <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Fyrir meira en <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 84b307b6f457..3adf868006e2 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifica"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifica screenshot"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Acquisisci di più"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superiore"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverti colori"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modalità di correzione del colore"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Altre impostazioni"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Impostazioni utente"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fine"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Chiudi"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Connesso"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Connesso, batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Connessione..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Questo dispositivo appartiene a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ed è collegato a VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"La tua organizzazione potrebbe monitorare il traffico di rete nel tuo profilo di lavoro"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> potrebbe monitorare il traffico di rete nel tuo profilo di lavoro"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"L\'attività di rete del tuo profilo di lavoro è visibile all\'amministratore IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"La rete potrebbe essere monitorata"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Questo dispositivo è collegato a VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Il tuo profilo di lavoro è collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Apri conversazione"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widget di conversazione"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tocca una conversazione per aggiungerla alla schermata Home"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> fa"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Meno di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string> <string name="over_timestamp" msgid="4765793502859358634">"Più di <xliff:g id="DURATION">%1$s</xliff:g> fa"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 6699eeabad6a..e934e7bc4d05 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -29,7 +29,7 @@ <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"נותרו <xliff:g id="PERCENTAGE">%1$s</xliff:g>, נשארו בערך <xliff:g id="TIME">%2$s</xliff:g> על סמך השימוש במכשיר"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"נותרו <xliff:g id="PERCENTAGE">%1$s</xliff:g>, נשארו בערך <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"נותרו <xliff:g id="PERCENTAGE">%s</xliff:g>. התכונה \'חיסכון בסוללה\' הופעלה."</string> - <string name="invalid_charger" msgid="4370074072117767416">"לא ניתן לטעון באמצעות USB. ניתן להשתמש במטען שצורף למכשיר שלך."</string> + <string name="invalid_charger" msgid="4370074072117767416">"לא ניתן לטעון באמצעות USB. אפשר להשתמש במטען שצורף למכשיר שלך."</string> <string name="invalid_charger_title" msgid="938685362320735167">"לא ניתן לטעון באמצעות USB"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"שימוש במטען שסופק עם המכשיר"</string> <string name="battery_low_why" msgid="2056750982959359863">"הגדרות"</string> @@ -46,7 +46,7 @@ <string name="bluetooth_tethered" msgid="4171071193052799041">"ה-Bluetooth שותף"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"הגדר שיטות קלט"</string> <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"מקלדת פיזית"</string> - <string name="usb_device_permission_prompt" msgid="4414719028369181772">"האם לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> + <string name="usb_device_permission_prompt" msgid="4414719028369181772">"לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"האם לאפשר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה."</string> <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"האם לתת לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g> גישה אל <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string> <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"האם לפתוח את <xliff:g id="APPLICATION">%1$s</xliff:g> כדי לעבוד עם <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> @@ -78,19 +78,18 @@ <string name="compat_mode_off" msgid="7682459748279487945">"מתיחה למילוי של המסך"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"צילום מסך"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"נשלחה תמונה"</string> - <string name="screenshot_saving_ticker" msgid="6519186952674544916">"שומר צילום מסך..."</string> + <string name="screenshot_saving_ticker" msgid="6519186952674544916">"צילום המסך נשמר..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"שומר צילום מסך..."</string> <string name="screenshot_saved_title" msgid="8893267638659083153">"צילום המסך נשמר"</string> <string name="screenshot_saved_text" msgid="7778833104901642442">"אפשר להקיש כדי להציג את צילום המסך"</string> <string name="screenshot_failed_title" msgid="3259148215671936891">"לא ניתן היה לשמור צילום מסך"</string> <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"כדי שצילום המסך יישמר, צריך לבטל את הנעילה של המכשיר"</string> - <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"יש לנסות שוב לבצע צילום מסך"</string> + <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"אפשר לצלם שוב את המסך"</string> <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"לא ניתן לשמור את צילום המסך"</string> <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"האפליקציה או הארגון שלך אינם מתירים ליצור צילומי מסך"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"עריכה"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"עריכת צילום מסך"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"צילום תוכן נוסף"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"סגירת צילום מסך"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"הקצה העליון"</string> @@ -148,7 +147,7 @@ <string name="biometric_dialog_confirm" msgid="2005978443007344895">"אישור"</string> <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ניסיון נוסף"</string> <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"יש להקיש כדי לבטל את האימות"</string> - <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"עליך לנסות שוב"</string> + <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"יש לנסות שוב"</string> <string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"המערכת מחפשת את הפנים שלך"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"זיהוי הפנים בוצע"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"מאושר"</string> @@ -173,7 +172,7 @@ <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"הזנה של קוד אימות שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"נעשו יותר מדי ניסיונות שגויים. הנתונים במכשיר יימחקו."</string> - <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"נעשו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"בוצעו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"נעשו יותר מדי ניסיונות שגויים. פרופיל העבודה הזה והנתונים המשויכים אליו יימחקו."</string> <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"סגירה"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"יש לגעת בחיישן טביעות האצבע"</string> @@ -228,7 +227,7 @@ <string name="accessibility_no_sims" msgid="5711270400476534667">"אין כרטיס SIM."</string> <string name="accessibility_battery_details" msgid="6184390274150865789">"פתיחת פרטי סוללה"</string> <string name="accessibility_battery_level" msgid="5143715405241138822">"<xliff:g id="NUMBER">%d</xliff:g> אחוזים של סוללה."</string> - <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:<xliff:g id="TIME">%2$s</xliff:g>"</string> + <string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"רמת הטעינה בסוללה: <xliff:g id="PERCENTAGE">%1$s</xliff:g> אחוזים, הזמן הנותר המשוער על סמך השימוש שלך: <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"הסוללה בטעינה, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string> <string name="accessibility_settings_button" msgid="2197034218538913880">"הגדרות מערכת"</string> <string name="accessibility_notifications_button" msgid="3960913924189228831">"התראות"</string> @@ -249,8 +248,8 @@ <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"מסך נעילה."</string> <string name="accessibility_desc_settings" msgid="6728577365389151969">"הגדרות"</string> <string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"סקירה."</string> - <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה בעבודה"</string> - <string name="accessibility_desc_close" msgid="8293708213442107755">"סגור"</string> + <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה של עבודה"</string> + <string name="accessibility_desc_close" msgid="8293708213442107755">"סגירה"</string> <string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi כבוי."</string> <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi מופעל."</string> @@ -337,7 +336,7 @@ <string name="quick_settings_dnd_none_label" msgid="8420869988472836354">"שקט מוחלט"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> מכשירים)"</string> - <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"Bluetooth מופסק"</string> + <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"Bluetooth כבוי"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"אין מכשירים מותאמים זמינים"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> סוללה"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"אודיו"</string> @@ -386,15 +385,13 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"היפוך צבעים"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"מצב תיקון צבע"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"הגדרות נוספות"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"הגדרות המשתמש"</string> <string name="quick_settings_done" msgid="2163641301648855793">"בוצע"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"סגירה"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"מחובר"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"מחובר, הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"מתחבר..."</string> - <string name="quick_settings_tethering_label" msgid="5257299852322475780">"שיתוף אינטרנט בין ניידים"</string> + <string name="quick_settings_tethering_label" msgid="5257299852322475780">"שיתוף אינטרנט בין מכשירים"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"נקודת אינטרנט (hotspot)"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"ההפעלה מתבצעת…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"חוסך הנתונים פועל"</string> @@ -528,7 +525,7 @@ <string name="vpn_footer" msgid="3457155078010607471">"ייתכן שהרשת נמצאת במעקב"</string> <string name="branded_vpn_footer" msgid="816930186313188514">"ייתכן שהרשת מנוטרת"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"המכשיר הזה מנוהל על ידי ההורה שלך"</string> - <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"הארגון שלך הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת"</string> + <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"הארגון שלך הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"הארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת"</string> <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"המכשיר הזה התקבל מ-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="quick_settings_disclosure_management_named_vpn" msgid="6096715329056415588">"המכשיר הזה שייך לארגון שלך, והוא מחובר ל-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"המכשיר הזה שייך לארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> והוא מחובר לרשתות VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"הארגון שלך יכול לנטר את התנועה ברשת בפרופיל העבודה שלך"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"הארגון <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> עשוי לנטר את התנועה ברשת בפרופיל העבודה שלך"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"הפעילות ברשת של פרופיל עבודה גלויה למנהל ה-IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ייתכן שהרשת מנוטרת"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"המכשיר הזה מחובר לרשתות VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"פרופיל העבודה שלך מחובר ל-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -962,12 +958,12 @@ <string name="notification_channel_storage" msgid="2720725707628094977">"אחסון"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"טיפים"</string> <string name="instant_apps" msgid="8337185853050247304">"אפליקציות ללא התקנה"</string> - <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> פועלת"</string> + <string name="instant_apps_title" msgid="8942706782103036910">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת"</string> <string name="instant_apps_message" msgid="6112428971833011754">"האפליקציה נפתחת בלי התקנה."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"האפליקציה נפתחת בלי התקנה. אפשר להקיש כדי לקבל מידע נוסף."</string> <string name="app_info" msgid="5153758994129963243">"פרטי האפליקציה"</string> <string name="go_to_web" msgid="636673528981366511">"מעבר אל הדפדפן"</string> - <string name="mobile_data" msgid="4564407557775397216">"נתונים סלולריים"</string> + <string name="mobile_data" msgid="4564407557775397216">"חבילת גלישה"</string> <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string> <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi כבוי"</string> @@ -975,7 +971,7 @@ <string name="dnd_is_off" msgid="3185706903793094463">"מצב \'נא לא להפריע\' כבוי"</string> <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"מצב \'נא לא להפריע\' הופעל על ידי כלל אוטומטי (<xliff:g id="ID_1">%s</xliff:g>)."</string> <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה (<xliff:g id="ID_1">%s</xliff:g>)."</string> - <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"מצב \'נא לא להפריע להפריע\' הופעל על ידי אפליקציה או על ידי כלל אוטומטי."</string> + <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה או על ידי כלל אוטומטי."</string> <string name="qs_dnd_until" msgid="7844269319043747955">"עד <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="qs_dnd_keep" msgid="3829697305432866434">"שמירה"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"החלף"</string> @@ -1081,7 +1077,7 @@ <string name="controls_confirmation_confirming" msgid="2596071302617310665">"בתהליך אישור…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"יש לאשר את השינוי עבור <xliff:g id="DEVICE">%s</xliff:g>"</string> <string name="controls_structure_tooltip" msgid="4355922222944447867">"יש להחליק כדי להציג עוד פריטים"</string> - <string name="controls_seeding_in_progress" msgid="3033855341410264148">"בטעינת המלצות"</string> + <string name="controls_seeding_in_progress" msgid="3033855341410264148">"ההמלצות בטעינה"</string> <string name="controls_media_title" msgid="1746947284862928133">"מדיה"</string> <string name="controls_media_close_session" msgid="3957093425905475065">"הסתרת הסשן הנוכחי."</string> <string name="controls_media_active_session" msgid="1984383994625845642">"לא ניתן להסתיר את הסשן הנוכחי."</string> @@ -1097,7 +1093,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"לא ניתן לטעון את הסטטוס"</string> <string name="controls_error_failed" msgid="960228639198558525">"שגיאה, יש לנסות שוב"</string> <string name="controls_in_progress" msgid="4421080500238215939">"בתהליך"</string> - <string name="controls_added_tooltip" msgid="4842812921719153085">"ניתן ללחוץ על לחצן ההפעלה כדי להציג פקדים חדשים"</string> + <string name="controls_added_tooltip" msgid="4842812921719153085">"אפשר ללחוץ על לחצן ההפעלה כדי להציג פקדים חדשים"</string> <string name="controls_menu_add" msgid="4447246119229920050">"הוספת פקדים"</string> <string name="controls_menu_edit" msgid="890623986951347062">"עריכת פקדים"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"הוספת מכשירי פלט"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"פתיחת שיחה"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ווידג\'טים של שיחות"</string> <string name="select_conversation_text" msgid="3376048251434956013">"יש להקיש על שיחה כדי להוסיף אותה למסך הבית"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"לפני <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"לפני פחות מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"לפני יותר מ-<xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 742d1ae28f1e..980506d75fee 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"スクリーンショットの作成はアプリまたは組織で許可されていません"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"編集"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"スクリーンショットを編集します"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"キャプチャ範囲を拡大"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"スクリーンショットを閉じます"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"上部境界"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"色を反転"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"色補正モード"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"詳細設定"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ユーザー設定"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完了"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"閉じる"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"接続済み"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"接続済み、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"接続しています..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"これは <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> が所有するデバイスで、VPN に接続しています"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"組織は仕事用プロファイルのネットワーク トラフィックを監視することがあります"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> によってこの仕事用プロファイルのネットワーク トラフィックが監視されることもあります"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"仕事用プロファイルのネットワーク アクティビティは IT 管理者に公開されます"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ネットワークが監視されることもあります"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"このデバイスは VPN に接続しています"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"この仕事用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"空の会話"</string> <string name="select_conversation_title" msgid="6716364118095089519">"会話ウィジェット"</string> <string name="select_conversation_text" msgid="3376048251434956013">"会話をタップするとホーム画面に追加されます"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>前まで"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>以上前"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 8e260ca44af8..8788defc0913 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ეკრანის ანაბეჭდების შექმნა არ არის ნებადართული აპის ან თქვენი ორგანიზაციის მიერ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"რედაქტირება"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ეკრანის ანაბეჭდის რედაქტირება"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"მეტის აღბეჭდვა"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ეკრანის ანაბეჭდის დახურვა"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ეკრანის ანაბეჭდის გადახედვა"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ზედა საზღვარი"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ფერების შებრუნება"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ფერთა კორექციის რეჟიმი"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"დამატებითი პარამეტრები"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"მომხმარებლის პარამეტრები"</string> <string name="quick_settings_done" msgid="2163641301648855793">"დასრულდა"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"დახურვა"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"დაკავშირებულია"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"დაკავშირებულია. ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"დაკავშირება..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ამ მოწყობილობას ფლობს <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> და ის დაკავშირებულია VPN-ებთან"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"თქვენს ორგანიზაციას სამსახურის პროფილში ქსელის ტრაფიკის მონიტორინგი შეუძლია"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-ს სამსახურის პროფილში ქსელის ტრაფიკის მონიტორინგი შეუძლია"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"სამსახურის პროფილის ქსელის აქტივობა ხილულია თქვენი IT ადმინისტრატორისთვის"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ქსელზე შესაძლოა ხორციელდებოდეს მონიტორინგი"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ეს მოწყობილობა დაკავშირებულია VPN-ებთან"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"თქვენი სამსახურის პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"მიმოწერის გახსნა"</string> <string name="select_conversation_title" msgid="6716364118095089519">"საუბრის ვიჯეტები"</string> <string name="select_conversation_text" msgid="3376048251434956013">"შეეხეთ საუბარს მის თქვენს მთავარ ეკრანზე დასამატებლად"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>-ს წინ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე ნაკლები ხნის წინ"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-ზე მეტი ხნის წინ"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 4567410db766..2b7e908adfe0 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Қолданба немесе ұйым скриншоттар түсіруге рұқсат етпейді"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Өзгерту"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотты өзгерту"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Тағы суретке түсіру"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотты жабу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Жоғарғы шектік сызық"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Түстерді инверсиялау"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Түсті түзету режимі"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Қосымша параметрлер"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пайдаланушы параметрлері"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Дайын"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Жабу"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Қосылды"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Қосылды, батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Қосылуда…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Бұл құрылғы <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ұйымына тиесілі және VPN-дерге қосылған."</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ұйымыңыз жұмыс профиліңіздегі желі трафигін бақылауы мүмкін"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> жұмыс профиліңіздегі желі трафигін бақылауы мүмкін"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Желіде жұмыс профилі арқылы не істелгені әкімшіге көрініп тұрады."</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Желі бақылануы мүмкін"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Бұл құрылғы VPN-дерге қосылған."</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Жұмыс профиліңіз <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған."</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Ашық әңгіме"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Әңгіме виджеттері"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Негізгі экранға қосқыңыз келетін әңгімені түртіңіз."</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Максимум <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string> <string name="over_timestamp" msgid="4765793502859358634">"Кемінде <xliff:g id="DURATION">%1$s</xliff:g> бұрын"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index d79144d23a6a..a09b21614d96 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ការថតរូបអេក្រង់មិនត្រូវបានអនុញ្ញាតដោយកម្មវិធីនេះ ឬស្ថាប័នរបស់អ្នក"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"កែ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"កែរូបថតអេក្រង់"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ថតច្រើនទៀត"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ច្រានចោលរូបថតអេក្រង់"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើលរូបថតអេក្រង់សាកល្បង"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"បន្ទាត់បែងចែកខាងលើ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ដាក់បញ្ច្រាសពណ៌"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"របៀបកែពណ៌"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ការកំណត់ច្រើនទៀត"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ការកំណត់អ្នកប្រើប្រាស់"</string> <string name="quick_settings_done" msgid="2163641301648855793">"រួចរាល់"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"បិទ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"បានភ្ជាប់"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"បានភ្ជាប់ ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"កំពុងតភ្ជាប់..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ឧបករណ៍នេះគឺជាកម្មសិទ្ធិរបស់ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> និងត្រូវបានភ្ជាប់ទៅ VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ស្ថាប័នរបស់អ្នកអាចនឹងតាមដានចរាចរណ៍បណ្តាញនៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> អាចនឹងតាមដានចរាចរណ៍បណ្តាញនៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកអាចមើលឃើញសកម្មភាពបណ្ដាញនៃកម្រងព័ត៌មានការងារ"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"បណ្ដាញអាចត្រូវតាមដាន"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ឧបករណ៍នេះត្រូវបានភ្ជាប់ទៅ VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"កម្រងព័ត៌មានការងាររបស់អ្នកត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"បើកការសន្ទនា"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ធាតុក្រាហ្វិកនៃការសន្ទនា"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ចុចការសន្ទនា ដើម្បីបញ្ចូលវាទៅក្នុងអេក្រង់ដើមរបស់អ្នក"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> មុន"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"តិចជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string> <string name="over_timestamp" msgid="4765793502859358634">"ជាង <xliff:g id="DURATION">%1$s</xliff:g> មុន"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index bfc6d875af1f..a7a51050db47 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ಅಪ್ಲಿಕೇಶನ್ ಅಥವಾ ಸಂಸ್ಥೆಯು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆಯುವುದನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ಇನ್ನಷ್ಟು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್ಶಾಟ್ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ಮೇಲಿನ ಗಡಿರೇಖೆ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ಬಣ್ಣಗಳನ್ನು ಇನ್ವರ್ಟ್ ಮಾಡಿ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ ಮೋಡ್"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ಮುಚ್ಚಿರಿ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ಸಂಪರ್ಕಗೊಂಡಿದೆ, ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ಈ ಸಾಧನವು <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ಗೆ ಸೇರಿದೆ ಮತ್ತು VPN ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರಿಗೆ ಗೋಚರಿಸುತ್ತದೆ"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ನೆಟ್ವರ್ಕ್ನ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾಗಿದೆ"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ಈ ಸಾಧನವು VPN ಗಳಿಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ಸಂಭಾಷಣೆಯನ್ನು ತೆರೆಯಿರಿ"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ಸಂಭಾಷಣೆ ವಿಜೆಟ್ಗಳು"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ಸಂಭಾಷಣೆಯನ್ನು ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಸೇರಿಸಲು ಅದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ಸಮಯದ ಹಿಂದೆ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಕಡಿಮೆ ಅವಧಿಯ ಹಿಂದೆ"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ಗಿಂತ ಹೆಚ್ಚಿನ ಅವಧಿಯ ಹಿಂದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e2193ee0ab7e..bac0570b370c 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"앱이나 조직에서 스크린샷 촬영을 허용하지 않습니다."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"수정"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"스크린샷 수정"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"더 캡처하기"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"스크린샷 닫기"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"상단 경계"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"색상 반전"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"색상 보정 모드"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"설정 더보기"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"사용자 설정"</string> <string name="quick_settings_done" msgid="2163641301648855793">"완료"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"닫기"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"연결됨"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"연결됨, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"연결 중..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에 속한 기기이며 VPN에 연결되었습니다."</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"조직에서 직장 프로필의 네트워크 트래픽을 모니터링할 수 있습니다."</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에서 내 직장 프로필의 네트워크 트래픽을 모니터링할 수 있습니다."</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"직장 프로필의 네트워크 활동은 IT 관리자에게 공개됩니다."</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"네트워크가 모니터링될 수 있습니다."</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"기기가 VPN에 연결되었습니다."</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"직장 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다."</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"대화 열기"</string> <string name="select_conversation_title" msgid="6716364118095089519">"대화 위젯"</string> <string name="select_conversation_text" msgid="3376048251434956013">"대화를 탭하여 홈 화면에 추가하세요."</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> 전"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> 이내"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> 이상 경과"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index e7a45b24491c..0f395363ed82 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1100,6 +1100,14 @@ <string name="basic_status" msgid="2315371112182658176">"Маекти ачуу"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Маек виджеттери"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Маекти Башкы экранга кошуу үчүн таптап коюңуз"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> мурда"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> жетпеген убакыт мурда"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ашуун мурда"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 2416dee4b58f..53cd88b55560 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ແອັບ ຫຼື ອົງກອນຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຖ່າຍຮູບໜ້າຈໍ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ແກ້ໄຂ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ແກ້ໄຂຮູບໜ້າຈໍ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ບັນທຶກເພີ່ມເຕີມ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ປິດຮູບໜ້າຈໍ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ຕົວຢ່າງຮູບໜ້າຈໍ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ຂອບເຂດທາງເທິງ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ສະຫຼັບສີ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ໂໝດການແກ້ໄຂສີ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ຕັ້ງຄ່າຜູ້ໃຊ້"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ແລ້ວໆ"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ປິດ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ເຊື່ອມຕໍ່ແລ້ວ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ເຊື່ອມຕໍ່ແລ້ວ, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"ກຳລັງເຊື່ອມຕໍ່..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ອຸປະກອນນີ້ເປັນຂອງ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ແລະ ເຊື່ອມຕໍ່ຫາ VPN ແລ້ວ"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ອົງກອນຂອງທ່ານສາມາດຕິດຕາມທຣາບຟິກເຄືອຂ່າຍໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານໄດ້"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ສາມາດຕິດຕາມທຣາບຟິກເຄືອຂ່າຍໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານໄດ້"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ການເຄື່ອນໄຫວເຄືອຂ່າຍໂປຣໄຟລ໌ບ່ອນເຮັດວຽກແມ່ນສະແດງໃຫ້ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານເຫັນໄດ້"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ເຄືອຂ່າຍອາດຖືກຕິດຕາມ"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານເຊື່ອມຕໍ່ຫາ VPN ແລ້ວ"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ເປີດການສົນທະນາ"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ວິດເຈັດການສົນທະນາ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ແຕະໃສ່ການສົນທະນາໃດໜຶ່ງເພື່ອເພີ່ມມັນໃສ່ໂຮມສະກຣີນຂອງທ່ານ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"ບໍ່ຮອດ <xliff:g id="DURATION">%1$s</xliff:g> ກ່ອນ"</string> <string name="over_timestamp" msgid="4765793502859358634">"ເກີນ <xliff:g id="DURATION">%1$s</xliff:g> ມາແລ້ວ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 698bc9fff516..fdfb954d41f5 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Jūsų organizacijoje arba naudojant šią programą neleidžiama daryti ekrano kopijų"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Redaguoti"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Redaguoti ekrano kopiją"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fiksuoti daugiau"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Praleisti ekrano kopiją"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Viršutinė riba"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Pakeisti spalvas"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Spalvų taisymo režimas"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Daugiau nustatymų"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Naudotojo nustatymai"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Atlikta"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Uždaryti"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Prijungtas"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Prijungta, akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Prisijungiama..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Šis įrenginys priklauso „<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ ir yra prijungtas prie VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jūsų organizacija darbo profilyje gali stebėti tinklo srautą"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"„<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“ darbo profilyje gali stebėti tinklo srautą"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Darbo profilio tinklo veiklą mato jūsų IT administratorius"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Tinklas gali būti stebimas"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Šis įrenginys prijungtas prie VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Darbo profilis susietas su „<xliff:g id="VPN_APP">%1$s</xliff:g>“"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Atidaryti pokalbį"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Pokalbio valdikliai"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Palieskite pokalbį, kad pridėtumėte jį prie pagrindinio ekrano"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Mažiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Daugiau nei prieš <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index e7380cd33384..4f6764871fe8 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Lietotne vai jūsu organizācija neatļauj veikt ekrānuzņēmumus."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediģēt"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediģēt ekrānuzņēmumu"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tvert vairāk"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Nerādīt ekrānuzņēmumu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Augšējā robeža"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertēt krāsas"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Krāsu korekcijas režīms"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Vairāk iestatījumu"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Lietotāja iestatījumi"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gatavs"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Aizvērt"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Pievienota"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Savienojums izveidots, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Notiek savienojuma izveide…"</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Šī ierīce pieder organizācijai<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> un ir savienota ar virtuālajiem privātajiem tīkliem."</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Jūsu organizācija var uzraudzīt jūsu darba profila tīkla datplūsmu."</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> var uzraudzīt jūsu profila tīkla datplūsmu."</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT administrators var skatīt tīklā veiktās darbības, kurām izmantojat darba profilu"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Var tikt pārraudzītas tīklā veiktās darbības."</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Šī ierīce ir saistīta ar virtuālajiem privātajiem tīkliem."</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jūsu darba profils ir savienots ar: <xliff:g id="VPN_APP">%1$s</xliff:g>."</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Atvērt sarunu"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Sarunu logrīki"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Pieskarieties kādai sarunai, lai pievienotu to savam sākuma ekrānam."</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Pirms šāda laika: <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Pirms mazāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Pirms vairāk nekā: <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index fbf8b4706b5a..c72f6720c4e1 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликацијата или вашата организација не дозволува снимање слики од екранот"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Изменете ја сликата од екранот"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Сними повеќе"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отфрлете ја сликата од екранот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Преврти ги боите"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим за корекција на бои"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Повеќе поставки"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Поставки на корисникот"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Поврзано"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Поврзан, ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Се поврзува..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Уредов е во сопственост на <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и е поврзан со VPN-мрежи"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Вашата организација може да го следи мрежниот сообраќај на вашиот работен профил"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да го следи мрежниот сообраќај на вашиот работен профил"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Мрежната активност на работниот профил е видлива за вашиот IT-администратор"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежата можеби се следи"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Уредов е поврзан со VPN-мрежи"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Вашиот работен профил е поврзан со <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Започни разговор"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Виџети за разговор"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Допрете на разговор за да го додадете на вашиот почетен екран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Пред <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Пред помалку од <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Пред повеќе од <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index a0cd24dd9a12..47ea733c0c2b 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"എഡിറ്റ് ചെയ്യുക"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"സ്ക്രീൻഷോട്ട് എഡിറ്റ് ചെയ്യുക"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"കൂടുതൽ ക്യാപ്ചർ ചെയ്യുക"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"സ്ക്രീൻഷോട്ട് പ്രിവ്യു"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"മുകളിലുള്ള അതിർത്തി"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"നെഗറ്റീവ് ലുക്ക്"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"വർണ്ണം ശരിയാക്കൽ മോഡ്"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ഉപയോക്തൃ ക്രമീകരണം"</string> <string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"അടയ്ക്കുക"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"കണക്റ്റുചെയ്തു"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"കണക്റ്റുചെയ്തു, ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"കണക്റ്റുചെയ്യുന്നു..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ഈ ഉപകരണം <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> എന്ന സ്ഥാപനത്തിന്റേതാണ്, കൂടാതെ VPN-കളിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കാൻ നിങ്ങളുടെ സ്ഥാപനത്തിന് കഴിഞ്ഞേക്കാം"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വർക്ക് ട്രാഫിക്ക് <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> നിരീക്ഷിച്ചേക്കാം"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ഔദ്യോഗിക പ്രൊഫൈലിലെ നെറ്റ്വര്ക്ക് ആക്റ്റിവിറ്റി ഐടി അഡ്മിന് കാണാനാകും"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ഈ ഉപകരണം VPN-കളിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"<xliff:g id="VPN_APP">%1$s</xliff:g> എന്നതിലേക്ക് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"സംഭാഷണം തുറക്കുക"</string> <string name="select_conversation_title" msgid="6716364118095089519">"സംഭാഷണ വിജറ്റുകൾ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"നിങ്ങളുടെ ഹോം സ്ക്രീനിൽ ചേർക്കാൻ സംഭാഷണത്തിൽ ടാപ്പ് ചെയ്യുക"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> എന്നതിൽ കുറവ്"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> മുമ്പ്"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 4642d3ddc5d3..a196280c7a1d 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Таны апп, байгууллагад дэлгэцийн зураг авахыг зөвшөөрдөггүй"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Засах"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Дэлгэцийн агшныг засах"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Ихийг багтаасан зураг авах"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Дэлгэцийн агшныг хаах"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Дээд талын хязгаар"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Өнгийг урвуулах"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Өнгө залруулах горим"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Бусад тохиргоо"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Хэрэглэгчийн тохиргоо"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Дууссан"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Хаах"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Холбогдсон"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Холбогдсон, батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Холбогдож байна..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Энэ төхөөрөмж <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>-д харьяалагддаг бөгөөд VPN-д холбогдсон байна"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Таны байгууллага таны ажлын профайлын сүлжээний ачааллыг хянадаг"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> таны ажлын профайлын сүлжээний ачааллыг хянадаг"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Таны IT админд ажлын профайлын сүлжээний үйл ажиллагаа харагдана"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Сүлжээг хянаж байж болзошгүй"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Энэ төхөөрөмж VPN-д холбогдсон байна"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Таны ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Харилцан яриаг нээх"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Харилцан ярианы жижиг хэрэгслүүд"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Үндсэн нүүрэндээ нэмэх харилцан яриаг товшино уу"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>-н өмнө"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>-с бага хугацааны өмнө"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>-с дээш хугацааны өмнө"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 0de9a97ff1d8..3df8b926037e 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"अॅप किंवा आपल्या संस्थेद्वारे स्क्रीनशॉट घेण्याची अनुमती नाही"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"संपादित करा"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट संपादित करा"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"आणखी गोष्टी कॅप्चर करा"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"सर्वात वरची सीमा"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उलटे करा"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"रंग सुधारणा मोड"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"अधिक सेटिंग्ज"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"वापरकर्ता सेटिंग्ज"</string> <string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बंद करा"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"कनेक्ट केलेले"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"कनेक्ट केलेले आहे, बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"कनेक्ट करत आहे..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> चे आहे आणि ते VPN ना कनेक्ट केले आहे"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"तुमची संस्था आपल्या कार्य प्रोफाइलमधील नेटवर्क रहदारीचे परीक्षण करू शकते"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपल्या कार्य प्रोफाइलमधील नेटवर्क रहदारीचे परीक्षण करू शकते"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"तुमच्या IT ॲडमिनला कार्य प्रोफाइलची नेटवर्क अॅक्टिव्हिटी दृश्यमान आहे"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"हे डिव्हाइस VPN ला कनेक्ट केले आहे"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"तुमची कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> ला कनेक्ट केली"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"संभाषण उघडा"</string> <string name="select_conversation_title" msgid="6716364118095089519">"संभाषण विजेट"</string> <string name="select_conversation_text" msgid="3376048251434956013">"तुमच्या होम स्क्रीन वर संभाषण जोडण्यासाठी त्यावर टॅप करा"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> पूर्वी"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा कमी"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> पेक्षा आधी"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index eb0ddd5d09f0..7095ac3b3303 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Pengambilan tangkapan skrin tidak dibenarkan oleh apl atau organisasi anda"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit tangkapan skrin"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tangkap lebih banyak"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ketepikan tangkapan skrin"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Sempadan atas"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Songsangkan warna"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mod pembetulan warna"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Lagi tetapan"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Tetapan pengguna"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Disambungkan"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Disambungkan, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Peranti ini milik <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dan dihubungkan dengan VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasi anda mungkin memantau trafik rangkaian dalam profil kerja anda"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mungkin memantau trafik rangkaian dalam profil kerja anda"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktiviti rangkaian profil kerja boleh dilihat oleh pentadbir IT anda"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Rangkaian mungkin dipantau"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Peranti ini dihubungkan dengan VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profil kerja anda dihubungkan dengan <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Buka perbualan"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widget perbualan"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Ketik perbualan untuk menambahkan perbualan itu pada skrin Utama anda"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Kurang daripada <xliff:g id="DURATION">%1$s</xliff:g> lalu"</string> <string name="over_timestamp" msgid="4765793502859358634">"Lebih <xliff:g id="DURATION">%1$s</xliff:g> yang lalu"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 5f8ae62858b5..eddf58b097e3 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ဖန်သားပြင်ဓာတ်ပုံရိုက်ကူးခြင်းကို ဤအက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"တည်းဖြတ်ရန်"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ဖန်သားပြင်ဓာတ်ပုံကို တည်းဖြတ်သည်"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"နောက်ထပ် ရိုက်ကူးရန်"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ဖန်သားပြင်ဓာတ်ပုံကို ပယ်သည်"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ထိပ်ပိုင်းအနားသတ်"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"အရောင်ပြောင်းပြန်"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"အရောင် မှန်ကန်စေခြင်း အခြေအနေ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"နောက်ထပ် ဆက်တင်များ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"အသုံးပြုသူ ဆက်တင်များ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ပြီးပါပြီ"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ပိတ်ရန်"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ချိတ်ဆက်ထား"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ချိတ်ဆက်ပြီးပါပြီ၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"ဆက်သွယ်နေ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ဤစက်ကို <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> က ပိုင်ဆိုင်ပြီး VPN များသို့ ချိတ်ဆက်ထားပါသည်"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"သင်၏ အဖွဲ့အစည်းက သင့်အလုပ်ပရိုဖိုင်ရှိ ကွန်ရက်ဒေတာ စီးဆင်းမှုကို စောင့်ကြည့်နိုင်သည်"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> သည် သင်၏ အလုပ်ပရိုဖိုင်ရှိ ကွန်ရက်ဒေတာ စီးဆင်းမှုကို စောင့်ကြည့်နိုင်ပါသည်"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"အလုပ်ပရိုဖိုင်ကွန်ရက် လုပ်ဆောင်ချက်ကို သင့် IT စီမံခန့်ခွဲသူက မြင်နိုင်သည်"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ကွန်ရက်ကို စောင့်ကြည့်နိုင်ပါသည်"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ဤစက်ကို VPN များသို့ ချိတ်ဆက်ထားပါသည်"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"သင်၏အလုပ်ပရိုဖိုင်သည် <xliff:g id="VPN_APP">%1$s</xliff:g> ကို ချိတ်ဆက်ထားပါသည်"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string> <string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"စကားဝိုင်းကို သင်၏ ‘ပင်မစာမျက်နှာ’ သို့ထည့်ရန် တို့ပါ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"ပြီးခဲ့သည့် <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> မပြည့်ခင်"</string> <string name="over_timestamp" msgid="4765793502859358634">"ပြီးခဲ့သော <xliff:g id="DURATION">%1$s</xliff:g> ကျော်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index b0c746539507..0262a7dab5a6 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger skjermdumpen"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Ta bilde av mer"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Avvis skjermdumpen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Øvre grense"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter farger"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modus for fargekorrigering"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere innstillinger"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brukerinnstillinger"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Ferdig"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Lukk"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Tilkoblet"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Tilkoblet, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Kobler til …"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Denne enheten tilhører <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> og er koblet til VPN-er"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisasjonen din kan overvåke nettverkstrafikken i jobbprofilen din"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan overvåke nettverkstrafikken i jobbprofilen din"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Nettverksaktiviteten i jobbprofilen er synlig for IT-administratoren din"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Nettverket kan bli overvåket"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Denne enheten er koblet til VPN-er"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jobbprofilen din er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Åpen samtale"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Samtalemoduler"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Trykk på en samtale for å legge den til på startskjermen"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"For <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"For mindre enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> <string name="over_timestamp" msgid="4765793502859358634">"For mer enn <xliff:g id="DURATION">%1$s</xliff:g> siden"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index e4fc4927bf57..e772622275d2 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त एप वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"सम्पादन गर्नुहोस्"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रिनसट सम्पादन गर्नुहोस्"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"अन्य कुराहरू खिच्नुहोस्"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"सिरानको सीमा"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"रंग उल्टाउनुहोस्"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"रङ्ग सुधार मोड"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"थप सेटिङहरू"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"प्रयोगकर्तासम्बन्धी सेटिङ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"भयो"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"बन्द गर्नुहोस्"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"जोडिएको"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"यन्त्र जडान भयो, ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"जडान हुँदै..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> को स्वामित्वमा छ र VPN हरूमा कनेक्ट गरिएको छ"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा नेटवर्कको ट्राफिकको अनुगमन गर्न पनि सक्छ"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलमा नेटवर्क ट्राफिकको अनुगमन गर्न पनि सक्छ"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"तपाईंका IT एड्मिन कार्य प्रोफाइलमा गरिने नेटवर्कसम्बन्धी क्रियाकलाप देख्न सक्नुहुन्छ"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"नेटवर्कको अनुगमन हुनसक्छ"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"यो यन्त्र VPN हरूमा कनेक्ट गरिएको छ"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"तपाईंको कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> मा कनेक्ट गरिएको छ"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"वार्तालाप खोल्नुहोस्"</string> <string name="select_conversation_title" msgid="6716364118095089519">"वार्तालापसम्बन्धी विजेटहरू"</string> <string name="select_conversation_text" msgid="3376048251434956013">"कुनै वार्तालाप होम स्क्रिनमा हाल्न उक्त वार्तालापमा ट्याप गर्नुहोस्"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> अघि"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा कम समयअघि"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> भन्दा बढी समयअघि"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 32886c127036..5573f7da54ae 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Het maken van screenshots wordt niet toegestaan door de app of je organisatie"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Bewerken"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bewerken"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Meer opnemen"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot sluiten"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Voorbeeld van screenshot"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Bovengrens"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Kleuren omkeren"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modus voor kleurcorrectie"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellingen"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikersinstellingen"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Sluiten"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Verbonden"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Verbonden, batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Verbinding maken…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dit apparaat is eigendom van <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> en is verbonden met VPN\'s"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Je organisatie kan het netwerkverkeer in je werkprofiel bijhouden"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan het netwerkverkeer in je werkprofiel bijhouden"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"De netwerkactiviteit van je werkprofiel is zichtbaar voor je IT-beheerder"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Netwerk kan worden bijgehouden"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dit apparaat is verbonden met VPN\'s"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Je werkprofiel is verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -648,7 +644,7 @@ <string name="output_title" msgid="3938776561655668350">"Media-uitvoer"</string> <string name="output_calls_title" msgid="7085583034267889109">"Uitvoer van telefoongesprek"</string> <string name="output_none_found" msgid="5488087293120982770">"Geen apparaten gevonden"</string> - <string name="output_none_found_service_off" msgid="935667567681386368">"Geen apparaten gevonden. Probeer <xliff:g id="SERVICE">%1$s</xliff:g> in te schakelen."</string> + <string name="output_none_found_service_off" msgid="935667567681386368">"Geen apparaten gevonden. Probeer <xliff:g id="SERVICE">%1$s</xliff:g> aan te zetten."</string> <string name="output_service_bt" msgid="4315362133973911687">"Bluetooth"</string> <string name="output_service_wifi" msgid="9003667810868222134">"Wifi"</string> <string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth en wifi"</string> @@ -669,7 +665,7 @@ <string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string> <string name="add_tile" msgid="6239678623873086686">"Tegel toevoegen"</string> <string name="broadcast_tile" msgid="5224010633596487481">"Tegel \'Uitzenden\'"</string> - <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g> tenzij je dit voor die tijd uitschakelt"</string> + <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g> tenzij je dit voor die tijd uitzet"</string> <string name="zen_alarm_warning" msgid="7844303238486849503">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="alarm_template" msgid="2234991538018805736">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="alarm_template_far" msgid="3561752195856839456">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string> @@ -981,7 +977,7 @@ <string name="slice_permission_checkbox" msgid="4242888137592298523">"<xliff:g id="APP">%1$s</xliff:g> toestaan om segmenten van apps te tonen"</string> <string name="slice_permission_allow" msgid="6340449521277951123">"Toestaan"</string> <string name="slice_permission_deny" msgid="6870256451658176895">"Weigeren"</string> - <string name="auto_saver_title" msgid="6873691178754086596">"Tikken om Batterijbesparing in te schakelen"</string> + <string name="auto_saver_title" msgid="6873691178754086596">"Tikken om Batterijbesparing aan te zetten"</string> <string name="auto_saver_text" msgid="3214960308353838764">"Aanzetten als de batterij waarschijnlijk leeg raakt"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"Nee"</string> <string name="auto_saver_enabled_title" msgid="4294726198280286333">"Batterijbesparing staat aan"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Gesprek openen"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Gesprekswidgets"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tik op een gesprek om het toe te voegen aan je startscherm"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> geleden"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Minder dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string> <string name="over_timestamp" msgid="4765793502859358634">"Meer dan <xliff:g id="DURATION">%1$s</xliff:g> geleden"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index a14aa18f7f5b..811ae0b8d4bb 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ଆପ୍ କିମ୍ବା ସଂସ୍ଥା ଦ୍ୱାରା ସ୍କ୍ରୀନଶଟ୍ ନେବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ଏଡିଟ୍ କରନ୍ତୁ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ସ୍କ୍ରିନସଟ୍ ଏଡିଟ୍ କରନ୍ତୁ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ଅଧିକ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ଶୀର୍ଷ ସୀମାରେଖା"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ରଙ୍ଗ ଇନଭାର୍ଟ୍ କରନ୍ତୁ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ରଙ୍ଗ ସଂଶୋଧନ ମୋଡ୍"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ଅଧିକ ସେଟିଂସ୍"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ଉପଯୋଗକର୍ତ୍ତା ସେଟିଂସ୍"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ସଂଯୁକ୍ତ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"କନେକ୍ଟ ରହିଛି, ବ୍ୟାଟେରୀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"ସଂଯୋଗ କରୁଛି..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ଏହି ଡିଭାଇସଟି <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>ର ଅଟେ ଏବଂ ଏହା VPNଗୁଡ଼ିକ ସହ ସଂଯୁକ୍ତ ଅଛି"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ଆପଣଙ୍କ ସଂସ୍ଥା ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲରେ ନେଟୱର୍କ ଟ୍ରାଫିକ୍ ନୀରିକ୍ଷଣ କରିପାରନ୍ତି"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପ ଆପଣଙ୍କ IT ଆଡମିନଙ୍କୁ ଦେଖାଯିବ"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ନେଟୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ଏହି ଡିଭାଇସଟି VPNଗୁଡ଼ିକ ସହ ସଂଯୁକ୍ତ ଅଛି"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ <xliff:g id="VPN_APP">%1$s</xliff:g> ସହ ସଂଯୁକ୍ତ ଅଛି"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ବାର୍ତ୍ତାଳାପ ଖୋଲନ୍ତୁ"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ବାର୍ତ୍ତାଳାପ ୱିଜେଟଗୁଡ଼ିକ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ଏକ ବାର୍ତ୍ତାଳାପକୁ ଆପଣଙ୍କ ମୂଳସ୍କ୍ରିନରେ ଯୋଗ କରିବା ପାଇଁ ସେଥିରେ ଟାପ୍ କରନ୍ତୁ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ପୂର୍ବେ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ କମ୍ ସମୟ ପୂର୍ବେ"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>ରୁ ଅଧିକ ସମୟ ପୂର୍ବେ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 2b745df072a9..daae60d9e6e7 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"ਹੋਰ ਕੈਪਚਰ ਕਰੋ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ਉੱਪਰ ਦੀ ਸੀਮਾ"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ਰੰਗ ਪਲਟਾਓ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ਰੰਗ ਸੰਸ਼ੋਧਨ ਮੋਡ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ਬੰਦ ਕਰੋ"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ, ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ਇਹ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ ਅਤੇ VPN ਨਾਲ ਕਨੈਕਟ ਹੈ"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਦਿਖਾਈ ਦਿੰਦੀ ਹੈ"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ਇਹ ਡੀਵਾਈਸ VPN ਨਾਲ ਕਨੈਕਟ ਹੈ"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ"</string> <string name="select_conversation_title" msgid="6716364118095089519">"ਗੱਲਬਾਤ ਵਿਜੇਟ"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕੋਈ ਗੱਲਬਾਤ ਚੁਣੋ"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ਪਹਿਲਾਂ"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਪਹਿਲਾਂ"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਪਹਿਲਾਂ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index b0ee6e7790f6..2bd09c88c704 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nie możesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Edytuj"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Edytuj zrzut ekranu"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zarejestruj więcej danych"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zamknij zrzut ekranu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Górna granica"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Odwróć kolory"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Tryb korekcji kolorów"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Więcej ustawień"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ustawienia użytkownika"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Gotowe"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zamknij"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Połączono"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Połączono, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Łączę..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"To urządzenie należy do organizacji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i jest połączone z sieciami VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Twoja organizacja może monitorować ruch w sieci w Twoim profilu służbowym"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> może monitorować ruch w sieci w Twoim profilu służbowym"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktywność w sieci w profilu służbowym jest widoczna dla Twojego administratora IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Sieć może być monitorowana"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"To urządzenie jest połączone z sieciami VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Twój profil służbowy jest połączony z siecią <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otwarta rozmowa"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widżety Rozmowa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Kliknij rozmowę, aby dodać ją do ekranu głównego"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> temu"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Mniej niż <xliff:g id="DURATION">%1$s</xliff:g> temu"</string> <string name="over_timestamp" msgid="4765793502859358634">"Ponad <xliff:g id="DURATION">%1$s</xliff:g> temu"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 48615490d3a1..805a673b209d 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1096,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toque em uma conversa para adicioná-la à tela inicial"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> <string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index d8fc15702598..5a6cdb64715f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"A app ou a sua entidade não permitem tirar capturas de ecrã"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de ecrã"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar captura de ecrã"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pré-visualização da captura de ecrã"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superior"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverter cores"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modo de correção de cor"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais definições"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Definições do utilizador"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Fechar"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Ligado"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ligado, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"A ligar..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertence à entidade <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> e está ligado a VPNs."</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"A sua entidade pode monitorizar o tráfego de rede no seu perfil de trabalho"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"A <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> pode monitorizar o tráfego de rede no seu perfil de trabalho"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"A atividade da rede do perfil de trabalho fica visível para o administrador de TI"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"A rede pode ser monitorizada"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está ligado a VPNs."</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"O seu perfil de trabalho está ligado a <xliff:g id="VPN_APP">%1$s</xliff:g>."</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Abrir conversa"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toque numa conversa para a adicionar ao ecrã principal"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Há <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Há menos de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Há mais de <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 48615490d3a1..805a673b209d 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1096,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Conversa aberta"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgets de conversa"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Toque em uma conversa para adicioná-la à tela inicial"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Menos de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> <string name="over_timestamp" msgid="4765793502859358634">"Mais de <xliff:g id="DURATION">%1$s</xliff:g> atrás"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 81b41f928b55..de49c91c8144 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Crearea capturilor de ecran nu este permisă de aplicație sau de organizația dvs."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Editați"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Editați captura de ecran"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Surprindeți mai mult"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Închideți captura de ecran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Marginea superioară"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inversați culorile"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mod de corectare a culorilor"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mai multe setări"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setări de utilizator"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Terminat"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Închideți"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Conectat"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectat, bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Se conectează..."</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Dispozitivul aparține organizației <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> și este conectat la VPN-uri"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Este posibil ca organizația dvs. să monitorizeze traficul de rețea în profilul dvs. de serviciu"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Este posibil ca <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> să monitorizeze traficul de rețea din profilul dvs. de serviciu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Activitatea din rețeaua de profiluri de serviciu este vizibilă pentru administratorul IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Este posibil ca rețeaua să fie monitorizată"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Dispozitivul este conectat la VPN-uri"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profilul dvs. de serviciu este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Deschideți conversația"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Widgeturi pentru conversație"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Atingeți o conversație ca să o adăugați pe ecranul de pornire"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Acum <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"În urmă cu mai puțin de <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"În urmă cu peste <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 8647aac904d4..3c4326616f5f 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Не удалось сделать скриншот: нет разрешения от приложения или организации."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Изменить"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Изменить скриншот"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Увеличить площадь скриншота"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрыть скриншот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граница"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Обратные цвета"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Коррекция цвета"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Настройки"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пользовательские настройки"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрыть"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Подключено"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Подключено, уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Соединение..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Это устройство принадлежит организации \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" и подключено к приложениям для VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Ваша организация может отслеживать сетевой трафик в рабочем профиле"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Организация \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\" может отслеживать сетевой трафик в вашем рабочем профиле"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Администратору доступна история действий в сети в рабочем аккаунте."</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Сеть может отслеживаться"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Это устройство подключено к приложениям для VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш рабочий профиль подключен к приложению \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Открытый чат"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Виджеты чатов"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Нажмите на чат, чтобы добавить его на главный экран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> назад"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Прошло не более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Прошло более чем <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index eb3494e242cb..02a20dbbfb70 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"තිර රූ ගැනීමට යෙදුම හෝ ඔබගේ සංවිධානය ඉඩ නොදේ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"සංස්කරණය කරන්න"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"තිර රුව සංස්කරණය කරන්න"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"තව ග්රහණය කරන්න"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"තිර රුව ඉවත ලන්න"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ඉහළම මායිම"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"වර්ණ යටිකුරු කරන්න"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"වර්ණ නිවැරදි කිරීමේ ප්රකාරය"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"තව සැකසීම්"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"පරිශීලක සැකසීම්"</string> <string name="quick_settings_done" msgid="2163641301648855793">"නිමයි"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"වසන්න"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"සම්බන්ධිත"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"සම්බන්ධිතයි, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"සම්බන්ධ වෙමින්..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"මෙම උපාංගය <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> සංවිධානයට අයිති අතර VPNs වෙත සම්බන්ධ කර ඇත"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"ඔබගේ කාර්යාල පැතිකඩ තුළ ඔබේ සංවිධානය ජාල තදබදය නිරීක්ෂණය කිරීමට හැක"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ඔබේ කාර්යාල පැතිකඩ තුළ ජාල තදබදය නිරීක්ෂණය කළ හැක"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"කාර්යාල පැතිකඩ ජාල ක්රියාකාරකම් ඔබගේ IT පරිපාලකට දෘශ්යමානය"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"මෙම උපාංගය VPNs වෙත සම්බන්ධ කර ඇත"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"ඔබේ කාර්යාල පැතිකඩ <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත සම්බන්ධ කර ඇත"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"සංවාදය විවෘත කරන්න"</string> <string name="select_conversation_title" msgid="6716364118095089519">"සංවාද විජට්"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ඔබගේ මුල් තිරයට එය එක් කිරීමට සංවාදයක් තට්ටු කරන්න"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>කට පෙර"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා අඩු කාලයකට පෙර"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>කට වඩා පෙර"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 3abd28819bda..a645d210b155 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Vytváranie snímok obrazovky je zakázané aplikáciou alebo vašou organizáciou"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Upraviť"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Upraviť snímku obrazovky"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasnímať viac"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavrieť snímku obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Horná hranica"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzia farieb"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Režim korekcie farieb"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Ďalšie nastavenia"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Používateľské nastavenia"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zavrieť"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Pripojené"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Pripojené, stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Pripája sa..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Toto zariadenie patrí organizácii <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> a je pripojené k sieťam VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizácia môže sledovať sieťovú premávku vo vašom pracovnom profile"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizácia <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> môže sledovať sieťovú premávku vo vašom pracovnom profile"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktivitu siete pracovného profilu vidí váš správca IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Sieť môže byť sledovaná"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Toto zariadenie je pripojené k sieťam VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Váš pracovný profil je pripojený k sieti <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Otvorená konverzácia"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Miniaplikácie konverzácií"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Klepnite na konverzáciu a pridajte ju tak na plochu"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Pred <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Pred menej ako <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Pred viac ako <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 180d65cce1b6..0d3ebe02cad8 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Aplikacija ali vaša organizacija ne dovoljuje posnetkov zaslona"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Urejanje posnetka zaslona"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zajemi več"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Opusti posnetek zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Predogled posnetka zaslona"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Zgornji rob"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverzija barv"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Način popravljanja barv"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Več nastavitev"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uporabniške nastavitve"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Zapri"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Povezava je vzpostavljena"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezava je vzpostavljena, raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Vzpostavljanje povezave ..."</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Ta naprava pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> in je povezana v omrežja VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Vaša organizacija lahko nadzira omrežni promet v vašem delovnem profilu"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> lahko nadzira omrežni promet v vašem delovnem profilu"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Omrežna dejavnost delovnega profila je vidna skrbniku za IT."</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Omrežje je morda nadzorovano"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Ta naprava je povezana v omrežja VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Delovni profil je povezan v aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Odprt pogovor"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Pripomočki za pogovore"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Dotaknite se pogovora, da ga dodate na začetni zaslon."</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"pred <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Pred manj kot <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Pred več kot <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index cc62da3ebb83..4f0c942ab50e 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Nxjerrja e pamjeve të ekranit nuk lejohet nga aplikacioni ose organizata jote."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifiko"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifiko pamjen e ekranit"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Shkrep më shumë"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Kufiri i sipërm"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Shkëmbe ngjyrat"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modaliteti i korrigjimit të ngjyrës"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Cilësime të tjera"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cilësimet e përdoruesit"</string> <string name="quick_settings_done" msgid="2163641301648855793">"U krye"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Mbyll"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"I lidhur"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"E lidhur, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Po lidhet..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Kjo pajisje i përket <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> dhe është e lidhur me rrjetet VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organizata jote mund të monitorojë trafikun e rrjetit në profilin tënd të punës"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> mund të monitorojë trafikun e rrjetit në profilin tënd të punës"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktiviteti i rrjetit të profilit të punës është i dukshëm për administratorin tënd të teknologjisë së informacionit"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Rrjeti mund të jetë i monitoruar"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Kjo pajisje është e lidhur me rrjetet VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Profili yt i punës është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Hap bisedën"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Miniaplikacionet e bisedave"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Trokit te një bisedë dhe shtoje në ekranin bazë"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> më parë"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Më pak se <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string> <string name="over_timestamp" msgid="4765793502859358634">"Mbi <xliff:g id="DURATION">%1$s</xliff:g> më parë"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 6975a45bfcf7..58939458f09d 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Апликација или организација не дозвољавају прављење снимака екрана"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Измените снимак екрана"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Снимите још"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Одбаците снимак екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горња граница"</string> @@ -385,11 +384,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Обрни боје"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим корекције боје"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Још подешавања"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Корисничка подешавања"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Затвори"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Повезан"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Повезано, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Повезује се..."</string> @@ -536,8 +533,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Овај уређај припада организацији <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> и повезан је са VPN-овима"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Организација може да прати мрежни саобраћај на пословном профилу"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> може да надгледа мрежни саобраћај на пословном профилу"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Активност на мрежи пословног профила је видљива ИТ администратору"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мрежа се можда надгледа"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Овај уређај је повезан са VPN-овима"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Пословни профил је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1106,6 +1102,14 @@ <string name="basic_status" msgid="2315371112182658176">"Отворите конверзацију"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Виџети за конверзацију"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Додирните конверзацију да бисте је додали на почетни екран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"Пре <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Пре мање од <xliff:g id="DURATION">%1$s</xliff:g>"</string> <string name="over_timestamp" msgid="4765793502859358634">"Пре више од <xliff:g id="DURATION">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index f3ed80698b0f..ff1324cee8fd 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Appen eller organisationen tillåter inte att du tar skärmbilder"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Redigera"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Redigera skärmbild"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fånga mer"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Stäng skärmbild"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmbild"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Övre gräns"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertera färger"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Färgkorrigeringsläge"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Fler inställningar"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Användarinställningar"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Klart"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Stäng"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Ansluten"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ansluten, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Ansluter ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Den här enheten tillhör <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> och är ansluten till VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Organisationen kan övervaka nätverkstrafik i jobbprofilen"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kan övervaka nätverkstrafiken i jobbprofilen"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Jobbprofilens nätverksaktivitet är synlig för IT-administratören"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Nätverket kan vara övervakat"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Den här enheten är ansluten till VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Öppen konversation"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Konversationswidgetar"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Tryck på en konversation för att lägga till den på startskärmen"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"För <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Mindre än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string> <string name="over_timestamp" msgid="4765793502859358634">"Mer än <xliff:g id="DURATION">%1$s</xliff:g> sedan"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 634cd9d0b3f2..f1904f473382 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Programu au shirika lako halikuruhusu kupiga picha za skrini"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Badilisha"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Badilisha picha ya skrini"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasa zaidi"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ondoa picha ya skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Mpaka wa sehemu ya juu"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Pindua rangi"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Hali ya kusahihisha rangi"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Mipangilio zaidi"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mipangilio ya mtumiaji"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Nimemaliza"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Funga"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Imeunganishwa"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Imeunganishwa, kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Inaunganisha..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Kifaa hiki kinamilikiwa na <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> na kimeunganishwa kwenye VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Huenda shirika lako likafuatilia shughuli kwenye mtandao katika wasifu wako wa kazini"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Huenda <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ikafuatilia shughuli kwenye mtandao katika wasifu wako wa kazini"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Shughuli za mtandao za wasifu wa kazini zinaonekana kwa msimamizi wako wa TEHAMA."</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Huenda mtandao unafuatiliwa"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Kifaa hiki kimeunganishwa kwenye VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Wasifu wako wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -952,7 +948,7 @@ <string name="notification_channel_storage" msgid="2720725707628094977">"Hifadhi"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"Vidokezo"</string> <string name="instant_apps" msgid="8337185853050247304">"Programu Zinazofunguka Papo Hapo"</string> - <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> inaendelea kutumika"</string> + <string name="instant_apps_title" msgid="8942706782103036910">"Programu ya <xliff:g id="APP">%1$s</xliff:g> inatumika"</string> <string name="instant_apps_message" msgid="6112428971833011754">"Programu inafunguka bila kusakinishwa."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Programu inafunguka bila kusakinishwa. Gusa ili upate maelezo zaidi."</string> <string name="app_info" msgid="5153758994129963243">"Maelezo ya programu"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Fungua mazungumzo"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Wijeti za mazungumzo"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Gusa mazungumzo ili uyaweke kwenye Skrini yako ya kwanza"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Chini ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string> <string name="over_timestamp" msgid="4765793502859358634">"Zaidi ya <xliff:g id="DURATION">%1$s</xliff:g> zilizopita"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index a940304e56e9..79f2125808b3 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"திருத்து"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"ஸ்கிரீன்ஷாட்டைத் திருத்தும்"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"கூடுதலாகப் படமெடு"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ஸ்கிரீன்ஷாட்டை நிராகரிக்கும்"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"மேற்புற எல்லை"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"வண்ணங்களை மாற்று"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"வண்ணத்தைச் சரிப்படுத்தும் முறை"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"அமைப்பில் மாற்று"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"பயனர் அமைப்புகள்"</string> <string name="quick_settings_done" msgid="2163641301648855793">"முடிந்தது"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"மூடுக"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"இணைக்கப்பட்டது"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"இணைக்கப்பட்டது, பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"இணைக்கிறது..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"இந்த சாதனம் <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிறுவனத்துக்கு சொந்தமானது, அது VPNகளுடன் இணைக்கப்பட்டுள்ளது"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"உங்கள் நிறுவனம் பணிக் கணக்கில் நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம்"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> உங்கள் பணிக் கணக்கில் நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம்"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"பணிக் கணக்கின் நெட்வொர்க் செயல்பாட்டை IT நிர்வாகியால் பார்க்க முடியும்"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"நெட்வொர்க் கண்காணிக்கப்படலாம்"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"இந்த சாதனம் VPNகளுடன் இணைக்கப்பட்டுள்ளது"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"உங்கள் பணிக் கணக்கு <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"திறந்தநிலை உரையாடல்"</string> <string name="select_conversation_title" msgid="6716364118095089519">"உரையாடல் விட்ஜெட்டுகள்"</string> <string name="select_conversation_text" msgid="3376048251434956013">"ஓர் உரையாடலை உங்கள் முகப்புத் திரையில் சேர்க்க அந்த உரையாடலைத் தட்டுங்கள்"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>க்குக் குறைவாக"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>க்கு முன்பு"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index e76e1823f580..a735020b10a8 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"స్క్రీన్షాట్లు తీయడానికి యాప్ లేదా మీ సంస్థ అనుమతించలేదు"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"ఎడిట్ చేయండి"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"స్క్రీన్షాట్ను ఎడిట్ చేయండి"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"మరిన్ని క్యాప్చర్ చేయండి"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్షాట్ను విస్మరించు"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్షాట్ ప్రివ్యూ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ఎగువ సరిహద్దు"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"కలర్ మార్పిడి"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"రంగు సవరణ మోడ్"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"మరిన్ని సెట్టింగ్లు"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"యూజర్ సెట్టింగ్లు"</string> <string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"కనెక్ట్ చేయబడినది"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"కనెక్ట్ అవుతోంది..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>కు చెందినది, ఇది VPNలకు కనెక్ట్ అయి ఉంది"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"మీ కార్యాలయ ప్రొఫైల్లోని నెట్వర్క్ ట్రాఫిక్ని మీ సంస్థ పర్యవేక్షించవచ్చు"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"మీ కార్యాలయ ప్రొఫైల్లోని నెట్వర్క్ ట్రాఫిక్ని <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> పర్యవేక్షించవచ్చు"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"వర్క్ ప్రొఫైల్ నెట్వర్క్ యాక్టివిటీ మీ IT అడ్మిన్కు కనిపిస్తుంది"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"ఈ పరికరం VPNలకు కనెక్ట్ అయి ఉంది"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"మీ వర్క్ ప్రొఫైల్ <xliff:g id="VPN_APP">%1$s</xliff:g>కు కనెక్ట్ చేయబడింది"</string> @@ -951,7 +947,7 @@ <string name="notification_channel_general" msgid="4384774889645929705">"సాధారణ సందేశాలు"</string> <string name="notification_channel_storage" msgid="2720725707628094977">"నిల్వ"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"సూచనలు"</string> - <string name="instant_apps" msgid="8337185853050247304">"తక్షణ యాప్లు"</string> + <string name="instant_apps" msgid="8337185853050247304">"ఇన్స్టంట్ యాప్లు"</string> <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string> <string name="instant_apps_message" msgid="6112428971833011754">"ఇన్స్టాల్ చేయకుండా యాప్ తెరవబడింది."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"ఇన్స్టాల్ చేయకుండా యాప్ తెరవబడింది. మరింత తెలుసుకోవడానికి నొక్కండి."</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"సంభాషణను తెరవండి"</string> <string name="select_conversation_title" msgid="6716364118095089519">"సంభాషణ విడ్జెట్లు"</string> <string name="select_conversation_text" msgid="3376048251434956013">"దీనిని మీ మొదటి స్క్రీన్కు జోడించడానికి సంభాషణను ట్యాప్ చేయండి"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> కంటే ముందు"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> క్రితం"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index be6eae45b3f5..e851b3d5fa39 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"แก้ไข"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"แก้ไขภาพหน้าจอ"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"จับภาพได้มากขึ้น"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ปิดภาพหน้าจอ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"ขอบเขตด้านบน"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"กลับสี"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"โหมดการแก้ไขสี"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"การตั้งค่าเพิ่มเติม"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"การตั้งค่าของผู้ใช้"</string> <string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"ปิด"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"เชื่อมต่อ"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"เชื่อมต่ออยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"กำลังเชื่อมต่อ..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> เป็นเจ้าของอุปกรณ์นี้ และอุปกรณ์เชื่อมต่ออยู่กับ VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"องค์กรของคุณอาจตรวจสอบการจราจรของข้อมูลในเครือข่ายในโปรไฟล์งาน"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> อาจตรวจสอบการจราจรของข้อมูลในเครือข่ายในโปรไฟล์งานของคุณ"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"ผู้ดูแลระบบไอทีจะเห็นกิจกรรมในเครือข่ายโปรไฟล์งาน"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"อาจมีการตรวจสอบเครือข่าย"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"อุปกรณ์นี้เชื่อมต่ออยู่กับ VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"โปรไฟล์งานของคุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"เปิดการสนทนา"</string> <string name="select_conversation_title" msgid="6716364118095089519">"วิดเจ็ตการสนทนา"</string> <string name="select_conversation_text" msgid="3376048251434956013">"แตะการสนทนาเพื่อเพิ่มไปยังหน้าจอหลัก"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"ไม่ถึง <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string> <string name="over_timestamp" msgid="4765793502859358634">"นานกว่า <xliff:g id="DURATION">%1$s</xliff:g>ที่ผ่านมา"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 5847a687c870..41f039ba05b4 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Hindi pinahihintulutan ng app o ng iyong organisasyon ang pagkuha ng mga screenshot"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"I-edit"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"I-edit ang screenshot"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mag-capture pa"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"I-dismiss ang screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Pinakamataas na limitasyon"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"I-invert ang mga kulay"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Correction mode ng kulay"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Higit pang setting"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mga setting ng user"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Tapos na"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Isara"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Nakakonekta"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Nakakonekta, baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Kumokonekta..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Pagmamay-ari ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang device na ito at nakakonekta ito sa mga VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Maaaring sumubaybay ang iyong organisasyon ng trapiko sa network sa profile sa trabaho mo"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Maaaring subaybayan ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang trapiko sa network sa iyong profile sa trabaho"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Nakikita ng iyong IT admin ang aktibidad sa network ng profile sa trabaho"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Maaaring sinusubaybayan ang network"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Nakakonekta sa mga VPN ang device na ito"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang iyong profile sa trabaho"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Buksan ang pag-uusap"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Mga widget ng pag-uusap"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Mag-tap sa isang pag-uusap para idagdag ito sa iyong Home screen"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Wala pang <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string> <string name="over_timestamp" msgid="4765793502859358634">"Mahigit <xliff:g id="DURATION">%1$s</xliff:g> ang nakalipas"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index add02600f73f..b8201e66b390 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Uygulama veya kuruluşunuz, ekran görüntüsü alınmasına izin vermiyor."</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Düzenle"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Ekran görüntüsünü düzenle"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Daha fazla ekran görüntüsü al"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran görüntüsünü kapat"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Üst sınır"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Renkleri çevir"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Renk düzeltme modu"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Diğer ayarlar"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kullanıcı ayarları"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Bitti"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Kapat"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Bağlı"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Bağlandı, pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Bağlanılıyor..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> kuruluşuna ait olup VPN\'lere bağlı"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Kuruluşunuz, iş profilinizdeki ağ trafiğini izleyebilir"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>, iş profilinizdeki ağ trafiğini izleyebilir"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"BT yöneticiniz, iş profilinizin ağ etkinliğini görebilir"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Ağ trafiği izlenebilir"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu cihaz VPN\'lere bağlı"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"İş profiliniz <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Görüşmeyi aç"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Görüşme widget\'ları"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Ana ekranınıza eklemek için bir ileti dizisine dokunun"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> önce"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Henüz <xliff:g id="DURATION">%1$s</xliff:g> olmadı"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> üzerinde bir süre önce"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 4c1f55b30188..7ee93772c2b2 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Додаток або адміністратор вашої організації не дозволяють робити знімки екрана"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Редагувати"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Редагувати знімок екрана"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Включити більше деталей"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрити знімок екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхня межа"</string> @@ -386,11 +385,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Інвертовані кольори"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Режим коригування кольору"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Більше налаштувань"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налаштування користувача"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Закрити"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Під’єднано"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Під’єдано, заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"З’єднання…"</string> @@ -539,8 +536,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\". Його підключено до мереж VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Адміністратор вашої організації може відстежувати мережевий трафік у вашому робочому профілі"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Адміністратор організації <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> мож відстежувати мережевий трафік у вашому робочому профілі"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Дії в мережі в робочому профілі може бачити ваш системний адміністратор"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Мережевий трафік може відстежуватися"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Цей пристрій підключено до мереж VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ваш робочий профіль підключено до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1112,6 +1108,14 @@ <string name="basic_status" msgid="2315371112182658176">"Відкрита розмова"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Віджети розмов"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Натисніть розмову, щоб додати її на головний екран"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> тому"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Менше ніж <xliff:g id="DURATION">%1$s</xliff:g> тому"</string> <string name="over_timestamp" msgid="4765793502859358634">"Понад <xliff:g id="DURATION">%1$s</xliff:g> тому"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index ab6ae70390ab..bdd6b1e893b5 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1100,6 +1100,14 @@ <string name="basic_status" msgid="2315371112182658176">"گفتگو کھولیں"</string> <string name="select_conversation_title" msgid="6716364118095089519">"گفتگو ویجیٹس"</string> <string name="select_conversation_text" msgid="3376048251434956013">"اسے اپنے ہوم اسکرین پر شامل کرنے کے لیے گفتگو پر تھپتھپائیں"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> قبل"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g> سے کچھ کم وقت قبل"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g> سے زائد عرصہ قبل"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 7847967e906c..321f36c27d32 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Tahrirlash"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinshotni tahrirlash"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Yana suratga olish"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Skrinshotni yopish"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Yuqori chegara"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Teskari ranglar"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Rangni to‘g‘rilash usuli"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Boshqa sozlamalar"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Foydalanuvchi sozlamalari"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Tayyor"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Yopish"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Ulangan"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Ulangan, batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Ulanmoqda…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Bu qurilma <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tashkilotiga tegishli va VPN tarmoqlarga ulangan"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tashkilotingiz ishchi profilingizda tarmoq trafigini nazorat qilishi mumkin"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ishchi profilingizda tarmoq trafigini nazorat qilishi mumkin"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Ish profilida tarmoqqa oid harakatlar AT administratoriga koʻrinadi"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Tarmoq kuzatilishi mumkin"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Bu qurilma VPN tarmoqlarga ulangan"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Ish profilingiz <xliff:g id="VPN_APP">%1$s</xliff:g> tarmogʻiga ulangan"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Suhbatni ochish"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Suhbat vidjetlari"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Bosh ekranga chiqariladigan suhbat ustiga bosing"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> oldin"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"<xliff:g id="DURATION">%1$s</xliff:g>dan kam vaqt oldin"</string> <string name="over_timestamp" msgid="4765793502859358634">"<xliff:g id="DURATION">%1$s</xliff:g>dan ortiq vaqt oldin"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 54f5f403104b..6ef59c8655e4 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ứng dụng hoặc tổ chức của bạn không cho phép chụp ảnh màn hình"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Chỉnh sửa"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Chỉnh sửa ảnh chụp màn hình"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Chụp được nhiều hơn"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Đóng ảnh chụp màn hình"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ranh giới trên"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Đảo ngược màu"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Chế độ chỉnh màu"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Chế độ cài đặt khác"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cài đặt người dùng"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Đóng"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Đã kết nối"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Đã kết nối, mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Đang kết nối..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Thiết bị này thuộc về <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> và đã kết nối với VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tổ chức của bạn có thể giám sát lưu lượng truy cập mạng trong hồ sơ công việc của bạn"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> có thể giám sát lưu lượng truy cập mạng trong hồ sơ công việc của bạn"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Quản trị viên CNTT của bạn có thể xem hoạt động trên mạng của hồ sơ công việc"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mạng có thể được giám sát"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Thiết bị này đã kết nối với VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Hồ sơ công việc của bạn đã kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Mở cuộc trò chuyện"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Tiện ích trò chuyện"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Nhấn vào một cuộc trò chuyện để thêm cuộc trò chuyện đó vào Màn hình chính"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> trước"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Chưa đầy <xliff:g id="DURATION">%1$s</xliff:g> trước"</string> <string name="over_timestamp" msgid="4765793502859358634">"Hơn <xliff:g id="DURATION">%1$s</xliff:g> trước"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 71b1b6a80ce2..e87f4ddd3ca4 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"此应用或您所在的单位不允许进行屏幕截图"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"编辑"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"编辑屏幕截图"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"截取更多内容"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"关闭屏幕截图"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"顶部边界"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"反色"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"颜色校正模式"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多设置"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"用户设置"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"关闭"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"已连接"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"正在连接…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"此设备归<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>所有,且已连接到多个 VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"您所在的单位可能会监控您工作资料中的网络流量"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"“<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>”可能会监控您工作资料中的网络流量"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理员可以看到工作资料网络活动记录"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"网络可能会受到监控"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"此设备已连接到多个 VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"您的工作资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"开放式对话"</string> <string name="select_conversation_title" msgid="6716364118095089519">"对话微件"</string> <string name="select_conversation_text" msgid="3376048251434956013">"点按对话即可将其添加到主屏幕"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>内"</string> <string name="over_timestamp" msgid="4765793502859358634">"超过 <xliff:g id="DURATION">%1$s</xliff:g>前"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 63a0febd04e8..8b984580cbde 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"應用程式或您的機構不允許擷取螢幕畫面"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"上方邊界"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"反轉顏色"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"色彩校正模式"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"已連線"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"正在連線…"</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」,並已連結至 VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"您的機構可能監控您工作設定檔上的網絡流量"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>可能會監控您工作設定檔上的網絡流量"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理員可以查看工作設定檔的網絡活動"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"網絡可能會受到監控"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"此裝置已連結至 VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"您的工作設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"開啟對話"</string> <string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string> <string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string> <string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index c8ade67853a1..714e3e0feda0 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"這個應用程式或貴機構不允許擷取螢幕畫面"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"頂端邊界"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"反轉顏色"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"色彩校正模式"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string> <string name="quick_settings_done" msgid="2163641301648855793">"完成"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"關閉"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"已連線"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"連線中..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"這部裝置的擁有者為「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」,並且已連線到 VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"貴機構可能會監控你工作資料夾的網路流量"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」可能會監控你工作資料夾的網路流量"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理員可以查看工作資料夾的網路活動"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"網路可能會受到監控"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"這部裝置已連線到 VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"你的工作資料夾已連線到「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"開放式對話"</string> <string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string> <string name="select_conversation_text" msgid="3376048251434956013">"輕觸對話即可新增至主畫面"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g>前"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"最近 <xliff:g id="DURATION">%1$s</xliff:g>內"</string> <string name="over_timestamp" msgid="4765793502859358634">"超過 <xliff:g id="DURATION">%1$s</xliff:g>前"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2c6c985ccb3e..6d2e37749362 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -89,8 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Ukuthatha izithombe-skrini akuvunyelwe uhlelo lokusebenza noma inhlangano yakho"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Hlela"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Hlela isithombe-skrini"</string> - <!-- no translation found for screenshot_scroll_label (2930198809899329367) --> - <skip /> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Thwebula okuningi"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cashisa isithombe-skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string> <string name="screenshot_top_boundary" msgid="1500569103321300856">"Umngcele ophezulu"</string> @@ -384,11 +383,9 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Faka imibala"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Imodi yokulungisa umbala"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Izilungiselelo eziningi"</string> - <!-- no translation found for quick_settings_more_user_settings (1064187451100861954) --> - <skip /> + <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Amasethingi womsebenzisi"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Kwenziwe"</string> - <!-- no translation found for quick_settings_close_user_panel (5599724542275896849) --> - <skip /> + <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Vala"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Ixhunyiwe"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Kuxhunyiwe, ibhethri elingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Iyaxhuma..."</string> @@ -533,8 +530,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Le divayisi ngeye-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> futhi ixhunywe kuma-VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Inhlangano yakho ingaqapha ithrafikhi yenethiwekhi kuphrofayela yakho yomsebenzi"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"I-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ingaqaphela ithrafikhi yenethiwekhi kuphrofayela yakho yomsebenzi"</string> - <!-- no translation found for quick_settings_disclosure_managed_profile_network_activity (2636594621387832827) --> - <skip /> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Umsebenzi wenethiwekhi yephrofayela yomsebenzi uyabonakala kumphathi wakho we-IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Inethiwekhi kungenzeka iqashiwe"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Le divayisi ixhunywe kuma-VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Iphrofayela yakho yomsebenzi ixhunywe ku-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1100,6 +1096,14 @@ <string name="basic_status" msgid="2315371112182658176">"Vula ingxoxo"</string> <string name="select_conversation_title" msgid="6716364118095089519">"Amawijethi wengxoxo"</string> <string name="select_conversation_text" msgid="3376048251434956013">"Thepha ingxoxo ukuyengeza Kusikrini sakho sasekhaya"</string> + <!-- no translation found for no_conversations_text (7362374212649891057) --> + <skip /> + <!-- no translation found for priority_conversations (3967482288896653039) --> + <skip /> + <!-- no translation found for recent_conversations (8531874684782574622) --> + <skip /> + <!-- no translation found for okay (6490552955618608554) --> + <skip /> <string name="timestamp" msgid="6577851592534538533">"<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string> <string name="less_than_timestamp" msgid="6598972791137724517">"Ngaphansi kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string> <string name="over_timestamp" msgid="4765793502859358634">"Ngaphezu kwe-<xliff:g id="DURATION">%1$s</xliff:g> edlule"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index e77a8a4fbdf0..b21c3ae4c2cf 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -288,4 +288,9 @@ <!-- Accessibility floating menu --> <color name="accessibility_floating_menu_background">#CCFFFFFF</color> <!-- 80% --> <color name="accessibility_floating_menu_stroke_dark">#26FFFFFF</color> <!-- 15% --> + + <!-- Wallet screen --> + <color name="wallet_white">#FFFFFF</color> + <color name="wallet_card_border">#33FFFFFF</color> + <color name="wallet_primary_text">@color/GM2_grey_900</color> </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 1d82518da619..bd92299f38cf 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -610,6 +610,21 @@ <!-- Determines whether the shell features all run on another thread. --> <bool name="config_enableShellMainThread">false</bool> + <!-- Default udfps icon. Same path as ic_fingerprint.xml --> + <string name="config_udfpsIcon" translatable="false"> + M25.5,16.3283C28.47,14.8433 31.9167,14 35.5834,14C39.2501,14 42.6968,14.8433 45.6668,16.3283 + M20,28.6669C22.7683,24.3402 28.7084,21.3335 35.5834,21.3335C42.4585,21.3335 48.3985, + 24.3402 51.1669,28.6669 + M22.8607,47.0002C21.834,44.3235 21.834,41.5002 21.834,41.5002C21.834, + 34.4051 27.7374,28.6667 35.5841,28.6667C43.4308,28.6667 49.3341,34.4051 49.3341,41.5002 + M49.3344,41.5003V42.0319C49.3344,44.7636 47.1161,47.0003 44.3661,47.0003C41.9461, + 47.0003 39.8744,45.2403 39.471,42.857L38.9577, + 39.7769C38.591,37.5953 36.7027,36.0002 34.5027, + 36.0002C26.5826,36.0002 29.846,49.1087 35.291,50.6487 + M44.9713,54.6267C42.5513,56.7167 39.2879,58.0001 35.5846,58.0001C32.2296, + 58.0001 29.2229,56.9551 26.8945,55.195 + </string> + <!-- package name of a built-in camera app to use to restrict implicit intent resolution when the double-press power gesture is used. Ignored if empty. --> <string translatable="false" name="config_cameraGesturePackage"></string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 91e0466c82fe..6b7c62821a5f 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -420,6 +420,8 @@ <!-- Padding on each QS Footer Icon to make the icons 20dpx20dp --> <dimen name="qs_footer_icon_padding">14dp</dimen> + <!-- 3/4 of icon width 20dpx20dp --> + <dimen name="qs_footer_tuner_icon_translation">15dp</dimen> <!-- The padding between the notifications and the quick settings container --> <dimen name="qs_notification_padding">@dimen/notification_side_paddings</dimen> @@ -1091,7 +1093,7 @@ <!-- The maximum offset for the under-display fingerprint sensor (UDFPS) icon in either direction that elements aer moved to prevent burn-in on AOD--> - <dimen name="udfps_burn_in_offset_x">8dp</dimen> + <dimen name="udfps_burn_in_offset_x">2dp</dimen> <dimen name="udfps_burn_in_offset_y">8dp</dimen> <dimen name="corner_size">8dp</dimen> @@ -1407,6 +1409,9 @@ <!-- rounded_slider_track_width / 2 --> <dimen name="rounded_slider_track_corner_radius">4dp</dimen> + <!-- inset for ic_lock_open within a DisabledUdfpsView --> + <dimen name="udfps_unlock_icon_inset">16dp</dimen> + <!-- Location on the screen of the center of the physical power button. This is a reasonable default that should be overridden by device-specific overlays. --> <dimen name="physical_power_button_center_screen_location_y">620px</dimen> @@ -1421,4 +1426,15 @@ For devices with sensors on the back of the device, this corresponds to the location on the screen directly in front of the sensor. --> <dimen name="physical_fingerprint_sensor_center_screen_location_y">610px</dimen> + + <!-- Wallet activity screen specs --> + <dimen name="wallet_icon_size">36sp</dimen> + <dimen name="card_margin">16dp</dimen> + <dimen name="card_carousel_dot_offset">24dp</dimen> + <dimen name="card_carousel_dot_unselected_radius">2dp</dimen> + <dimen name="card_carousel_dot_selected_radius">3dp</dimen> + <dimen name="card_carousel_dot_margin">4dp</dimen> + <dimen name="min_wallet_empty_height">208dp</dimen> + <dimen name="wallet_card_border_width">1dp</dimen> + <dimen name="wallet_empty_state_corner_radius">24dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index 2f3fbe74d5fa..6af982ddad72 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -50,4 +50,6 @@ <bool name="flag_alarm_tile">false</bool> <bool name="flag_charging_ripple">false</bool> + + <bool name="flag_ongoing_call_status_bar_chip">false</bool> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f4b50eb71b39..8dad40b0cd69 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1633,8 +1633,14 @@ <!-- Wallet strings --> <!-- Wallet empty state, title [CHAR LIMIT=32] --> <string name="wallet_title">Wallet</string> + <!-- Label of the button underneath the card carousel when device is unlocked. [CHAR LIMIT=NONE] --> + <string name="wallet_button_label_device_unlocked">Show all</string> + <!-- Label of the button underneath the card carousel when device is locked. [CHAR LIMIT=NONE] --> + <string name="wallet_button_label_device_locked">Unlock to pay</string> <!-- Secondary label of the quick access wallet tile. [CHAR LIMIT=32] --> <string name="wallet_secondary_label">Ready</string> + <!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] --> + <string name="wallet_error_generic">There was a problem getting your cards, please try again later</string> <!-- Name of the work status bar icon. --> <string name="status_bar_work">Work profile</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 10c70a0914c8..3dad634ffd1a 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -792,4 +792,18 @@ <item name="android:mirrorForRtl">false</item> <item name="android:progressDrawable">@drawable/udfps_progress_bar</item> </style> + + <!-- Wallet styles --> + <style name="Wallet" /> + + <style name="Wallet.TextAppearance"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textColor">@color/wallet_primary_text</item> + <item name="android:singleLine">true</item> + <item name="android:textSize">14sp</item> + </style> + + <style name="Wallet.Theme"> + <item name="android:colorControlHighlight">@*android:color/primary_text_material_dark</item> + </style> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java index 118f98da11e2..ed465de0e766 100644 --- a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java +++ b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsController.java @@ -18,27 +18,31 @@ package com.android.keyguard; import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.InsetDrawable; import android.hardware.biometrics.BiometricSourceType; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import com.android.settingslib.Utils; import com.android.systemui.Dumpable; +import com.android.systemui.R; import com.android.systemui.biometrics.AuthController; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.ViewController; import java.io.FileDescriptor; import java.io.PrintWriter; /** - * Controls when to show the DisabledUdfpsView to unlock the device on the lockscreen. - * If the device is not authenticated, the bouncer will show. + * Controls when to show the DisabledUdfpsView affordance (unlock icon or circle) on lock screen. * - * This tap target will only show when: + * This view only exists when: * - User has UDFPS enrolled * - UDFPS is currently unavailable see {@link KeyguardUpdateMonitor#shouldListenForUdfps} */ @@ -47,21 +51,26 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @NonNull private final KeyguardViewController mKeyguardViewController; @NonNull private final StatusBarStateController mStatusBarStateController; + @NonNull private final KeyguardStateController mKeyguardStateController; + @NonNull private final Drawable mButton; + @NonNull private final Drawable mUnlockIcon; private boolean mIsDozing; private boolean mIsBouncerShowing; private boolean mIsKeyguardShowing; private boolean mRunningFPS; - private boolean mAuthenticated; + private boolean mCanDismissLockScreen; private boolean mShowButton; + private boolean mShowUnlockIcon; public DisabledUdfpsController( @NonNull DisabledUdfpsView view, @NonNull StatusBarStateController statusBarStateController, @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor, @NonNull AuthController authController, - @NonNull KeyguardViewController keyguardViewController + @NonNull KeyguardViewController keyguardViewController, + @NonNull KeyguardStateController keyguardStateController ) { super(view); mView.setOnClickListener(mOnClickListener); @@ -70,25 +79,38 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i mStatusBarStateController = statusBarStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardViewController = keyguardViewController; + mKeyguardStateController = keyguardStateController; + + final Context context = view.getContext(); + mButton = context.getResources().getDrawable( + com.android.systemui.R.drawable.circle_white, context.getTheme()); + mUnlockIcon = new InsetDrawable(context.getResources().getDrawable( + com.android.internal.R.drawable.ic_lock_open, context.getTheme()), + context.getResources().getDimensionPixelSize( + com.android.systemui.R.dimen.udfps_unlock_icon_inset)); } @Override protected void onViewAttached() { mIsBouncerShowing = mKeyguardViewController.isBouncerShowing(); - mIsKeyguardShowing = mStatusBarStateController.getState() == StatusBarState.KEYGUARD; + mIsKeyguardShowing = mKeyguardStateController.isShowing(); mIsDozing = mStatusBarStateController.isDozing(); mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning(); - mAuthenticated = false; - updateButtonVisibility(); + mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen(); + mUnlockIcon.setTint(Utils.getColorAttrDefaultColor(mView.getContext(), + R.attr.wallpaperTextColorAccent)); + updateVisibility(); mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.addCallback(mStatusBarStateListener); + mKeyguardStateController.addCallback(mKeyguardStateCallback); } @Override protected void onViewDetached() { mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback); mStatusBarStateController.removeCallback(mStatusBarStateListener); + mKeyguardStateController.removeCallback(mKeyguardStateCallback); } /** @@ -100,30 +122,41 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i } } - private void updateButtonVisibility() { - mShowButton = !mAuthenticated && !mIsDozing && mIsKeyguardShowing - && !mIsBouncerShowing && !mRunningFPS; + private void updateVisibility() { + mShowButton = !mCanDismissLockScreen && !mRunningFPS && isLockScreen(); + mShowUnlockIcon = mCanDismissLockScreen && isLockScreen(); + if (mShowButton) { + mView.setImageDrawable(mButton); + mView.setVisibility(View.VISIBLE); + } else if (mShowUnlockIcon) { + mView.setImageDrawable(mUnlockIcon); mView.setVisibility(View.VISIBLE); } else { mView.setVisibility(View.INVISIBLE); } } + private boolean isLockScreen() { + return mIsKeyguardShowing && !mIsDozing && !mIsBouncerShowing; + } + @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { pw.println("DisabledUdfpsController state:"); pw.println(" mShowBouncerButton: " + mShowButton); + pw.println(" mShowUnlockIcon: " + mShowUnlockIcon); pw.println(" mIsDozing: " + mIsDozing); pw.println(" mIsKeyguardShowing: " + mIsKeyguardShowing); pw.println(" mIsBouncerShowing: " + mIsBouncerShowing); pw.println(" mRunningFPS: " + mRunningFPS); - pw.println(" mAuthenticated: " + mAuthenticated); + pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen); } private final View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { + // if the device is locked, shows bouncer, else goes to launcher mKeyguardViewController.showBouncer(/* scrim */ true); } }; @@ -131,15 +164,9 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i private StatusBarStateController.StateListener mStatusBarStateListener = new StatusBarStateController.StateListener() { @Override - public void onStateChanged(int newState) { - mIsKeyguardShowing = newState == StatusBarState.KEYGUARD; - updateButtonVisibility(); - } - - @Override public void onDozingChanged(boolean isDozing) { mIsDozing = isDozing; - updateButtonVisibility(); + updateVisibility(); } }; @@ -148,7 +175,7 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i @Override public void onKeyguardBouncerChanged(boolean bouncer) { mIsBouncerShowing = bouncer; - updateButtonVisibility(); + updateVisibility(); } @Override @@ -157,21 +184,29 @@ public class DisabledUdfpsController extends ViewController<DisabledUdfpsView> i if (biometricSourceType == FINGERPRINT) { mRunningFPS = running; } - mAuthenticated &= !mRunningFPS; - updateButtonVisibility(); - } - @Override - public void onBiometricAuthenticated(int userId, - BiometricSourceType biometricSourceType, boolean isStrongBiometric) { - mAuthenticated = true; - updateButtonVisibility(); - } - - @Override - public void onUserUnlocked() { - mAuthenticated = true; - updateButtonVisibility(); + updateVisibility(); } }; + + private final KeyguardStateController.Callback mKeyguardStateCallback = + new KeyguardStateController.Callback() { + @Override + public void onKeyguardShowingChanged() { + updateIsKeyguardShowing(); + updateVisibility(); + } + + @Override + public void onUnlockedChanged() { + updateIsKeyguardShowing(); + mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen(); + updateVisibility(); + } + + private void updateIsKeyguardShowing() { + mIsKeyguardShowing = mKeyguardStateController.isShowing() + && !mKeyguardStateController.isKeyguardGoingAway(); + } + }; } diff --git a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java index d8ab780eb6bd..8ae753e7f3f7 100644 --- a/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java +++ b/packages/SystemUI/src/com/android/keyguard/DisabledUdfpsView.java @@ -22,14 +22,13 @@ import android.graphics.RectF; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.util.AttributeSet; import android.view.Surface; -import android.widget.Button; import android.widget.FrameLayout; +import android.widget.ImageView; /** - * A full screen view with an oval target where the UDFPS sensor is. - * Controlled by {@link DisabledUdfpsController}. + * A view positioned in the area of the UDPFS sensor. */ -public class DisabledUdfpsView extends Button { +public class DisabledUdfpsView extends ImageView { @NonNull private final RectF mSensorRect; @NonNull private final Context mContext; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 27a2ac379eee..621ca594393e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -427,6 +427,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab public void onTrustChanged(boolean enabled, int userId, int flags) { Assert.isMainThread(); mUserHasTrust.put(userId, enabled); + updateBiometricListeningState(); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -627,6 +628,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } // Don't send cancel if authentication succeeds mFingerprintCancelSignal = null; + updateBiometricListeningState(); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -810,6 +812,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } // Don't send cancel if authentication succeeds mFaceCancelSignal = null; + updateBiometricListeningState(); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -2109,6 +2112,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab boolean shouldListenForUdfps() { return shouldListenForFingerprint() && !mBouncer + && !getUserCanSkipBouncer(getCurrentUser()) + && !isEncryptedOrLockdown(getCurrentUser()) && mStrongAuthTracker.hasUserAuthenticatedSinceBoot(); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 078ec9fdfd1c..7b5d7cb5a525 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -45,6 +45,7 @@ import android.view.VelocityTracker; import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.biometrics.HbmTypes.HbmType; import com.android.systemui.dagger.SysUISingleton; @@ -88,6 +89,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager; @NonNull private final DumpManager mDumpManager; @NonNull private final AuthRippleController mAuthRippleController; + @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. @VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps; @@ -307,7 +309,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback { @NonNull StatusBar statusBar, @NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager, @NonNull DumpManager dumpManager, - @NonNull AuthRippleController authRippleController) { + @NonNull AuthRippleController authRippleController, + @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor) { mContext = context; mInflater = inflater; // The fingerprint manager is queried for UDFPS before this class is constructed, so the @@ -320,6 +323,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { mKeyguardViewManager = statusBarKeyguardViewManager; mDumpManager = dumpManager; mAuthRippleController = authRippleController; + mKeyguardUpdateMonitor = keyguardUpdateMonitor; mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists @@ -327,8 +331,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { mStatusBar.setSensorRect(getSensorLocation()); mCoreLayoutParams = new WindowManager.LayoutParams( - // TODO(b/152419866): Use the UDFPS window type when it becomes available. - WindowManager.LayoutParams.TYPE_BOOT_PROGRESS, + WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE @@ -486,6 +489,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback { mStatusBarStateController, mStatusBar, mKeyguardViewManager, + mKeyguardUpdateMonitor, + mFgExecutor, mDumpManager ); case IUdfpsOverlayController.REASON_AUTH_BP: diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java index 18f54166ad28..55ed5aaff958 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDrawable.java @@ -18,9 +18,13 @@ package com.android.systemui.biometrics; import android.content.Context; import android.graphics.ColorFilter; +import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.PathShape; +import android.util.PathParser; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -32,15 +36,30 @@ import com.android.systemui.R; * sensor area. */ public abstract class UdfpsDrawable extends Drawable { - @NonNull protected final Context mContext; - @NonNull protected final Drawable mFingerprintDrawable; + static final float DEFAULT_STROKE_WIDTH = 3f; + + @NonNull final Context mContext; + @NonNull final ShapeDrawable mFingerprintDrawable; + private final Paint mPaint; private boolean mIlluminationShowing; int mAlpha = 255; // 0 - 255 public UdfpsDrawable(@NonNull Context context) { mContext = context; - mFingerprintDrawable = context.getResources().getDrawable(R.drawable.ic_fingerprint, null); + final String fpPath = context.getResources().getString(R.string.config_udfpsIcon); + mFingerprintDrawable = new ShapeDrawable( + new PathShape(PathParser.createPathFromPathData(fpPath), 72, 72)); mFingerprintDrawable.mutate(); + + mPaint = mFingerprintDrawable.getPaint(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeCap(Paint.Cap.ROUND); + setStrokeWidth(DEFAULT_STROKE_WIDTH); + } + + void setStrokeWidth(float strokeWidth) { + mPaint.setStrokeWidth(strokeWidth); + invalidateSelf(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java index 12c15a0882f9..71ed3f8c9b0a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardDrawable.java @@ -18,6 +18,7 @@ package com.android.systemui.biometrics; import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; +import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -27,6 +28,7 @@ import androidx.annotation.NonNull; import com.android.internal.graphics.ColorUtils; import com.android.settingslib.Utils; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.doze.DozeReceiver; @@ -37,6 +39,7 @@ public class UdfpsKeyguardDrawable extends UdfpsDrawable implements DozeReceiver private static final String TAG = "UdfpsAnimationKeyguard"; private final int mAmbientDisplayColor; + static final float DEFAULT_AOD_STROKE_WIDTH = 1f; @NonNull private final Context mContext; private int mLockScreenColor; @@ -48,22 +51,31 @@ public class UdfpsKeyguardDrawable extends UdfpsDrawable implements DozeReceiver private float mBurnInOffsetX; private float mBurnInOffsetY; + private final ValueAnimator mHintAnimator = ValueAnimator.ofFloat( + UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH, + .5f, + UdfpsKeyguardDrawable.DEFAULT_STROKE_WIDTH); + UdfpsKeyguardDrawable(@NonNull Context context) { super(context); mContext = context; - // TODO: move burn-in to view mMaxBurnInOffsetX = context.getResources() .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x); mMaxBurnInOffsetY = context.getResources() .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y); + mHintAnimator.setDuration(2000); + mHintAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mHintAnimator.addUpdateListener(anim -> setStrokeWidth((float) anim.getAnimatedValue())); + mLockScreenColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor); mAmbientDisplayColor = Color.WHITE; - updateAodPositionAndColor(); + + updateIcon(); } - private void updateAodPositionAndColor() { + private void updateIcon() { mBurnInOffsetX = MathUtils.lerp(0f, getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */) - mMaxBurnInOffsetX, @@ -75,12 +87,14 @@ public class UdfpsKeyguardDrawable extends UdfpsDrawable implements DozeReceiver mFingerprintDrawable.setTint(ColorUtils.blendARGB(mLockScreenColor, mAmbientDisplayColor, mInterpolatedDarkAmount)); + setStrokeWidth(MathUtils.lerp(DEFAULT_STROKE_WIDTH, DEFAULT_AOD_STROKE_WIDTH, + mInterpolatedDarkAmount)); invalidateSelf(); } @Override public void dozeTimeTick() { - updateAodPositionAndColor(); + updateIcon(); } @Override @@ -88,17 +102,25 @@ public class UdfpsKeyguardDrawable extends UdfpsDrawable implements DozeReceiver if (isIlluminationShowing()) { return; } + canvas.save(); + canvas.translate(mBurnInOffsetX, mBurnInOffsetY); mFingerprintDrawable.draw(canvas); + canvas.restore(); + } + + void animateHint() { + mHintAnimator.start(); } void onDozeAmountChanged(float linear, float eased) { + mHintAnimator.cancel(); mInterpolatedDarkAmount = eased; - updateAodPositionAndColor(); + updateIcon(); } void setLockScreenColor(int color) { if (mLockScreenColor == color) return; mLockScreenColor = color; - updateAodPositionAndColor(); + updateIcon(); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java index e2748437c0c6..4590182ac870 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java @@ -85,7 +85,6 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { @Override public boolean dozeTimeTick() { - // TODO: burnin mFingerprintDrawable.dozeTimeTick(); return true; } @@ -100,13 +99,16 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { void onDozeAmountChanged(float linear, float eased) { mFingerprintDrawable.onDozeAmountChanged(linear, eased); - invalidate(); + } + + void animateHint() { + mFingerprintDrawable.animateHint(); } /** * Animates in the bg protection circle behind the fp icon to highlight the icon. */ - void animateHighlightFp() { + void animateUdfpsBouncer() { if (mBgProtection.getVisibility() == View.VISIBLE && mBgProtection.getAlpha() == 1f) { // already fully highlighted, don't re-animate return; @@ -154,7 +156,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { /** * Animates out the bg protection circle behind the fp icon to unhighlight the icon. */ - void animateUnhighlightFp(@Nullable Runnable onEndAnimation) { + void animateAwayUdfpsBouncer(@Nullable Runnable onEndAnimation) { if (mBgProtection.getVisibility() == View.GONE) { // already hidden return; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 1f652dbfdaf2..9d846fa54e5b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -17,32 +17,53 @@ package com.android.systemui.biometrics; import android.annotation.NonNull; +import android.hardware.biometrics.BiometricSourceType; +import androidx.annotation.Nullable; + +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.util.concurrency.DelayableExecutor; import java.io.FileDescriptor; import java.io.PrintWriter; /** * Class that coordinates non-HBM animations during keyguard authentication. + * + * Highlights the udfps icon when: + * - Face authentication has failed + * - Face authentication has been run for > 2 seconds */ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<UdfpsKeyguardView> { + private static final long AFTER_FACE_AUTH_HINT_DELAY = 2000; + @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager; + @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @NonNull private final DelayableExecutor mExecutor; - private boolean mForceShow; + @Nullable private Runnable mCancelRunnable; + private boolean mShowBouncer; private boolean mQsExpanded; + private boolean mFaceDetectRunning; + private boolean mHintShown; protected UdfpsKeyguardViewController( @NonNull UdfpsKeyguardView view, @NonNull StatusBarStateController statusBarStateController, @NonNull StatusBar statusBar, @NonNull StatusBarKeyguardViewManager statusBarKeyguardViewManager, + @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor, + @NonNull DelayableExecutor mainDelayableExecutor, @NonNull DumpManager dumpManager) { super(view, statusBarStateController, statusBar, dumpManager); mKeyguardViewManager = statusBarKeyguardViewManager; + mKeyguardUpdateMonitor = keyguardUpdateMonitor; + mExecutor = mainDelayableExecutor; } @Override @@ -53,6 +74,9 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @Override protected void onViewAttached() { super.onViewAttached(); + mHintShown = false; + mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); + updateFaceDetectRunning(mKeyguardUpdateMonitor.isFaceDetectionRunning()); final float dozeAmount = mStatusBarStateController.getDozeAmount(); mStatusBarStateController.addCallback(mStateListener); @@ -64,31 +88,40 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @Override protected void onViewDetached() { super.onViewDetached(); + mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback); + mFaceDetectRunning = false; + mStatusBarStateController.removeCallback(mStateListener); - mAlternateAuthInterceptor.resetForceShow(); + mAlternateAuthInterceptor.hideAlternateAuthBouncer(); mKeyguardViewManager.setAlternateAuthInterceptor(null); + + if (mCancelRunnable != null) { + mCancelRunnable.run(); + mCancelRunnable = null; + } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { super.dump(fd, pw, args); - pw.println("mForceShow=" + mForceShow); + pw.println("mShowBouncer=" + mShowBouncer); + pw.println("mFaceDetectRunning=" + mFaceDetectRunning); } /** - * Overrides non-force show logic in shouldPauseAuth to still auth. + * Overrides non-bouncer show logic in shouldPauseAuth to still auth. */ - private void forceShow(boolean forceShow) { - if (mForceShow == forceShow) { + private void showBouncer(boolean forceShow) { + if (mShowBouncer == forceShow) { return; } - mForceShow = forceShow; + mShowBouncer = forceShow; updatePauseAuth(); - if (mForceShow) { - mView.animateHighlightFp(); + if (mShowBouncer) { + mView.animateUdfpsBouncer(); } else { - mView.animateUnhighlightFp(() -> mKeyguardViewManager.cancelPostAuthActions()); + mView.animateAwayUdfpsBouncer(() -> mKeyguardViewManager.cancelPostAuthActions()); } } @@ -98,7 +131,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud * is expanded, so this can be overridden with the forceShow method. */ public boolean shouldPauseAuth() { - if (mForceShow) { + if (mShowBouncer) { return false; } @@ -109,12 +142,42 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud return super.shouldPauseAuth(); } + private void cancelDelayedHint() { + if (mCancelRunnable != null) { + mCancelRunnable.run(); + mCancelRunnable = null; + } + } + + private void updateFaceDetectRunning(boolean running) { + if (mFaceDetectRunning == running) { + return; + } + + // show udfps hint a few seconds after face auth started running + if (!mFaceDetectRunning && running && !mHintShown && mCancelRunnable == null) { + // Face detect started running, show udfps hint after a delay + mCancelRunnable = mExecutor.executeDelayed(() -> showHint(false), + AFTER_FACE_AUTH_HINT_DELAY); + } + + mFaceDetectRunning = running; + } + + private void showHint(boolean forceShow) { + cancelDelayedHint(); + if (!mHintShown || forceShow) { + mHintShown = true; + mView.animateHint(); + } + } + private final StatusBarStateController.StateListener mStateListener = new StatusBarStateController.StateListener() { @Override public void onDozeAmountChanged(float linear, float eased) { mView.onDozeAmountChanged(linear, eased); - if (linear != 0) forceShow(false); + if (linear != 0) showBouncer(false); } @Override @@ -123,31 +186,56 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud } }; + private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = + new KeyguardUpdateMonitorCallback() { + public void onBiometricRunningStateChanged(boolean running, + BiometricSourceType biometricSourceType) { + if (biometricSourceType == BiometricSourceType.FACE) { + updateFaceDetectRunning(running); + } + } + + public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) { + if (biometricSourceType == BiometricSourceType.FACE) { + // show udfps hint when face auth fails + showHint(true); + } + } + + public void onBiometricAuthenticated(int userId, + BiometricSourceType biometricSourceType, boolean isStrongBiometric) { + if (biometricSourceType == BiometricSourceType.FACE) { + // cancel delayed hint if face auth succeeded + cancelDelayedHint(); + } + } + }; + private final StatusBarKeyguardViewManager.AlternateAuthInterceptor mAlternateAuthInterceptor = new StatusBarKeyguardViewManager.AlternateAuthInterceptor() { @Override - public boolean showAlternativeAuthMethod() { - if (mForceShow) { + public boolean showAlternateAuthBouncer() { + if (mShowBouncer) { return false; } - forceShow(true); + showBouncer(true); return true; } @Override - public boolean resetForceShow() { - if (!mForceShow) { + public boolean hideAlternateAuthBouncer() { + if (!mShowBouncer) { return false; } - forceShow(false); + showBouncer(false); return true; } @Override - public boolean isShowingAlternateAuth() { - return mForceShow; + public boolean isShowingAlternateAuthBouncer() { + return mShowBouncer; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java index bb037202d985..3871248eccd5 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java @@ -112,9 +112,21 @@ public interface FalsingCollector { /** */ void onBouncerHidden(); - /** */ + /** + * Call this to record a MotionEvent in the {@link com.android.systemui.plugins.FalsingManager}. + * + * Be sure to call {@link #onMotionEventComplete()} after the rest of SystemUI is done with the + * MotionEvent. + */ void onTouchEvent(MotionEvent ev); + /** + * Call this once SystemUI has completed all processing of a given MotionEvent. + * + * See {@link #onTouchEvent(MotionEvent)}. + */ + void onMotionEventComplete(); + /** */ void avoidGesture(); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java index 939b45a2b4a5..28aac051c66d 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java @@ -147,6 +147,10 @@ public class FalsingCollectorFake implements FalsingCollector { } @Override + public void onMotionEventComplete() { + } + + @Override public void avoidGesture() { } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java index cf6169703dca..aaea9ce98359 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java @@ -275,6 +275,11 @@ class FalsingCollectorImpl implements FalsingCollector { } @Override + public void onMotionEventComplete() { + mFalsingDataProvider.onMotionEventComplete(); + } + + @Override public void avoidGesture() { mAvoidGesture = true; if (mPendingDownEvent != null) { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java index 1aaa139eb7ce..2e60a65c3bd1 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java @@ -81,8 +81,8 @@ public class FalsingDataProvider { } if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + // Ensure prior gesture was completed. May be a no-op. completePriorGesture(); - mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS); } mRecentMotionEvents.addAll(motionEvents); @@ -100,12 +100,23 @@ public class FalsingDataProvider { mDirty = true; } + void onMotionEventComplete() { + if (mRecentMotionEvents.isEmpty()) { + return; + } + int action = mRecentMotionEvents.get(mRecentMotionEvents.size() - 1).getActionMasked(); + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + completePriorGesture(); + } + } + private void completePriorGesture() { if (!mRecentMotionEvents.isEmpty()) { mGestureFinalizedListeners.forEach(listener -> listener.onGestureFinalized( mRecentMotionEvents.get(mRecentMotionEvents.size() - 1).getEventTime())); mPriorMotionEvents = mRecentMotionEvents; + mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS); } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 1a729295165c..187caf9c2b2e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -31,7 +31,6 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.ServiceManager; import android.os.UserHandle; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.view.Choreographer; import android.view.IWindowManager; import android.view.LayoutInflater; @@ -376,11 +375,4 @@ public class DependencyProvider { public ModeSwitchesController providesModeSwitchesController(Context context) { return new ModeSwitchesController(context); } - - /** */ - @Provides - @SysUISingleton - public QuickAccessWalletClient provideQuickAccessWalletClient(Context context) { - return QuickAccessWalletClient.create(context); - } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index b67db03a743c..365a102b61dd 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -73,6 +73,7 @@ import com.android.systemui.util.settings.SettingsUtilModule; import com.android.systemui.util.time.SystemClock; import com.android.systemui.util.time.SystemClockImpl; import com.android.systemui.volume.dagger.VolumeModule; +import com.android.systemui.wallet.dagger.WalletModule; import com.android.systemui.wmshell.BubblesManager; import com.android.wm.shell.bubbles.Bubbles; @@ -109,7 +110,8 @@ import dagger.Provides; TunerModule.class, UserModule.class, UtilModule.class, - VolumeModule.class + VolumeModule.class, + WalletModule.class }, subcomponents = { StatusBarComponent.class, diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java index 0673879758ad..37b8a2c953fe 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentService.java @@ -23,6 +23,7 @@ import android.view.View; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.qs.QSFragment; +import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.policy.ConfigurationController; import java.io.FileDescriptor; @@ -128,6 +129,9 @@ public class FragmentService implements Dumpable { * Inject a QSFragment. */ QSFragment createQSFragment(); + + /** Inject a CollapsedStatusBarFragment. */ + CollapsedStatusBarFragment createCollapsedStatusBarFragment(); } private class FragmentHostState { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index d54d3f21f0b6..9a889e0ff088 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -210,6 +210,7 @@ public class QSDetail extends LinearLayout { mDetailAdapter = adapter; listener = mHideGridContentWhenDone; setVisibility(View.VISIBLE); + updateDetailText(); } else { if (wasShowingDetail) { Dependency.get(MetricsLogger.class).hidden(mDetailAdapter.getMetricsCategory()); @@ -223,7 +224,6 @@ public class QSDetail extends LinearLayout { mQsPanelController.setGridContentVisibility(true); mQsPanelCallback.onScanStateChanged(false); } - updateDetailText(); sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); if (mShouldAnimate) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java index 3d8784b29e4c..eb7b115700a7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java @@ -75,6 +75,8 @@ public class QSFooterView extends FrameLayout { private TouchAnimator mSettingsCogAnimator; private View mActionsContainer; + private View mTunerIcon; + private int mTunerIconTranslation; private OnClickListener mExpandClickListener; @@ -107,6 +109,7 @@ public class QSFooterView extends FrameLayout { mActionsContainer = requireViewById(R.id.qs_footer_actions_container); mEditContainer = findViewById(R.id.qs_footer_actions_edit_container); mBuildText = findViewById(R.id.build); + mTunerIcon = requireViewById(R.id.tuner_icon); // RenderThread is doing more harm than good when touching the header (to expand quick // settings), so disable it for this view @@ -166,6 +169,9 @@ public class QSFooterView extends FrameLayout { private void updateResources() { updateFooterAnimator(); + mTunerIconTranslation = mContext.getResources() + .getDimensionPixelOffset(R.dimen.qs_footer_tuner_icon_translation); + mTunerIcon.setTranslationX(isLayoutRtl() ? -mTunerIconTranslation : mTunerIconTranslation); } private void updateFooterAnimator() { @@ -274,8 +280,7 @@ public class QSFooterView extends FrameLayout { private void updateVisibilities(boolean isTunerEnabled) { mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE); - mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( - isTunerEnabled ? View.VISIBLE : View.INVISIBLE); + mTunerIcon.setVisibility(isTunerEnabled ? View.VISIBLE : View.INVISIBLE); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE); if (mEditContainer != null) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 8aaf84b7d9f9..b661e2b6ae57 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -17,9 +17,6 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN; -import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON; - import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -41,7 +38,7 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.qs.QSDetail.Callback; -import com.android.systemui.statusbar.StatusBarMobileView; +import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusIconContainer; @@ -91,7 +88,7 @@ public class QuickStatusBarHeader extends FrameLayout { public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); - mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_mobile); + mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_no_calling); } /** @@ -221,8 +218,8 @@ public class QuickStatusBarHeader extends FrameLayout { } private void updateAlphaAnimator() { - StatusBarMobileView icon = - ((StatusBarMobileView) mIconContainer.getViewForSlot(mMobileSlotName)); + StatusBarIconView icon = + ((StatusBarIconView) mIconContainer.getViewForSlot(mMobileSlotName)); TouchAnimator.Builder builder = new TouchAnimator.Builder() .addFloat(mQSCarriers, "alpha", 0, 1) .addFloat(mDatePrivacyView, "alpha", 0, mDatePrivacyAlpha); @@ -231,14 +228,12 @@ public class QuickStatusBarHeader extends FrameLayout { builder.setListener(new TouchAnimator.ListenerAdapter() { @Override public void onAnimationAtEnd() { - icon.forceHidden(true); - icon.setVisibleState(STATE_HIDDEN); + mIconContainer.addIgnoredSlot(mMobileSlotName); } @Override public void onAnimationStarted() { - icon.forceHidden(false); - icon.setVisibleState(STATE_ICON); + mIconContainer.removeIgnoredSlot(mMobileSlotName); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java index ce90fc107b82..b609df5e77fe 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java @@ -134,8 +134,9 @@ public class SignalTileView extends QSIconViewImpl { mSignal.setPaddingRelative(0, 0, 0, 0); } final boolean shouldAnimate = allowAnimations && isShown(); - setVisibility(mIn, shouldAnimate, s.activityIn); - setVisibility(mOut, shouldAnimate, s.activityOut); + // Do not show activity indicators +// setVisibility(mIn, shouldAnimate, s.activityIn); +// setVisibility(mOut, shouldAnimate, s.activityOut); } private void setVisibility(View view, boolean shown, boolean visible) { diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java index 926d5c4701aa..2863074bee0a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java @@ -83,6 +83,13 @@ public class ScrollCaptureClient { int getMaxTiles(); /** + * @return the maximum combined capture height for this session, in pixels. + */ + default int getMaxHeight() { + return getMaxTiles() * getTileHeight(); + } + + /** * @return the height of each image tile */ int getTileHeight(); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java index d3dd048a989e..3dc8ae8ada9f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureController.java @@ -27,6 +27,7 @@ import android.view.ScrollCaptureResponse; import androidx.concurrent.futures.CallbackToFutureAdapter; import androidx.concurrent.futures.CallbackToFutureAdapter.Completer; +import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.screenshot.ScrollCaptureClient.CaptureResult; import com.android.systemui.screenshot.ScrollCaptureClient.Session; @@ -139,6 +140,11 @@ public class ScrollCaptureController { mImageTileSet = imageTileSet; } + @VisibleForTesting + float getTargetTopSizeRatio() { + return IDEAL_PORTION_ABOVE; + } + /** * Run scroll capture. Performs a batch capture, collecting image tiles. * diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java index 90c3dfcee5bf..b937dad269e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java @@ -98,4 +98,8 @@ public class FeatureFlags { public boolean isChargingRippleEnabled() { return mFlagReader.isEnabled(R.bool.flag_charging_ripple); } + + public boolean isOngoingCallStatusBarChipEnabled() { + return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java index e090d0b13205..1c5df4119a24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java @@ -161,22 +161,22 @@ public class NotificationGroupingUtil { private void sanitizeTopLineViews(ExpandableNotificationRow row) { if (row.isSummaryWithChildren()) { - sanitizeTopLine(row.getNotificationViewWrapper().getNotificationHeader()); + sanitizeTopLine(row.getNotificationViewWrapper().getNotificationHeader(), row); return; } final NotificationContentView layout = row.getPrivateLayout(); - sanitizeChild(layout.getContractedChild()); - sanitizeChild(layout.getHeadsUpChild()); - sanitizeChild(layout.getExpandedChild()); + sanitizeChild(layout.getContractedChild(), row); + sanitizeChild(layout.getHeadsUpChild(), row); + sanitizeChild(layout.getExpandedChild(), row); } - private void sanitizeChild(View child) { + private void sanitizeChild(View child, ExpandableNotificationRow row) { if (child != null) { - sanitizeTopLine(child.findViewById(R.id.notification_top_line)); + sanitizeTopLine(child.findViewById(R.id.notification_top_line), row); } } - private void sanitizeTopLine(ViewGroup rowHeader) { + private void sanitizeTopLine(ViewGroup rowHeader, ExpandableNotificationRow row) { if (rowHeader == null) { return; } @@ -195,7 +195,7 @@ public class NotificationGroupingUtil { } // in case no view is visible we make sure the time is visible int timeVisibility = !hasVisibleText - || mRow.getEntry().getSbn().getNotification().showsTime() + || row.getEntry().getSbn().getNotification().showsTime() ? View.VISIBLE : View.GONE; time.setVisibility(timeVisibility); View left = null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt index 2f198d500299..77b418670ca6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/ChargingRippleView.kt @@ -20,13 +20,14 @@ import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context +import android.content.res.Configuration import android.graphics.Canvas import android.graphics.Paint import android.graphics.PointF import android.util.AttributeSet import android.view.View -private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.4f +private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.3f /** * Expanding ripple effect that shows when charging begins. @@ -51,6 +52,16 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context visibility = View.GONE } + override fun onConfigurationChanged(newConfig: Configuration?) { + rippleShader.pixelDensity = resources.displayMetrics.density + super.onConfigurationChanged(newConfig) + } + + override fun onAttachedToWindow() { + rippleShader.pixelDensity = resources.displayMetrics.density + super.onAttachedToWindow() + } + fun startRipple() { if (rippleInProgress) { return // Ignore if ripple effect is already playing diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt index 296868a20dad..146046b33375 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt @@ -42,6 +42,7 @@ class RippleShader internal constructor() : RuntimeShader(SHADER, false) { uniform float in_fadeCircle; uniform float in_fadeRing; uniform float in_blur; + uniform float in_pixelDensity; uniform vec4 in_color; uniform float in_sparkle_strength;""" private const val SHADER_LIB = """float triangleNoise(vec2 n) { @@ -60,12 +61,13 @@ class RippleShader internal constructor() : RuntimeShader(SHADER, false) { float n = triangleNoise(uv); float s = 0.0; for (float i = 0; i < 4; i += 1) { - float l = i * 0.25; - float h = l + 0.005; - float o = abs(sin(0.1 * PI * (t + i))); - s += threshold(n + o, l, h); + float l = i * 0.01; + float h = l + 0.1; + float o = smoothstep(n - l, h, n); + o *= abs(sin(PI * o * (t + 0.55 * i))); + s += o; } - return saturate(s); + return s; } float softCircle(vec2 uv, vec2 xy, float radius, float blur) { @@ -96,10 +98,11 @@ class RippleShader internal constructor() : RuntimeShader(SHADER, false) { // Draw shapes float sparkleRing = softRing(p_distorted, in_origin, in_radius, in_blur); - float sparkle = sparkles(p, in_time * 0.000033) * sparkleRing * in_fadeSparkle; + float sparkle = sparkles(p - mod(p, in_pixelDensity * 0.8), in_time * 0.00175) + * sparkleRing * in_fadeSparkle; float circle = softCircle(p_distorted, in_origin, in_radius * 1.2, in_blur); float rippleAlpha = max(circle * in_fadeCircle, - softRing(p_distorted, in_origin, in_radius, in_blur) * in_fadeRing) * 0.36; + softRing(p_distorted, in_origin, in_radius, in_blur) * in_fadeRing) * 0.45; vec4 ripple = in_color * rippleAlpha; return mix(ripple, vec4(sparkle), sparkle * in_sparkle_strength); }""" @@ -139,12 +142,12 @@ class RippleShader internal constructor() : RuntimeShader(SHADER, false) { field = value setUniform("in_progress", value) setUniform("in_radius", - (1 - (1 - value) * (1 - value) * (1 - value))* 1.2f * radius) + (1 - (1 - value) * (1 - value) * (1 - value))* radius) setUniform("in_blur", MathUtils.lerp(1.25f, 0.5f, value)) val fadeIn = subProgress(0f, 0.1f, value) - val fadeOutNoise = subProgress(0.8f, 1f, value) - val fadeOutRipple = subProgress(0.4f, 1f, value) + val fadeOutNoise = subProgress(0.4f, 1f, value) + val fadeOutRipple = subProgress(0.3f, 1f, value) val fadeCircle = subProgress(0f, 0.2f, value) setUniform("in_fadeSparkle", Math.min(fadeIn, 1 - fadeOutNoise)) setUniform("in_fadeCircle", 1 - fadeCircle) @@ -191,4 +194,10 @@ class RippleShader internal constructor() : RuntimeShader(SHADER, false) { setUniform("in_distort_radial", 75 * progress * value) setUniform("in_distort_xy", 75 * value) } + + var pixelDensity: Float = 1.0f + set(value) { + field = value + setUniform("in_pixelDensity", value) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java index efd0519d6608..14c73b5cbb4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java @@ -49,6 +49,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper; import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy; import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager; +import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ManagedProfileController; @@ -57,6 +58,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl; import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.policy.RemoteInputUriController; import com.android.systemui.tracing.ProtoTracer; import com.android.systemui.util.DeviceConfigProxy; @@ -226,4 +228,16 @@ public interface StatusBarDependenciesModule { @Binds StatusBarIconController provideStatusBarIconController( StatusBarIconControllerImpl controllerImpl); + + /** + */ + @Provides + @SysUISingleton + static OngoingCallController provideOngoingCallController( + CommonNotifCollection notifCollection, FeatureFlags featureFlags) { + OngoingCallController ongoingCallController = + new OngoingCallController(notifCollection, featureFlags); + ongoingCallController.init(); + return ongoingCallController; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java index 75d772e8a1c5..db0c1745f565 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionListener.java @@ -57,7 +57,7 @@ public interface NotifCollectionListener { * Called whenever a notification with the same key as an existing notification is posted. By * the time this listener is called, the entry's SBN and Ranking will already have been updated. */ - default void onEntryUpdated(NotificationEntry entry) { + default void onEntryUpdated(@NonNull NotificationEntry entry) { } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java index 562d0ec06a63..f64a0e03698a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java @@ -37,6 +37,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.policy.EncryptionHelper; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.NetworkController; @@ -45,6 +46,8 @@ import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + /** * Contains the collapsed status bar and handles hiding/showing based on disable flags * and keyguard state. Also manages lifecycle to make sure the views it contains are being @@ -72,6 +75,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private DarkIconManager mDarkIconManager; private View mOperatorNameFrame; private CommandQueue mCommandQueue; + private OngoingCallController mOngoingCallController; private List<String> mBlockedIcons = new ArrayList<>(); @@ -82,6 +86,11 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } }; + @Inject + public CollapsedStatusBarFragment(OngoingCallController ongoingCallController) { + mOngoingCallController = ongoingCallController; + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -110,7 +119,6 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mDarkIconManager.setShouldLog(true); mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume)); mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock)); - mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength)); mDarkIconManager.setBlockList(mBlockedIcons); Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager); mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 2d760e6fc176..3f8e9d372d82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -189,7 +189,6 @@ public class KeyguardStatusBarView extends RelativeLayout Resources r = getResources(); mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume)); mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock)); - mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_call_strength)); } private void updateVisibilities() { 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 a38cf61d5e4e..555df5c37ee3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3543,7 +3543,8 @@ public class NotificationPanelViewController extends PanelViewController { mStatusBarStateController, mUpdateMonitor, mAuthController, - mStatusBarKeyguardViewManager); + mStatusBarKeyguardViewManager, + mKeyguardStateController); mDisabledUdfpsController.init(); } else if (mDisabledUdfpsController != null && !udfpsEnrolled) { mDisabledUdfpsController.destroy(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java index af595b60daa1..72f169564c10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java @@ -49,7 +49,6 @@ import android.view.WindowInsets; import android.view.WindowInsetsController; import android.widget.FrameLayout; -import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.view.FloatingActionMode; import com.android.internal.widget.FloatingToolbar; import com.android.systemui.R; @@ -174,7 +173,11 @@ public class NotificationShadeWindowView extends FrameLayout { public boolean dispatchTouchEvent(MotionEvent ev) { Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev); - return result != null ? result : super.dispatchTouchEvent(ev); + result = result != null ? result : super.dispatchTouchEvent(ev); + + mInteractionEventHandler.dispatchTouchEventComplete(); + + return result; } @Override @@ -346,6 +349,12 @@ public class NotificationShadeWindowView extends FrameLayout { Boolean handleDispatchTouchEvent(MotionEvent ev); /** + * Called after all dispatching is done. + */ + + void dispatchTouchEventComplete(); + + /** * Returns if the view should intercept the touch event. * * The touch event may still be interecepted if diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java index 5595ae7ed820..2ff7c9933edf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java @@ -292,6 +292,11 @@ public class NotificationShadeWindowViewController { } @Override + public void dispatchTouchEventComplete() { + mFalsingCollector.onMotionEventComplete(); + } + + @Override public boolean shouldInterceptTouchEvent(MotionEvent ev) { if (mStatusBarStateController.isDozing() && !mService.isPulsing() && !mDockManager.isDocked()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 012439e448c3..d4df126c55b9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -225,6 +225,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -424,6 +425,7 @@ public class StatusBar extends SystemUI implements DemoMode, private final DismissCallbackRegistry mDismissCallbackRegistry; private final DemoModeController mDemoModeController; private NotificationsController mNotificationsController; + private final OngoingCallController mOngoingCallController; // expanded notifications // the sliding/resizing panel within the notification window @@ -788,6 +790,7 @@ public class StatusBar extends SystemUI implements DemoMode, NotificationIconAreaController notificationIconAreaController, BrightnessSlider.Factory brightnessSliderFactory, WiredChargingRippleController chargingRippleAnimationController, + OngoingCallController ongoingCallController, FeatureFlags featureFlags) { super(context); mNotificationsController = notificationsController; @@ -867,6 +870,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationIconAreaController = notificationIconAreaController; mBrightnessSliderFactory = brightnessSliderFactory; mChargingRippleAnimationController = chargingRippleAnimationController; + mOngoingCallController = ongoingCallController; mFeatureFlags = featureFlags; mExpansionChangedListeners = new ArrayList<>(); @@ -1153,7 +1157,8 @@ public class StatusBar extends SystemUI implements DemoMode, checkBarModes(); }).getFragmentManager() .beginTransaction() - .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(), + .replace(R.id.status_bar_container, + new CollapsedStatusBarFragment(mOngoingCallController), CollapsedStatusBarFragment.TAG) .commit(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 93b83d3cbcbd..89e701606c1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -74,10 +74,6 @@ public interface StatusBarIconController { /** * Display the no calling & SMS icons. */ - void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states); - /** - * Display the no calling & SMS icons. - */ void setNoCallingIcons(String slot, List<CallIndicatorIconState> states); public void setIconVisibility(String slot, boolean b); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java index 75900a2bffa1..068ded32bbdb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -224,33 +224,6 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } /** - * Accept a list of CallIndicatorIconStates, and show the call strength icons. - * @param slot StatusBar slot for the call strength icons - * @param states All of the no Calling & SMS icon states - */ - @Override - public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) { - Slot callStrengthSlot = getSlot(slot); - int callStrengthSlotIndex = getSlotIndex(slot); - Collections.reverse(states); - for (CallIndicatorIconState state : states) { - if (!state.isNoCalling) { - StatusBarIconHolder holder = callStrengthSlot.getHolderForTag(state.subId); - if (holder == null) { - holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state); - setIcon(callStrengthSlotIndex, holder); - } else { - holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(), - Icon.createWithResource(mContext, state.callStrengthResId), 0, 0, - state.callStrengthDescription)); - setIcon(callStrengthSlotIndex, holder); - } - } - setIconVisibility(slot, !state.isNoCalling, state.subId); - } - } - - /** * Accept a list of CallIndicatorIconStates, and show the no calling icons. * @param slot StatusBar slot for the no calling icons * @param states All of the no Calling & SMS icon states diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java index af342dd31a76..4ca71f081c0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java @@ -86,11 +86,9 @@ public class StatusBarIconHolder { Context context, CallIndicatorIconState state) { StatusBarIconHolder holder = new StatusBarIconHolder(); - int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId; - String contentDescription = state.isNoCalling - ? state.noCallingDescription : state.callStrengthDescription; holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(), - Icon.createWithResource(context, resId), 0, 0, contentDescription); + Icon.createWithResource(context, state.noCallingResId), + 0, 0, state.noCallingDescription); holder.mTag = state.subId; return holder; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 0b6bbcd407f2..ef2444eba814 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -479,7 +479,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (mAlternateAuthInterceptor != null) { mAfterKeyguardGoneAction = r; mKeyguardGoneCancelAction = cancelAction; - if (mAlternateAuthInterceptor.showAlternativeAuthMethod()) { + if (mAlternateAuthInterceptor.showAlternateAuthBouncer()) { mStatusBar.updateScrimController(); } return; @@ -529,7 +529,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * Stop showing any alternate auth methods */ public void resetAlternateAuth() { - if (mAlternateAuthInterceptor != null && mAlternateAuthInterceptor.resetForceShow()) { + if (mAlternateAuthInterceptor != null + && mAlternateAuthInterceptor.hideAlternateAuthBouncer()) { mStatusBar.updateScrimController(); } } @@ -1141,12 +1142,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public boolean isShowingAlternateAuth() { return mAlternateAuthInterceptor != null - && mAlternateAuthInterceptor.isShowingAlternateAuth(); + && mAlternateAuthInterceptor.isShowingAlternateAuthBouncer(); } public boolean isShowingAlternateAuthOrAnimating() { return mAlternateAuthInterceptor != null - && (mAlternateAuthInterceptor.isShowingAlternateAuth() + && (mAlternateAuthInterceptor.isShowingAlternateAuthBouncer() || mAlternateAuthInterceptor.isAnimating()); } @@ -1174,24 +1175,25 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb /** * Delegate used to send show/reset events to an alternate authentication method instead of the - * bouncer. + * regular pin/pattern/password bouncer. */ public interface AlternateAuthInterceptor { /** - * @return whether alternative auth method was newly shown + * Show alternate authentication bouncer. + * @return whether alternate auth method was newly shown */ - boolean showAlternativeAuthMethod(); + boolean showAlternateAuthBouncer(); /** - * reset the state to the default (only keyguard showing, no auth methods showing) - * @return whether alternative auth method was newly hidden + * Hide alternate authentication bouncer + * @return whether the alternate auth method was newly hidden */ - boolean resetForceShow(); + boolean hideAlternateAuthBouncer(); /** - * @return true if alternative auth method is showing + * @return true if the alternate auth bouncer is showing */ - boolean isShowingAlternateAuth(); + boolean isShowingAlternateAuthBouncer(); /** * print information for the alternate auth interceptor registered @@ -1199,12 +1201,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb void dump(PrintWriter pw); /** - * @return true if the new auth method is currently animating in or out. + * @return true if the new auth method bouncer is currently animating in or out. */ boolean isAnimating(); /** - * Set whether qs is currently expanded + * Set whether qs is currently expanded. */ void setQsExpanded(boolean expanded); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 3445826eefbe..b57d8766854e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -22,7 +22,6 @@ import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.Log; -import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController; @@ -50,7 +49,6 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba private final String mSlotEthernet; private final String mSlotVpn; private final String mSlotNoCalling; - private final String mSlotCallStrength; private final Context mContext; private final StatusBarIconController mIconController; @@ -84,8 +82,6 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba mSlotEthernet = mContext.getString(com.android.internal.R.string.status_bar_ethernet); mSlotVpn = mContext.getString(com.android.internal.R.string.status_bar_vpn); mSlotNoCalling = mContext.getString(com.android.internal.R.string.status_bar_no_calling); - mSlotCallStrength = - mContext.getString(com.android.internal.R.string.status_bar_call_strength); mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity); mIconController = iconController; @@ -211,14 +207,9 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) { state.isNoCalling = statusIcon.visible; state.noCallingDescription = statusIcon.contentDescription; - } else { - state.callStrengthResId = statusIcon.icon; - state.callStrengthDescription = statusIcon.contentDescription; + mIconController.setNoCallingIcons(mSlotNoCalling, + CallIndicatorIconState.copyStates(mCallIndicatorStates)); } - mIconController.setCallStrengthIcons(mSlotCallStrength, - CallIndicatorIconState.copyStates(mCallIndicatorStates)); - mIconController.setNoCallingIcons(mSlotNoCalling, - CallIndicatorIconState.copyStates(mCallIndicatorStates)); } @Override @@ -305,7 +296,6 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba mIconController.removeAllIconsForSlot(mSlotMobile); mIconController.removeAllIconsForSlot(mSlotNoCalling); - mIconController.removeAllIconsForSlot(mSlotCallStrength); mMobileStates.clear(); List<CallIndicatorIconState> noCallingStates = new ArrayList<CallIndicatorIconState>(); noCallingStates.addAll(mCallIndicatorStates); @@ -420,15 +410,12 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba public static class CallIndicatorIconState { public boolean isNoCalling; public int noCallingResId; - public int callStrengthResId; public int subId; public String noCallingDescription; - public String callStrengthDescription; private CallIndicatorIconState(int subId) { this.subId = subId; this.noCallingResId = R.drawable.ic_qs_no_calling_sms; - this.callStrengthResId = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0]; } @Override @@ -440,26 +427,21 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba CallIndicatorIconState that = (CallIndicatorIconState) o; return isNoCalling == that.isNoCalling && noCallingResId == that.noCallingResId - && callStrengthResId == that.callStrengthResId && subId == that.subId - && noCallingDescription == that.noCallingDescription - && callStrengthDescription == that.callStrengthDescription; + && noCallingDescription == that.noCallingDescription; } @Override public int hashCode() { - return Objects.hash(isNoCalling, noCallingResId, - callStrengthResId, subId, noCallingDescription, callStrengthDescription); + return Objects.hash(isNoCalling, noCallingResId, subId, noCallingDescription); } private void copyTo(CallIndicatorIconState other) { other.isNoCalling = isNoCalling; other.noCallingResId = noCallingResId; - other.callStrengthResId = callStrengthResId; other.subId = subId; other.noCallingDescription = noCallingDescription; - other.callStrengthDescription = callStrengthDescription; } private static List<CallIndicatorIconState> copyStates( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 4f32712e81fa..785d98ccd8dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -90,6 +90,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -206,6 +207,7 @@ public interface StatusBarPhoneModule { NotificationIconAreaController notificationIconAreaController, BrightnessSlider.Factory brightnessSliderFactory, WiredChargingRippleController chargingRippleAnimationController, + OngoingCallController ongoingCallController, FeatureFlags featureFlags) { return new StatusBar( context, @@ -288,6 +290,7 @@ public interface StatusBarPhoneModule { notificationIconAreaController, brightnessSliderFactory, chargingRippleAnimationController, + ongoingCallController, featureFlags); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt new file mode 100644 index 000000000000..60d3ea3a7093 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone.ongoingcall + +import android.app.Notification +import android.app.Notification.CallStyle.CALL_TYPE_ONGOING +import android.util.Log +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.FeatureFlags +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection +import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener +import javax.inject.Inject + +/** + * A controller to handle the ongoing call chip in the collapsed status bar. + */ +@SysUISingleton +class OngoingCallController @Inject constructor( + private val notifCollection: CommonNotifCollection, + private val featureFlags: FeatureFlags +) { + + private val notifListener = object : NotifCollectionListener { + override fun onEntryUpdated(entry: NotificationEntry) { + if (isOngoingCallNotification(entry) && DEBUG) { + Log.d(TAG, "Ongoing call notification updated") + } + } + + override fun onEntryRemoved(entry: NotificationEntry, reason: Int) { + if (isOngoingCallNotification(entry) && DEBUG) { + Log.d(TAG, "Ongoing call notification removed") + } + } + } + + fun init() { + if (featureFlags.isOngoingCallStatusBarChipEnabled) { + notifCollection.addCollectionListener(notifListener) + } + } +} + +private fun isOngoingCallNotification(entry: NotificationEntry): Boolean { + val extras = entry.sbn.notification.extras + val callStyleTemplateName = Notification.CallStyle::class.java.name + return extras.getString(Notification.EXTRA_TEMPLATE) == callStyleTemplateName && + extras.getInt(Notification.EXTRA_CALL_TYPE, -1) == CALL_TYPE_ONGOING +} + +private const val TAG = "OngoingCallController" +private val DEBUG = Log.isLoggable(TAG, Log.DEBUG) diff --git a/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java b/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java new file mode 100644 index 000000000000..c1f5516f02bb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/dagger/WalletModule.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.dagger; + +import android.app.Activity; +import android.content.Context; +import android.service.quickaccesswallet.QuickAccessWalletClient; + +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.wallet.ui.WalletActivity; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.ClassKey; +import dagger.multibindings.IntoMap; + + +/** + * Module for injecting classes in Wallet. + */ +@Module +public abstract class WalletModule { + + /** */ + @Binds + @IntoMap + @ClassKey(WalletActivity.class) + public abstract Activity provideWalletActivity(WalletActivity activity); + + /** */ + @SysUISingleton + @Provides + public static QuickAccessWalletClient provideQuickAccessWalletClient(Context context) { + return QuickAccessWalletClient.create(context); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java new file mode 100644 index 000000000000..644addfef1d1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.text.TextPaint; +import android.util.MathUtils; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.systemui.R; + +final class DotIndicatorDecoration extends RecyclerView.ItemDecoration { + private final int mUnselectedRadius; + private final int mSelectedRadius; + private final int mDotMargin; + @ColorInt private final int mUnselectedColor; + @ColorInt private final int mSelectedColor; + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + private WalletCardCarousel mCardCarousel; + + DotIndicatorDecoration(Context context) { + super(); + + mUnselectedRadius = + context.getResources().getDimensionPixelSize( + R.dimen.card_carousel_dot_unselected_radius); + mSelectedRadius = + context.getResources().getDimensionPixelSize( + R.dimen.card_carousel_dot_selected_radius); + mDotMargin = context.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_margin); + + TextView textView = new TextView(context); + mTextPaint.set(textView.getPaint()); + // Text color is not copied from text appearance. + mTextPaint.setColor(ContextCompat.getColor(context, R.color.GM2_blue_600)); + + mUnselectedColor = ContextCompat.getColor(context, R.color.GM2_grey_300); + mSelectedColor = ContextCompat.getColor(context, R.color.GM2_blue_600); + } + + @Override + public void getItemOffsets( + Rect rect, View view, RecyclerView recyclerView, RecyclerView.State state) { + super.getItemOffsets(rect, view, recyclerView, state); + if (recyclerView.getAdapter().getItemCount() > 1) { + rect.bottom = + view.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_offset); + } + } + + @Override + public void onDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.State state) { + super.onDrawOver(canvas, recyclerView, state); + + mCardCarousel = (WalletCardCarousel) recyclerView; + int itemCount = recyclerView.getAdapter().getItemCount(); + if (itemCount <= 1) { + // Only shown if there are at least 2 items, and it's not a shimmer loader + return; + } + canvas.save(); + + float animationStartOffset = recyclerView.getWidth() / 6f; + // 0 when a card is still very prominent, ie. edgeToCenterDistance is greater than + // animationStartOffset + // 1 when the two cards are equidistant from the center ie. edgeToCenterDistance == 0 + float interpolatedProgress = + 1 - Math.min(Math.abs(mCardCarousel.mEdgeToCenterDistance), animationStartOffset) + / animationStartOffset; + + float totalWidth = + mDotMargin * (itemCount - 1) + + 2 * mUnselectedRadius * (itemCount - 2) + + 2 * mSelectedRadius; + // Translate the canvas so the drawing can always start at (0, 0) coordinates. + canvas.translate( + (recyclerView.getWidth() - totalWidth) / 2f, + recyclerView.getHeight() - mDotMargin); + + int itemsDrawn = 0; + while (itemsDrawn < itemCount) { + // count up from 0 to itemCount - 1 if LTR; count down from itemCount - 1 to 0 if RTL. + int i = isLayoutLtr() ? itemsDrawn : itemCount - itemsDrawn - 1; + + if (isSelectedItem(i)) { + drawSelectedDot(canvas, interpolatedProgress, i); + } else if (isNextItemInScrollingDirection(i)) { + drawFadingUnselectedDot(canvas, interpolatedProgress, i); + } else { + drawUnselectedDot(canvas); + } + canvas.translate(mDotMargin, 0); + itemsDrawn++; + } + + canvas.restore(); + this.mCardCarousel = null; // No need to hold a reference. + } + + private void drawSelectedDot(Canvas canvas, float progress, int position) { + // Divide progress by 2 because the other half of the animation is done by + // drawFadingUnselectedDot. + mPaint.setColor( + getTransitionAdjustedColor( + ColorUtils.blendARGB(mSelectedColor, mUnselectedColor, progress / 2))); + float radius = MathUtils.lerp(mSelectedRadius, mUnselectedRadius, progress / 2); + canvas.drawCircle(radius, 0, radius, mPaint); + canvas.translate(radius * 2, 0); + } + + private void drawFadingUnselectedDot(Canvas canvas, float progress, int position) { + // Divide progress by 2 because the first half of the animation is done by drawSelectedDot. + int blendedColor = + ColorUtils.blendARGB( + mUnselectedColor, mSelectedColor, progress / 2); + mPaint.setColor(getTransitionAdjustedColor(blendedColor)); + float radius = MathUtils.lerp(mSelectedRadius, mUnselectedRadius, progress / 2); + canvas.drawCircle(radius, 0, radius, mPaint); + canvas.translate(radius * 2, 0); + } + + private void drawUnselectedDot(Canvas canvas) { + mPaint.setColor(mUnselectedColor); + canvas.drawCircle(mUnselectedRadius, 0, mUnselectedRadius, mPaint); + canvas.translate(mUnselectedRadius * 2, 0); + } + + private int getTransitionAdjustedColor(int color) { + int transitionAlphaOverride = 0xff; + return ColorUtils.setAlphaComponent(color, transitionAlphaOverride); + } + + private boolean isSelectedItem(int position) { + return mCardCarousel.mCenteredAdapterPosition == position; + } + + private boolean isNextItemInScrollingDirection(int position) { + if (isLayoutLtr()) { + return (mCardCarousel.mCenteredAdapterPosition + 1 == position + && mCardCarousel.mEdgeToCenterDistance >= 0f) + || (mCardCarousel.mCenteredAdapterPosition - 1 == position + && mCardCarousel.mEdgeToCenterDistance < 0f); + } + return (mCardCarousel.mCenteredAdapterPosition - 1 == position + && mCardCarousel.mEdgeToCenterDistance >= 0f) + || (mCardCarousel.mCenteredAdapterPosition + 1 == position + && mCardCarousel.mEdgeToCenterDistance < 0f); + } + + private boolean isLayoutLtr() { + if (mCardCarousel == null) { + // Shouldn't happen, but assume LTR for now. + return true; + } + return mCardCarousel.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java new file mode 100644 index 000000000000..ba063a8ba303 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.view.MenuItem; +import android.view.Window; + +import androidx.annotation.NonNull; + +import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.policy.KeyguardStateController; +import com.android.systemui.util.LifecycleActivity; + +import java.util.concurrent.Executor; + +import javax.inject.Inject; + +/** + * Displays Wallet carousel screen inside an activity. + */ +public class WalletActivity extends LifecycleActivity { + + private final QuickAccessWalletClient mQuickAccessWalletClient; + private final KeyguardStateController mKeyguardStateController; + private final ActivityStarter mActivityStarter; + private final Executor mExecutor; + private final Handler mHandler; + private final UserTracker mUserTracker; + private WalletScreenController mWalletScreenController; + + @Inject + public WalletActivity( + QuickAccessWalletClient quickAccessWalletClient, + KeyguardStateController keyguardStateController, + ActivityStarter activityStarter, + @Background Executor executor, + @Background Handler handler, + UserTracker userTracker) { + mQuickAccessWalletClient = quickAccessWalletClient; + mKeyguardStateController = keyguardStateController; + mActivityStarter = activityStarter; + mExecutor = executor; + mHandler = handler; + mUserTracker = userTracker; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); + super.onCreate(savedInstanceState); + + setContentView(R.layout.quick_access_wallet); + + getWindow().getDecorView().setBackgroundColor(getColor(R.color.wallet_white)); + setTitle(""); + getActionBar().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeAsUpIndicator(R.drawable.ic_close); + getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close); + WalletView walletView = requireViewById(R.id.wallet_view); + mWalletScreenController = new WalletScreenController( + this, + walletView, + mQuickAccessWalletClient, + mActivityStarter, + mExecutor, + mHandler, + mUserTracker, + !mKeyguardStateController.isUnlocked()); + walletView.getWalletButton().setOnClickListener( + v -> mActivityStarter.startActivity( + mQuickAccessWalletClient.createWalletIntent(), true)); + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + protected void onDestroy() { + mWalletScreenController.onDismissed(); + super.onDestroy(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java new file mode 100644 index 000000000000..21e55496d3e6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardCarousel.java @@ -0,0 +1,473 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.HapticFeedbackConstants; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.PagerSnapHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate; + +import com.android.systemui.R; + +import java.util.Collections; +import java.util.List; + +/** + * Card Carousel for displaying Quick Access Wallet cards. + */ +public class WalletCardCarousel extends RecyclerView { + + // A negative card margin is required because card shrinkage pushes the cards too far apart + private static final float CARD_MARGIN_RATIO = -.03f; + // Size of the unselected card as a ratio to size of selected card. + private static final float UNSELECTED_CARD_SCALE = .83f; + private static final float CORNER_RADIUS_RATIO = 25f / 700f; + private static final float CARD_ASPECT_RATIO = 700f / 440f; + private static final float CARD_VIEW_WIDTH_RATIO = 0.69f; + + + static final int CARD_ANIM_ALPHA_DURATION = 100; + static final int CARD_ANIM_ALPHA_DELAY = 50; + + private final Rect mSystemGestureExclusionZone = new Rect(); + private WalletCardCarouselAdapter mWalletCardCarouselAdapter; + private int mExpectedViewWidth; + private int mCardMarginPx; + private int mCardWidthPx; + private int mCardHeightPx; + private float mCornerRadiusPx; + private int mTotalCardWidth; + private float mCardEdgeToCenterDistance; + + private OnSelectionListener mSelectionListener; + private OnCardScrollListener mCardScrollListener; + // Adapter position of the child that is closest to the center of the recycler view, will also + // be used in DotIndicatorDecoration. + int mCenteredAdapterPosition = RecyclerView.NO_POSITION; + // Pixel distance, along y-axis, from the center of the recycler view to the nearest child, will + // also be used in DotIndicatorDecoration. + float mEdgeToCenterDistance = Float.MAX_VALUE; + private float mCardCenterToScreenCenterDistancePx = Float.MAX_VALUE; + // When card data is loaded, this many cards should be animated as data is bound to them. + private int mNumCardsToAnimate; + // When card data is loaded, this is the position of the leftmost card to be animated. + private int mCardAnimationStartPosition; + // When card data is loaded, the animations may be delayed so that other animations can complete + private int mExtraAnimationDelay; + + interface OnSelectionListener { + /** + * The card was moved to the center, thus selecting it. + */ + void onCardSelected(@NonNull WalletCardViewInfo card); + + /** + * The card was clicked. + */ + void onCardClicked(@NonNull WalletCardViewInfo card); + + /** + * Cards should be re-queried due to a layout change + */ + void queryWalletCards(); + } + + interface OnCardScrollListener { + void onCardScroll(WalletCardViewInfo centerCard, WalletCardViewInfo nextCard, + float percentDistanceFromCenter); + } + + public WalletCardCarousel(Context context) { + this(context, null); + } + + public WalletCardCarousel(Context context, @Nullable AttributeSet attributeSet) { + super(context, attributeSet); + + setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); + addOnScrollListener(new CardCarouselScrollListener()); + new CarouselSnapHelper().attachToRecyclerView(this); + mWalletCardCarouselAdapter = new WalletCardCarouselAdapter(); + mWalletCardCarouselAdapter.setHasStableIds(true); + setAdapter(mWalletCardCarouselAdapter); + ViewCompat.setAccessibilityDelegate(this, new CardCarouselAccessibilityDelegate(this)); + + addItemDecoration(new DotIndicatorDecoration(getContext())); + } + + /** + * We need to know the card width before we query cards. Card width depends on layout width. + * But the carousel isn't laid out until set to visible, which only happens after cards are + * returned. Setting the expected view width breaks the chicken-and-egg problem. + */ + void setExpectedViewWidth(int width) { + if (mExpectedViewWidth == width) { + return; + } + mExpectedViewWidth = width; + Resources res = getResources(); + DisplayMetrics metrics = res.getDisplayMetrics(); + int screenWidth = Math.min(metrics.widthPixels, metrics.heightPixels); + mCardWidthPx = Math.round(Math.min(width, screenWidth) * CARD_VIEW_WIDTH_RATIO); + mCardHeightPx = Math.round(mCardWidthPx / CARD_ASPECT_RATIO); + mCornerRadiusPx = mCardWidthPx * CORNER_RADIUS_RATIO; + mCardMarginPx = Math.round(mCardWidthPx * CARD_MARGIN_RATIO); + mTotalCardWidth = mCardWidthPx + res.getDimensionPixelSize(R.dimen.card_margin) * 2; + mCardEdgeToCenterDistance = mTotalCardWidth / 2f; + updatePadding(width); + if (mSelectionListener != null) { + mSelectionListener.queryWalletCards(); + } + } + + @Override + public void onViewAdded(View child) { + super.onViewAdded(child); + LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); + layoutParams.leftMargin = mCardMarginPx; + layoutParams.rightMargin = mCardMarginPx; + child.addOnLayoutChangeListener((v, l, t, r, b, ol, ot, or, ob) -> updateCardView(child)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + int width = getWidth(); + if (mWalletCardCarouselAdapter.getItemCount() > 1 && width < mTotalCardWidth * 1.5) { + // When 2 or more cards are available but only one whole card can be shown on screen at + // a time, the entire carousel is opted out from system gesture to help users swipe + // between cards without accidentally performing the 'back' gesture. When there is only + // one card or when the carousel is large enough to accommodate several whole cards, + // there is no need to disable the back gesture since either the user can't swipe or has + // plenty of room with which to do so. + mSystemGestureExclusionZone.set(0, 0, width, getHeight()); + setSystemGestureExclusionRects(Collections.singletonList(mSystemGestureExclusionZone)); + } + if (width != mExpectedViewWidth) { + updatePadding(width); + } + } + + void setExtraAnimationDelay(int extraAnimationDelay) { + mExtraAnimationDelay = extraAnimationDelay; + } + + void setSelectionListener(OnSelectionListener selectionListener) { + mSelectionListener = selectionListener; + } + + void setCardScrollListener(OnCardScrollListener scrollListener) { + mCardScrollListener = scrollListener; + } + + int getCardWidthPx() { + return mCardWidthPx; + } + + int getCardHeightPx() { + return mCardHeightPx; + } + + /** + * Set card data. Returns true if carousel was empty, indicating that views will be animated + */ + boolean setData(List<WalletCardViewInfo> data, int selectedIndex) { + boolean wasEmpty = mWalletCardCarouselAdapter.getItemCount() == 0; + mWalletCardCarouselAdapter.setData(data); + if (wasEmpty) { + scrollToPosition(selectedIndex); + mNumCardsToAnimate = numCardsOnScreen(data.size(), selectedIndex); + mCardAnimationStartPosition = Math.max(selectedIndex - 1, 0); + } + WalletCardViewInfo selectedCard = data.get(selectedIndex); + mCardScrollListener.onCardScroll(selectedCard, selectedCard, 0); + return wasEmpty; + } + + @Override + public void scrollToPosition(int position) { + super.scrollToPosition(position); + mSelectionListener.onCardSelected(mWalletCardCarouselAdapter.mData.get(position)); + } + + /** + * The number of cards shown on screen when one of the cards is position in the center. This is + * also the num + */ + private static int numCardsOnScreen(int numCards, int selectedIndex) { + if (numCards <= 2) { + return numCards; + } + // When there are 3 or more cards, 3 cards will be shown unless the first or last card is + // centered on screen. + return selectedIndex > 0 && selectedIndex < (numCards - 1) ? 3 : 2; + } + + /** + * The padding pushes the first and last cards in the list to the center when they are + * selected. + */ + private void updatePadding(int viewWidth) { + int paddingHorizontal = (viewWidth - mTotalCardWidth) / 2 - mCardMarginPx; + paddingHorizontal = Math.max(0, paddingHorizontal); // just in case + setPadding(paddingHorizontal, getPaddingTop(), paddingHorizontal, getPaddingBottom()); + + // re-center selected card after changing padding (if card is selected) + if (mWalletCardCarouselAdapter != null + && mWalletCardCarouselAdapter.getItemCount() > 0 + && mCenteredAdapterPosition != NO_POSITION) { + ViewHolder viewHolder = findViewHolderForAdapterPosition(mCenteredAdapterPosition); + if (viewHolder != null) { + View cardView = viewHolder.itemView; + int cardCenter = (cardView.getLeft() + cardView.getRight()) / 2; + int viewCenter = (getLeft() + getRight()) / 2; + int scrollX = cardCenter - viewCenter; + scrollBy(scrollX, 0); + } + } + } + + private void updateCardView(View view) { + WalletCardViewHolder viewHolder = (WalletCardViewHolder) view.getTag(); + CardView cardView = viewHolder.mCardView; + float center = (float) getWidth() / 2f; + float viewCenter = (view.getRight() + view.getLeft()) / 2f; + float viewWidth = view.getWidth(); + float position = (viewCenter - center) / viewWidth; + float scaleFactor = Math.max(UNSELECTED_CARD_SCALE, 1f - Math.abs(position)); + + cardView.setScaleX(scaleFactor); + cardView.setScaleY(scaleFactor); + + // a card is the "centered card" until its edge has moved past the center of the recycler + // view. note that we also need to factor in the negative margin. + // Find the edge that is closer to the center. + int edgePosition = + viewCenter < center ? view.getRight() + mCardMarginPx + : view.getLeft() - mCardMarginPx; + + if (Math.abs(viewCenter - center) < mCardCenterToScreenCenterDistancePx) { + int childAdapterPosition = getChildAdapterPosition(view); + if (childAdapterPosition == RecyclerView.NO_POSITION) { + return; + } + mCenteredAdapterPosition = getChildAdapterPosition(view); + mEdgeToCenterDistance = edgePosition - center; + mCardCenterToScreenCenterDistancePx = Math.abs(viewCenter - center); + } + } + + private class CardCarouselScrollListener extends OnScrollListener { + + private int mOldState = -1; + + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE && newState != mOldState) { + performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); + } + mOldState = newState; + } + + /** + * Callback method to be invoked when the RecyclerView has been scrolled. This will be + * called after the scroll has completed. + * + * <p>This callback will also be called if visible item range changes after a layout + * calculation. In that case, dx and dy will be 0. + * + * @param recyclerView The RecyclerView which scrolled. + * @param dx The amount of horizontal scroll. + * @param dy The amount of vertical scroll. + */ + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + mCenteredAdapterPosition = RecyclerView.NO_POSITION; + mEdgeToCenterDistance = Float.MAX_VALUE; + mCardCenterToScreenCenterDistancePx = Float.MAX_VALUE; + for (int i = 0; i < getChildCount(); i++) { + updateCardView(getChildAt(i)); + } + if (mCenteredAdapterPosition == RecyclerView.NO_POSITION || dx == 0) { + return; + } + + int nextAdapterPosition = + mCenteredAdapterPosition + (mEdgeToCenterDistance > 0 ? 1 : -1); + if (nextAdapterPosition < 0 + || nextAdapterPosition >= mWalletCardCarouselAdapter.mData.size()) { + return; + } + + // Update the label text based on the currently selected card and the next one + WalletCardViewInfo centerCard = + mWalletCardCarouselAdapter.mData.get(mCenteredAdapterPosition); + WalletCardViewInfo nextCard = mWalletCardCarouselAdapter.mData.get(nextAdapterPosition); + float percentDistanceFromCenter = + Math.abs(mEdgeToCenterDistance) / mCardEdgeToCenterDistance; + mCardScrollListener.onCardScroll(centerCard, nextCard, percentDistanceFromCenter); + } + } + + private class CarouselSnapHelper extends PagerSnapHelper { + + private static final float MILLISECONDS_PER_INCH = 200.0F; + private static final int MAX_SCROLL_ON_FLING_DURATION = 80; // ms + + @Override + public View findSnapView(LayoutManager layoutManager) { + View view = super.findSnapView(layoutManager); + if (view == null) { + // implementation decides not to snap + return null; + } + WalletCardViewHolder viewHolder = (WalletCardViewHolder) view.getTag(); + WalletCardViewInfo card = viewHolder.mCardViewInfo; + mSelectionListener.onCardSelected(card); + mCardScrollListener.onCardScroll(card, card, 0); + return view; + } + + /** + * The default SnapScroller is a little sluggish + */ + @Override + protected LinearSmoothScroller createScroller(LayoutManager layoutManager) { + return new LinearSmoothScroller(getContext()) { + @Override + protected void onTargetFound(View targetView, State state, Action action) { + int[] snapDistances = calculateDistanceToFinalSnap(layoutManager, targetView); + final int dx = snapDistances[0]; + final int dy = snapDistances[1]; + final int time = calculateTimeForDeceleration( + Math.max(Math.abs(dx), Math.abs(dy))); + if (time > 0) { + action.update(dx, dy, time, mDecelerateInterpolator); + } + } + + @Override + protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { + return MILLISECONDS_PER_INCH / displayMetrics.densityDpi; + } + + @Override + protected int calculateTimeForScrolling(int dx) { + return Math.min(MAX_SCROLL_ON_FLING_DURATION, + super.calculateTimeForScrolling(dx)); + } + }; + } + } + + private class WalletCardCarouselAdapter extends Adapter<WalletCardViewHolder> { + + private List<WalletCardViewInfo> mData = Collections.EMPTY_LIST; + + @NonNull + @Override + public WalletCardViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); + View view = inflater.inflate(R.layout.wallet_card_view, viewGroup, false); + WalletCardViewHolder viewHolder = new WalletCardViewHolder(view); + CardView cardView = viewHolder.mCardView; + cardView.setRadius(mCornerRadiusPx); + ViewGroup.LayoutParams layoutParams = cardView.getLayoutParams(); + layoutParams.width = mCardWidthPx; + layoutParams.height = mCardHeightPx; + view.setTag(viewHolder); + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull WalletCardViewHolder viewHolder, int position) { + WalletCardViewInfo cardViewInfo = mData.get(position); + viewHolder.mCardViewInfo = cardViewInfo; + if (cardViewInfo.getCardId().isEmpty()) { + viewHolder.mImageView.setScaleType(ImageView.ScaleType.CENTER); + } + viewHolder.mImageView.setImageDrawable(cardViewInfo.getCardDrawable()); + viewHolder.mCardView.setContentDescription(cardViewInfo.getContentDescription()); + viewHolder.mCardView.setOnClickListener( + v -> { + if (position != mCenteredAdapterPosition) { + smoothScrollToPosition(position); + } else { + mSelectionListener.onCardClicked(cardViewInfo); + } + }); + if (mNumCardsToAnimate > 0 && (position - mCardAnimationStartPosition < 2)) { + mNumCardsToAnimate--; + int startDelay = (position - mCardAnimationStartPosition) * CARD_ANIM_ALPHA_DELAY + + mExtraAnimationDelay; + viewHolder.itemView.setAlpha(0f); + viewHolder.itemView.animate().alpha(1f) + .setStartDelay(Math.max(0, startDelay)) + .setDuration(CARD_ANIM_ALPHA_DURATION).start(); + } + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @Override + public long getItemId(int position) { + return mData.get(position).getCardId().hashCode(); + } + + void setData(List<WalletCardViewInfo> data) { + mData = data; + notifyDataSetChanged(); + } + } + + private class CardCarouselAccessibilityDelegate extends RecyclerViewAccessibilityDelegate { + + private CardCarouselAccessibilityDelegate(@NonNull RecyclerView recyclerView) { + super(recyclerView); + } + + @Override + public boolean onRequestSendAccessibilityEvent( + ViewGroup viewGroup, View view, AccessibilityEvent accessibilityEvent) { + int eventType = accessibilityEvent.getEventType(); + if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) { + scrollToPosition(getChildAdapterPosition(view)); + } + return super.onRequestSendAccessibilityEvent(viewGroup, view, accessibilityEvent); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java new file mode 100644 index 000000000000..fc1adc37d09b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardView.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; + +import com.android.systemui.R; + +/** Customized card view of the wallet card carousel. */ +public class WalletCardView extends CardView { + private final Paint mBorderPaint; + + public WalletCardView(@NonNull Context context) { + this(context, null); + } + + public WalletCardView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + mBorderPaint = new Paint(); + mBorderPaint.setColor(context.getColor(R.color.wallet_card_border)); + mBorderPaint.setStrokeWidth( + context.getResources().getDimension(R.dimen.wallet_card_border_width)); + mBorderPaint.setStyle(Paint.Style.STROKE); + mBorderPaint.setAntiAlias(true); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + float radius = getRadius(); + canvas.drawRoundRect(0, 0, getWidth(), getHeight(), radius, radius, mBorderPaint); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java new file mode 100644 index 000000000000..3197976456e3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewHolder.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.view.View; +import android.widget.ImageView; + +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.systemui.R; + +/** + * View holder for the quick access wallet card. + */ +class WalletCardViewHolder extends RecyclerView.ViewHolder { + + final CardView mCardView; + final ImageView mImageView; + WalletCardViewInfo mCardViewInfo; + + WalletCardViewHolder(View view) { + super(view); + mCardView = view.requireViewById(R.id.card); + mImageView = mCardView.requireViewById(R.id.card_image); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java new file mode 100644 index 000000000000..669d6664b305 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletCardViewInfo.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +interface WalletCardViewInfo { + String getCardId(); + + /** + * Image of the card. + */ + @NonNull + Drawable getCardDrawable(); + + /** + * Content description for the card. + */ + @Nullable + CharSequence getContentDescription(); + + /** + * Icon shown above the card. + */ + @Nullable + Drawable getIcon(); + + /** + * Text shown above the card. + */ + @NonNull + CharSequence getLabel(); +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java new file mode 100644 index 000000000000..a93f0f0ba165 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.os.Handler; +import android.service.quickaccesswallet.GetWalletCardsError; +import android.service.quickaccesswallet.GetWalletCardsRequest; +import android.service.quickaccesswallet.GetWalletCardsResponse; +import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.service.quickaccesswallet.SelectWalletCardRequest; +import android.service.quickaccesswallet.WalletCard; +import android.service.quickaccesswallet.WalletServiceEvent; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.R; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.UserTracker; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + +/** Controller for the wallet card carousel screen. */ +public class WalletScreenController implements + WalletCardCarousel.OnSelectionListener, + QuickAccessWalletClient.OnWalletCardsRetrievedCallback, + QuickAccessWalletClient.WalletServiceEventListener { + + private static final String TAG = "WalletScreenCtrl"; + private static final String PREFS_HAS_CARDS = "has_cards"; + private static final String PREFS_WALLET_VIEW_HEIGHT = "wallet_view_height"; + private static final int MAX_CARDS = 10; + private static final long SELECTION_DELAY_MILLIS = TimeUnit.SECONDS.toMillis(30); + + private Context mContext; + private final QuickAccessWalletClient mWalletClient; + private final ActivityStarter mActivityStarter; + private final Executor mExecutor; + private final Handler mHandler; + private final Runnable mSelectionRunnable = this::selectCard; + private final SharedPreferences mPrefs; + private final WalletView mWalletView; + private final WalletCardCarousel mCardCarousel; + + @VisibleForTesting String mSelectedCardId; + @VisibleForTesting boolean mIsDismissed; + private boolean mIsDeviceLocked; + private boolean mHasRegisteredListener; + + public WalletScreenController( + Context context, + WalletView walletView, + QuickAccessWalletClient walletClient, + ActivityStarter activityStarter, + Executor executor, + Handler handler, + UserTracker userTracker, + boolean isDeviceLocked) { + mContext = context; + mWalletClient = walletClient; + mActivityStarter = activityStarter; + mExecutor = executor; + mHandler = handler; + mPrefs = userTracker.getUserContext().getSharedPreferences(TAG, Context.MODE_PRIVATE); + mWalletView = walletView; + mWalletView.setMinimumHeight(getExpectedMinHeight()); + mWalletView.setLayoutParams( + new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + mCardCarousel = mWalletView.getCardCarousel(); + if (mCardCarousel != null) { + mCardCarousel.setSelectionListener(this); + } + + if (!mPrefs.getBoolean(PREFS_HAS_CARDS, false)) { + // The empty state view is shown preemptively when cards were not returned last time + // to decrease perceived latency. + showEmptyStateView(); + } + mIsDeviceLocked = isDeviceLocked; + } + + /** + * Implements {@link QuickAccessWalletClient.OnWalletCardsRetrievedCallback}. Called when cards + * are retrieved successfully from the service. This is called on {@link #mExecutor}. + */ + @Override + public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) { + if (mIsDismissed) { + return; + } + List<WalletCard> walletCards = response.getWalletCards(); + List<WalletCardViewInfo> data = new ArrayList<>(walletCards.size()); + for (WalletCard card : walletCards) { + data.add(new QAWalletCardViewInfo(mContext, card)); + } + mHandler.post(() -> { + if (data.isEmpty()) { + showEmptyStateView(); + } else { + mWalletView.showCardCarousel(data, response.getSelectedIndex(), mIsDeviceLocked); + } + // The empty state view will not be shown preemptively next time if cards were returned + mPrefs.edit().putBoolean(PREFS_HAS_CARDS, !data.isEmpty()).apply(); + removeMinHeightAndRecordHeightOnLayout(); + }); + } + + /** + * Implements {@link QuickAccessWalletClient.OnWalletCardsRetrievedCallback}. Called when there + * is an error during card retrieval. This will be run on the {@link #mExecutor}. + */ + @Override + public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) { + if (mIsDismissed) { + return; + } + mHandler.post(() -> { + mWalletView.showErrorMessage(error.getMessage()); + }); + } + + /** + * Implements {@link QuickAccessWalletClient.WalletServiceEventListener}. Called when the wallet + * application propagates an event, such as an NFC tap, to the quick access wallet view. + */ + @Override + public void onWalletServiceEvent(WalletServiceEvent event) { + if (mIsDismissed) { + return; + } + switch (event.getEventType()) { + case WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED: + onDismissed(); + break; + case WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED: + queryWalletCards(); + break; + default: + Log.w(TAG, "onWalletServiceEvent: Unknown event type"); + } + } + + @Override + public void onCardSelected(@NonNull WalletCardViewInfo card) { + if (mIsDismissed) { + return; + } + mSelectedCardId = card.getCardId(); + selectCard(); + } + + private void selectCard() { + mHandler.removeCallbacks(mSelectionRunnable); + String selectedCardId = mSelectedCardId; + if (mIsDismissed || selectedCardId == null) { + return; + } + mWalletClient.selectWalletCard(new SelectWalletCardRequest(selectedCardId)); + // Re-selecting the card keeps the connection bound so we continue to get service events + // even if the user keeps it open for a long time. + mHandler.postDelayed(mSelectionRunnable, SELECTION_DELAY_MILLIS); + } + + + + @Override + public void onCardClicked(@NonNull WalletCardViewInfo cardInfo) { + if (!(cardInfo instanceof QAWalletCardViewInfo) + || ((QAWalletCardViewInfo) cardInfo).mWalletCard == null + || ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent() == null) { + return; + } + mActivityStarter.startActivity( + ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent().getIntent(), + true); + } + + @Override + public void queryWalletCards() { + if (mIsDismissed) { + return; + } + if (!mHasRegisteredListener) { + // Listener is registered even when device is locked. Should only be registered once. + mWalletClient.addWalletServiceEventListener(this); + mHasRegisteredListener = true; + } + + mWalletView.show(); + mWalletView.hideErrorMessage(); + int iconSizePx = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_icon_size); + int cardWidthPx = mCardCarousel.getCardWidthPx(); + int cardHeightPx = mCardCarousel.getCardHeightPx(); + GetWalletCardsRequest request = + new GetWalletCardsRequest(cardWidthPx, cardHeightPx, iconSizePx, MAX_CARDS); + mWalletClient.getWalletCards(mExecutor, request, this); + } + + void onDismissed() { + if (mIsDismissed) { + return; + } + mIsDismissed = true; + mSelectedCardId = null; + mHandler.removeCallbacks(mSelectionRunnable); + mWalletClient.notifyWalletDismissed(); + mWalletClient.removeWalletServiceEventListener(this); + mWalletView.animateDismissal(); + // clear refs to the Wallet Activity + mContext = null; + } + + private void showEmptyStateView() { + Drawable logo = mWalletClient.getLogo(); + CharSequence logoContentDesc = mWalletClient.getServiceLabel(); + CharSequence label = mWalletClient.getShortcutLongLabel(); + Intent intent = mWalletClient.createWalletIntent(); + if (logo == null + || TextUtils.isEmpty(logoContentDesc) + || TextUtils.isEmpty(label) + || intent == null) { + Log.w(TAG, "QuickAccessWalletService manifest entry mis-configured"); + // Issue is not likely to be resolved until manifest entries are enabled. + // Hide wallet feature until then. + mWalletView.hide(); + mPrefs.edit().putInt(PREFS_WALLET_VIEW_HEIGHT, 0).apply(); + } else { + logo.setTint(mContext.getColor(R.color.GM2_grey_900)); + mWalletView.showEmptyStateView( + logo, + logoContentDesc, + label, + v -> mActivityStarter.startActivity(intent, true)); + } + } + + private int getExpectedMinHeight() { + int expectedHeight = mPrefs.getInt(PREFS_WALLET_VIEW_HEIGHT, -1); + if (expectedHeight == -1) { + Resources res = mContext.getResources(); + expectedHeight = res.getDimensionPixelSize(R.dimen.min_wallet_empty_height); + } + return expectedHeight; + } + + private void removeMinHeightAndRecordHeightOnLayout() { + mWalletView.setMinimumHeight(0); + mWalletView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + mWalletView.removeOnLayoutChangeListener(this); + mPrefs.edit().putInt(PREFS_WALLET_VIEW_HEIGHT, bottom - top).apply(); + } + }); + } + + @VisibleForTesting + static class QAWalletCardViewInfo implements WalletCardViewInfo { + + private final WalletCard mWalletCard; + private final Drawable mCardDrawable; + private final Drawable mIconDrawable; + + /** + * Constructor is called on background executor, so it is safe to load drawables + * synchronously. + */ + QAWalletCardViewInfo(Context context, WalletCard walletCard) { + mWalletCard = walletCard; + mCardDrawable = mWalletCard.getCardImage().loadDrawable(context); + Icon icon = mWalletCard.getCardIcon(); + mIconDrawable = icon == null ? null : icon.loadDrawable(context); + } + + @Override + public String getCardId() { + return mWalletCard.getCardId(); + } + + @Override + public Drawable getCardDrawable() { + return mCardDrawable; + } + + @Override + public CharSequence getContentDescription() { + return mWalletCard.getContentDescription(); + } + + @Override + public Drawable getIcon() { + return mIconDrawable; + } + + @Override + public CharSequence getLabel() { + return mWalletCard.getCardLabel(); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java new file mode 100644 index 000000000000..d2f0720fa66b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import static com.android.systemui.wallet.ui.WalletCardCarousel.CARD_ANIM_ALPHA_DELAY; +import static com.android.systemui.wallet.ui.WalletCardCarousel.CARD_ANIM_ALPHA_DURATION; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.R; + +import java.util.List; + +/** Layout for the wallet screen. */ +public class WalletView extends FrameLayout implements WalletCardCarousel.OnCardScrollListener { + + private static final int CAROUSEL_IN_ANIMATION_DURATION = 300; + private static final int CAROUSEL_OUT_ANIMATION_DURATION = 200; + private static final int CARD_LABEL_ANIM_DELAY = 133; + private static final int CONTACTLESS_ICON_SIZE = 90; + + private final WalletCardCarousel mCardCarousel; + private final ImageView mIcon; + private final TextView mCardLabel; + private final Button mWalletButton; + private final Interpolator mInInterpolator; + private final Interpolator mOutInterpolator; + private final float mAnimationTranslationX; + private final ViewGroup mCardCarouselContainer; + private final TextView mErrorView; + private final ViewGroup mEmptyStateView; + private CharSequence mCenterCardText; + + public WalletView(Context context) { + this(context, null); + } + + public WalletView(Context context, AttributeSet attrs) { + super(context, attrs); + inflate(context, R.layout.wallet_fullscreen, this); + mCardCarouselContainer = requireViewById(R.id.card_carousel_container); + mCardCarousel = requireViewById(R.id.card_carousel); + mCardCarousel.setCardScrollListener(this); + mIcon = requireViewById(R.id.icon); + mCardLabel = requireViewById(R.id.label); + mWalletButton = requireViewById(R.id.wallet_button); + mErrorView = requireViewById(R.id.error_view); + mEmptyStateView = requireViewById(R.id.wallet_empty_state); + mInInterpolator = + AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in); + mOutInterpolator = + AnimationUtils.loadInterpolator(context, android.R.interpolator.accelerate_cubic); + mAnimationTranslationX = mCardCarousel.getCardWidthPx() / 4f; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + mCardCarousel.setExpectedViewWidth(getWidth()); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + // Forward touch events to card carousel to allow for swiping outside carousel bounds. + return mCardCarousel.onTouchEvent(event) || super.onTouchEvent(event); + } + + @Override + public void onCardScroll(WalletCardViewInfo centerCard, WalletCardViewInfo nextCard, + float percentDistanceFromCenter) { + CharSequence centerCardText = centerCard.getLabel(); + Drawable icon = centerCard.getIcon(); + if (icon != null) { + mIcon.setImageDrawable(resizeDrawable(getResources(), icon)); + mIcon.setVisibility(VISIBLE); + } else { + mIcon.setVisibility(INVISIBLE); + } + if (!TextUtils.equals(mCenterCardText, centerCardText)) { + mCenterCardText = centerCardText; + mCardLabel.setText(centerCardText); + } + if (TextUtils.equals(centerCardText, nextCard.getLabel())) { + mCardLabel.setAlpha(1f); + } else { + mCardLabel.setAlpha(percentDistanceFromCenter); + mIcon.setAlpha(percentDistanceFromCenter); + } + } + + void showCardCarousel( + List<WalletCardViewInfo> data, int selectedIndex, boolean isDeviceLocked) { + boolean shouldAnimate = mCardCarousel.setData(data, selectedIndex); + mCardCarouselContainer.setVisibility(VISIBLE); + mErrorView.setVisibility(GONE); + if (isDeviceLocked) { + // TODO(b/182964813): Add click action to prompt device unlock. + mWalletButton.setText(R.string.wallet_button_label_device_locked); + } else { + mWalletButton.setText(R.string.wallet_button_label_device_unlocked); + } + if (shouldAnimate) { + // If the empty state is visible, animate it away and delay the card carousel animation + int emptyStateAnimDelay = 0; + if (mEmptyStateView.getVisibility() == VISIBLE) { + emptyStateAnimDelay = CARD_ANIM_ALPHA_DURATION; + mEmptyStateView.animate() + .alpha(0) + .setDuration(emptyStateAnimDelay) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mEmptyStateView.setVisibility(GONE); + } + }) + .start(); + } + mCardLabel.setAlpha(0f); + mCardLabel.animate().alpha(1f) + .setStartDelay(CARD_LABEL_ANIM_DELAY + emptyStateAnimDelay) + .setDuration(CARD_ANIM_ALPHA_DURATION) + .start(); + mCardCarousel.setExtraAnimationDelay(emptyStateAnimDelay); + mCardCarousel.setTranslationX(mAnimationTranslationX); + mCardCarousel.animate().translationX(0) + .setInterpolator(mInInterpolator) + .setDuration(CAROUSEL_IN_ANIMATION_DURATION) + .setStartDelay(emptyStateAnimDelay) + .start(); + } + } + + void animateDismissal() { + if (mCardCarouselContainer.getVisibility() != VISIBLE) { + return; + } + mCardCarousel.animate().translationX(mAnimationTranslationX) + .setInterpolator(mOutInterpolator) + .setDuration(CAROUSEL_OUT_ANIMATION_DURATION) + .start(); + mCardCarouselContainer.animate() + .alpha(0f) + .setDuration(CARD_ANIM_ALPHA_DURATION) + .setStartDelay(CARD_ANIM_ALPHA_DELAY) + .start(); + } + + void showEmptyStateView(Drawable logo, CharSequence logoContentDescription, CharSequence label, + OnClickListener clickListener) { + mEmptyStateView.setVisibility(VISIBLE); + mErrorView.setVisibility(GONE); + mCardCarouselContainer.setVisibility(GONE); + ImageView logoView = mEmptyStateView.requireViewById(R.id.empty_state_icon); + logoView.setImageDrawable(logo); + logoView.setContentDescription(logoContentDescription); + mEmptyStateView.<TextView>requireViewById(R.id.empty_state_title).setText(label); + mEmptyStateView.setOnClickListener(clickListener); + } + + void showErrorMessage(@Nullable CharSequence message) { + if (TextUtils.isEmpty(message)) { + message = getResources().getText(R.string.wallet_error_generic); + } + mErrorView.setText(message); + mErrorView.setVisibility(VISIBLE); + mCardCarouselContainer.setVisibility(GONE); + mEmptyStateView.setVisibility(GONE); + } + + void hide() { + setVisibility(GONE); + } + + void show() { + setVisibility(VISIBLE); + } + + void hideErrorMessage() { + mErrorView.setVisibility(GONE); + } + + WalletCardCarousel getCardCarousel() { + return mCardCarousel; + } + + Button getWalletButton() { + return mWalletButton; + } + + @VisibleForTesting + TextView getErrorView() { + return mErrorView; + } + + @VisibleForTesting + ViewGroup getEmptyStateView() { + return mEmptyStateView; + } + + @VisibleForTesting + ViewGroup getCardCarouselContainer() { + return mCardCarouselContainer; + } + + private static Drawable resizeDrawable(Resources resources, Drawable drawable) { + Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); + return new BitmapDrawable(resources, Bitmap.createScaledBitmap( + bitmap, CONTACTLESS_ICON_SIZE, CONTACTLESS_ICON_SIZE, true)); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java index 82dad68f238c..2216a915b0d9 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java @@ -34,6 +34,7 @@ import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; +import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTransitionController; @@ -85,9 +86,15 @@ public abstract class TvPipModule { @WMSingleton @Provides - static PipBoundsAlgorithm providePipBoundsHandler(Context context, - PipBoundsState pipBoundsState) { - return new PipBoundsAlgorithm(context, pipBoundsState); + static PipSnapAlgorithm providePipSnapAlgorithm() { + return new PipSnapAlgorithm(); + } + + @WMSingleton + @Provides + static PipBoundsAlgorithm providePipBoundsAlgorithm(Context context, + PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) { + return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm); } @WMSingleton diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index af94876b1f8c..33b2d67e462e 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -43,6 +43,7 @@ import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; +import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTransition; @@ -51,6 +52,7 @@ import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.phone.PhonePipMenuController; import com.android.wm.shell.pip.phone.PipAppOpsListener; import com.android.wm.shell.pip.phone.PipController; +import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.pip.phone.PipTouchHandler; import com.android.wm.shell.transition.Transitions; @@ -140,9 +142,15 @@ public class WMShellModule { @WMSingleton @Provides - static PipBoundsAlgorithm providesPipBoundsHandler(Context context, - PipBoundsState pipBoundsState) { - return new PipBoundsAlgorithm(context, pipBoundsState); + static PipSnapAlgorithm providePipSnapAlgorithm() { + return new PipSnapAlgorithm(); + } + + @WMSingleton + @Provides + static PipBoundsAlgorithm providesPipBoundsAlgorithm(Context context, + PipBoundsState pipBoundsState, PipSnapAlgorithm pipSnapAlgorithm) { + return new PipBoundsAlgorithm(context, pipBoundsState, pipSnapAlgorithm); } // Handler is used by Icon.loadDrawableAsync @@ -162,12 +170,12 @@ public class WMShellModule { PhonePipMenuController menuPhoneController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, - PipTransitionController pipTransitionController, + PipMotionHelper pipMotionHelper, FloatingContentCoordinator floatingContentCoordinator, PipUiEventLogger pipUiEventLogger, @ShellMainThread ShellExecutor mainExecutor) { return new PipTouchHandler(context, menuPhoneController, pipBoundsAlgorithm, - pipBoundsState, pipTaskOrganizer, pipTransitionController, + pipBoundsState, pipTaskOrganizer, pipMotionHelper, floatingContentCoordinator, pipUiEventLogger, mainExecutor); } @@ -208,4 +216,16 @@ public class WMShellModule { return new PipTransition(context, pipBoundsState, pipMenuController, pipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer); } + + @WMSingleton + @Provides + static PipMotionHelper providePipMotionHelper(Context context, + PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, + PhonePipMenuController menuController, PipSnapAlgorithm pipSnapAlgorithm, + PipTransitionController pipTransitionController, + FloatingContentCoordinator floatingContentCoordinator) { + return new PipMotionHelper(context, pipBoundsState, pipTaskOrganizer, + menuController, pipSnapAlgorithm, pipTransitionController, + floatingContentCoordinator); + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 44c3b26189c4..d544f7378f8a 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -881,6 +881,51 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + public void testShouldNotListenForUdfps_whenTrustEnabled() { + // GIVEN a "we should listen for udfps" state + setKeyguardBouncerVisibility(false /* isVisible */); + mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD); + when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true); + + // WHEN trust is enabled (ie: via smartlock) + mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */); + + // THEN we shouldn't listen for udfps + assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false); + } + + @Test + public void testShouldNotListenForUdfps_whenFaceAuthenticated() { + // GIVEN a "we should listen for udfps" state + setKeyguardBouncerVisibility(false /* isVisible */); + mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD); + when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true); + + // WHEN face authenticated + mKeyguardUpdateMonitor.onFaceAuthenticated( + KeyguardUpdateMonitor.getCurrentUser(), false); + + // THEN we shouldn't listen for udfps + assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false); + } + + @Test + public void testShouldNotListenForUdfps_whenInLockDown() { + // GIVEN a "we should listen for udfps" state + setKeyguardBouncerVisibility(false /* isVisible */); + mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD); + when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true); + + // WHEN device in lock down + when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + + // THEN we shouldn't listen for udfps + assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false); + } + + @Test public void testRequireUnlockForNfc_Broadcast() { KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class); mKeyguardUpdateMonitor.registerCallback(callback); diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index d3694ddedae4..beca96549fb9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -43,6 +43,7 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; @@ -100,6 +101,8 @@ public class UdfpsControllerTest extends SysuiTestCase { @Mock private AuthRippleController mAuthRippleController; @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback; private FakeExecutor mFgExecutor; @@ -151,7 +154,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mStatusBar, mStatusBarKeyguardViewManager, mDumpManager, - mAuthRippleController); + mAuthRippleController, + mKeyguardUpdateMonitor); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java index 44109924f9f5..879cdbfb775f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java @@ -27,12 +27,14 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.util.concurrency.DelayableExecutor; import org.junit.Before; import org.junit.Test; @@ -59,6 +61,10 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Mock private DumpManager mDumpManager; + @Mock + private DelayableExecutor mExecutor; + @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private UdfpsKeyguardViewController mController; @@ -82,6 +88,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { mStatusBarStateController, mStatusBar, mStatusBarKeyguardViewManager, + mKeyguardUpdateMonitor, + mExecutor, mDumpManager); } @@ -168,13 +176,13 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED); assertTrue(mController.shouldPauseAuth()); - mAltAuthInterceptor.showAlternativeAuthMethod(); // force show + mAltAuthInterceptor.showAlternateAuthBouncer(); // force show assertFalse(mController.shouldPauseAuth()); - assertTrue(mAltAuthInterceptor.isShowingAlternateAuth()); + assertTrue(mAltAuthInterceptor.isShowingAlternateAuthBouncer()); - mAltAuthInterceptor.resetForceShow(); // stop force show + mAltAuthInterceptor.hideAlternateAuthBouncer(); // stop force show assertTrue(mController.shouldPauseAuth()); - assertFalse(mAltAuthInterceptor.isShowingAlternateAuth()); + assertFalse(mAltAuthInterceptor.isShowingAlternateAuthBouncer()); } @Test @@ -184,13 +192,13 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { captureStatusBarStateListeners(); captureAltAuthInterceptor(); - mAltAuthInterceptor.showAlternativeAuthMethod(); // alt auth force show + mAltAuthInterceptor.showAlternateAuthBouncer(); // alt auth force show // WHEN view is detached mController.onViewDetached(); // THEN alt auth state reports not showing - assertFalse(mAltAuthInterceptor.isShowingAlternateAuth()); + assertFalse(mAltAuthInterceptor.isShowingAlternateAuthBouncer()); } private void sendStatusBarStateChanged(int statusBarState) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java index ebdda67a90d0..42387bcf9adc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java @@ -16,9 +16,12 @@ package com.android.systemui.classifier; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.closeTo; -import static org.junit.Assert.assertThat; +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import android.testing.AndroidTestingRunner; import android.util.DisplayMetrics; @@ -26,6 +29,7 @@ import android.view.MotionEvent; import androidx.test.filters.SmallTest; +import com.android.systemui.classifier.FalsingDataProvider.GestureFinalizedListener; import com.android.systemui.utils.leaks.FakeBatteryController; import org.junit.After; @@ -67,19 +71,19 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(appendUpEvent(6, 5)); List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents(); - assertThat(motionEventList.size(), is(3)); - assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_DOWN)); - assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(2).getActionMasked(), is(MotionEvent.ACTION_UP)); - assertThat(motionEventList.get(0).getEventTime(), is(1L)); - assertThat(motionEventList.get(1).getEventTime(), is(2L)); - assertThat(motionEventList.get(2).getEventTime(), is(3L)); - assertThat(motionEventList.get(0).getX(), is(2f)); - assertThat(motionEventList.get(1).getX(), is(4f)); - assertThat(motionEventList.get(2).getX(), is(6f)); - assertThat(motionEventList.get(0).getY(), is(9f)); - assertThat(motionEventList.get(1).getY(), is(7f)); - assertThat(motionEventList.get(2).getY(), is(5f)); + assertThat(motionEventList.size()).isEqualTo(3); + assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_DOWN); + assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(2).getActionMasked()).isEqualTo(MotionEvent.ACTION_UP); + assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L); + assertThat(motionEventList.get(1).getEventTime()).isEqualTo(2L); + assertThat(motionEventList.get(2).getEventTime()).isEqualTo(3L); + assertThat(motionEventList.get(0).getX()).isEqualTo(2f); + assertThat(motionEventList.get(1).getX()).isEqualTo(4f); + assertThat(motionEventList.get(2).getX()).isEqualTo(6f); + assertThat(motionEventList.get(0).getY()).isEqualTo(9f); + assertThat(motionEventList.get(1).getY()).isEqualTo(7f); + assertThat(motionEventList.get(2).getY()).isEqualTo(5f); } @Test @@ -88,28 +92,28 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(appendMoveEvent(4, 7, 800)); List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents(); - assertThat(motionEventList.size(), is(2)); - assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_DOWN)); - assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(0).getEventTime(), is(1L)); - assertThat(motionEventList.get(1).getEventTime(), is(800L)); - assertThat(motionEventList.get(0).getX(), is(2f)); - assertThat(motionEventList.get(1).getX(), is(4f)); - assertThat(motionEventList.get(0).getY(), is(9f)); - assertThat(motionEventList.get(1).getY(), is(7f)); + assertThat(motionEventList.size()).isEqualTo(2); + assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_DOWN); + assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L); + assertThat(motionEventList.get(1).getEventTime()).isEqualTo(800L); + assertThat(motionEventList.get(0).getX()).isEqualTo(2f); + assertThat(motionEventList.get(1).getX()).isEqualTo(4f); + assertThat(motionEventList.get(0).getY()).isEqualTo(9f); + assertThat(motionEventList.get(1).getY()).isEqualTo(7f); mDataProvider.onMotionEvent(appendUpEvent(6, 5, 1200)); // Still two events, but event a is gone. - assertThat(motionEventList.size(), is(2)); - assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_UP)); - assertThat(motionEventList.get(0).getEventTime(), is(800L)); - assertThat(motionEventList.get(1).getEventTime(), is(1200L)); - assertThat(motionEventList.get(0).getX(), is(4f)); - assertThat(motionEventList.get(1).getX(), is(6f)); - assertThat(motionEventList.get(0).getY(), is(7f)); - assertThat(motionEventList.get(1).getY(), is(5f)); + assertThat(motionEventList.size()).isEqualTo(2); + assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_UP); + assertThat(motionEventList.get(0).getEventTime()).isEqualTo(800L); + assertThat(motionEventList.get(1).getEventTime()).isEqualTo(1200L); + assertThat(motionEventList.get(0).getX()).isEqualTo(4f); + assertThat(motionEventList.get(1).getX()).isEqualTo(6f); + assertThat(motionEventList.get(0).getY()).isEqualTo(7f); + assertThat(motionEventList.get(1).getY()).isEqualTo(5f); } @Test @@ -126,19 +130,19 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventA); List<MotionEvent> motionEventList = mDataProvider.getRecentMotionEvents(); - assertThat(motionEventList.size(), is(3)); - assertThat(motionEventList.get(0).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(1).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(2).getActionMasked(), is(MotionEvent.ACTION_MOVE)); - assertThat(motionEventList.get(0).getEventTime(), is(1L)); - assertThat(motionEventList.get(1).getEventTime(), is(2L)); - assertThat(motionEventList.get(2).getEventTime(), is(3L)); - assertThat(motionEventList.get(0).getX(), is(2f)); - assertThat(motionEventList.get(1).getX(), is(4f)); - assertThat(motionEventList.get(2).getX(), is(6f)); - assertThat(motionEventList.get(0).getY(), is(9f)); - assertThat(motionEventList.get(1).getY(), is(7f)); - assertThat(motionEventList.get(2).getY(), is(5f)); + assertThat(motionEventList.size()).isEqualTo(3); + assertThat(motionEventList.get(0).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(1).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(2).getActionMasked()).isEqualTo(MotionEvent.ACTION_MOVE); + assertThat(motionEventList.get(0).getEventTime()).isEqualTo(1L); + assertThat(motionEventList.get(1).getEventTime()).isEqualTo(2L); + assertThat(motionEventList.get(2).getEventTime()).isEqualTo(3L); + assertThat(motionEventList.get(0).getX()).isEqualTo(2f); + assertThat(motionEventList.get(1).getX()).isEqualTo(4f); + assertThat(motionEventList.get(2).getX()).isEqualTo(6f); + assertThat(motionEventList.get(0).getY()).isEqualTo(9f); + assertThat(motionEventList.get(1).getY()).isEqualTo(7f); + assertThat(motionEventList.get(2).getY()).isEqualTo(5f); } @Test @@ -147,18 +151,18 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(1, 1)); - assertThat((double) mDataProvider.getAngle(), closeTo(Math.PI / 4, .001)); + assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(Math.PI / 4); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(-1, -1)); - assertThat((double) mDataProvider.getAngle(), closeTo(5 * Math.PI / 4, .001)); + assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(5 * Math.PI / 4); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(2, 0)); - assertThat((double) mDataProvider.getAngle(), closeTo(0, .001)); + assertThat((double) mDataProvider.getAngle()).isWithin(.001).of(0); mDataProvider.onSessionEnd(); } @@ -168,17 +172,17 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(1, 1)); - assertThat(mDataProvider.isHorizontal(), is(false)); + assertThat(mDataProvider.isHorizontal()).isFalse(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(2, 1)); - assertThat(mDataProvider.isHorizontal(), is(true)); + assertThat(mDataProvider.isHorizontal()).isTrue(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(-3, -1)); - assertThat(mDataProvider.isHorizontal(), is(true)); + assertThat(mDataProvider.isHorizontal()).isTrue(); mDataProvider.onSessionEnd(); } @@ -188,17 +192,17 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(1, 0)); - assertThat(mDataProvider.isVertical(), is(false)); + assertThat(mDataProvider.isVertical()).isFalse(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(0, 1)); - assertThat(mDataProvider.isVertical(), is(true)); + assertThat(mDataProvider.isVertical()).isTrue(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(-3, -10)); - assertThat(mDataProvider.isVertical(), is(true)); + assertThat(mDataProvider.isVertical()).isTrue(); mDataProvider.onSessionEnd(); } @@ -208,17 +212,17 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(1, 1)); - assertThat(mDataProvider.isRight(), is(true)); + assertThat(mDataProvider.isRight()).isTrue(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(0, 1)); - assertThat(mDataProvider.isRight(), is(false)); + assertThat(mDataProvider.isRight()).isFalse(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(-3, -10)); - assertThat(mDataProvider.isRight(), is(false)); + assertThat(mDataProvider.isRight()).isFalse(); mDataProvider.onSessionEnd(); } @@ -230,25 +234,60 @@ public class FalsingDataProviderTest extends ClassifierTest { mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(1, -1)); - assertThat(mDataProvider.isUp(), is(true)); + assertThat(mDataProvider.isUp()).isTrue(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(0, 0)); - assertThat(mDataProvider.isUp(), is(false)); + assertThat(mDataProvider.isUp()).isFalse(); mDataProvider.onSessionEnd(); mDataProvider.onMotionEvent(motionEventOrigin); mDataProvider.onMotionEvent(appendMoveEvent(-3, 10)); - assertThat(mDataProvider.isUp(), is(false)); + assertThat(mDataProvider.isUp()).isFalse(); mDataProvider.onSessionEnd(); } @Test public void test_isWirelessCharging() { - assertThat(mDataProvider.isWirelessCharging(), is(false)); + assertThat(mDataProvider.isWirelessCharging()).isFalse(); mFakeBatteryController.setWirelessCharging(true); - assertThat(mDataProvider.isWirelessCharging(), is(true)); + assertThat(mDataProvider.isWirelessCharging()).isTrue(); + } + + @Test + public void test_GestureFinalizedListener() { + GestureFinalizedListener listener = mock(GestureFinalizedListener.class); + + mDataProvider.addGestureCompleteListener(listener); + + mDataProvider.onMotionEvent(appendDownEvent(0, 0)); + mDataProvider.onMotionEventComplete(); + verify(listener, never()).onGestureFinalized(anyLong()); + mDataProvider.onMotionEvent(appendMoveEvent(0, 0)); + mDataProvider.onMotionEventComplete(); + verify(listener, never()).onGestureFinalized(anyLong()); + mDataProvider.onMotionEvent(appendUpEvent(0, 0, 100)); + verify(listener, never()).onGestureFinalized(anyLong()); + + mDataProvider.onMotionEventComplete(); + verify(listener).onGestureFinalized(100); + } + + @Test + public void test_GestureFinalizedListener_SkipCompletion() { + GestureFinalizedListener listener = mock(GestureFinalizedListener.class); + + mDataProvider.addGestureCompleteListener(listener); + + mDataProvider.onMotionEvent(appendDownEvent(0, 0)); + mDataProvider.onMotionEvent(appendMoveEvent(0, 0)); + mDataProvider.onMotionEvent(appendUpEvent(0, 0, 100)); + verify(listener, never()).onGestureFinalized(anyLong()); + + // The start of a new gesture should finalized the prior one. + mDataProvider.onMotionEvent(appendDownEvent(0, 200)); + verify(listener).onGestureFinalized(100); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java new file mode 100644 index 000000000000..9c68f0d8a7ff --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSession.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenshot; + +import static android.util.MathUtils.constrain; + +import static com.google.common.util.concurrent.Futures.immediateFuture; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import static java.lang.Math.abs; +import static java.lang.Math.max; +import static java.lang.Math.min; + +import android.graphics.Rect; +import android.hardware.HardwareBuffer; +import android.media.Image; +import android.util.Log; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; + +/** + * A flexible test double for {@link ScrollCaptureClient.Session}. + * <p> + * FakeSession provides the ability to emulate both the available scrollable content range as well + * as the current visible bounds. Visible bounds may vary because the target view itself may be + * slid vertically during capture, with portions may become clipped by parent views. This scenario + * frequently occurs with UIs constructed from nested scrolling views or collapsing headers. + */ +class FakeSession implements ScrollCaptureClient.Session { + private static final String TAG = "FakeSession"; + // Available range of content + private final Rect mAvailable; + + /** bounds for scrollDelta (y), range with bottom adjusted to account for page height. */ + private final Rect mAvailableTop; + + private final Rect mVisiblePage; + private final int mTileHeight; + private final int mMaxTiles; + + private int mScrollDelta; + private int mPageHeight; + + FakeSession(int pageHeight, float maxPages, int tileHeight, int visiblePageTop, + int visiblePageBottom, int availableTop, int availableBottom) { + mPageHeight = pageHeight; + mTileHeight = tileHeight; + mAvailable = new Rect(0, availableTop, getPageWidth(), availableBottom); + mAvailableTop = new Rect(mAvailable); + mAvailableTop.inset(0, 0, 0, pageHeight); + mVisiblePage = new Rect(0, visiblePageTop, getPageWidth(), visiblePageBottom); + mMaxTiles = (int) Math.ceil((pageHeight * maxPages) / mTileHeight); + } + + private static Image mockImage() { + Image image = mock(Image.class); + when(image.getHardwareBuffer()).thenReturn(mock(HardwareBuffer.class)); + return image; + } + + public int getScrollDelta() { + return mScrollDelta; + } + + @Override + public ListenableFuture<ScrollCaptureClient.CaptureResult> requestTile(int requestedTop) { + Rect requested = new Rect(0, requestedTop, getPageWidth(), requestedTop + getTileHeight()); + Log.d(TAG, "requested: " + requested); + Rect page = new Rect(0, 0, getPageWidth(), mPageHeight); + page.offset(0, mScrollDelta); + Log.d(TAG, "page: " + page); + // Simulate behavior from lower levels by replicating 'requestChildRectangleOnScreen' + if (!page.contains(requested)) { + Log.d(TAG, "requested not within page, scrolling"); + // distance+direction needed to scroll to align each edge of request with + // corresponding edge of the page + int distTop = requested.top - page.top; // positive means already visible + int distBottom = requested.bottom - page.bottom; // negative means already visible + Log.d(TAG, "distTop = " + distTop); + Log.d(TAG, "distBottom = " + distBottom); + + boolean scrollUp = false; + if (distTop < 0 && distBottom > 0) { + scrollUp = abs(distTop) < distBottom; + } else if (distTop < 0) { + scrollUp = true; + } + + // determine which edges are currently clipped + if (scrollUp) { + Log.d(TAG, "trying to scroll up by " + -distTop + " px"); + // need to scroll up to align top edge to visible-top + mScrollDelta += distTop; + Log.d(TAG, "new scrollDelta = " + mScrollDelta); + } else { + Log.d(TAG, "trying to scroll down by " + distBottom + " px"); + // scroll down to align bottom edge with visible bottom, but keep top visible + int topEdgeDistance = max(0, requestedTop - page.top); + mScrollDelta += min(distBottom, topEdgeDistance); + Log.d(TAG, "new scrollDelta = " + mScrollDelta); + } + + // Clamp to available content + mScrollDelta = constrain(mScrollDelta, mAvailableTop.top, mAvailableTop.bottom); + Log.d(TAG, "scrollDelta, adjusted to available range = " + mScrollDelta); + + // Reset to apply a changed scroll delta possibly. + page.offsetTo(0, 0); + page.offset(0, mScrollDelta); + + Log.d(TAG, "page (after scroll): " + page); + Log.d(TAG, "requested (after scroll): " + requested); + } + Log.d(TAG, "mVisiblePage = " + mVisiblePage); + Log.d(TAG, "scrollDelta = " + mScrollDelta); + + Rect target = new Rect(requested); + Rect visible = new Rect(mVisiblePage); + visible.offset(0, mScrollDelta); + + Log.d(TAG, "target: " + target); + Log.d(TAG, "visible: " + visible); + + // if any of the requested rect is available to scroll into the view: + if (target.intersect(page) && target.intersect(visible)) { + Log.d(TAG, "returning captured = " + target); + ScrollCaptureClient.CaptureResult result = + new ScrollCaptureClient.CaptureResult(mockImage(), requested, target); + return immediateFuture(result); + } + Log.d(TAG, "no part of requested rect is within page, returning empty"); + ScrollCaptureClient.CaptureResult result = + new ScrollCaptureClient.CaptureResult(null, requested, new Rect()); + return immediateFuture(result); + } + + + @Override + public int getMaxTiles() { + return mMaxTiles; + } + + @Override + public int getTileHeight() { + return mTileHeight; + } + + @Override + public int getPageWidth() { + return 100; + } + + @Override + public int getPageHeight() { + return mPageHeight; + } + + @Override + public Rect getWindowBounds() { + throw new IllegalStateException("Not implemented"); + } + + @Override + public ListenableFuture<Void> end() { + return Futures.immediateVoidFuture(); + } + + @Override + public void release() { + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java new file mode 100644 index 000000000000..2520af94380c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/FakeSessionTest.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenshot; + +import static com.google.common.util.concurrent.Futures.getUnchecked; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.testing.AndroidTestingRunner; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests for {@link FakeSession}, a a test double for a ScrollCaptureClient.Session. + * <p> + * These tests verify a single tile request behaves similarly to a live scroll capture + * client/connection. + */ +@SmallTest +@RunWith(AndroidTestingRunner.class) +public class FakeSessionTest extends SysuiTestCase { + @Test + public void testMaxTiles() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 2.25f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -250, + /* availableBottom */ 250); + + // (pageHeight * maxPages) / tileHeight + assertEquals("getMaxTiles()", 23, session.getMaxTiles()); + } + + @Test + public void testNonEmptyResult_hasImage() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 1.0f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ 0, + /* availableBottom */ 100); + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0)); + assertNotNull("result.image", result.image); + assertNotNull("result.image.getHardwareBuffer()", result.image.getHardwareBuffer()); + } + + @Test + public void testEmptyResult_hasNullImage() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 1.0f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ 0, + /* availableBottom */ 100); + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-100)); + assertNull("result.image", result.image); + } + + @Test + public void testCaptureAtZero() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 2.5f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -250, + /* availableBottom */ 250); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0)); + assertEquals("requested top", 0, result.requested.top); + assertEquals("requested bottom", 10, result.requested.bottom); + assertEquals("captured top", 0, result.captured.top); + assertEquals("captured bottom", 10, result.captured.bottom); + assertEquals("scroll delta", 0, session.getScrollDelta()); + } + + @Test + public void testCaptureAtPageBottom() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 2.5f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -250, + /* availableBottom */ 250); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(90)); + assertEquals("requested top", 90, result.requested.top); + assertEquals("requested bottom", 100, result.requested.bottom); + assertEquals("captured top", 90, result.captured.top); + assertEquals("captured bottom", 100, result.captured.bottom); + assertEquals("scroll delta", 0, session.getScrollDelta()); + } + + @Test + public void testCaptureFromPreviousPage() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 2.5f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -250, + /* availableBottom */ 250); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-100)); + assertEquals("requested top", -100, result.requested.top); + assertEquals("requested bottom", -90, result.requested.bottom); + assertEquals("captured top", -100, result.captured.top); + assertEquals("captured bottom", -90, result.captured.bottom); + assertEquals("scroll delta", -100, session.getScrollDelta()); + } + + @Test + public void testCaptureFromNextPage() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 2.5f, + /* tileHeight */ 10, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -250, + /* availableBottom */ 250); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(150)); + assertEquals("requested top", 150, result.requested.top); + assertEquals("requested bottom", 160, result.requested.bottom); + assertEquals("captured top", 150, result.captured.top); + assertEquals("captured bottom", 160, result.captured.bottom); + assertEquals("scroll delta", 60, session.getScrollDelta()); + } + + @Test + public void testCaptureTopPartiallyUnavailable() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3f, + /* tileHeight */ 50, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -100, + /* availableBottom */ 100); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-125)); + assertEquals("requested top", -125, result.requested.top); + assertEquals("requested bottom", -75, result.requested.bottom); + assertEquals("captured top", -100, result.captured.top); + assertEquals("captured bottom", -75, result.captured.bottom); + assertEquals("scroll delta", -100, session.getScrollDelta()); + } + + @Test + public void testCaptureBottomPartiallyUnavailable() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3f, + /* tileHeight */ 50, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -100, + /* availableBottom */ 100); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(75)); + assertEquals("requested top", 75, result.requested.top); + assertEquals("requested bottom", 125, result.requested.bottom); + assertEquals("captured top", 75, result.captured.top); + assertEquals("captured bottom", 100, result.captured.bottom); + assertEquals("scroll delta", 0, session.getScrollDelta()); + } + + /** + * Set visiblePageTop > 0 to cause the returned request's top edge to be cropped. + */ + @Test + public void testCaptureTopPartiallyInvisible() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3f, + /* tileHeight */ 50, + /* visiblePageTop */ 25, // <<-- + /* visiblePageBottom */ 100, + /* availableTop */ -150, + /* availableBottom */ 150); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-150)); + assertEquals("requested top", -150, result.requested.top); + assertEquals("requested bottom", -100, result.requested.bottom); + assertEquals("captured top", -125, result.captured.top); + assertEquals("captured bottom", -100, result.captured.bottom); + assertEquals("scroll delta", -150, session.getScrollDelta()); + } + + /** + * Set visiblePageBottom < pageHeight to cause the returned request's bottom edge to be cropped. + */ + @Test + public void testCaptureBottomPartiallyInvisible() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3f, + /* tileHeight */ 50, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 75, + /* availableTop */ -150, + /* availableBottom */ 150); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(50)); + assertEquals("requested top", 50, result.requested.top); + assertEquals("requested bottom", 100, result.requested.bottom); + assertEquals("captured top", 50, result.captured.top); + assertEquals("captured bottom", 75, result.captured.bottom); + assertEquals("scroll delta", 0, session.getScrollDelta()); + } + + @Test + public void testEmptyResult_aboveAvailableTop() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3.0f, + /* tileHeight */ 50, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -100, + /* availableBottom */ 200); + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(-150)); + assertTrue("captured rect is empty", result.captured.isEmpty()); + } + + @Test + public void testEmptyResult_belowAvailableBottom() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3.0f, + /* tileHeight */ 50, + /* visiblePageTop */ 0, + /* visiblePageBottom */ 100, + /* availableTop */ -100, + /* availableBottom */ 200); + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(200)); + assertTrue("captured rect is empty", result.captured.isEmpty()); + } + + @Test + public void testEmptyResult_notVisible() { + FakeSession session = new FakeSession( + /* pageHeight */ 100, + /* maxPages */ 3f, + /* tileHeight */ 50, + /* visiblePageTop */ 60, // <<--- + /* visiblePageBottom */ 0, + /* availableTop */ -150, + /* availableBottom */ 150); + + ScrollCaptureClient.CaptureResult result = getUnchecked(session.requestTile(0)); + assertEquals("requested top", 0, result.requested.top); + assertEquals("requested bottom", 50, result.requested.bottom); + assertEquals("captured top", 0, result.captured.top); + assertEquals("captured bottom", 0, result.captured.bottom); + assertEquals("scroll delta", 0, session.getScrollDelta()); + } + +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java index 7fe178c81ea8..1c32cd4b612a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScrollCaptureControllerTest.java @@ -16,35 +16,30 @@ package com.android.systemui.screenshot; +import static com.google.common.util.concurrent.Futures.getUnchecked; +import static com.google.common.util.concurrent.Futures.immediateFuture; + import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static java.lang.Math.abs; + import android.content.Context; -import android.graphics.Rect; -import android.hardware.HardwareBuffer; -import android.media.Image; import android.testing.AndroidTestingRunner; import android.view.ScrollCaptureResponse; import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; import com.android.systemui.SysuiTestCase; +import com.android.systemui.screenshot.ScrollCaptureClient.Session; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; - -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.concurrent.ExecutionException; - /** * Tests for ScrollCaptureController which manages sequential image acquisition for long * screenshots. @@ -53,169 +48,177 @@ import java.util.concurrent.ExecutionException; @RunWith(AndroidTestingRunner.class) public class ScrollCaptureControllerTest extends SysuiTestCase { - private static class FakeSession implements ScrollCaptureClient.Session { - public int availableTop = Integer.MIN_VALUE; - public int availableBottom = Integer.MAX_VALUE; - // If true, return an empty rect any time a partial result would have been returned. - public boolean emptyInsteadOfPartial = false; - private int mPreviousTopRequested = 0; - - @Override - public ListenableFuture<ScrollCaptureClient.CaptureResult> requestTile(int top) { - // Ensure we don't request a tile more than a tile away. - assertTrue(Math.abs(top - mPreviousTopRequested) <= getTileHeight()); - mPreviousTopRequested = top; - Rect requested = new Rect(0, top, getPageWidth(), top + getTileHeight()); - Rect fullContent = new Rect(0, availableTop, getPageWidth(), availableBottom); - Rect captured = new Rect(requested); - assertTrue(captured.intersect(fullContent)); - if (emptyInsteadOfPartial && captured.height() != getTileHeight()) { - captured = new Rect(); - } - Image image = mock(Image.class); - when(image.getHardwareBuffer()).thenReturn(mock(HardwareBuffer.class)); - ScrollCaptureClient.CaptureResult result = - new ScrollCaptureClient.CaptureResult(image, requested, captured); - return Futures.immediateFuture(result); - } - - public int getMaxHeight() { - return getTileHeight() * getMaxTiles(); - } - - @Override - public int getMaxTiles() { - return 10; - } - - @Override - public int getTileHeight() { - return 50; - } - - @Override - public int getPageHeight() { - return 100; - } - - @Override - public int getPageWidth() { - return 100; - } - - @Override - public Rect getWindowBounds() { - return null; - } + private static final ScrollCaptureResponse EMPTY_RESPONSE = + new ScrollCaptureResponse.Builder().build(); - @Override - public ListenableFuture<Void> end() { - return Futures.immediateVoidFuture(); - } + @Test + public void testInfinite() { + ScrollCaptureController controller = new TestScenario() + .withPageHeight(100) + .withMaxPages(2.5f) + .withTileHeight(10) + .withAvailableRange(Integer.MIN_VALUE, Integer.MAX_VALUE) + .createController(mContext); - @Override - public void release() { + ScrollCaptureController.LongScreenshot screenshot = + getUnchecked(controller.run(EMPTY_RESPONSE)); + + assertEquals("top", -90, screenshot.getTop()); + assertEquals("bottom", 160, screenshot.getBottom()); + + // Test that top portion is >= getTargetTopSizeRatio() + // (Due to tileHeight, top will almost always be larger than the target) + float topPortion = abs(screenshot.getTop()) / abs((float) screenshot.getBottom()); + if (topPortion < controller.getTargetTopSizeRatio()) { + fail("expected top portion > " + + (controller.getTargetTopSizeRatio() * 100) + "%" + + " but was " + (topPortion * 100)); } } - private ScrollCaptureController mController; - private FakeSession mSession; - private ScrollCaptureClient mScrollCaptureClient; - - @Before - public void setUp() { - Context context = InstrumentationRegistry.getInstrumentation().getContext(); - mSession = new FakeSession(); - mScrollCaptureClient = mock(ScrollCaptureClient.class); - when(mScrollCaptureClient.request(anyInt(), anyInt())).thenReturn( - Futures.immediateFuture(new ScrollCaptureResponse.Builder().build())); - when(mScrollCaptureClient.start(any(), anyFloat())).thenReturn( - Futures.immediateFuture(mSession)); - mController = new ScrollCaptureController(context, context.getMainExecutor(), - mScrollCaptureClient, new ImageTileSet(context.getMainThreadHandler())); - } - @Test - public void testInfinite() throws ExecutionException, InterruptedException { - ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - assertEquals(mSession.getMaxHeight(), screenshot.getHeight()); - // TODO: the top and bottom ratio in the infinite case should be extracted and tested. - assertEquals(-150, screenshot.getTop()); - assertEquals(350, screenshot.getBottom()); - } + public void testLimitedBottom() { + ScrollCaptureController controller = new TestScenario() + .withPageHeight(100) + .withMaxPages(2.5f) + .withTileHeight(10) + .withAvailableRange(Integer.MIN_VALUE, 150) + .createController(mContext); - @Test - public void testLimitedBottom() throws ExecutionException, InterruptedException { - // We hit the bottom of the content, so expect it to scroll back up and go above the -150 - // default top position - mSession.availableBottom = 275; ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - // Bottom tile will be 25px tall, 10 tiles total - assertEquals(mSession.getMaxHeight() - 25, screenshot.getHeight()); - assertEquals(-200, screenshot.getTop()); - assertEquals(mSession.availableBottom, screenshot.getBottom()); - } + getUnchecked(controller.run(EMPTY_RESPONSE)); - @Test - public void testLimitedTopAndBottom() throws ExecutionException, InterruptedException { - mSession.availableBottom = 275; - mSession.availableTop = -200; - ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - assertEquals(mSession.availableBottom - mSession.availableTop, screenshot.getHeight()); - assertEquals(mSession.availableTop, screenshot.getTop()); - assertEquals(mSession.availableBottom, screenshot.getBottom()); + assertEquals("top", -100, screenshot.getTop()); + assertEquals("bottom", 150, screenshot.getBottom()); } @Test - public void testVeryLimitedTopInfiniteBottom() throws ExecutionException, InterruptedException { - // Hit the boundary before the "headroom" is hit in the up direction, then go down - // infinitely. - mSession.availableTop = -55; + public void testLimitedTopAndBottom() { + ScrollCaptureController controller = new TestScenario() + .withPageHeight(100) + .withMaxPages(2.5f) + .withTileHeight(10) + .withAvailableRange(-50, 150) + .createController(mContext); + ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - // The top tile will be 5px tall, so subtract 45px from the theoretical max. - assertEquals(mSession.getMaxHeight() - 45, screenshot.getHeight()); - assertEquals(mSession.availableTop, screenshot.getTop()); - assertEquals(mSession.availableTop + mSession.getMaxHeight() - 45, screenshot.getBottom()); + getUnchecked(controller.run(EMPTY_RESPONSE)); + + assertEquals("top", -50, screenshot.getTop()); + assertEquals("bottom", 150, screenshot.getBottom()); } @Test - public void testVeryLimitedTopLimitedBottom() throws ExecutionException, InterruptedException { - mSession.availableBottom = 275; - mSession.availableTop = -55; + public void testVeryLimitedTopInfiniteBottom() { + ScrollCaptureController controller = new TestScenario() + .withPageHeight(100) + .withMaxPages(2.5f) + .withTileHeight(10) + .withAvailableRange(-10, Integer.MAX_VALUE) + .createController(mContext); + ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - assertEquals(mSession.availableBottom - mSession.availableTop, screenshot.getHeight()); - assertEquals(mSession.availableTop, screenshot.getTop()); - assertEquals(mSession.availableBottom, screenshot.getBottom()); + getUnchecked(controller.run(EMPTY_RESPONSE)); + + assertEquals("top", -10, screenshot.getTop()); + assertEquals("bottom", 240, screenshot.getBottom()); } @Test - public void testLimitedTopAndBottomWithEmpty() throws ExecutionException, InterruptedException { - mSession.emptyInsteadOfPartial = true; - mSession.availableBottom = 275; - mSession.availableTop = -167; + public void testVeryLimitedTopLimitedBottom() { + ScrollCaptureController controller = new TestScenario() + .withPageHeight(100) + .withMaxPages(2.5f) + .withTileHeight(10) + .withAvailableRange(-10, 200) + .createController(mContext); + ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - // Expecting output from -150 to 250 - assertEquals(400, screenshot.getHeight()); - assertEquals(-150, screenshot.getTop()); - assertEquals(250, screenshot.getBottom()); + getUnchecked(controller.run(EMPTY_RESPONSE)); + + assertEquals("top", -10, screenshot.getTop()); + assertEquals("bottom", 200, screenshot.getBottom()); } - @Test - public void testVeryLimitedTopWithEmpty() throws ExecutionException, InterruptedException { - // Hit the boundary before the "headroom" is hit in the up direction, then go down - // infinitely. - mSession.availableTop = -55; - mSession.emptyInsteadOfPartial = true; - ScrollCaptureController.LongScreenshot screenshot = - mController.run(new ScrollCaptureResponse.Builder().build()).get(); - assertEquals(mSession.getMaxHeight(), screenshot.getHeight()); - assertEquals(-50, screenshot.getTop()); - assertEquals(-50 + mSession.getMaxHeight(), screenshot.getBottom()); + /** + * Build and configure a stubbed controller for each test case. + */ + private static class TestScenario { + private int mPageHeight = -1; + private int mTileHeight = -1; + private boolean mAvailableRangeSet; + private int mAvailableTop; + private int mAvailableBottom; + private int mLocalVisibleTop; + private int mLocalVisibleBottom = -1; + private float mMaxPages = -1; + + TestScenario withPageHeight(int pageHeight) { + if (pageHeight < 0) { + throw new IllegalArgumentException("pageHeight must be positive"); + } + mPageHeight = pageHeight; + return this; + } + + TestScenario withTileHeight(int tileHeight) { + if (tileHeight < 0) { + throw new IllegalArgumentException("tileHeight must be positive"); + } + mTileHeight = tileHeight; + return this; + } + + TestScenario withAvailableRange(int top, int bottom) { + mAvailableRangeSet = true; + mAvailableTop = top; + mAvailableBottom = bottom; + return this; + } + + TestScenario withMaxPages(float maxPages) { + if (maxPages < 0) { + throw new IllegalArgumentException("maxPages must be positive"); + } + mMaxPages = maxPages; + return this; + } + + TestScenario withPageVisibleRange(int top, int bottom) { + if (top < 0 || bottom < 0) { + throw new IllegalArgumentException("top and bottom must be positive"); + } + mLocalVisibleTop = top; + mLocalVisibleBottom = bottom; + return this; + } + + + ScrollCaptureController createController(Context context) { + if (mTileHeight < 0) { + throw new IllegalArgumentException("tileHeight not set"); + } + if (!mAvailableRangeSet) { + throw new IllegalArgumentException("availableRange not set"); + } + if (mPageHeight < 0) { + throw new IllegalArgumentException("pageHeight not set"); + } + + if (mMaxPages < 0) { + throw new IllegalArgumentException("maxPages not set"); + } + // Default: page fully visible + if (mLocalVisibleBottom < 0) { + mLocalVisibleBottom = mPageHeight; + } + Session session = new FakeSession(mPageHeight, mMaxPages, mTileHeight, + mLocalVisibleTop, mLocalVisibleBottom, mAvailableTop, mAvailableBottom); + ScrollCaptureClient client = mock(ScrollCaptureClient.class); + when(client.start(/* response */ any(), /* maxPages */ anyFloat())) + .thenReturn(immediateFuture(session)); + return new ScrollCaptureController(context, context.getMainExecutor(), + client, new ImageTileSet(context.getMainThreadHandler())); + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java index 781f875fd868..96cdaf98d964 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java @@ -23,7 +23,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; +import android.app.Fragment; import android.app.StatusBarManager; +import android.content.Context; +import android.os.Bundle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.View; @@ -34,6 +37,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import org.junit.Before; import org.junit.Test; @@ -157,4 +161,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { Mockito.verify(mStatusBarStateController).isDozing(); Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE)); } + + @Override + protected Fragment instantiate(Context context, String className, Bundle arguments) { + return new CollapsedStatusBarFragment(mock(OngoingCallController.class)); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 781cde6c48b5..2576d958b5fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -132,6 +132,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; +import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -263,6 +264,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy; @Mock private BrightnessSlider.Factory mBrightnessSliderFactory; @Mock private WiredChargingRippleController mWiredChargingRippleController; + @Mock private OngoingCallController mOngoingCallController; @Mock private FeatureFlags mFeatureFlags; private ShadeController mShadeController; private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -427,6 +429,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationIconAreaController, mBrightnessSliderFactory, mWiredChargingRippleController, + mOngoingCallController, mFeatureFlags); when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 566c71774709..4471778a03ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -130,6 +130,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected int mSubId; private NetworkCapabilities mNetCapabilities; + private Network mNetwork; private ConnectivityManager.NetworkCallback mDefaultCallbackInWifiTracker; private ConnectivityManager.NetworkCallback mDefaultCallbackInNetworkController; private ConnectivityManager.NetworkCallback mNetworkCallback; @@ -174,8 +175,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockCm = mock(ConnectivityManager.class); mMockBd = mock(BroadcastDispatcher.class); mMockNsm = mock(NetworkScoreManager.class); + mNetwork = mock(Network.class); mMockSubDefaults = mock(SubscriptionDefaults.class); mNetCapabilities = new NetworkCapabilities(); + when(mNetwork.getNetId()).thenReturn(0); when(mMockTm.isDataCapable()).thenReturn(true); when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm); doAnswer(invocation -> { @@ -323,7 +326,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mNetCapabilities.setTransportInfo(info); setConnectivityCommon(networkType, validated, isConnected); mDefaultCallbackInNetworkController.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); } public void setConnectivityViaCallbackInNetworkController( @@ -333,7 +336,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } setConnectivityCommon(networkType, validated, isConnected); mDefaultCallbackInNetworkController.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); } public void setConnectivityViaCallbackInWifiTracker( @@ -344,12 +347,12 @@ public class NetworkControllerBaseTest extends SysuiTestCase { setConnectivityCommon(networkType, validated, isConnected); if (networkType == NetworkCapabilities.TRANSPORT_WIFI) { if (isConnected) { - mNetworkCallback.onAvailable(mock(Network.class), + mNetworkCallback.onAvailable(mNetwork, new NetworkCapabilities(mNetCapabilities), new LinkProperties(), false); mNetworkCallback.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); } else { - mNetworkCallback.onLost(mock(Network.class)); + mNetworkCallback.onLost(mNetwork); } } } @@ -360,14 +363,14 @@ public class NetworkControllerBaseTest extends SysuiTestCase { setConnectivityCommon(networkType, validated, isConnected); if (networkType == NetworkCapabilities.TRANSPORT_CELLULAR) { if (isConnected) { - mNetworkCallback.onAvailable(mock(Network.class), + mNetworkCallback.onAvailable(mNetwork, new NetworkCapabilities(mNetCapabilities), new LinkProperties(), false); mNetworkCallback.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); mDefaultCallbackInWifiTracker.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); } else { - mNetworkCallback.onLost(mock(Network.class)); + mNetworkCallback.onLost(mNetwork); } } } @@ -379,7 +382,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } setConnectivityCommon(networkType, validated, isConnected); mDefaultCallbackInWifiTracker.onCapabilitiesChanged( - mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + mNetwork, new NetworkCapabilities(mNetCapabilities)); } private void setConnectivityCommon( diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java index 8ad6271bfc7e..64127b9d1e6e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java @@ -66,10 +66,6 @@ public class FakeStatusBarIconController extends BaseLeakChecker<IconManager> } @Override - public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) { - } - - @Override public void setNoCallingIcons(String slot, List<CallIndicatorIconState> states) { } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java new file mode 100644 index 000000000000..f85962b6859b --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallet.ui; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.os.Handler; +import android.service.quickaccesswallet.GetWalletCardsError; +import android.service.quickaccesswallet.GetWalletCardsRequest; +import android.service.quickaccesswallet.GetWalletCardsResponse; +import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.service.quickaccesswallet.QuickAccessWalletService; +import android.service.quickaccesswallet.WalletCard; +import android.service.quickaccesswallet.WalletServiceEvent; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.settings.UserTracker; + +import com.google.common.util.concurrent.MoreExecutors; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Collections; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class WalletScreenControllerTest extends SysuiTestCase { + + private static final int MAX_CARDS = 10; + private static final String CARD_ID = "card_id"; + private static final CharSequence SHORTCUT_SHORT_LABEL = "View all"; + private static final CharSequence SHORTCUT_LONG_LABEL = "Add a payment method"; + private static final CharSequence SERVICE_LABEL = "Wallet app"; + private final WalletView mWalletView = new WalletView(mContext); + private final Drawable mWalletLogo = mContext.getDrawable(android.R.drawable.ic_lock_lock); + private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET) + .setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity")); + + @Mock + QuickAccessWalletClient mWalletClient; + @Mock + ActivityStarter mActivityStarter; + @Mock + UserTracker mUserTracker; + @Captor + ArgumentCaptor<Intent> mIntentCaptor; + @Captor + ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor; + @Captor + ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor; + @Captor + ArgumentCaptor<QuickAccessWalletClient.WalletServiceEventListener> mListenerCaptor; + private WalletScreenController mController; + private TestableLooper mTestableLooper; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mTestableLooper = TestableLooper.get(this); + when(mUserTracker.getUserContext()).thenReturn(mContext); + when(mWalletClient.getLogo()).thenReturn(mWalletLogo); + when(mWalletClient.getShortcutLongLabel()).thenReturn(SHORTCUT_LONG_LABEL); + when(mWalletClient.getShortcutShortLabel()).thenReturn(SHORTCUT_SHORT_LABEL); + when(mWalletClient.getServiceLabel()).thenReturn(SERVICE_LABEL); + when(mWalletClient.createWalletIntent()).thenReturn(mWalletIntent); + mController = new WalletScreenController( + mContext, + mWalletView, + mWalletClient, + mActivityStarter, + MoreExecutors.directExecutor(), + new Handler(mTestableLooper.getLooper()), + mUserTracker, + /* isDeviceLocked= */false); + } + + @Test + public void queryCards_hasCards_showCarousel() { + GetWalletCardsResponse response = + new GetWalletCardsResponse( + Collections.singletonList(createWalletCard(mContext)), 0); + + mController.queryWalletCards(); + mTestableLooper.processAllMessages(); + + verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); + + mCallbackCaptor.getValue().onWalletCardsRetrieved(response); + mTestableLooper.processAllMessages(); + + assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility()); + assertEquals(GONE, mWalletView.getErrorView().getVisibility()); + } + + @Test + public void queryCards_noCards_showEmptyState() { + GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.EMPTY_LIST, 0); + + mController.queryWalletCards(); + mTestableLooper.processAllMessages(); + + verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); + + mCallbackCaptor.getValue().onWalletCardsRetrieved(response); + mTestableLooper.processAllMessages(); + + assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility()); + assertEquals(VISIBLE, mWalletView.getEmptyStateView().getVisibility()); + assertEquals(GONE, mWalletView.getErrorView().getVisibility()); + } + + @Test + public void queryCards_error_showErrorView() { + String errorMessage = "getWalletCardsError"; + GetWalletCardsError error = new GetWalletCardsError(createIcon(), errorMessage); + + mController.queryWalletCards(); + mTestableLooper.processAllMessages(); + + verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); + + mCallbackCaptor.getValue().onWalletCardRetrievalError(error); + mTestableLooper.processAllMessages(); + + assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility()); + assertEquals(GONE, mWalletView.getEmptyStateView().getVisibility()); + assertEquals(VISIBLE, mWalletView.getErrorView().getVisibility()); + assertEquals(errorMessage, mWalletView.getErrorView().getText().toString()); + } + + @Test + public void onWalletServiceEvent_nfcPaymentStart_dismiss() { + WalletServiceEvent event = + new WalletServiceEvent(WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED); + + mController.onWalletServiceEvent(event); + mTestableLooper.processAllMessages(); + + assertNull(mController.mSelectedCardId); + assertTrue(mController.mIsDismissed); + verify(mWalletClient).notifyWalletDismissed(); + } + + @Test + public void onWalletServiceEvent_walletCardsUpdate_queryCards() { + mController.queryWalletCards(); + + verify(mWalletClient).addWalletServiceEventListener(mListenerCaptor.capture()); + + WalletServiceEvent event = + new WalletServiceEvent(WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED); + + QuickAccessWalletClient.WalletServiceEventListener listener = mListenerCaptor.getValue(); + listener.onWalletServiceEvent(event); + mTestableLooper.processAllMessages(); + + verify(mWalletClient, times(2)) + .getWalletCards(any(), mRequestCaptor.capture(), mCallbackCaptor.capture()); + + GetWalletCardsRequest request = mRequestCaptor.getValue(); + + assertEquals(MAX_CARDS, request.getMaxCards()); + } + + @Test + public void onCardSelected() { + mController.onCardSelected(createCardViewInfo()); + + assertEquals(CARD_ID, mController.mSelectedCardId); + } + + @Test + public void onCardClicked_startIntent() { + WalletCardViewInfo walletCardViewInfo = createCardViewInfo(); + + mController.onCardClicked(walletCardViewInfo); + + verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true)); + + assertEquals(mWalletIntent.getAction(), mIntentCaptor.getValue().getAction()); + assertEquals(mWalletIntent.getComponent(), mIntentCaptor.getValue().getComponent()); + } + + @Test + public void onWalletCardsRetrieved_cardDataEmpty_intentIsNull_hidesWallet() { + when(mWalletClient.createWalletIntent()).thenReturn(null); + GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0); + + mController.onWalletCardsRetrieved(response); + mTestableLooper.processAllMessages(); + + assertEquals(GONE, mWalletView.getVisibility()); + } + + @Test + public void onWalletCardsRetrieved_cardDataEmpty_logoIsNull_hidesWallet() { + when(mWalletClient.getLogo()).thenReturn(null); + GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0); + + mController.onWalletCardsRetrieved(response); + mTestableLooper.processAllMessages(); + + assertEquals(GONE, mWalletView.getVisibility()); + } + + @Test + public void onWalletCardsRetrieved_cardDataEmpty_labelIsEmpty_hidesWallet() { + when(mWalletClient.getShortcutLongLabel()).thenReturn(""); + GetWalletCardsResponse response = new GetWalletCardsResponse(Collections.emptyList(), 0); + + mController.onWalletCardsRetrieved(response); + mTestableLooper.processAllMessages(); + + assertEquals(GONE, mWalletView.getVisibility()); + } + + private WalletCard createWalletCard(Context context) { + PendingIntent pendingIntent = + PendingIntent.getActivity(context, 0, mWalletIntent, PendingIntent.FLAG_IMMUTABLE); + return new WalletCard.Builder(CARD_ID, createIcon(), "description", pendingIntent).build(); + } + + private static Icon createIcon() { + return Icon.createWithBitmap(Bitmap.createBitmap(70, 44, Bitmap.Config.ARGB_8888)); + } + + private WalletCardViewInfo createCardViewInfo() { + return new WalletScreenController.QAWalletCardViewInfo( + mContext, createWalletCard(mContext)); + } +} diff --git a/services/backup/OWNERS b/services/backup/OWNERS index ba2a63abb62d..cc36b47029a2 100644 --- a/services/backup/OWNERS +++ b/services/backup/OWNERS @@ -9,4 +9,3 @@ niagra@google.com niamhfw@google.com philippov@google.com rthakohov@google.com -tobiast@google.com diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 82538b6b906c..e9b2ed30aa09 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -1120,11 +1120,18 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } ComponentName componentName = packageResolveInfos.get(0).serviceInfo.getComponentName(); Slog.i(LOG_TAG, "Initializing CompanionDeviceService binding for " + componentName); - return new ServiceConnector.Impl<>(getContext(), + return new ServiceConnector.Impl<ICompanionDeviceService>(getContext(), new Intent(CompanionDeviceService.SERVICE_INTERFACE).setComponent(componentName), BIND_IMPORTANT, a.getUserId(), - ICompanionDeviceService.Stub::asInterface); + ICompanionDeviceService.Stub::asInterface) { + + @Override + protected long getAutoDisconnectTimeoutMs() { + // Service binding is managed manually based on corresponding device being nearby + return Long.MAX_VALUE; + } + }; } private class BleScanCallback extends ScanCallback { diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index c7460a6337a9..ed579f2df4fc 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -40,7 +40,6 @@ import android.net.vcn.IVcnManagementService; import android.net.vcn.IVcnStatusCallback; import android.net.vcn.IVcnUnderlyingNetworkPolicyListener; import android.net.vcn.VcnConfig; -import android.net.vcn.VcnManager; import android.net.vcn.VcnManager.VcnErrorCode; import android.net.vcn.VcnManager.VcnStatusCode; import android.net.vcn.VcnUnderlyingNetworkPolicy; @@ -531,11 +530,12 @@ public class VcnManagementService extends IVcnManagementService.Stub { if (mVcns.containsKey(subscriptionGroup)) { final Vcn vcn = mVcns.get(subscriptionGroup); - final boolean isActive = vcn.isActive(); + final int status = vcn.getStatus(); vcn.updateConfig(config); + // TODO(b/183174340): Remove this once opportunistic-safe-mode is supported // Only notify VcnStatusCallbacks if this VCN was previously in Safe Mode - if (!isActive) { + if (status == VCN_STATUS_CODE_SAFE_MODE) { // TODO(b/181789060): invoke asynchronously after Vcn notifies through VcnCallback notifyAllPermissionedStatusCallbacksLocked( subscriptionGroup, VCN_STATUS_CODE_ACTIVE); @@ -768,7 +768,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { synchronized (mLock) { final Vcn vcn = mVcns.get(subGrp); if (vcn != null) { - if (vcn.isActive()) { + if (vcn.getStatus() == VCN_STATUS_CODE_ACTIVE) { isVcnManagedNetwork = true; } @@ -879,20 +879,23 @@ public class VcnManagementService extends IVcnManagementService.Stub { // now that callback is registered, send it the VCN's current status final VcnConfig vcnConfig = mConfigs.get(subGroup); final Vcn vcn = mVcns.get(subGroup); - final int vcnStatus; + final int vcnStatus = + vcn == null ? VCN_STATUS_CODE_NOT_CONFIGURED : vcn.getStatus(); + final int resultStatus; if (vcnConfig == null || !isCallbackPermissioned(cbInfo, subGroup)) { - vcnStatus = VcnManager.VCN_STATUS_CODE_NOT_CONFIGURED; + resultStatus = VCN_STATUS_CODE_NOT_CONFIGURED; } else if (vcn == null) { - vcnStatus = VcnManager.VCN_STATUS_CODE_INACTIVE; - } else if (vcn.isActive()) { - vcnStatus = VcnManager.VCN_STATUS_CODE_ACTIVE; + resultStatus = VCN_STATUS_CODE_INACTIVE; + } else if (vcnStatus == VCN_STATUS_CODE_ACTIVE + || vcnStatus == VCN_STATUS_CODE_SAFE_MODE) { + resultStatus = vcnStatus; } else { - // TODO(b/181789060): create Vcn.getStatus() and Log.WTF() for unknown status - vcnStatus = VcnManager.VCN_STATUS_CODE_SAFE_MODE; + Slog.wtf(TAG, "Unknown VCN status: " + vcnStatus); + resultStatus = VCN_STATUS_CODE_NOT_CONFIGURED; } try { - cbInfo.mCallback.onVcnStatusChanged(vcnStatus); + cbInfo.mCallback.onVcnStatusChanged(resultStatus); } catch (RemoteException e) { Slog.d(TAG, "VcnStatusCallback threw on VCN status change", e); } diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index c360190d58a3..5c2fd2647df2 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -279,7 +279,7 @@ public class AccountManagerService mAppOpsManager = mContext.getSystemService(AppOpsManager.class); mHandler = new MessageHandler(injector.getMessageHandlerLooper()); mAuthenticatorCache = mInjector.getAccountAuthenticatorCache(); - mAuthenticatorCache.setListener(this, mHandler); + mAuthenticatorCache.setListener(this, null /* Handler */); sThis.set(this); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index cdeaca26375b..2de2fdf1f188 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -128,6 +128,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.VibrationEffect; import android.os.Vibrator; +import android.os.VibratorManager; import android.provider.Settings; import android.provider.Settings.System; import android.service.notification.ZenModeConfig; @@ -1092,6 +1093,33 @@ public class AudioService extends IAudioService.Stub } } + private void updateVibratorInfos() { + VibratorManager vibratorManager = mContext.getSystemService(VibratorManager.class); + if (vibratorManager == null) { + Slog.e(TAG, "Vibrator manager is not found"); + return; + } + int[] vibratorIds = vibratorManager.getVibratorIds(); + if (vibratorIds.length == 0) { + Slog.d(TAG, "No vibrator found"); + return; + } + List<Vibrator> vibrators = new ArrayList<>(vibratorIds.length); + for (int id : vibratorIds) { + Vibrator vibrator = vibratorManager.getVibrator(id); + if (vibrator != null) { + vibrators.add(vibrator); + } else { + Slog.w(TAG, "Vibrator(" + id + ") is not found"); + } + } + if (vibrators.isEmpty()) { + Slog.w(TAG, "Cannot find any available vibrator"); + return; + } + AudioSystem.setVibratorInfos(vibrators); + } + public void onSystemReady() { mSystemReady = true; scheduleLoadSoundEffects(); @@ -1149,6 +1177,8 @@ public class AudioService extends IAudioService.Stub setMicMuteFromSwitchInput(); initMinStreamVolumeWithoutModifyAudioSettings(); + + updateVibratorInfos(); } RoleObserver mRoleObserver; @@ -1341,6 +1371,9 @@ public class AudioService extends IAudioService.Stub setMicrophoneMuteNoCallerCheck(getCurrentUserId()); // will also update the mic mute cache setMicMuteFromSwitchInput(); + + // Restore vibrator info + updateVibratorInfos(); } private void onReinitVolumes(@NonNull String caller) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 972071c6f3ee..24e867afedd7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -52,7 +52,6 @@ import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; -import com.android.server.biometrics.sensors.HalClientMonitor; import com.android.server.biometrics.sensors.InvalidationRequesterClient; import com.android.server.biometrics.sensors.LockoutResetDispatcher; import com.android.server.biometrics.sensors.PerformanceTracker; @@ -153,7 +152,10 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi prop.commonProps.maxEnrollmentsPerUser, componentInfo, prop.sensorType, - true /* resetLockoutRequiresHardwareAuthToken */); + true /* resetLockoutRequiresHardwareAuthToken */, + prop.sensorLocations[0].sensorLocationX, + prop.sensorLocations[0].sensorLocationY, + prop.sensorLocations[0].sensorRadius); final Sensor sensor = new Sensor(getTag() + "/" + sensorId, this, mContext, mHandler, internalProp, gestureAvailabilityDispatcher); @@ -388,7 +390,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi public void scheduleRemove(int sensorId, @NonNull IBinder token, @NonNull IFingerprintServiceReceiver receiver, int fingerId, int userId, @NonNull String opPackageName) { - scheduleRemoveSpecifiedIds(sensorId, token, new int[] {fingerId}, userId, receiver, + scheduleRemoveSpecifiedIds(sensorId, token, new int[]{fingerId}, userId, receiver, opPackageName); } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 3ac11da5fb3b..ed8ea186b1d4 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -3541,15 +3541,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub InputBindResult res = null; // We shows the IME when the system allows the IME focused target window to restore the // IME visibility (e.g. switching to the app task when last time the IME is visible). - if (isTextEditor && mWindowManagerInternal.shouldRestoreImeVisibility(windowToken)) { - if (attribute != null) { - res = startInputUncheckedLocked(cs, inputContext, missingMethods, - attribute, startInputFlags, startInputReason); - showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null, - SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY); - } else { - res = InputBindResult.NULL_EDITOR_INFO; - } + // Note that we don't restore IME visibility for some cases (e.g. when the soft input + // state is ALWAYS_HIDDEN or STATE_HIDDEN with forward navigation). + // Because the app might leverage these flags to hide soft-keyboard with showing their own + // UI for input. + if (isTextEditor && attribute != null + && shouldRestoreImeVisibility(windowToken, softInputMode)) { + res = startInputUncheckedLocked(cs, inputContext, missingMethods, attribute, + startInputFlags, startInputReason); + showCurrentInputLocked(windowToken, InputMethodManager.SHOW_IMPLICIT, null, + SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY); return res; } @@ -3673,6 +3674,19 @@ public class InputMethodManagerService extends IInputMethodManager.Stub return res; } + private boolean shouldRestoreImeVisibility(IBinder windowToken, + @SoftInputModeFlags int softInputMode) { + switch (softInputMode & LayoutParams.SOFT_INPUT_MASK_STATE) { + case LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN: + return false; + case LayoutParams.SOFT_INPUT_STATE_HIDDEN: + if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) { + return false; + } + } + return mWindowManagerInternal.shouldRestoreImeVisibility(windowToken); + } + private boolean isImeVisible() { return (mImeWindowVis & InputMethodService.IME_VISIBLE) != 0; } diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 31edf43679e9..5286bce67b37 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -113,6 +113,22 @@ class MediaRouter2ServiceImpl { //////////////////////////////////////////////////////////////// @NonNull + public void checkModifyAudioRoutingPermission() { + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + + try { + if (mContext.checkPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING, pid, uid) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Must hold the MODIFY_AUDIO_ROUTING permission."); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @NonNull public List<MediaRoute2Info> getSystemRoutes() { final int uid = Binder.getCallingUid(); final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier(); diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index b6d6cc48d0cd..b85cea7a637d 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -438,6 +438,12 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override + public void checkModifyAudioRoutingPermission() { + mService2.checkModifyAudioRoutingPermission(); + } + + // Binder call + @Override public List<MediaRoute2Info> getSystemRoutes() { return mService2.getSystemRoutes(); } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 40eefca096b9..7bd3ee2b33e3 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -3198,23 +3198,19 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // Verify they're not lying about package name mAppOps.checkPackage(callingUid, callingPackage); - final SubscriptionManager sm; - final SubscriptionInfo si; final PersistableBundle config; + final TelephonyManager tm; final long token = Binder.clearCallingIdentity(); try { - sm = mContext.getSystemService(SubscriptionManager.class); - si = sm.getActiveSubscriptionInfo(subId); config = mCarrierConfigManager.getConfigForSubId(subId); + tm = mContext.getSystemService(TelephonyManager.class); } finally { Binder.restoreCallingIdentity(token); } - // First check: is caller the CarrierService? - if (si != null) { - if (si.isEmbedded() && sm.canManageSubscription(si, callingPackage)) { - return; - } + // First check: does caller have carrier privilege? + if (tm != null && tm.hasCarrierPrivileges(subId)) { + return; } // Second check: has the CarrierService delegated access? diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 671fccf0e9ef..7b71be98834c 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -4132,6 +4132,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void destroyInternal() { + final IncrementalFileStorages incrementalFileStorages; synchronized (mLock) { mSealed = true; if (!params.isStaged) { @@ -4144,16 +4145,17 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { for (FileBridge bridge : mBridges) { bridge.forceClose(); } - if (mIncrementalFileStorages != null) { - mIncrementalFileStorages.cleanUp(); - mIncrementalFileStorages = null; - } + incrementalFileStorages = mIncrementalFileStorages; + mIncrementalFileStorages = null; } // For staged sessions, we don't delete the directory where the packages have been copied, // since these packages are supposed to be read on reboot. // Those dirs are deleted when the staged session has reached a final state. if (stageDir != null && !params.isStaged) { try { + if (incrementalFileStorages != null) { + incrementalFileStorages.cleanUp(); + } mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath()); } catch (InstallerException ignored) { } @@ -4171,13 +4173,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void cleanStageDir() { + final IncrementalFileStorages incrementalFileStorages; synchronized (mLock) { - if (mIncrementalFileStorages != null) { - mIncrementalFileStorages.cleanUp(); - mIncrementalFileStorages = null; - } + incrementalFileStorages = mIncrementalFileStorages; + mIncrementalFileStorages = null; } try { + if (incrementalFileStorages != null) { + incrementalFileStorages.cleanUp(); + } mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath()); } catch (InstallerException ignored) { } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1279025b1485..cb68cc9d5e45 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12580,10 +12580,21 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mInstallLock") void removeCodePathLI(File codePath) { if (codePath.isDirectory()) { - File codePathParent = codePath.getParentFile(); + final File codePathParent = codePath.getParentFile(); + final boolean needRemoveParent = codePathParent.getName().startsWith(RANDOM_DIR_PREFIX); try { + final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath( + codePath.getAbsolutePath())); + if (isIncremental) { + if (needRemoveParent) { + mIncrementalManager.rmPackageDir(codePathParent); + } else { + mIncrementalManager.rmPackageDir(codePath); + } + } + mInstaller.rmPackageDir(codePath.getAbsolutePath()); - if (codePathParent.getName().startsWith(RANDOM_DIR_PREFIX)) { + if (needRemoveParent) { mInstaller.rmPackageDir(codePathParent.getAbsolutePath()); removeCachedResult(codePathParent); } @@ -18126,16 +18137,7 @@ public class PackageManagerService extends IPackageManager.Stub if (codeFile == null || !codeFile.exists()) { return false; } - - final boolean isIncremental = (mIncrementalManager != null && isIncrementalPath( - codeFile.getAbsolutePath())); - removeCodePathLI(codeFile); - - if (isIncremental) { - mIncrementalManager.onPackageRemoved(codeFile); - } - return true; } @@ -24776,7 +24778,7 @@ public class PackageManagerService extends IPackageManager.Stub final int fileToDeleteCount = filesToDelete.size(); for (int i = 0; i < fileToDeleteCount; i++) { File fileToDelete = filesToDelete.get(i); - logCriticalInfo(Log.WARN, "Destroying orphaned" + fileToDelete); + logCriticalInfo(Log.WARN, "Destroying orphaned at " + fileToDelete); synchronized (mInstallLock) { removeCodePathLI(fileToDelete); } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index b02a21da3d69..19c56f82d7bf 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -19,33 +19,18 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Person; -import android.app.appsearch.AppSearchManager; -import android.app.appsearch.AppSearchResult; import android.app.appsearch.AppSearchSession; -import android.app.appsearch.GenericDocument; -import android.app.appsearch.GetByUriRequest; import android.app.appsearch.PackageIdentifier; -import android.app.appsearch.PutDocumentsRequest; -import android.app.appsearch.RemoveByUriRequest; -import android.app.appsearch.ReportUsageRequest; -import android.app.appsearch.SearchResult; -import android.app.appsearch.SearchResults; -import android.app.appsearch.SearchSpec; -import android.app.appsearch.SetSchemaRequest; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; import android.content.LocusId; -import android.content.pm.AppSearchPerson; -import android.content.pm.AppSearchShortcutInfo; import android.content.pm.PackageInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.content.res.Resources; import android.graphics.drawable.Icon; -import android.os.Binder; import android.os.PersistableBundle; -import android.os.StrictMode; import android.text.format.Formatter; import android.util.ArrayMap; import android.util.ArraySet; @@ -58,10 +43,8 @@ import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.infra.AndroidFuture; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; -import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.server.pm.ShortcutService.DumpFilter; @@ -81,17 +64,13 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; /** @@ -158,9 +137,9 @@ class ShortcutPackage extends ShortcutPackageItem { private static final String KEY_BITMAP_BYTES = "bitmapBytes"; /** - * An temp in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs. + * All the shortcuts from the package, keyed on IDs. */ - final ArraySet<ShortcutInfo> mShortcuts = new ArraySet<>(); + private final ArrayMap<String, ShortcutInfo> mShortcuts = new ArrayMap<>(); /** * All the share targets from the package @@ -220,9 +199,7 @@ class ShortcutPackage extends ShortcutPackageItem { } public int getShortcutCount() { - final int[] count = new int[1]; - forEachShortcut(si -> count[0]++); - return count[0]; + return mShortcuts.size(); } @Override @@ -236,20 +213,17 @@ class ShortcutPackage extends ShortcutPackageItem { // - Unshadow all shortcuts. // - Set disabled reason. // - Disable if needed. - forEachShortcutMutateIf(si -> { - if (!si.hasFlags(ShortcutInfo.FLAG_SHADOW) - && si.getDisabledReason() == restoreBlockReason - && restoreBlockReason == ShortcutInfo.DISABLED_REASON_NOT_DISABLED) { - return false; - } - si.clearFlags(ShortcutInfo.FLAG_SHADOW); - - si.setDisabledReason(restoreBlockReason); - if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) { - si.addFlags(ShortcutInfo.FLAG_DISABLED); - } - return true; - }); + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + ShortcutInfo si = mShortcuts.valueAt(i); + mutateShortcut(si.getId(), si, shortcut -> { + shortcut.clearFlags(ShortcutInfo.FLAG_SHADOW); + + shortcut.setDisabledReason(restoreBlockReason); + if (restoreBlockReason != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) { + shortcut.addFlags(ShortcutInfo.FLAG_DISABLED); + } + }); + } // Because some launchers may not have been restored (e.g. allowBackup=false), // we need to re-calculate the pinned shortcuts. refreshPinnedFlags(); @@ -260,7 +234,7 @@ class ShortcutPackage extends ShortcutPackageItem { */ @Nullable public ShortcutInfo findShortcutById(String id) { - return getShortcutById(id); + return mShortcuts.get(id); } public boolean isShortcutExistsAndInvisibleToPublisher(String id) { @@ -326,9 +300,8 @@ class ShortcutPackage extends ShortcutPackageItem { * Delete a shortcut by ID. This will *always* remove it even if it's immutable or invisible. */ private ShortcutInfo forceDeleteShortcutInner(@NonNull String id) { - final ShortcutInfo shortcut = getShortcutById(id); + final ShortcutInfo shortcut = mShortcuts.remove(id); if (shortcut != null) { - removeShortcut(id); mShortcutUser.mService.removeIconLocked(shortcut); shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_MANIFEST | ShortcutInfo.FLAG_CACHED_ALL); @@ -345,10 +318,10 @@ class ShortcutPackage extends ShortcutPackageItem { forceDeleteShortcutInner(newShortcut.getId()); + // Extract Icon and update the icon res ID and the bitmap path. s.saveIconAndFixUpShortcutLocked(newShortcut); s.fixUpShortcutResourceNamesAndValues(newShortcut); - - saveShortcut(newShortcut); + mShortcuts.put(newShortcut.getId(), newShortcut); } /** @@ -437,16 +410,6 @@ class ShortcutPackage extends ShortcutPackageItem { } forceReplaceShortcutInner(newShortcut); - // TODO: Report usage can be filed async - runInAppSearch(session -> { - final AndroidFuture<Boolean> future = new AndroidFuture<>(); - session.reportUsage( - new ReportUsageRequest.Builder(getPackageName()) - .setUri(newShortcut.getId()).build(), - mShortcutUser.mExecutor, result -> future.complete(result.isSuccess())); - return future; - }); - return deleted; } @@ -456,12 +419,19 @@ class ShortcutPackage extends ShortcutPackageItem { * @return List of removed shortcuts. */ private List<ShortcutInfo> removeOrphans() { - final List<ShortcutInfo> removeList = new ArrayList<>(1); - forEachShortcut(si -> { - if (si.isAlive()) return; + List<ShortcutInfo> removeList = null; + + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + + if (si.isAlive()) continue; + + if (removeList == null) { + removeList = new ArrayList<>(); + } removeList.add(si); - }); - if (!removeList.isEmpty()) { + } + if (removeList != null) { for (int i = removeList.size() - 1; i >= 0; i--) { forceDeleteShortcutInner(removeList.get(i).getId()); } @@ -478,19 +448,20 @@ class ShortcutPackage extends ShortcutPackageItem { public List<ShortcutInfo> deleteAllDynamicShortcuts(boolean ignoreInvisible) { final long now = mShortcutUser.mService.injectCurrentTimeMillis(); - final boolean[] changed = new boolean[1]; - forEachShortcutMutateIf(si -> { + boolean changed = false; + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (si.isDynamic() && (!ignoreInvisible || si.isVisibleToPublisher())) { - changed[0] = true; + changed = true; - si.setTimestamp(now); - si.clearFlags(ShortcutInfo.FLAG_DYNAMIC); - si.setRank(0); // It may still be pinned, so clear the rank. - return true; + mutateShortcut(si.getId(), si, shortcut -> { + shortcut.setTimestamp(now); + shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC); + shortcut.setRank(0); // It may still be pinned, so clear the rank. + }); } - return false; - }); - if (changed[0]) { + } + if (changed) { return removeOrphans(); } return null; @@ -635,6 +606,11 @@ class ShortcutPackage extends ShortcutPackageItem { * <p>Then remove all shortcuts that are not dynamic and no longer pinned either. */ public void refreshPinnedFlags() { + final List<ShortcutInfo> shortcuts = new ArrayList<>(mShortcuts.values()); + final Map<String, ShortcutInfo> shortcutMap = new ArrayMap<>(shortcuts.size()); + for (ShortcutInfo si : shortcuts) { + shortcutMap.put(si.getId(), si); + } final Set<String> pinnedShortcuts = new ArraySet<>(); // First, for the pinned set for each launcher, keep track of their id one by one. @@ -644,20 +620,31 @@ class ShortcutPackage extends ShortcutPackageItem { if (pinned == null || pinned.size() == 0) { return; } - pinnedShortcuts.addAll(pinned); + for (int i = pinned.size() - 1; i >= 0; i--) { + final String id = pinned.valueAt(i); + final ShortcutInfo si = shortcutMap.get(id); + if (si == null) { + // This happens if a launcher pinned shortcuts from this package, then backup& + // restored, but this package doesn't allow backing up. + // In that case the launcher ends up having a dangling pinned shortcuts. + // That's fine, when the launcher is restored, we'll fix it. + continue; + } + pinnedShortcuts.add(si.getId()); + } }); // Then, update the pinned state if necessary - forEachShortcutMutateIf(si -> { + for (int i = shortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = shortcuts.get(i); if (pinnedShortcuts.contains(si.getId()) && !si.isPinned()) { - si.addFlags(ShortcutInfo.FLAG_PINNED); - return true; + mutateShortcut(si.getId(), si, + shortcut -> shortcut.addFlags(ShortcutInfo.FLAG_PINNED)); } if (!pinnedShortcuts.contains(si.getId()) && si.isPinned()) { - si.clearFlags(ShortcutInfo.FLAG_PINNED); - return true; + mutateShortcut(si.getId(), si, shortcut -> + shortcut.clearFlags(ShortcutInfo.FLAG_PINNED)); } - return false; - }); + } // Lastly, remove the ones that are no longer pinned, cached nor dynamic. removeOrphans(); @@ -772,7 +759,9 @@ class ShortcutPackage extends ShortcutPackageItem { final ArraySet<String> pinnedByCallerSet = (callingLauncher == null) ? null : s.getLauncherShortcutsLocked(callingLauncher, getPackageUserId(), launcherUserId) .getPinnedShortcutIds(getPackageName(), getPackageUserId()); - forEachShortcut(si -> { + + for (int i = 0; i < mShortcuts.size(); i++) { + final ShortcutInfo si = mShortcuts.valueAt(i); // Need to adjust PINNED flag depending on the caller. // Basically if the caller is a launcher (callingLauncher != null) and the launcher // isn't pinning it, then we need to clear PINNED for this caller. @@ -782,7 +771,7 @@ class ShortcutPackage extends ShortcutPackageItem { if (!getPinnedByAnyLauncher) { if (si.isFloating() && !si.isCached()) { if (!isPinnedByCaller) { - return; + continue; } } } @@ -802,7 +791,7 @@ class ShortcutPackage extends ShortcutPackageItem { } result.add(clone); } - }); + } } public void resetThrottling() { @@ -872,7 +861,7 @@ class ShortcutPackage extends ShortcutPackageItem { * the app's Xml resource. */ int getSharingShortcutCount() { - if (getShortcutCount() == 0 || mShareTargets.isEmpty()) { + if (mShortcuts.isEmpty() || mShareTargets.isEmpty()) { return 0; } @@ -910,12 +899,14 @@ class ShortcutPackage extends ShortcutPackageItem { * Return the filenames (excluding path names) of icon bitmap files from this package. */ public ArraySet<String> getUsedBitmapFiles() { - final ArraySet<String> usedFiles = new ArraySet<>(1); - forEachShortcut(si -> { + final ArraySet<String> usedFiles = new ArraySet<>(mShortcuts.size()); + + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (si.getBitmapPath() != null) { usedFiles.add(getFileName(si.getBitmapPath())); } - }); + } return usedFiles; } @@ -932,29 +923,30 @@ class ShortcutPackage extends ShortcutPackageItem { * @return false if any of the target activities are no longer enabled. */ private boolean areAllActivitiesStillEnabled() { + if (mShortcuts.size() == 0) { + return true; + } final ShortcutService s = mShortcutUser.mService; // Normally the number of target activities is 1 or so, so no need to use a complex // structure like a set. final ArrayList<ComponentName> checked = new ArrayList<>(4); - final boolean[] reject = new boolean[1]; - forEachShortcutStopWhen(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); final ComponentName activity = si.getActivity(); if (checked.contains(activity)) { - return false; // Already checked. + continue; // Already checked. } checked.add(activity); if ((activity != null) && !s.injectIsActivityEnabledAndExported(activity, getOwnerUserId())) { - reject[0] = true; - return true; // Found at least 1 activity is disabled, so skip the rest. + return false; } - return false; - }); - return !reject[0]; + } + return true; } /** @@ -1037,32 +1029,32 @@ class ShortcutPackage extends ShortcutPackageItem { // See if there are any shortcuts that were prevented restoring because the app was of a // lower version, and re-enable them. - forEachShortcutMutateIf(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_VERSION_LOWER) { - return false; + continue; } if (getPackageInfo().getBackupSourceVersionCode() > newVersionCode) { if (ShortcutService.DEBUG) { Slog.d(TAG, String.format("Shortcut %s require version %s, still not restored.", si.getId(), getPackageInfo().getBackupSourceVersionCode())); } - return false; + continue; } Slog.i(TAG, String.format("Restoring shortcut: %s", si.getId())); - if (si.hasFlags(ShortcutInfo.FLAG_DISABLED) - || si.getDisabledReason() != ShortcutInfo.DISABLED_REASON_NOT_DISABLED) { - si.clearFlags(ShortcutInfo.FLAG_DISABLED); - si.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED); - return true; - } - return false; - }); + mutateShortcut(si.getId(), si, shortcut -> { + shortcut.clearFlags(ShortcutInfo.FLAG_DISABLED); + shortcut.setDisabledReason(ShortcutInfo.DISABLED_REASON_NOT_DISABLED); + }); + } // For existing shortcuts, update timestamps if they have any resources. // Also check if shortcuts' activities are still main activities. Otherwise, disable them. if (!isNewApp) { - final Resources publisherRes = getPackageResources(); - forEachShortcutMutateIf(si -> { + Resources publisherRes = null; + + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); // Disable dynamic shortcuts whose target activity is gone. if (si.isDynamic()) { if (si.getActivity() == null) { @@ -1075,26 +1067,33 @@ class ShortcutPackage extends ShortcutPackageItem { getPackageName(), si.getId())); if (disableDynamicWithId(si.getId(), /*ignoreInvisible*/ false, ShortcutInfo.DISABLED_REASON_APP_CHANGED) != null) { - return false; // Actually removed. + continue; // Actually removed. } // Still pinned, so fall-through and possibly update the resources. } } - if (!si.hasAnyResources() || publisherRes == null) { - return false; - } + if (si.hasAnyResources()) { + if (publisherRes == null) { + publisherRes = getPackageResources(); + if (publisherRes == null) { + break; // Resources couldn't be loaded. + } + } - if (!si.isOriginallyFromManifest()) { - si.lookupAndFillInResourceIds(publisherRes); - } + final Resources res = publisherRes; + mutateShortcut(si.getId(), si, shortcut -> { + if (!shortcut.isOriginallyFromManifest()) { + shortcut.lookupAndFillInResourceIds(res); + } - // If this shortcut is not from a manifest, then update all resource IDs - // from resource names. (We don't allow resource strings for - // non-manifest at the moment, but icons can still be resources.) - si.setTimestamp(s.injectCurrentTimeMillis()); - return true; - }); + // If this shortcut is not from a manifest, then update all resource IDs + // from resource names. (We don't allow resource strings for + // non-manifest at the moment, but icons can still be resources.) + shortcut.setTimestamp(s.injectCurrentTimeMillis()); + }); + } + } } // (Re-)publish manifest shortcut. @@ -1120,12 +1119,17 @@ class ShortcutPackage extends ShortcutPackageItem { boolean changed = false; // Keep the previous IDs. - final ArraySet<String> toDisableList = new ArraySet<>(1); - forEachShortcut(si -> { + ArraySet<String> toDisableList = null; + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + if (si.isManifestShortcut()) { + if (toDisableList == null) { + toDisableList = new ArraySet<>(); + } toDisableList.add(si.getId()); } - }); + } // Publish new ones. if (newManifestShortcutList != null) { @@ -1165,7 +1169,7 @@ class ShortcutPackage extends ShortcutPackageItem { // regardless. forceReplaceShortcutInner(newShortcut); // This will clean up the old one too. - if (!newDisabled && !toDisableList.isEmpty()) { + if (!newDisabled && toDisableList != null) { // Still alive, don't remove. toDisableList.remove(id); } @@ -1173,7 +1177,7 @@ class ShortcutPackage extends ShortcutPackageItem { } // Disable the previous manifest shortcuts that are no longer in the manifest. - if (!toDisableList.isEmpty()) { + if (toDisableList != null) { if (ShortcutService.DEBUG) { Slog.d(TAG, String.format( "Package %s: disabling %d stale shortcuts", getPackageName(), @@ -1188,8 +1192,8 @@ class ShortcutPackage extends ShortcutPackageItem { /* overrideImmutable=*/ true, /*ignoreInvisible=*/ false, ShortcutInfo.DISABLED_REASON_APP_CHANGED); } + removeOrphans(); } - removeOrphans(); adjustRanks(); return changed; @@ -1262,21 +1266,25 @@ class ShortcutPackage extends ShortcutPackageItem { private ArrayMap<ComponentName, ArrayList<ShortcutInfo>> sortShortcutsToActivities() { final ArrayMap<ComponentName, ArrayList<ShortcutInfo>> activitiesToShortcuts = new ArrayMap<>(); - forEachShortcut(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (si.isFloating()) { - return; // Ignore floating shortcuts, which are not tied to any activities. + continue; // Ignore floating shortcuts, which are not tied to any activities. } final ComponentName activity = si.getActivity(); if (activity == null) { mShortcutUser.mService.wtf("null activity detected."); - return; + continue; } - ArrayList<ShortcutInfo> list = activitiesToShortcuts.computeIfAbsent(activity, - k -> new ArrayList<>()); + ArrayList<ShortcutInfo> list = activitiesToShortcuts.get(activity); + if (list == null) { + list = new ArrayList<>(); + activitiesToShortcuts.put(activity, list); + } list.add(si); - }); + } return activitiesToShortcuts; } @@ -1312,13 +1320,14 @@ class ShortcutPackage extends ShortcutPackageItem { // (If it's for update, then don't count dynamic shortcuts, since they'll be replaced // anyway.) final ArrayMap<ComponentName, Integer> counts = new ArrayMap<>(4); - forEachShortcut(shortcut -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo shortcut = mShortcuts.valueAt(i); if (shortcut.isManifestShortcut()) { incrementCountForActivity(counts, shortcut.getActivity(), 1); } else if (shortcut.isDynamic() && (operation != ShortcutService.OPERATION_SET)) { incrementCountForActivity(counts, shortcut.getActivity(), 1); } - }); + } for (int i = newList.size() - 1; i >= 0; i--) { final ShortcutInfo newShortcut = newList.get(i); @@ -1331,7 +1340,7 @@ class ShortcutPackage extends ShortcutPackageItem { continue; // Activity can be null for update. } - final ShortcutInfo original = findShortcutById(newShortcut.getId()); + final ShortcutInfo original = mShortcuts.get(newShortcut.getId()); if (original == null) { if (operation == ShortcutService.OPERATION_UPDATE) { continue; // When updating, ignore if there's no target. @@ -1370,17 +1379,31 @@ class ShortcutPackage extends ShortcutPackageItem { public void resolveResourceStrings() { final ShortcutService s = mShortcutUser.mService; - final Resources publisherRes = getPackageResources(); - final List<ShortcutInfo> changedShortcuts = new ArrayList<>(1); + List<ShortcutInfo> changedShortcuts = null; - if (publisherRes != null) { - forEachShortcutMutateIf(si -> { - if (!si.hasStringResources()) return false; - si.resolveResourceStrings(publisherRes); - si.setTimestamp(s.injectCurrentTimeMillis()); + Resources publisherRes = null; + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + + if (si.hasStringResources()) { + if (publisherRes == null) { + publisherRes = getPackageResources(); + if (publisherRes == null) { + break; // Resources couldn't be loaded. + } + } + + final Resources res = publisherRes; + mutateShortcut(si.getId(), si, shortcut -> { + shortcut.resolveResourceStrings(res); + shortcut.setTimestamp(s.injectCurrentTimeMillis()); + }); + + if (changedShortcuts == null) { + changedShortcuts = new ArrayList<>(1); + } changedShortcuts.add(si); - return true; - }); + } } if (!CollectionUtils.isEmpty(changedShortcuts)) { s.packageShortcutsChanged(getPackageName(), getPackageUserId(), changedShortcuts, null); @@ -1389,7 +1412,10 @@ class ShortcutPackage extends ShortcutPackageItem { /** Clears the implicit ranks for all shortcuts. */ public void clearAllImplicitRanks() { - forEachShortcutMutate(ShortcutInfo::clearImplicitRankAndRankChangedFlag); + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + mutateShortcut(si.getId(), si, ShortcutInfo::clearImplicitRankAndRankChangedFlag); + } } /** @@ -1429,16 +1455,17 @@ class ShortcutPackage extends ShortcutPackageItem { final long now = s.injectCurrentTimeMillis(); // First, clear ranks for floating shortcuts. - forEachShortcutMutateIf(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (si.isFloating()) { if (si.getRank() != 0) { - si.setTimestamp(now); - si.setRank(0); - return true; + mutateShortcut(si.getId(), si, shortcut -> { + shortcut.setTimestamp(now); + shortcut.setRank(0); + }); } } - return false; - }); + } // Then adjust ranks. Ranks are unique for each activity, so we first need to sort // shortcuts to each activity. @@ -1463,7 +1490,7 @@ class ShortcutPackage extends ShortcutPackageItem { } // At this point, it must be dynamic. if (!si.isDynamic()) { - s.wtf("Non-dynamic shortcut found.: " + si.toInsecureString()); + s.wtf("Non-dynamic shortcut found."); continue; } final int thisRank = rank++; @@ -1480,14 +1507,13 @@ class ShortcutPackage extends ShortcutPackageItem { /** @return true if there's any shortcuts that are not manifest shortcuts. */ public boolean hasNonManifestShortcuts() { final boolean[] condition = new boolean[1]; - forEachShortcutStopWhen(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (!si.isDeclaredInManifest()) { - condition[0] = true; return true; } - return false; - }); - return condition[0]; + } + return false; } public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { @@ -1527,8 +1553,11 @@ class ShortcutPackage extends ShortcutPackageItem { pw.print(prefix); pw.println(" Shortcuts:"); - final long[] totalBitmapSize = new long[1]; - forEachShortcut(si -> { + long totalBitmapSize = 0; + final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts; + final int size = shortcuts.size(); + for (int i = 0; i < size; i++) { + final ShortcutInfo si = shortcuts.valueAt(i); pw.println(si.toDumpString(prefix + " ")); if (si.getBitmapPath() != null) { final long len = new File(si.getBitmapPath()).length(); @@ -1537,15 +1566,15 @@ class ShortcutPackage extends ShortcutPackageItem { pw.print("bitmap size="); pw.println(len); - totalBitmapSize[0] += len; + totalBitmapSize += len; } - }); + } pw.print(prefix); pw.print(" "); pw.print("Total bitmap size: "); - pw.print(totalBitmapSize[0]); + pw.print(totalBitmapSize); pw.print(" ("); - pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize[0])); + pw.print(Formatter.formatFileSize(mShortcutUser.mService.mContext, totalBitmapSize)); pw.println(")"); } @@ -1560,39 +1589,46 @@ class ShortcutPackage extends ShortcutPackageItem { | (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0) | (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0); - forEachShortcut(si -> { + final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts; + final int size = shortcuts.size(); + for (int i = 0; i < size; i++) { + final ShortcutInfo si = shortcuts.valueAt(i); if ((si.getFlags() & shortcutFlags) != 0) { pw.println(si.toDumpString("")); } - }); + } } @Override public JSONObject dumpCheckin(boolean clear) throws JSONException { final JSONObject result = super.dumpCheckin(clear); - final int[] numDynamic = new int[1]; - final int[] numPinned = new int[1]; - final int[] numManifest = new int[1]; - final int[] numBitmaps = new int[1]; - final long[] totalBitmapSize = new long[1]; + int numDynamic = 0; + int numPinned = 0; + int numManifest = 0; + int numBitmaps = 0; + long totalBitmapSize = 0; - forEachShortcut(si -> { - if (si.isDynamic()) numDynamic[0]++; - if (si.isDeclaredInManifest()) numManifest[0]++; - if (si.isPinned()) numPinned[0]++; + final ArrayMap<String, ShortcutInfo> shortcuts = mShortcuts; + final int size = shortcuts.size(); + for (int i = 0; i < size; i++) { + final ShortcutInfo si = shortcuts.valueAt(i); + + if (si.isDynamic()) numDynamic++; + if (si.isDeclaredInManifest()) numManifest++; + if (si.isPinned()) numPinned++; if (si.getBitmapPath() != null) { - numBitmaps[0]++; - totalBitmapSize[0] += new File(si.getBitmapPath()).length(); + numBitmaps++; + totalBitmapSize += new File(si.getBitmapPath()).length(); } - }); + } - result.put(KEY_DYNAMIC, numDynamic[0]); - result.put(KEY_MANIFEST, numManifest[0]); - result.put(KEY_PINNED, numPinned[0]); - result.put(KEY_BITMAPS, numBitmaps[0]); - result.put(KEY_BITMAP_BYTES, totalBitmapSize[0]); + result.put(KEY_DYNAMIC, numDynamic); + result.put(KEY_MANIFEST, numManifest); + result.put(KEY_PINNED, numPinned); + result.put(KEY_BITMAPS, numBitmaps); + result.put(KEY_BITMAP_BYTES, totalBitmapSize); // TODO Log update frequency too. @@ -1616,15 +1652,9 @@ class ShortcutPackage extends ShortcutPackageItem { ShortcutService.writeAttr(out, ATTR_LAST_RESET, mLastResetTime); getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup); - if (forBackup) { - // Shortcuts are persisted in AppSearch, xml is only needed for backup. - forEachShortcut(si -> { - try { - saveShortcut(out, si, forBackup, getPackageInfo().isBackupAllowed()); - } catch (IOException | XmlPullParserException e) { - throw new RuntimeException(e); - } - }); + for (int j = 0; j < size; j++) { + saveShortcut(out, mShortcuts.valueAt(j), forBackup, + getPackageInfo().isBackupAllowed()); } if (!forBackup) { @@ -1741,14 +1771,12 @@ class ShortcutPackage extends ShortcutPackageItem { } final Intent[] intentsNoExtras = si.getIntentsNoExtras(); final PersistableBundle[] intentsExtras = si.getIntentPersistableExtrases(); - if (intentsNoExtras != null && intentsExtras != null) { - final int numIntents = intentsNoExtras.length; - for (int i = 0; i < numIntents; i++) { - out.startTag(null, TAG_INTENT); - ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]); - ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]); - out.endTag(null, TAG_INTENT); - } + final int numIntents = intentsNoExtras.length; + for (int i = 0; i < numIntents; i++) { + out.startTag(null, TAG_INTENT); + ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]); + ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]); + out.endTag(null, TAG_INTENT); } ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras()); @@ -1836,7 +1864,7 @@ class ShortcutPackage extends ShortcutPackageItem { final ShortcutInfo si = parseShortcut(parser, packageName, shortcutUser.getUserId(), fromBackup); // Don't use addShortcut(), we don't need to save the icon. - ret.mShortcuts.add(si); + ret.mShortcuts.put(si.getId(), si); continue; case TAG_SHARE_TARGET: ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); @@ -2032,9 +2060,7 @@ class ShortcutPackage extends ShortcutPackageItem { @VisibleForTesting List<ShortcutInfo> getAllShortcutsForTest() { - final List<ShortcutInfo> ret = new ArrayList<>(1); - forEachShortcut(ret::add); - return ret; + return new ArrayList<>(mShortcuts.values()); } @VisibleForTesting @@ -2046,7 +2072,7 @@ class ShortcutPackage extends ShortcutPackageItem { public void verifyStates() { super.verifyStates(); - final boolean[] failed = new boolean[1]; + boolean failed = false; final ShortcutService s = mShortcutUser.mService; @@ -2057,7 +2083,7 @@ class ShortcutPackage extends ShortcutPackageItem { for (int outer = all.size() - 1; outer >= 0; outer--) { final ArrayList<ShortcutInfo> list = all.valueAt(outer); if (list.size() > mShortcutUser.mService.getMaxActivityShortcuts()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": activity " + all.keyAt(outer) + " has " + all.valueAt(outer).size() + " shortcuts."); } @@ -2077,60 +2103,61 @@ class ShortcutPackage extends ShortcutPackageItem { } // Verify each shortcut's status. - forEachShortcut(si -> { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); if (!(si.isDeclaredInManifest() || si.isDynamic() || si.isPinned() || si.isCached())) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " is not manifest, dynamic or pinned."); } if (si.isDeclaredInManifest() && si.isDynamic()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " is both dynamic and manifest at the same time."); } if (si.getActivity() == null && !si.isFloating()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has null activity, but not floating."); } if ((si.isDynamic() || si.isManifestShortcut()) && !si.isEnabled()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " is not floating, but is disabled."); } if (si.isFloating() && si.getRank() != 0) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " is floating, but has rank=" + si.getRank()); } if (si.getIcon() != null) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " still has an icon"); } if (si.hasAdaptiveBitmap() && !(si.hasIconFile() || si.hasIconUri())) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has adaptive bitmap but was not saved to a file nor has icon uri."); } if (si.hasIconFile() && si.hasIconResource()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has both resource and bitmap icons"); } if (si.hasIconFile() && si.hasIconUri()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has both url and bitmap icons"); } if (si.hasIconUri() && si.hasIconResource()) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has both url and resource icons"); } if (si.isEnabled() != (si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_NOT_DISABLED)) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " isEnabled() and getDisabledReason() disagree: " + si.isEnabled() + " vs " + si.getDisabledReason()); @@ -2138,18 +2165,18 @@ class ShortcutPackage extends ShortcutPackageItem { if ((si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_VERSION_LOWER) && (getPackageInfo().getBackupSourceVersionCode() == ShortcutInfo.VERSION_CODE_UNKNOWN)) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " RESTORED_VERSION_LOWER with no backup source version code."); } if (s.isDummyMainActivity(si.getActivity())) { - failed[0] = true; + failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has a dummy target activity"); } - }); + } - if (failed[0]) { + if (failed) { throw new IllegalStateException("See logcat for errors"); } } @@ -2160,7 +2187,6 @@ class ShortcutPackage extends ShortcutPackageItem { } else { mPackageIdentifiers.remove(packageName); } - resetAppSearch(session -> AndroidFuture.completedFuture(true)); } void mutateShortcut(@NonNull final String id, @Nullable final ShortcutInfo shortcut, @@ -2170,302 +2196,23 @@ class ShortcutPackage extends ShortcutPackageItem { synchronized (mLock) { if (shortcut != null) { transform.accept(shortcut); + } else { + transform.accept(findShortcutById(id)); } - final ShortcutInfo si = getShortcutById(id); - if (si == null) { - return; - } - transform.accept(si); - saveShortcut(si); + // TODO: Load ShortcutInfo from AppSearch, apply transformation logic and save } } - private void saveShortcut(@NonNull final ShortcutInfo... shortcuts) { - Objects.requireNonNull(shortcuts); - saveShortcut(Arrays.asList(shortcuts)); - } - - private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { - Objects.requireNonNull(shortcuts); - if (shortcuts.isEmpty()) { - // No need to invoke AppSearch when there's nothing to save. - return; - } - ConcurrentUtils.waitForFutureNoInterrupt( - runInAppSearch(session -> { - final AndroidFuture<Boolean> future = new AndroidFuture<>(); - session.put(new PutDocumentsRequest.Builder() - .addGenericDocuments( - AppSearchShortcutInfo.toGenericDocuments(shortcuts)) - .build(), - mShortcutUser.mExecutor, - result -> { - if (!result.isSuccess()) { - for (AppSearchResult<Void> k : result.getFailures().values()) { - Slog.e(TAG, k.getErrorMessage()); - } - future.completeExceptionally(new RuntimeException( - "failed to save shortcuts")); - return; - } - future.complete(true); - }); - return future; - }), - "saving shortcut"); - } - /** * Removes shortcuts from AppSearch. */ void removeShortcuts() { - awaitInAppSearch("removing shortcuts", session -> { - final AndroidFuture<Boolean> future = new AndroidFuture<>(); - session.remove("", - new SearchSpec.Builder() - .addFilterSchemas(AppSearchShortcutInfo.SCHEMA_TYPE) - .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY) - .build(), - mShortcutUser.mExecutor, result -> { - if (!result.isSuccess()) { - future.completeExceptionally(new RuntimeException( - "Failed to cleanup shortcuts " + result.getErrorMessage())); - return; - } - future.complete(true); - }); - return future; - }); - } - - private void removeShortcut(@NonNull final String id) { - Objects.requireNonNull(id); - awaitInAppSearch("removing shortcut with id=" + id, session -> { - final AndroidFuture<Boolean> future = new AndroidFuture<>(); - session.remove(new RemoveByUriRequest.Builder(getPackageName()).addUris(id).build(), - mShortcutUser.mExecutor, result -> { - if (!result.isSuccess()) { - final Map<String, AppSearchResult<Void>> failures = - result.getFailures(); - for (String key : failures.keySet()) { - Slog.e(TAG, "Failed deleting " + key + ", error message:" - + failures.get(key).getErrorMessage()); - } - future.completeExceptionally(new RuntimeException( - "Failed to delete shortcut: " + id)); - return; - } - future.complete(true); - }); - return future; - }); - } - - private ShortcutInfo getShortcutById(String id) { - return awaitInAppSearch("getting shortcut with id=" + id, session -> { - final AndroidFuture<ShortcutInfo> future = new AndroidFuture<>(); - session.getByUri( - new GetByUriRequest.Builder(getPackageName()).addUris(id).build(), - mShortcutUser.mExecutor, - results -> { - if (results.isSuccess()) { - Map<String, GenericDocument> documents = results.getSuccesses(); - for (GenericDocument doc : documents.values()) { - final ShortcutInfo info = new AppSearchShortcutInfo(doc) - .toShortcutInfo(mShortcutUser.getUserId()); - future.complete(info); - return; - } - } - future.complete(null); - }); - return future; - }); - } - - private void forEachShortcut( - @NonNull final Consumer<ShortcutInfo> cb) { - forEachShortcutStopWhen(si -> { - cb.accept(si); - return false; - }); - } - - private void forEachShortcutMutate(@NonNull final Consumer<ShortcutInfo> cb) { - forEachShortcutMutateIf(si -> { - cb.accept(si); - return true; - }); - } - - private void forEachShortcutMutateIf(@NonNull final Function<ShortcutInfo, Boolean> cb) { - final SearchResults res = awaitInAppSearch("mutating shortcuts", session -> - AndroidFuture.completedFuture(session.search("", new SearchSpec.Builder() - .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY).build()))); - if (res == null) return; - List<ShortcutInfo> shortcuts = getNextPage(res); - while (!shortcuts.isEmpty()) { - final List<ShortcutInfo> changed = new ArrayList<>(1); - for (ShortcutInfo si : shortcuts) { - if (cb.apply(si)) changed.add(si); - } - saveShortcut(changed); - shortcuts = getNextPage(res); - } - } - - private void forEachShortcutStopWhen( - @NonNull final Function<ShortcutInfo, Boolean> cb) { - forEachShortcutStopWhen("", cb); - } - - private void forEachShortcutStopWhen( - @NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) { - final SearchResults res = awaitInAppSearch("iterating shortcuts", session -> - AndroidFuture.completedFuture(session.search(query, new SearchSpec.Builder() - .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY).build()))); - if (res == null) return; - List<ShortcutInfo> shortcuts = getNextPage(res); - while (!shortcuts.isEmpty()) { - for (ShortcutInfo si : shortcuts) { - if (cb.apply(si)) return; - } - shortcuts = getNextPage(res); - } - } - - private List<ShortcutInfo> getNextPage(@NonNull final SearchResults res) { - final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>(); - final List<ShortcutInfo> ret = new ArrayList<>(); - final long callingIdentity = Binder.clearCallingIdentity(); - try { - res.getNextPage(mShortcutUser.mExecutor, nextPage -> { - if (!nextPage.isSuccess()) { - future.complete(ret); - return; - } - final List<SearchResult> results = nextPage.getResultValue(); - if (results.isEmpty()) { - future.complete(ret); - return; - } - final List<ShortcutInfo> page = new ArrayList<>(results.size()); - for (SearchResult result : results) { - final ShortcutInfo si = new AppSearchShortcutInfo(result.getGenericDocument()) - .toShortcutInfo(mShortcutUser.getUserId()); - page.add(si); - } - ret.addAll(page); - future.complete(ret); - }); - return ConcurrentUtils.waitForFutureNoInterrupt(future, - "getting next batch of shortcuts"); - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - } - - @Nullable - private <T> T awaitInAppSearch( - @NonNull final String description, - @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) { - return ConcurrentUtils.waitForFutureNoInterrupt(runInAppSearch(cb), description); - } - - @Nullable - private <T> CompletableFuture<T> runInAppSearch( - @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) { - synchronized (mLock) { - final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy(); - try { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectAll() - .penaltyLog() // TODO: change this to penaltyDeath to fix the call-site - .build()); - if (mAppSearchSession != null) { - final long callingIdentity = Binder.clearCallingIdentity(); - try { - return AndroidFuture.supply(() -> mAppSearchSession).thenCompose(cb); - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - } else { - return resetAppSearch(cb); - } - } finally { - StrictMode.setThreadPolicy(oldPolicy); - } - } - } - - private <T> CompletableFuture<T> resetAppSearch( - @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) { - final long callingIdentity = Binder.clearCallingIdentity(); - final AppSearchManager.SearchContext searchContext = - new AppSearchManager.SearchContext.Builder(getPackageName()).build(); - final AppSearchSession session; - try { - session = ConcurrentUtils.waitForFutureNoInterrupt( - mShortcutUser.getAppSearch(searchContext), "resetting app search"); - ConcurrentUtils.waitForFutureNoInterrupt(setupSchema(session), "setting up schema"); - mAppSearchSession = session; - return cb.apply(mAppSearchSession); - } catch (Exception e) { - Slog.e(TAG, "Failed to initiate app search for shortcut package " - + getPackageName() + " user " + mShortcutUser.getUserId(), e); - return AndroidFuture.completedFuture(null); - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - } - - void closeAppSearchSession() { - synchronized (mLock) { - if (mAppSearchSession != null) { - final long callingIdentity = Binder.clearCallingIdentity(); - try { - mAppSearchSession.close(); - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - } - mAppSearchSession = null; - } - } - - @NonNull - private AndroidFuture<AppSearchSession> setupSchema( - @NonNull final AppSearchSession session) { - SetSchemaRequest.Builder schemaBuilder = new SetSchemaRequest.Builder() - .addSchemas(AppSearchPerson.SCHEMA, AppSearchShortcutInfo.SCHEMA); - for (PackageIdentifier pi : mPackageIdentifiers.values()) { - schemaBuilder = schemaBuilder - .setSchemaTypeVisibilityForPackage( - AppSearchPerson.SCHEMA_TYPE, true, pi) - .setSchemaTypeVisibilityForPackage( - AppSearchShortcutInfo.SCHEMA_TYPE, true, pi); - } - final AndroidFuture<AppSearchSession> future = new AndroidFuture<>(); - session.setSchema( - schemaBuilder.build(), mShortcutUser.mExecutor, mShortcutUser.mExecutor, result -> { - if (!result.isSuccess()) { - future.completeExceptionally( - new IllegalArgumentException(result.getErrorMessage())); - return; - } - future.complete(session); - }); - return future; } /** * Merge/replace shortcuts parsed from xml file. */ void restoreParsedShortcuts(final boolean replace) { - if (replace) { - removeShortcuts(); - } - saveShortcut(mShortcuts); } private boolean verifyRanksSequential(List<ShortcutInfo> list) { diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 4cfa353b36f8..8e999de80707 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -1051,8 +1051,6 @@ public class ShortcutService extends IShortcutService.Stub { } final ShortcutUser user = getUserShortcutsLocked(userId); - // Close AppSearchSession to flush pending changes. - user.forAllPackages(ShortcutPackage::closeAppSearchSession); user.logSharingShortcutStats(mMetricsLogger); } @@ -5083,17 +5081,6 @@ public class ShortcutService extends IShortcutService.Stub { } @VisibleForTesting - void updatePackageShortcutForTest(String packageName, String shortcutId, int userId, - Consumer<ShortcutInfo> cb) { - synchronized (mLock) { - final ShortcutPackage pkg = getPackageShortcutForTest(packageName, userId); - if (pkg == null) return; - - pkg.mutateShortcut(shortcutId, null, cb); - } - } - - @VisibleForTesting ShortcutLauncher getLauncherShortcutForTest(String packageName, int userId) { synchronized (mLock) { final ShortcutUser user = mUsers.get(userId); diff --git a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java index 069c5c3fc714..ab9de77005b3 100644 --- a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java +++ b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java @@ -118,7 +118,7 @@ public class UnderlyingNetworkTracker { if (!mIsQuitting) { mRouteSelectionCallback = new RouteSelectionCallback(); mConnectivityManager.requestBackgroundNetwork( - getBaseNetworkRequestBuilder().build(), mHandler, mRouteSelectionCallback); + getRouteSelectionRequest(), mHandler, mRouteSelectionCallback); mWifiBringupCallback = new NetworkBringupCallback(); mConnectivityManager.requestBackgroundNetwork( @@ -149,12 +149,48 @@ public class UnderlyingNetworkTracker { } } + /** + * Builds the Route selection request + * + * <p>This request is guaranteed to select carrier-owned, non-VCN underlying networks by virtue + * of a populated set of subIds as expressed in NetworkCapabilities#getSubIds(). Only carrier + * owned networks may be selected, as the request specifies only subIds in the VCN's + * subscription group, while the VCN networks are excluded by virtue of not having subIds set on + * the VCN-exposed networks. + */ + private NetworkRequest getRouteSelectionRequest() { + return getBaseNetworkRequestBuilder() + .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup)) + .build(); + } + + /** + * Builds the WiFi bringup request + * + * <p>This request is built specifically to match only carrier-owned WiFi networks, but is also + * built to ONLY keep Carrier WiFi Networks alive (but never bring them up). This is a result of + * the WifiNetworkFactory not advertising a list of subIds, and therefore not accepting this + * request. As such, it will bind to a Carrier WiFi Network that has already been brought up, + * but will NEVER bring up a Carrier WiFi network itself. + */ private NetworkRequest getWifiNetworkRequest() { return getBaseNetworkRequestBuilder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup)) .build(); } + /** + * Builds a Cellular bringup request for a given subId + * + * <p>This request is filed in order to ensure that the Telephony stack always has a + * NetworkRequest to bring up a VCN underlying cellular network. It is required in order to + * ensure that even when a VCN (appears as Cellular) satisfies the default request, Telephony + * will bring up additional underlying Cellular networks. + * + * <p>Since this request MUST make it to the TelephonyNetworkFactory, subIds are not specified + * in the NetworkCapabilities, but rather in the TelephonyNetworkSpecifier. + */ private NetworkRequest getCellNetworkRequestForSubId(int subId) { return getBaseNetworkRequestBuilder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) @@ -164,20 +200,13 @@ public class UnderlyingNetworkTracker { /** * Builds and returns a NetworkRequest builder common to all Underlying Network requests - * - * <p>This request is guaranteed to select carrier-owned, non-VCN underlying networks by virtue - * of a populated set of subIds as expressed in NetworkCapabilities#getSubIds(). Only carrier - * owned networks may be selected, as the request specifies only subIds in the VCN's - * subscription group, while the VCN networks are excluded by virtue of not having subIds set on - * the VCN-exposed networks. */ private NetworkRequest.Builder getBaseNetworkRequestBuilder() { return new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) - .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup)); + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); } /** diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java index c0130da7ddbc..54689358802f 100644 --- a/services/core/java/com/android/server/vcn/Vcn.java +++ b/services/core/java/com/android/server/vcn/Vcn.java @@ -17,6 +17,9 @@ package com.android.server.vcn; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE; import static com.android.server.VcnManagementService.VDBG; @@ -44,7 +47,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; /** * Represents an single instance of a VCN. @@ -137,17 +139,14 @@ public class Vcn extends Handler { @NonNull private TelephonySubscriptionSnapshot mLastSnapshot; /** - * Whether this Vcn instance is active and running. + * The current status of this Vcn instance * - * <p>The value will be {@code true} while running. It will be {@code false} if the VCN has been - * shut down or has entered safe mode. - * - * <p>This AtomicBoolean is required in order to ensure consistency and correctness across - * multiple threads. Unlike the rest of the Vcn, this is queried synchronously on Binder threads - * from VcnManagementService, and therefore cannot rely on guarantees of running on the VCN - * Looper. + * <p>The value will be {@link VCN_STATUS_CODE_ACTIVE} while all VcnGatewayConnections are in + * good standing, {@link VCN_STATUS_CODE_SAFE_MODE} if any VcnGatewayConnections are in safe + * mode, and {@link VCN_STATUS_CODE_INACTIVE} once a teardown has been commanded. */ - private final AtomicBoolean mIsActive = new AtomicBoolean(true); + // Accessed from different threads, but always under lock in VcnManagementService + private volatile int mCurrentStatus = VCN_STATUS_CODE_ACTIVE; public Vcn( @NonNull VcnContext vcnContext, @@ -199,9 +198,15 @@ public class Vcn extends Handler { sendMessageAtFrontOfQueue(obtainMessage(MSG_CMD_TEARDOWN)); } - /** Synchronously checks whether this Vcn is active. */ - public boolean isActive() { - return mIsActive.get(); + /** Synchronously retrieves the current status code. */ + public int getStatus() { + return mCurrentStatus; + } + + /** Sets the status of this VCN */ + @VisibleForTesting(visibility = Visibility.PRIVATE) + public void setStatus(int status) { + mCurrentStatus = status; } /** Get current Gateways for testing purposes */ @@ -217,12 +222,6 @@ public class Vcn extends Handler { return Collections.unmodifiableMap(new HashMap<>(mVcnGatewayConnections)); } - /** Set whether this Vcn is active for testing purposes */ - @VisibleForTesting(visibility = Visibility.PRIVATE) - public void setIsActive(boolean isActive) { - mIsActive.set(isActive); - } - private class VcnNetworkRequestListener implements VcnNetworkProvider.NetworkRequestListener { @Override public void onNetworkRequested(@NonNull NetworkRequest request, int score, int providerId) { @@ -264,7 +263,8 @@ public class Vcn extends Handler { mConfig = config; - if (mIsActive.getAndSet(true)) { + // TODO(b/183174340): Remove this once opportunistic safe mode is supported. + if (mCurrentStatus == VCN_STATUS_CODE_ACTIVE) { // VCN is already active - teardown any GatewayConnections whose configs have been // removed and get all current requests for (final Entry<VcnGatewayConnectionConfig, VcnGatewayConnection> entry : @@ -288,11 +288,15 @@ public class Vcn extends Handler { // Trigger a re-evaluation of all NetworkRequests (to make sure any that can be // satisfied start a new GatewayConnection) mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener); - } else { + } else if (mCurrentStatus == VCN_STATUS_CODE_SAFE_MODE) { // If this VCN was not previously active, it is exiting Safe Mode. Re-register the // request listener to get NetworkRequests again (and all cached requests). mVcnContext.getVcnNetworkProvider().registerListener(mRequestListener); + } else { + // Ignored; VCN was not active; config updates ignored. + return; } + mCurrentStatus = VCN_STATUS_CODE_ACTIVE; } private void handleTeardown() { @@ -302,18 +306,20 @@ public class Vcn extends Handler { gatewayConnection.teardownAsynchronously(); } - mIsActive.set(false); + mCurrentStatus = VCN_STATUS_CODE_INACTIVE; } private void handleEnterSafeMode() { + // TODO(b/183174340): Remove this once opportunistic-safe-mode is supported handleTeardown(); + mCurrentStatus = VCN_STATUS_CODE_SAFE_MODE; mVcnCallback.onEnteredSafeMode(); } private void handleNetworkRequested( @NonNull NetworkRequest request, int score, int providerId) { - if (!isActive()) { + if (mCurrentStatus != VCN_STATUS_CODE_ACTIVE) { Slog.v(getLogTag(), "Received NetworkRequest while inactive. Ignore for now"); return; } @@ -370,8 +376,8 @@ public class Vcn extends Handler { mVcnGatewayConnections.remove(config); // Trigger a re-evaluation of all NetworkRequests (to make sure any that can be satisfied - // start a new GatewayConnection), but only if the Vcn is still active - if (isActive()) { + // start a new GatewayConnection), but only if the Vcn is still alive + if (mCurrentStatus == VCN_STATUS_CODE_ACTIVE) { mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener); } } @@ -379,7 +385,7 @@ public class Vcn extends Handler { private void handleSubscriptionsChanged(@NonNull TelephonySubscriptionSnapshot snapshot) { mLastSnapshot = snapshot; - if (isActive()) { + if (mCurrentStatus == VCN_STATUS_CODE_ACTIVE) { for (VcnGatewayConnection gatewayConnection : mVcnGatewayConnections.values()) { gatewayConnection.updateSubscriptionSnapshot(mLastSnapshot); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 9dc68f28ab8e..89b7bbd45072 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1300,8 +1300,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (callbacks == null) return; callbacks.broadcast(c -> { try { - int targetDisplayId = + Integer targetDisplayId = callbackDisplayIds.get(c.asBinder()); + if (targetDisplayId == null) return; if (targetDisplayId == displayId) c.onColorsChanged(area, colors); } catch (RemoteException e) { e.printStackTrace(); diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 0a02a86e71a6..9f25daf0732f 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -104,7 +104,6 @@ cc_defaults { "libhardware", "libhardware_legacy", "libhidlbase", - "libkeystore_binder", "libmeminfo", "libmtp", "libnativehelper", diff --git a/services/core/jni/gnss/GnssMeasurementCallback.cpp b/services/core/jni/gnss/GnssMeasurementCallback.cpp index 945694649f92..646aabd79e55 100644 --- a/services/core/jni/gnss/GnssMeasurementCallback.cpp +++ b/services/core/jni/gnss/GnssMeasurementCallback.cpp @@ -302,6 +302,10 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env, SET(Cn0DbHz, measurement.antennaCN0DbHz); SET(ConstellationType, static_cast<int32_t>(measurement.signalType.constellation)); + // Half cycle state is reported in the AIDL version of GnssMeasurement + SET(AccumulatedDeltaRangeState, + (static_cast<int32_t>(measurement.accumulatedDeltaRangeState) | + ADR_STATE_HALF_CYCLE_REPORTED)); if (measurement.flags & static_cast<uint32_t>(GnssMeasurement::HAS_CARRIER_FREQUENCY)) { SET(CarrierFrequencyHz, static_cast<float>(measurement.signalType.carrierFrequencyHz)); @@ -481,7 +485,7 @@ void GnssMeasurementCallbackHidl::translateSingleGnssMeasurement< JavaObject& object) { translateSingleGnssMeasurement(measurement_V1_1.v1_0, object); - // Set the V1_1 flag, and mark that new field has valid information for Java Layer + // Half cycle state is reported in HIDL v1.1 or newer. SET(AccumulatedDeltaRangeState, (static_cast<int32_t>(measurement_V1_1.accumulatedDeltaRangeState) | ADR_STATE_HALF_CYCLE_REPORTED)); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java index 94cc666d740c..35c37efa16b4 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.hardware.biometrics.common.CommonProps; import android.hardware.biometrics.fingerprint.IFingerprint; +import android.hardware.biometrics.fingerprint.SensorLocation; import android.hardware.biometrics.fingerprint.SensorProps; import android.os.UserManager; import android.platform.test.annotations.Presubmit; @@ -33,7 +34,6 @@ import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; -import com.android.server.biometrics.sensors.BaseClientMonitor; import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.HalClientMonitor; import com.android.server.biometrics.sensors.LockoutResetDispatcher; @@ -77,9 +77,11 @@ public class FingerprintProviderTest { final SensorProps sensor1 = new SensorProps(); sensor1.commonProps = new CommonProps(); sensor1.commonProps.sensorId = 0; + sensor1.sensorLocations = new SensorLocation[] {new SensorLocation()}; final SensorProps sensor2 = new SensorProps(); sensor2.commonProps = new CommonProps(); sensor2.commonProps.sensorId = 1; + sensor2.sensorLocations = new SensorLocation[] {new SensorLocation()}; mSensorProps = new SensorProps[] {sensor1, sensor2}; diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 88b06511cc74..589b3b403e6c 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -2041,11 +2041,6 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { return mService.getPackageShortcutForTest(packageName, shortcutId, userId); } - protected void updatePackageShortcut(String packageName, String shortcutId, int userId, - Consumer<ShortcutInfo> cb) { - mService.updatePackageShortcutForTest(packageName, shortcutId, userId, cb); - } - protected void assertShortcutExists(String packageName, String shortcutId, int userId) { assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null); } @@ -2241,10 +2236,6 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId()); } - protected void updateCallerShortcut(String shortcutId, Consumer<ShortcutInfo> cb) { - updatePackageShortcut(getCallingPackage(), shortcutId, getCallingUserId(), cb); - } - protected List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) { final List<ShortcutInfo>[] ret = new List[1]; runWithCaller(launcher, userId, () -> { @@ -2404,8 +2395,6 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { deleteAllSavedFiles(); - mMockAppSearchManager.removeShortcuts(); - initService(); mService.applyRestore(payload, USER_0); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 3f680e6c8d22..4d0beef99cca 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -1385,7 +1385,6 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.waitForBitmapSavesForTest(); assertWith(getCallerShortcuts()) .forShortcutWithId("s1", si -> { - Log.d("ShortcutManagerTest1", si.toString()); assertTrue(si.hasIconFile()); }); @@ -1703,8 +1702,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // Because setDynamicShortcuts will update the timestamps when ranks are changing, // we explicitly set timestamps here. - updateCallerShortcut("s1", si -> si.setTimestamp(5000)); - updateCallerShortcut("s2", si -> si.setTimestamp(1000)); + getCallerShortcut("s1").setTimestamp(5000); + getCallerShortcut("s2").setTimestamp(1000); setCaller(CALLING_PACKAGE_2); final ShortcutInfo s2_2 = makeShortcut("s2"); @@ -1714,9 +1713,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { makeComponent(ShortcutActivity.class)); assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4))); - updateCallerShortcut("s2", si -> si.setTimestamp(1500)); - updateCallerShortcut("s3", si -> si.setTimestamp(3000)); - updateCallerShortcut("s4", si -> si.setTimestamp(500)); + getCallerShortcut("s2").setTimestamp(1500); + getCallerShortcut("s3").setTimestamp(3000); + getCallerShortcut("s4").setTimestamp(500); setCaller(CALLING_PACKAGE_3); final ShortcutInfo s3_2 = makeShortcutWithLocusId("s3", makeLocusId("l2")); @@ -1724,7 +1723,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(mManager.setDynamicShortcuts(list(s3_2))); - updateCallerShortcut("s3", si -> si.setTimestamp(START_TIME + 5000)); + getCallerShortcut("s3").setTimestamp(START_TIME + 5000); setCaller(LAUNCHER_1); @@ -7687,7 +7686,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals("http://www/", si.getIntent().getData().toString()); assertEquals("foo/bar", si.getIntent().getType()); assertEquals( - new ComponentName("abc", "abc.xyz"), si.getIntent().getComponent()); + new ComponentName("abc", ".xyz"), si.getIntent().getComponent()); assertEquals(set("cat1", "cat2"), si.getIntent().getCategories()); assertEquals("value1", si.getIntent().getStringExtra("key1")); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java index 402fd22416fc..004e45a8be4b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java @@ -66,8 +66,14 @@ public class DisplayPolicyInsetsTests extends DisplayPolicyTestsBase { public void landscape() { final DisplayInfo di = displayInfoForRotation(ROTATION_90, false /* withCutout */); - verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - verifyNonDecorInsets(di, 0, 0, NAV_BAR_HEIGHT, 0); + if (mDisplayPolicy.navigationBarCanMove()) { + verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + verifyNonDecorInsets(di, 0, 0, NAV_BAR_HEIGHT, 0); + } else { + // if the navigation bar cannot move then it is always on the bottom + verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT); + verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT); + } verifyConsistency(di); } @@ -75,8 +81,14 @@ public class DisplayPolicyInsetsTests extends DisplayPolicyTestsBase { public void landscape_withCutout() { final DisplayInfo di = displayInfoForRotation(ROTATION_90, true /* withCutout */); - verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); - verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT, 0); + if (mDisplayPolicy.navigationBarCanMove()) { + verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); + verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT, 0); + } else { + // if the navigation bar cannot move then it is always on the bottom + verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT); + verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, 0, NAV_BAR_HEIGHT); + } verifyConsistency(di); } @@ -84,8 +96,14 @@ public class DisplayPolicyInsetsTests extends DisplayPolicyTestsBase { public void seascape() { final DisplayInfo di = displayInfoForRotation(ROTATION_270, false /* withCutout */); - verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0); - verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, 0, 0); + if (mDisplayPolicy.navigationBarCanMove()) { + verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0); + verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, 0, 0); + } else { + // if the navigation bar cannot move then it is always on the bottom + verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT); + verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT); + } verifyConsistency(di); } @@ -93,8 +111,14 @@ public class DisplayPolicyInsetsTests extends DisplayPolicyTestsBase { public void seascape_withCutout() { final DisplayInfo di = displayInfoForRotation(ROTATION_270, true /* withCutout */); - verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0); - verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, DISPLAY_CUTOUT_HEIGHT, 0); + if (mDisplayPolicy.navigationBarCanMove()) { + verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0); + verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, DISPLAY_CUTOUT_HEIGHT, 0); + } else { + // if the navigation bar cannot move then it is always on the bottom + verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, NAV_BAR_HEIGHT); + verifyNonDecorInsets(di, 0, 0, DISPLAY_CUTOUT_HEIGHT, NAV_BAR_HEIGHT); + } verifyConsistency(di); } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 1cc9c6fc5bc5..234cc4d133f1 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -5467,7 +5467,7 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY, new String[0]); sDefaults.putStringArray(KEY_APN_PRIORITY_STRING_ARRAY, new String[] { - "default:0", "enterprise:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2", + "enterprise:0", "default:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2", "ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3" }); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]); diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 6441565d731b..4004e37dc4e0 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -151,13 +151,14 @@ public class SubscriptionInfo implements Parcelable { /** * The access rules for this subscription, if it is embedded and defines any. + * This does not include access rules for non-embedded subscriptions. */ @Nullable private UiccAccessRule[] mNativeAccessRules; /** * The carrier certificates for this subscription that are saved in carrier configs. - * The other carrier certificates are embedded on Uicc and stored as part of mNativeAccessRules. + * This does not include access rules from the Uicc, whether embedded or non-embedded. */ @Nullable private UiccAccessRule[] mCarrierConfigAccessRules; @@ -664,7 +665,6 @@ public class SubscriptionInfo implements Parcelable { * is authorized to manage this subscription. * TODO and fix it properly in R / master: either deprecate this and have 3 APIs * native + carrier + all, or have this return all by default. - * @throws UnsupportedOperationException if this subscription is not embedded. * @hide */ @SystemApi diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 67fe783ee7a4..7b760ae52911 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2867,6 +2867,10 @@ public class SubscriptionManager { * Checks whether the app with the given context is authorized to manage the given subscription * according to its metadata. * + * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns + * true). To check for permissions for non-embedded subscription as well, + * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}. + * * @param info The subscription to check. * @return whether the app is authorized to manage this subscription per its metadata. */ @@ -2879,6 +2883,10 @@ public class SubscriptionManager { * be authorized if it is included in the {@link android.telephony.UiccAccessRule} of the * {@link android.telephony.SubscriptionInfo} with the access status. * + * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns + * true). To check for permissions for non-embedded subscription as well, + * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}. + * * @param info The subscription to check. * @param packageName Package name of the app to check. * @return whether the app is authorized to manage this subscription per its access rules. diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 5b68be5e17b7..75c80313cd12 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8968,6 +8968,9 @@ public class TelephonyManager { * call will return true. This access is granted by the owner of the UICC * card and does not depend on the registered carrier. * + * Note that this API applies to both physical and embedded subscriptions and + * is a superset of the checks done in SubscriptionManager#canManageSubscription. + * * @return true if the app has carrier privileges. */ public boolean hasCarrierPrivileges() { @@ -8981,6 +8984,9 @@ public class TelephonyManager { * call will return true. This access is granted by the owner of the UICC * card and does not depend on the registered carrier. * + * Note that this API applies to both physical and embedded subscriptions and + * is a superset of the checks done in SubscriptionManager#canManageSubscription. + * * @param subId The subscription to use. * @return true if the app has carrier privileges. * @hide diff --git a/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt b/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt index 5c2644844e14..b41ee3a9ef2c 100644 --- a/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt +++ b/tests/SilkFX/src/com/android/test/silkfx/common/ColorModeControls.kt @@ -19,7 +19,11 @@ package com.android.test.silkfx.common import android.content.Context import android.content.pm.ActivityInfo import android.hardware.display.DisplayManager +import android.os.IBinder import android.util.AttributeSet +import android.util.Log +import android.view.SurfaceControl +import android.view.SurfaceControlHdrLayerInfoListener import android.view.Window import android.widget.Button import android.widget.LinearLayout @@ -35,6 +39,7 @@ class ColorModeControls : LinearLayout, WindowObserver { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { displayManager = context.getSystemService(DisplayManager::class.java)!! displayId = context.getDisplayId() + displayToken = SurfaceControl.getInternalDisplayToken() } private var window: Window? = null @@ -42,6 +47,7 @@ class ColorModeControls : LinearLayout, WindowObserver { private val displayManager: DisplayManager private var targetSdrWhitePointIndex = 0 private var displayId: Int + private var displayToken: IBinder private val whitePoint get() = SDR_WHITE_POINTS[targetSdrWhitePointIndex] @@ -109,6 +115,7 @@ class ColorModeControls : LinearLayout, WindowObserver { // Imperfect, but close enough, synchronization by waiting for frame commit to set the value viewTreeObserver.registerFrameCommitCallback { try { + SurfaceControl.setDisplayBrightness(displayToken, level) displayManager.setTemporaryBrightness(displayId, level) } catch (ex: Exception) { // Ignore a permission denied rejection - it doesn't meaningfully change much @@ -116,9 +123,28 @@ class ColorModeControls : LinearLayout, WindowObserver { } } + private val listener = object : SurfaceControlHdrLayerInfoListener() { + override fun onHdrInfoChanged( + displayToken: IBinder?, + numberOfHdrLayers: Int, + maxW: Int, + maxH: Int, + flags: Int + ) { + Log.d("HDRInfo", "onHdrInfoChanged: numLayer = $numberOfHdrLayers ($maxW x $maxH)" + + ", flags = $flags") + } + } + override fun onAttachedToWindow() { super.onAttachedToWindow() threadedRenderer?.setColorMode(window!!.colorMode, whitePoint) + listener.register(displayToken) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + listener.unregister(displayToken) } }
\ No newline at end of file diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index c88b0c154712..4ad7136aabb2 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -19,6 +19,8 @@ package com.android.server; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE; import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; @@ -695,7 +697,9 @@ public class VcnManagementServiceTest { hasCarrierPrivileges); final Vcn vcn = startAndGetVcnInstance(subGrp); - doReturn(isVcnActive).when(vcn).isActive(); + doReturn(isVcnActive ? VCN_STATUS_CODE_ACTIVE : VCN_STATUS_CODE_SAFE_MODE) + .when(vcn) + .getStatus(); doReturn(true) .when(mLocationPermissionChecker) diff --git a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java index ed2e4d9b9946..b592000e38f9 100644 --- a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java +++ b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java @@ -158,7 +158,7 @@ public class UnderlyingNetworkTrackerTest { for (final int subId : expectedSubIds) { verify(mConnectivityManager) .requestBackgroundNetwork( - eq(getCellRequestForSubId(subId, expectedSubIds)), + eq(getCellRequestForSubId(subId)), any(), any(NetworkBringupCallback.class)); } @@ -189,30 +189,30 @@ public class UnderlyingNetworkTrackerTest { } private NetworkRequest getWifiRequest(Set<Integer> netCapsSubIds) { - return getExpectedRequestBase(netCapsSubIds) + return getExpectedRequestBase() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .setSubIds(netCapsSubIds) .build(); } - private NetworkRequest getCellRequestForSubId(int subId, Set<Integer> netCapsSubIds) { - return getExpectedRequestBase(netCapsSubIds) + private NetworkRequest getCellRequestForSubId(int subId) { + return getExpectedRequestBase() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .setNetworkSpecifier(new TelephonyNetworkSpecifier(subId)) .build(); } private NetworkRequest getRouteSelectionRequest(Set<Integer> netCapsSubIds) { - return getExpectedRequestBase(netCapsSubIds).build(); + return getExpectedRequestBase().setSubIds(netCapsSubIds).build(); } - private NetworkRequest.Builder getExpectedRequestBase(Set<Integer> subIds) { + private NetworkRequest.Builder getExpectedRequestBase() { final NetworkRequest.Builder builder = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) - .setSubIds(subIds); + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); return builder; } diff --git a/tests/vcn/java/com/android/server/vcn/VcnTest.java b/tests/vcn/java/com/android/server/vcn/VcnTest.java index 530d8348bfff..540be38ed798 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnTest.java @@ -19,10 +19,12 @@ package com.android.server.vcn; import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE; +import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; @@ -142,7 +144,7 @@ public class VcnTest { mTestLooper.dispatchAll(); } - private void verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(boolean isActive) { + private void verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(int status) { final NetworkRequestListener requestListener = verifyAndGetRequestListener(); startVcnGatewayWithCapabilities(requestListener, TEST_CAPS[0]); @@ -152,25 +154,25 @@ public class VcnTest { final TelephonySubscriptionSnapshot updatedSnapshot = mock(TelephonySubscriptionSnapshot.class); - mVcn.setIsActive(isActive); + mVcn.setStatus(status); mVcn.updateSubscriptionSnapshot(updatedSnapshot); mTestLooper.dispatchAll(); for (final VcnGatewayConnection gateway : gatewayConnections) { - verify(gateway, isActive ? times(1) : never()) + verify(gateway, status == VCN_STATUS_CODE_ACTIVE ? times(1) : never()) .updateSubscriptionSnapshot(eq(updatedSnapshot)); } } @Test public void testSubscriptionSnapshotUpdatesVcnGatewayConnections() { - verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(true /* isActive */); + verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(VCN_STATUS_CODE_ACTIVE); } @Test - public void testSubscriptionSnapshotUpdatesVcnGatewayConnectionsWhileInactive() { - verifyUpdateSubscriptionSnapshotNotifiesConnectionGateways(false /* isActive */); + public void testSubscriptionSnapshotUpdatesVcnGatewayConnectionsInSafeMode() { + verifyUpdateSubscriptionSnapshotNotifiesGatewayConnections(VCN_STATUS_CODE_SAFE_MODE); } private void triggerVcnRequestListeners(NetworkRequestListener requestListener) { @@ -201,7 +203,7 @@ public class VcnTest { private void verifySafeMode( NetworkRequestListener requestListener, Set<VcnGatewayConnection> expectedGatewaysTornDown) { - assertFalse(mVcn.isActive()); + assertEquals(VCN_STATUS_CODE_SAFE_MODE, mVcn.getStatus()); for (final VcnGatewayConnection gatewayConnection : expectedGatewaysTornDown) { verify(gatewayConnection).teardownAsynchronously(); } @@ -319,7 +321,7 @@ public class VcnTest { // Registered on start, then re-registered with new configs verify(mVcnNetworkProvider, times(2)).registerListener(eq(requestListener)); - assertTrue(mVcn.isActive()); + assertEquals(VCN_STATUS_CODE_ACTIVE, mVcn.getStatus()); for (final int[] caps : TEST_CAPS) { // Expect each gateway connection created only on initial startup verify(mDeps) @@ -334,7 +336,7 @@ public class VcnTest { @Test public void testIgnoreNetworkRequestWhileInactive() { - mVcn.setIsActive(false /* isActive */); + mVcn.setStatus(VCN_STATUS_CODE_INACTIVE); final NetworkRequestListener requestListener = verifyAndGetRequestListener(); triggerVcnRequestListeners(requestListener); |