diff options
324 files changed, 4067 insertions, 1860 deletions
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 50f4ddd5e2e3..2746cba76887 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -856,6 +856,7 @@ public final class MediaParser { private String mParserName; private Extractor mExtractor; private ExtractorInput mExtractorInput; + private boolean mPendingExtractorInit; private long mPendingSeekPosition; private long mPendingSeekTimeMicros; private boolean mLoggedSchemeInitDataCreationException; @@ -972,7 +973,7 @@ public final class MediaParser { if (extractor.sniff(mExtractorInput)) { mParserName = parserName; mExtractor = extractor; - mExtractor.init(new ExtractorOutputAdapter()); + mPendingExtractorInit = true; break; } } catch (EOFException e) { @@ -988,13 +989,17 @@ public final class MediaParser { } } + if (mPendingExtractorInit) { + mExtractor.init(new ExtractorOutputAdapter()); + mPendingExtractorInit = false; + } if (isPendingSeek()) { mExtractor.seek(mPendingSeekPosition, mPendingSeekTimeMicros); removePendingSeek(); } mPositionHolder.position = seekableInputReader.getPosition(); - int result = 0; + int result; try { result = mExtractor.read(mExtractorInput, mPositionHolder); } catch (ParserException e) { diff --git a/apex/sdkextensions/TEST_MAPPING b/apex/sdkextensions/TEST_MAPPING index 4e1883382e2c..3dc1b9fa5dd0 100644 --- a/apex/sdkextensions/TEST_MAPPING +++ b/apex/sdkextensions/TEST_MAPPING @@ -4,7 +4,7 @@ "name": "CtsSdkExtensionsTestCases" }, { - "name": "apiextensions_e2e_tests" + "name": "sdkextensions_e2e_tests" } ] } diff --git a/api/test-current.txt b/api/test-current.txt index 96cefe1afea4..d080d3d946c2 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4976,7 +4976,9 @@ package android.view.accessibility { method public void addAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, @Nullable android.os.Handler); method @NonNull @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int); method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void performAccessibilityShortcut(); + method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void registerSystemAction(@NonNull android.app.RemoteAction, int); method public void removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener); + method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void unregisterSystemAction(int); } public static interface AccessibilityManager.AccessibilityServicesStateChangeListener { diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index b3da32fc943f..bb00e23fc95c 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -668,7 +668,8 @@ message ActivityManagerSleepStateChanged { ASLEEP = 1; AWAKE = 2; } - optional State state = 1 [(state_field_option).exclusive_state = true]; + optional State state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -1185,7 +1186,8 @@ message BatterySaverModeStateChanged { OFF = 0; ON = 1; } - optional State state = 1; + optional State state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -1195,7 +1197,8 @@ message BatterySaverModeStateChanged { * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java */ message DeviceIdleModeStateChanged { - optional android.server.DeviceIdleModeEnum state = 1; + optional android.server.DeviceIdleModeEnum state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } @@ -1206,7 +1209,8 @@ message DeviceIdleModeStateChanged { * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java */ message DeviceIdlingModeStateChanged { - optional android.server.DeviceIdleModeEnum state = 1; + optional android.server.DeviceIdleModeEnum state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -1250,7 +1254,8 @@ message ChargingStateChanged { */ message PluggedStateChanged { // Whether the device is plugged in, from frameworks/base/core/proto/android/os/enums.proto. - optional android.os.BatteryPluggedStateEnum state = 1; + optional android.os.BatteryPluggedStateEnum state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** @@ -2714,8 +2719,9 @@ message UsbConnectorStateChanged { STATE_DISCONNECTED = 0; STATE_CONNECTED = 1; } - optional State state = 1; - optional string id = 2; + optional State state = 1 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; + optional string id = 2 [(state_field_option).primary_field = true]; // Last active session in ms. // 0 when the port is in connected state. optional int64 last_connect_duration_millis = 3; @@ -3598,11 +3604,8 @@ message OverlayStateChanged { ENTERED = 1; EXITED = 2; } - optional State state = 4 [ - (state_field_option).exclusive_state = true, - (state_field_option).nested = false, - (state_field_option).default_state_value = 2 - ]; + optional State state = 4 + [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; } /** diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 39fc18d8b747..f1472dd002fd 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -81,6 +81,15 @@ public abstract class ActivityManagerInternal { String processName, String abiOverride, int uid, Runnable crashHandler); /** + * Called when a user has been deleted. This can happen during normal device usage + * or just at startup, when partially removed users are purged. Any state persisted by the + * ActivityManager should be purged now. + * + * @param userId The user being cleaned up. + */ + public abstract void onUserRemoved(@UserIdInt int userId); + + /** * Kill foreground apps from the specified user. */ public abstract void killForegroundAppsForUser(@UserIdInt int userId); diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java index bae6ab5ea80c..7a18b8120d7e 100644 --- a/core/java/android/app/Presentation.java +++ b/core/java/android/app/Presentation.java @@ -236,7 +236,7 @@ public class Presentation extends Dialog { // to be rare but surprising, so we'll write a log message about it. if (!isConfigurationStillValid()) { Log.i(TAG, "Presentation is being dismissed because the " - + "display metrics have changed since it was created while onStart."); + + "display metrics have changed since it was created."); mHandler.sendEmptyMessage(MSG_CANCEL); } } @@ -296,8 +296,8 @@ public class Presentation extends Dialog { // is invalid and the application must recreate the presentation to get // a new context. if (!isConfigurationStillValid()) { - Log.i(TAG, "Presentation is being dismissed because the display metrics have changed " - + "since it was created while handleDisplayChanged."); + Log.i(TAG, "Presentation is being dismissed because the " + + "display metrics have changed since it was created."); cancel(); } } diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index c2caa40ba950..47ccc2f0badb 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -1111,6 +1111,7 @@ public class ResourcesManager { } int displayId = key.mDisplayId; final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); + tmpConfig.setTo(config); // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the @@ -1120,15 +1121,17 @@ public class ResourcesManager { daj = new DisplayAdjustments(daj); daj.setCompatibilityInfo(compat); } - tmpConfig.setTo(config); - if (hasOverrideConfiguration) { - tmpConfig.updateFrom(key.mOverrideConfiguration); - } - // Only apply for default display if (displayId == Display.DEFAULT_DISPLAY) { - daj.setConfiguration(tmpConfig); + daj.setConfiguration(config); } DisplayMetrics dm = getDisplayMetrics(displayId, daj); + if (displayId != Display.DEFAULT_DISPLAY) { + applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); + } + + if (hasOverrideConfiguration) { + tmpConfig.updateFrom(key.mOverrideConfiguration); + } resourcesImpl.updateConfiguration(tmpConfig, dm, compat); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index def150ab49e5..7d8a4a4633c2 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1885,8 +1885,9 @@ public class Intent implements Parcelable, Cloneable { /** * Activity action: Launch UI to manage auto-revoke state. * <p> - * Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose - * auto-revoke state will be reviewed (mandatory). + * Input: {@link Intent#setData data} should be a {@code package}-scheme {@link Uri} with + * a package name, whose auto-revoke state will be reviewed (mandatory). + * E.g. {@code Uri.fromParts("package", packageName, null) } * </p> * <p> * Output: Nothing. diff --git a/core/java/android/hardware/display/DeviceProductInfo.java b/core/java/android/hardware/display/DeviceProductInfo.java index 94c5dd884eab..f8d36758d1b1 100644 --- a/core/java/android/hardware/display/DeviceProductInfo.java +++ b/core/java/android/hardware/display/DeviceProductInfo.java @@ -139,7 +139,7 @@ public final class DeviceProductInfo implements Parcelable { @Override public int hashCode() { return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate, - mRelativeAddress); + Arrays.hashCode(mRelativeAddress)); } public static final Creator<DeviceProductInfo> CREATOR = diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index 98c4f618be18..d12142c0be79 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -1880,6 +1880,8 @@ public class SoundTrigger { return STATUS_PERMISSION_DENIED; case Status.DEAD_OBJECT: return STATUS_DEAD_OBJECT; + case Status.INTERNAL_ERROR: + return STATUS_ERROR; } return STATUS_ERROR; } diff --git a/core/java/android/inputmethodservice/InlineSuggestionSession.java b/core/java/android/inputmethodservice/InlineSuggestionSession.java index 98ccbfc8aef4..26197883c32f 100644 --- a/core/java/android/inputmethodservice/InlineSuggestionSession.java +++ b/core/java/android/inputmethodservice/InlineSuggestionSession.java @@ -169,6 +169,7 @@ class InlineSuggestionSession { mCallback.onInlineSuggestionsUnsupported(); } else { request.setHostInputToken(mHostInputTokenSupplier.get()); + request.filterContentTypes(); mResponseCallback = new InlineSuggestionsResponseCallbackImpl(this); mCallback.onInlineSuggestionsRequest(request, mResponseCallback); } diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index c889ee6307d1..e5f07607d86a 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -1202,13 +1202,4 @@ public class Binder implements IBinder { StrictMode.clearGatheredViolations(); return res; } - - /** - * Returns the specified service from servicemanager. If the service is not running, - * servicemanager will attempt to start it, and this function will wait for it to be ready. - * Returns nullptr only if there are permission problems or fatal errors. - * @hide - */ - public static final native @Nullable IBinder waitForService(@NonNull String serviceName) - throws RemoteException; } diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java index fab906b9e122..9e996d15fa84 100644 --- a/core/java/android/os/BugreportManager.java +++ b/core/java/android/os/BugreportManager.java @@ -27,6 +27,7 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.app.ActivityManager; import android.content.Context; +import android.content.Intent; import android.os.Handler; import android.util.Log; import android.widget.Toast; @@ -52,6 +53,8 @@ import java.util.concurrent.Executor; public final class BugreportManager { private static final String TAG = "BugreportManager"; + private static final String INTENT_UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED = + "com.android.internal.intent.action.UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED"; private final Context mContext; private final IDumpstate mBinder; @@ -284,5 +287,27 @@ public final class BugreportManager { Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); }); } + + @Override + public void onUiIntensiveBugreportDumpsFinished(String callingPackage) + throws RemoteException { + final long identity = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> { + // Send intent to let calling app to show UI safely without interfering with + // the bugreport/screenshot generation. + // TODO(b/154298410): When S is ready for API change, add a method in + // BugreportCallback so we can just call the callback instead of using + // broadcast. + Intent intent = new Intent(INTENT_UI_INTENSIVE_BUGREPORT_DUMPS_FINISHED); + intent.setPackage(callingPackage); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + mContext.sendBroadcast(intent, android.Manifest.permission.DUMP); + }); + } finally { + Binder.restoreCallingIdentity(identity); + } + } } } diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java index 74ff310ad3af..b654707a683b 100644 --- a/core/java/android/os/ServiceManager.java +++ b/core/java/android/os/ServiceManager.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.NonNull; import android.compat.annotation.UnsupportedAppUsage; import android.util.ArrayMap; import android.util.Log; @@ -219,6 +220,44 @@ public final class ServiceManager { } /** + * Returns whether the specified service is declared. + * + * @return true if the service is declared somewhere (eg. VINTF manifest) and + * waitForService should always be able to return the service. + */ + public static boolean isDeclared(@NonNull String name) { + try { + return getIServiceManager().isDeclared(name); + } catch (RemoteException e) { + Log.e(TAG, "error in isDeclared", e); + return false; + } + } + + /** + * Returns the specified service from the service manager. + * + * If the service is not running, servicemanager will attempt to start it, and this function + * will wait for it to be ready. + * + * @return {@code null} only if there are permission problems or fatal errors. + */ + public static native IBinder waitForService(@NonNull String name); + + /** + * Returns the specified service from the service manager, if declared. + * + * If the service is not running, servicemanager will attempt to start it, and this function + * will wait for it to be ready. + * + * @return {@code null} if the service is not declared in the manifest, or if there are + * permission problems, or if there are fatal errors. + */ + public static IBinder waitForDeclaredService(@NonNull String name) { + return isDeclared(name) ? waitForService(name) : null; + } + + /** * Return a list of all currently running services. * @return an array of all currently running services, or <code>null</code> in * case of an exception diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java index 39ddcb2af3c2..91b56fbbc38e 100644 --- a/core/java/android/os/ServiceManagerNative.java +++ b/core/java/android/os/ServiceManagerNative.java @@ -87,7 +87,7 @@ class ServiceManagerProxy implements IServiceManager { } public boolean isDeclared(String name) throws RemoteException { - throw new RemoteException(); + return mServiceManager.isDeclared(name); } public void registerClientCallback(String name, IBinder service, IClientCallback cb) diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index 5a918023fdc3..188670d0df50 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.annotation.SdkConstant; import android.app.Service; import android.content.Intent; +import android.os.BaseBundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; @@ -611,6 +612,7 @@ public abstract class AutofillService extends Service { public void onCreate() { super.onCreate(); mHandler = new Handler(Looper.getMainLooper(), null, true); + BaseBundle.setShouldDefuse(true); } @Override diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java index e3ed21ff556d..d3ad1c6b8862 100644 --- a/core/java/android/service/autofill/InlineSuggestionRenderService.java +++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java @@ -26,6 +26,7 @@ import android.app.slice.Slice; import android.content.Intent; import android.content.IntentSender; import android.graphics.PixelFormat; +import android.os.BaseBundle; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -146,6 +147,7 @@ public abstract class InlineSuggestionRenderService extends Service { @Override @Nullable public final IBinder onBind(@NonNull Intent intent) { + BaseBundle.setShouldDefuse(true); if (SERVICE_INTERFACE.equals(intent.getAction())) { return new IInlineSuggestionRenderService.Stub() { @Override diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java index b47b2b41bdd9..cca45f572489 100644 --- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java +++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java @@ -30,6 +30,7 @@ import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.graphics.Rect; +import android.os.BaseBundle; import android.os.Build; import android.os.Bundle; import android.os.CancellationSignal; @@ -132,6 +133,7 @@ public abstract class AugmentedAutofillService extends Service { public void onCreate() { super.onCreate(); mHandler = new Handler(Looper.getMainLooper(), null, true); + BaseBundle.setShouldDefuse(true); } /** @hide */ diff --git a/core/java/android/util/proto/ProtoUtils.java b/core/java/android/util/proto/ProtoUtils.java index a71561b7614b..8464d2d808d6 100644 --- a/core/java/android/util/proto/ProtoUtils.java +++ b/core/java/android/util/proto/ProtoUtils.java @@ -32,15 +32,25 @@ public class ProtoUtils { * Dump AggStats to ProtoOutputStream */ public static void toAggStatsProto(ProtoOutputStream proto, long fieldId, - long min, long average, long max) { + long min, long average, long max, int meanKb, int maxKb) { final long aggStatsToken = proto.start(fieldId); proto.write(AggStats.MIN, min); proto.write(AggStats.AVERAGE, average); proto.write(AggStats.MAX, max); + proto.write(AggStats.MEAN_KB, meanKb); + proto.write(AggStats.MAX_KB, maxKb); proto.end(aggStatsToken); } /** + * Dump AggStats to ProtoOutputStream + */ + public static void toAggStatsProto(ProtoOutputStream proto, long fieldId, + long min, long average, long max) { + toAggStatsProto(proto, fieldId, min, average, max, 0, 0); + } + + /** * Dump Duration to ProtoOutputStream */ public static void toDuration(ProtoOutputStream proto, long fieldId, long startMs, long endMs) { diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java index 679c912e846f..b4863f9c6dd0 100644 --- a/core/java/android/view/DisplayCutout.java +++ b/core/java/android/view/DisplayCutout.java @@ -332,7 +332,14 @@ public final class DisplayCutout { } /** - * Return the waterfall insets. + * Returns the insets representing the curved areas of a waterfall display. + * + * A waterfall display has curved areas along the edges of the screen. Apps should be careful + * when showing UI and handling touch input in those insets because the curve may impair + * legibility and can frequently lead to unintended touch inputs. + * + * @return the insets for the curved areas of a waterfall display in pixels or {@code + * Insets.NONE} if there are no curved areas or they don't overlap with the window. */ public @NonNull Insets getWaterfallInsets() { return mWaterfallInsets; diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index 2975d5ee8e1c..28a18da37b3e 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -36,6 +36,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.IResultReceiver; import java.util.List; @@ -69,7 +70,8 @@ import java.util.List; public final class WindowManagerImpl implements WindowManager { @UnsupportedAppUsage private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance(); - private final Context mContext; + @VisibleForTesting + public final Context mContext; private final Window mParentWindow; private IBinder mDefaultToken; diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index dfd91b9a05c1..37425431182e 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -1279,6 +1279,7 @@ public final class AccessibilityManager { * @hide */ @SystemApi + @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull RemoteAction action, int actionId) { final IAccessibilityManager service; @@ -1306,6 +1307,7 @@ public final class AccessibilityManager { * @hide */ @SystemApi + @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int actionId) { final IAccessibilityManager service; diff --git a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java index d282b56aedb6..4d4faa4ba2a3 100644 --- a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java +++ b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java @@ -126,6 +126,19 @@ public final class InlineSuggestionsRequest implements Parcelable { Preconditions.checkState(mMaxSuggestionCount >= mInlinePresentationSpecs.size()); } + /** + * Removes the remote objects from the bundles within the {@Code mExtras} and the + * {@code mInlinePresentationSpecs}. + * + * @hide + */ + public void filterContentTypes() { + InlinePresentationStyleUtils.filterContentTypes(mExtras); + for (int i = 0; i < mInlinePresentationSpecs.size(); i++) { + mInlinePresentationSpecs.get(i).filterContentTypes(); + } + } + private static int defaultMaxSuggestionCount() { return SUGGESTION_COUNT_UNLIMITED; } @@ -582,10 +595,10 @@ public final class InlineSuggestionsRequest implements Parcelable { } @DataClass.Generated( - time = 1586992395497L, + time = 1587537617922L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java", - inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.widget.inline.InlinePresentationSpec> mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate int mHostDisplayId\npublic void setHostInputToken(android.os.IBinder)\nprivate boolean extrasEquals(android.os.Bundle)\nprivate void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic void setHostDisplayId(int)\nprivate void onConstructed()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nprivate static android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List<android.widget.inline.InlinePresentationSpec>)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []") + inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.widget.inline.InlinePresentationSpec> mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate int mHostDisplayId\npublic void setHostInputToken(android.os.IBinder)\nprivate boolean extrasEquals(android.os.Bundle)\nprivate void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic void setHostDisplayId(int)\nprivate void onConstructed()\npublic void filterContentTypes()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nprivate static android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List<android.widget.inline.InlinePresentationSpec>)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated private void __metadata() {} diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 71dd6653f6a6..3cf61098f11c 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -645,11 +645,6 @@ public final class InputMethodManager { @Override public void setCurrentRootView(ViewRootImpl rootView) { synchronized (mH) { - if (mCurRootView != null) { - // Reset the last served view and restart window focus state of the root view. - mCurRootView.getImeFocusController().setServedView(null); - mRestartOnNextWindowFocus = true; - } mCurRootView = rootView; } } diff --git a/core/java/android/widget/inline/InlinePresentationSpec.java b/core/java/android/widget/inline/InlinePresentationSpec.java index 5635857154de..9f966d84eb34 100644 --- a/core/java/android/widget/inline/InlinePresentationSpec.java +++ b/core/java/android/widget/inline/InlinePresentationSpec.java @@ -57,6 +57,14 @@ public final class InlinePresentationSpec implements Parcelable { return InlinePresentationStyleUtils.bundleEquals(mStyle, style); } + /** + * Removes the remote objects from the {@code mStyle}. + * @hide + */ + public void filterContentTypes() { + InlinePresentationStyleUtils.filterContentTypes(mStyle); + } + /** @hide */ @DataClass.Suppress({"setMaxSize", "setMinSize"}) abstract static class BaseBuilder { @@ -285,10 +293,10 @@ public final class InlinePresentationSpec implements Parcelable { } @DataClass.Generated( - time = 1585768046898L, + time = 1586935491105L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/widget/inline/InlinePresentationSpec.java", - inputSignatures = "private final @android.annotation.NonNull android.util.Size mMinSize\nprivate final @android.annotation.NonNull android.util.Size mMaxSize\nprivate final @android.annotation.NonNull android.os.Bundle mStyle\nprivate static @android.annotation.NonNull android.os.Bundle defaultStyle()\nprivate boolean styleEquals(android.os.Bundle)\nclass InlinePresentationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []") + inputSignatures = "private final @android.annotation.NonNull android.util.Size mMinSize\nprivate final @android.annotation.NonNull android.util.Size mMaxSize\nprivate final @android.annotation.NonNull android.os.Bundle mStyle\nprivate static @android.annotation.NonNull android.os.Bundle defaultStyle()\nprivate boolean styleEquals(android.os.Bundle)\npublic void filterContentTypes()\nclass InlinePresentationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated private void __metadata() {} diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index bcb32fb60f47..b58dbddab44f 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -437,9 +437,6 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { resetViewVisibilitiesForWorkProfileEmptyState(emptyStateView); emptyStateView.setVisibility(View.VISIBLE); - View container = emptyStateView.findViewById(R.id.resolver_empty_state_container); - setupContainerPadding(container); - TextView title = emptyStateView.findViewById(R.id.resolver_empty_state_title); title.setText(titleRes); @@ -466,12 +463,6 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { activeListAdapter.markTabLoaded(); } - /** - * Sets up the padding of the view containing the empty state screens. - * <p>This method is meant to be overridden so that subclasses can customize the padding. - */ - protected void setupContainerPadding(View container) {} - private void showConsumerUserNoAppsAvailableEmptyState(ResolverListAdapter activeListAdapter) { ProfileDescriptor descriptor = getItem( userHandleToPageIndex(activeListAdapter.getUserHandle())); @@ -564,6 +555,12 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { } } + /** + * Callback called when the button layout has been hidden. + * <p>This method is meant to be overridden by subclasses. + */ + protected void onButtonLayoutHidden() { } + public interface OnProfileSelectedListener { /** * Callback for when the user changes the active tab from personal to work or vice versa. diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 00faa3b3d21e..84c833ea5ffe 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -180,7 +180,7 @@ public class ResolverActivity extends Activity implements public static final String EXTRA_IS_AUDIO_CAPTURE_DEVICE = "is_audio_capture_device"; private BroadcastReceiver mWorkProfileStateReceiver; - private boolean mIsHeaderCreated; + private UserHandle mHeaderCreatorUser; /** * Get the string resource to be used as a label for the link to the resolver activity for an @@ -1027,7 +1027,7 @@ public class ResolverActivity extends Activity implements @Override // ResolverListCommunicator public final void onPostListReady(ResolverListAdapter listAdapter, boolean doPostProcessing) { - if (isAutolaunching() || maybeAutolaunchActivity()) { + if (isAutolaunching()) { return; } if (mMultiProfilePagerAdapter.shouldShowEmptyStateScreen(listAdapter)) { @@ -1035,6 +1035,11 @@ public class ResolverActivity extends Activity implements } else { mMultiProfilePagerAdapter.showListView(listAdapter); } + // showEmptyResolverListEmptyState can mark the tab as loaded, + // which is a precondition for auto launching + if (maybeAutolaunchActivity()) { + return; + } if (doPostProcessing) { maybeCreateHeader(listAdapter); resetButtonBar(); @@ -1725,11 +1730,10 @@ public class ResolverActivity extends Activity implements /** * Configure the area above the app selection list (title, content preview, etc). - * <p>The header is created once when first launching the activity and whenever a package is - * installed or uninstalled. */ private void maybeCreateHeader(ResolverListAdapter listAdapter) { - if (mIsHeaderCreated) { + if (mHeaderCreatorUser != null + && !listAdapter.getUserHandle().equals(mHeaderCreatorUser)) { return; } if (!shouldShowTabs() @@ -1756,7 +1760,7 @@ public class ResolverActivity extends Activity implements if (iconView != null) { listAdapter.loadFilteredItemIconTaskAsync(iconView); } - mIsHeaderCreated = true; + mHeaderCreatorUser = listAdapter.getUserHandle(); } protected void resetButtonBar() { @@ -1772,13 +1776,18 @@ public class ResolverActivity extends Activity implements mMultiProfilePagerAdapter.getActiveListAdapter(); View buttonBarDivider = findViewById(R.id.resolver_button_bar_divider); if (activeListAdapter.isTabLoaded() - && mMultiProfilePagerAdapter.shouldShowEmptyStateScreen(activeListAdapter)) { + && mMultiProfilePagerAdapter.shouldShowEmptyStateScreen(activeListAdapter) + && !useLayoutWithDefault()) { buttonLayout.setVisibility(View.INVISIBLE); - buttonBarDivider.setVisibility(View.INVISIBLE); + if (buttonBarDivider != null) { + buttonBarDivider.setVisibility(View.INVISIBLE); + } + mMultiProfilePagerAdapter.onButtonLayoutHidden(); return; } - - buttonBarDivider.setVisibility(View.VISIBLE); + if (buttonBarDivider != null) { + buttonBarDivider.setVisibility(View.VISIBLE); + } buttonLayout.setVisibility(View.VISIBLE); if (!useLayoutWithDefault()) { @@ -1867,7 +1876,6 @@ public class ResolverActivity extends Activity implements // turning on. return; } - mIsHeaderCreated = false; boolean listRebuilt = mMultiProfilePagerAdapter.rebuildActiveTab(true); if (listRebuilt) { ResolverListAdapter activeListAdapter = diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java index 885d1bbc5b77..5e2470ed9651 100644 --- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java @@ -214,9 +214,12 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA } @Override - protected void setupContainerPadding(View container) { - container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), - container.getPaddingRight(), /* bottom */ 0); + protected void onButtonLayoutHidden() { + View emptyStateContainer = getItem(getCurrentPage()).getEmptyStateView() + .findViewById(R.id.resolver_empty_state_container); + emptyStateContainer.setPadding(emptyStateContainer.getPaddingLeft(), + emptyStateContainer.getPaddingTop(), emptyStateContainer.getPaddingRight(), + /* bottom */ 0); } class ResolverProfileDescriptor extends ProfileDescriptor { diff --git a/core/java/com/android/internal/app/procstats/DumpUtils.java b/core/java/com/android/internal/app/procstats/DumpUtils.java index 9bdbdc70d74d..b476a17fa9b1 100644 --- a/core/java/com/android/internal/app/procstats/DumpUtils.java +++ b/core/java/com/android/internal/app/procstats/DumpUtils.java @@ -550,7 +550,7 @@ public final class DumpUtils { // screen state is in lowest 0xf bits, process state is in next 0xf bits up try { - proto.write(stateId, STATE_PROTO_ENUMS[state >> 0xf]); + proto.write(stateId, state >> 0xf); } catch (IndexOutOfBoundsException e) { proto.write(stateId, ProcessStatsEnums.PROCESS_STATE_UNKNOWN); } diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index 79ff5948f32b..fe4138584fa7 100644 --- a/core/java/com/android/internal/app/procstats/ProcessState.java +++ b/core/java/com/android/internal/app/procstats/ProcessState.java @@ -1459,16 +1459,16 @@ public final class ProcessState { for (int i = 0; i < mPssTable.getKeyCount(); i++) { final int key = mPssTable.getKeyAt(i); final int type = SparseMappingTable.getIdFromKey(key); - if (durationByState.indexOfKey(type) < 0) { + final int aggregatedType = DumpUtils.aggregateCurrentProcessState(type); + if (durationByState.indexOfKey(aggregatedType) < 0) { // state without duration should not have stats! continue; } - final int aggregatedType = DumpUtils.aggregateCurrentProcessState(type); long[] rssMeanAndMax = mPssTable.getRssMeanAndMax(key); // compute mean * duration, then store sum of that in meanRssByState - long meanTimesDuration = rssMeanAndMax[0] * mDurations.getValue(key); + long meanTimesDuration = rssMeanAndMax[0] * mDurations.getValueForId((byte) type); if (meanRssByState.indexOfKey(aggregatedType) >= 0) { meanRssByState.put(aggregatedType, meanTimesDuration + meanRssByState.get(aggregatedType)); @@ -1492,8 +1492,10 @@ public final class ProcessState { // these data structures should be consistent continue; } + final long duration = durationByState.get(aggregatedKey); meanRssByState.put(aggregatedKey, - meanRssByState.get(aggregatedKey) / durationByState.get(aggregatedKey)); + duration > 0 ? (meanRssByState.get(aggregatedKey) / duration) + : meanRssByState.get(aggregatedKey)); } // build the output @@ -1508,14 +1510,16 @@ public final class ProcessState { DumpUtils.printAggregatedProcStateTagProto(proto, ProcessStatsStateProto.SCREEN_STATE, - ProcessStatsStateProto.PROCESS_STATE, + ProcessStatsStateProto.PROCESS_STATE_AGGREGATED, aggregatedKey); proto.write(ProcessStatsStateProto.DURATION_MS, durationByState.get(aggregatedKey)); ProtoUtils.toAggStatsProto(proto, ProcessStatsStateProto.RSS, 0, /* do not output a minimum value */ - meanRssByState.get(aggregatedKey), - maxRssByState.get(aggregatedKey)); + 0, /* do not output an average value */ + 0, /* do not output a max value */ + (int) meanRssByState.get(aggregatedKey), + (int) maxRssByState.get(aggregatedKey)); proto.end(stateToken); } diff --git a/core/java/com/android/internal/policy/DecorContext.java b/core/java/com/android/internal/policy/DecorContext.java index 99b4b5fb7707..51b41198e272 100644 --- a/core/java/com/android/internal/policy/DecorContext.java +++ b/core/java/com/android/internal/policy/DecorContext.java @@ -22,8 +22,6 @@ import android.content.Context; import android.content.res.AssetManager; import android.content.res.Resources; import android.view.ContextThemeWrapper; -import android.view.WindowManager; -import android.view.WindowManagerImpl; import android.view.contentcapture.ContentCaptureManager; import com.android.internal.annotations.VisibleForTesting; @@ -31,8 +29,8 @@ import com.android.internal.annotations.VisibleForTesting; import java.lang.ref.WeakReference; /** - * Context for decor views which can be seeded with pure application context and not depend on the - * activity, but still provide some of the facilities that Activity has, + * Context for decor views which can be seeded with display context and not depend on the activity, + * but still provide some of the facilities that Activity has, * e.g. themes, activity-based resources, etc. * * @hide @@ -40,80 +38,93 @@ import java.lang.ref.WeakReference; @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public class DecorContext extends ContextThemeWrapper { private PhoneWindow mPhoneWindow; - private WindowManager mWindowManager; - private Resources mActivityResources; + private Resources mResources; private ContentCaptureManager mContentCaptureManager; - private WeakReference<Context> mActivityContext; + private WeakReference<Context> mContext; - // TODO(b/149928768): Non-activity context can be passed. @VisibleForTesting - public DecorContext(Context context, Context activityContext) { - super(context.createDisplayContext(activityContext.getDisplayNoVerify()), null); - mActivityContext = new WeakReference<>(activityContext); - mActivityResources = activityContext.getResources(); + public DecorContext(Context baseContext, PhoneWindow phoneWindow) { + super(null /* base */, null); + setPhoneWindow(phoneWindow); + final Context displayContext = baseContext.createDisplayContext( + // TODO(b/149790106): Non-activity context can be passed. + phoneWindow.getContext().getDisplayNoVerify()); + attachBaseContext(displayContext); } void setPhoneWindow(PhoneWindow phoneWindow) { mPhoneWindow = phoneWindow; - mWindowManager = null; + final Context context = phoneWindow.getContext(); + mContext = new WeakReference<>(context); + mResources = context.getResources(); } @Override public Object getSystemService(String name) { if (Context.WINDOW_SERVICE.equals(name)) { - if (mWindowManager == null) { - WindowManagerImpl wm = - (WindowManagerImpl) super.getSystemService(Context.WINDOW_SERVICE); - mWindowManager = wm.createLocalWindowManager(mPhoneWindow); - } - return mWindowManager; + return mPhoneWindow.getWindowManager(); } + final Context context = mContext.get(); if (Context.CONTENT_CAPTURE_MANAGER_SERVICE.equals(name)) { - if (mContentCaptureManager == null) { - Context activityContext = mActivityContext.get(); - if (activityContext != null) { - mContentCaptureManager = (ContentCaptureManager) activityContext - .getSystemService(name); - } + if (context != null && mContentCaptureManager == null) { + mContentCaptureManager = (ContentCaptureManager) context.getSystemService(name); } return mContentCaptureManager; } - return super.getSystemService(name); + // TODO(b/154191411): Try to revisit this issue in S. + // We use application to get DisplayManager here because ViewRootImpl holds reference of + // DisplayManager and implicitly holds reference of mContext, which makes activity cannot + // be GC'd even after destroyed if mContext is an activity object. + if (Context.DISPLAY_SERVICE.equals(name)) { + return super.getSystemService(name); + } + // LayoutInflater and WallpaperManagerService should also be obtained from visual context + // instead of base context. + return (context != null) ? context.getSystemService(name) : super.getSystemService(name); } @Override public Resources getResources() { - Context activityContext = mActivityContext.get(); + Context context = mContext.get(); // Attempt to update the local cached Resources from the activity context. If the activity // is no longer around, return the old cached values. - if (activityContext != null) { - mActivityResources = activityContext.getResources(); + if (context != null) { + mResources = context.getResources(); } - return mActivityResources; + return mResources; } @Override public AssetManager getAssets() { - return mActivityResources.getAssets(); + return mResources.getAssets(); } @Override public AutofillOptions getAutofillOptions() { - Context activityContext = mActivityContext.get(); - if (activityContext != null) { - return activityContext.getAutofillOptions(); + Context context = mContext.get(); + if (context != null) { + return context.getAutofillOptions(); } return null; } @Override public ContentCaptureOptions getContentCaptureOptions() { - Context activityContext = mActivityContext.get(); - if (activityContext != null) { - return activityContext.getContentCaptureOptions(); + Context context = mContext.get(); + if (context != null) { + return context.getContentCaptureOptions(); } return null; } + + @Override + public boolean isUiContext() { + Context context = mContext.get(); + if (context != null) { + return context.isUiContext(); + } + return false; + } } diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 23ba6530b072..aa75d4010748 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2358,7 +2358,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (applicationContext == null) { context = getContext(); } else { - context = new DecorContext(applicationContext, getContext()); + context = new DecorContext(applicationContext, this); if (mTheme != -1) { context.setTheme(mTheme); } diff --git a/core/java/com/android/internal/widget/InlinePresentationStyleUtils.java b/core/java/com/android/internal/widget/InlinePresentationStyleUtils.java index 264c8bd2303a..db1725ff461c 100644 --- a/core/java/com/android/internal/widget/InlinePresentationStyleUtils.java +++ b/core/java/com/android/internal/widget/InlinePresentationStyleUtils.java @@ -17,7 +17,9 @@ package com.android.internal.widget; import android.annotation.NonNull; +import android.annotation.Nullable; import android.os.Bundle; +import android.os.IBinder; import java.util.Objects; import java.util.Set; @@ -61,6 +63,25 @@ public final class InlinePresentationStyleUtils { } /** + * Removes remote objects from the bundle. + */ + public static void filterContentTypes(@Nullable Bundle bundle) { + if (bundle == null) { + return; + } + + for (String key : bundle.keySet()) { + Object o = bundle.get(key); + + if (o instanceof Bundle) { + filterContentTypes((Bundle) o); + } else if (o instanceof IBinder) { + bundle.remove(key); + } + } + } + + /** * Private ctor to avoid constructing the class. */ private InlinePresentationStyleUtils() { diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 189a0a72e42c..bd7bc4cf4ceb 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -123,6 +123,7 @@ cc_library_shared { "android_os_MessageQueue.cpp", "android_os_Parcel.cpp", "android_os_SELinux.cpp", + "android_os_ServiceManager.cpp", "android_os_SharedMemory.cpp", "android_os_storage_StorageManager.cpp", "android_os_UEventObserver.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 4cb2e975a58b..6fcaddf34322 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -136,6 +136,7 @@ extern int register_android_os_HwBlob(JNIEnv *env); extern int register_android_os_HwParcel(JNIEnv *env); extern int register_android_os_HwRemoteBinder(JNIEnv *env); extern int register_android_os_NativeHandle(JNIEnv *env); +extern int register_android_os_ServiceManager(JNIEnv *env); extern int register_android_os_MessageQueue(JNIEnv* env); extern int register_android_os_Parcel(JNIEnv* env); extern int register_android_os_SELinux(JNIEnv* env); @@ -1461,6 +1462,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_HwParcel), REG_JNI(register_android_os_HwRemoteBinder), REG_JNI(register_android_os_NativeHandle), + REG_JNI(register_android_os_ServiceManager), REG_JNI(register_android_os_storage_StorageManager), REG_JNI(register_android_os_VintfObject), REG_JNI(register_android_os_VintfRuntimeInfo), diff --git a/core/jni/android_os_ServiceManager.cpp b/core/jni/android_os_ServiceManager.cpp new file mode 100644 index 000000000000..c7479492d404 --- /dev/null +++ b/core/jni/android_os_ServiceManager.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "ServiceManager" +//#define LOG_NDEBUG 0 +#include <android-base/logging.h> + +#include <binder/IInterface.h> +#include <binder/IServiceManager.h> +#include <nativehelper/JNIHelp.h> + +#include "android_util_Binder.h" +#include "core_jni_helpers.h" + +namespace android { + +// Native because we have a client-side wait in waitForService() and we do not +// want an unnecessary second copy of it. +static jobject android_os_ServiceManager_waitForService( + JNIEnv *env, + jclass /* clazzObj */, + jstring serviceNameObj) { + + const jchar* serviceName = env->GetStringCritical(serviceNameObj, nullptr); + if (!serviceName) { + jniThrowNullPointerException(env, nullptr); + return nullptr; + } + String16 nameCopy = String16(reinterpret_cast<const char16_t *>(serviceName), + env->GetStringLength(serviceNameObj)); + env->ReleaseStringCritical(serviceNameObj, serviceName); + + sp<IBinder> service = defaultServiceManager()->waitForService(nameCopy); + + if (!service) { + return nullptr; + } + + return javaObjectForIBinder(env, service); +} + +// ---------------------------------------------------------------------------- + +static const JNINativeMethod method_table[] = { + /* name, signature, funcPtr */ + { + "waitForService", + "(Ljava/lang/String;)Landroid/os/IBinder;", + (void*)android_os_ServiceManager_waitForService + }, +}; + +int register_android_os_ServiceManager(JNIEnv* env) { + return RegisterMethodsOrDie( + env, "android/os/ServiceManager", method_table, NELEM(method_table)); +} + +}; // namespace android diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 14d74878b2ea..4c9d7abeb5a1 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -1036,31 +1036,6 @@ static void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject cla return IPCThreadState::self()->blockUntilThreadAvailable(); } -static jobject android_os_Binder_waitForService( - JNIEnv *env, - jclass /* clazzObj */, - jstring serviceNameObj) { - - const jchar* serviceName = env->GetStringCritical(serviceNameObj, nullptr); - if (!serviceName) { - signalExceptionForError(env, nullptr, BAD_VALUE, true /*canThrowRemoteException*/); - return nullptr; - } - String16 nameCopy = String16(reinterpret_cast<const char16_t *>(serviceName), - env->GetStringLength(serviceNameObj)); - env->ReleaseStringCritical(serviceNameObj, serviceName); - - auto sm = android::defaultServiceManager(); - sp<IBinder> service = sm->waitForService(nameCopy); - - if (!service) { - signalExceptionForError(env, nullptr, NAME_NOT_FOUND, true /*canThrowRemoteException*/); - return nullptr; - } - - return javaObjectForIBinder(env, service); -} - static jobject android_os_Binder_getExtension(JNIEnv* env, jobject obj) { JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject); return javaObjectForIBinder(env, jbh->getExtension()); @@ -1101,7 +1076,6 @@ static const JNINativeMethod gBinderMethods[] = { { "getNativeBBinderHolder", "()J", (void*)android_os_Binder_getNativeBBinderHolder }, { "getNativeFinalizer", "()J", (void*)android_os_Binder_getNativeFinalizer }, { "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable }, - { "waitForService", "(Ljava/lang/String;)Landroid/os/IBinder;", (void*)android_os_Binder_waitForService }, { "getExtension", "()Landroid/os/IBinder;", (void*)android_os_Binder_getExtension }, { "setExtension", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension }, }; diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto index ad7299d9a45c..a6dc937566c2 100644 --- a/core/proto/android/service/procstats.proto +++ b/core/proto/android/service/procstats.proto @@ -104,7 +104,7 @@ message ProcessStatsAvailablePagesProto { repeated int32 pages_per_order = 4; } -// Next Tag: 10 +// Next Tag: 13 message ProcessStatsStateProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; @@ -114,13 +114,20 @@ message ProcessStatsStateProto { // this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java // and not frameworks/base/core/java/android/app/ActivityManager.java - optional ProcessState process_state = 3; + optional ProcessState process_state = 3 [deprecated = true]; + + // the AggregatedProcessState needs to keep sync with ProcessStateAggregated + optional AggregatedProcessState process_state_aggregated = 10; // Millisecond uptime duration spent in this state - optional int64 duration_ms = 4; + optional int64 duration_ms = 4 [deprecated = true]; + // Same as above, but with minute resolution so it fits into an int32. + optional int32 duration_minutes = 11; // Millisecond elapsed realtime duration spent in this state - optional int64 realtime_duration_ms = 9; + optional int64 realtime_duration_ms = 9 [deprecated = true]; + // Same as above, but with minute resolution so it fits into an int32. + optional int32 realtime_duration_minutes = 12; // # of samples taken optional int32 sample_size = 5; diff --git a/core/proto/android/util/common.proto b/core/proto/android/util/common.proto index aad24d140395..ec88f2be47c1 100644 --- a/core/proto/android/util/common.proto +++ b/core/proto/android/util/common.proto @@ -27,11 +27,16 @@ option java_multiple_files = true; message AggStats { option (android.msg_privacy).dest = DEST_AUTOMATIC; - optional int64 min = 1; + optional int64 min = 1 [deprecated = true]; - optional int64 average = 2; + optional int64 average = 2 [deprecated = true]; - optional int64 max = 3; + optional int64 max = 3 [deprecated = true]; + + // These are all in kilobyte resolution. Can fit in int32, so smaller on the wire than the above + // int64 fields. + optional int32 mean_kb = 4; + optional int32 max_kb = 5; } /** @@ -43,4 +48,4 @@ message Duration { optional int64 start_ms = 1; optional int64 end_ms = 2; -}
\ No newline at end of file +} diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 363c37b9e203..a23277eddf2b 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3201,6 +3201,11 @@ <permission android:name="android.permission.MODIFY_ACCESSIBILITY_DATA" android:protectionLevel="signature" /> + <!-- @hide Allows an application to perform accessibility operations (e.g. send events) on + behalf of another package. --> + <permission android:name="android.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY" + android:protectionLevel="signature" /> + <!-- @hide Allows an application to change the accessibility volume. --> <permission android:name="android.permission.CHANGE_ACCESSIBILITY_VOLUME" android:protectionLevel="signature" /> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 7a2639d1ccda..dfd729e1b204 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -724,7 +724,7 @@ </string-array> <string-array name="emailAddressTypes"> <item msgid="7786349763648997741">"المنزل"</item> - <item msgid="435564470865989199">"عمل"</item> + <item msgid="435564470865989199">"العمل"</item> <item msgid="4199433197875490373">"آخر"</item> <item msgid="3233938986670468328">"مخصص"</item> </string-array> @@ -778,7 +778,7 @@ <string name="phoneTypeMms" msgid="1799747455131365989">"رسالة وسائط متعددة"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"مخصص"</string> <string name="eventTypeBirthday" msgid="7770026752793912283">"عيد ميلاد"</string> - <string name="eventTypeAnniversary" msgid="4684702412407916888">"الذكرى السنوية"</string> + <string name="eventTypeAnniversary" msgid="4684702412407916888">"ذكرى سنوية"</string> <string name="eventTypeOther" msgid="530671238533887997">"غير ذلك"</string> <string name="emailTypeCustom" msgid="1809435350482181786">"مخصص"</string> <string name="emailTypeHome" msgid="1597116303154775999">"المنزل"</string> @@ -1541,9 +1541,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"مطلوب من <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"نعم"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"لا"</string> - <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"تم الوصول إلى الموقع الجغرافي أثناء حالة طوارئ"</string> - <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"وصلت الشركة المصنِّعة إلى موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string> - <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"وصل مشغّل شبكة الجوّال إلى موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"تمّ التعرّف على موقعك الجغرافي أثناء حالة طوارئ"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"تمكّنت الشركة المصنِّعة من معرفة موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"تمكّن مشغّل شبكة الجوّال من معرفة موقعك الجغرافي أثناء جلسة الطوارئ الأخيرة."</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"تم تجاوز حد الحذف."</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"هناك <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> من العناصر المحذوفة لـ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، في حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ماذا تريد أن تفعل؟"</string> <string name="sync_really_delete" msgid="5657871730315579051">"حذف العناصر"</string> @@ -1955,7 +1955,7 @@ </plurals> <string name="zen_mode_until" msgid="2250286190237669079">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (التنبيه التالي)"</string> - <string name="zen_mode_forever" msgid="740585666364912448">"لحين الإيقاف"</string> + <string name="zen_mode_forever" msgid="740585666364912448">"إلى أن يتم إيقاف الوضع"</string> <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"حتى يتم إيقاف \"عدم الإزعاج\""</string> <string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="8009920446193610996">"تصغير"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 4b38c9ba284b..ecf0394a20d2 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)এ অনুৰোধ কৰিছে"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"হয়"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"নহয়"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"জৰুৰীকালীন অৱস্থান এক্সেছ কৰা হৈছে"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"এটা শেহতীয়া জৰুৰীকালীন ছেশ্বনৰ সময়ত আপোনাৰ ডিভাইচ নিৰ্মাতাই আপোনাৰ অৱস্থান এক্সেছ কৰিছিল"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"এটা শেহতীয়া জৰুৰীকালীন ছেশ্বনৰ সময়ত আপোনাৰ বাহকে আপোনাৰ অৱস্থান এক্সেছ কৰিছিল"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"মচি পেলোৱাৰ সীমা পাৰ হ’ল"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"এই <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ৰ মচি থোৱা <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> টা <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> বস্তু আছে। আপুনি কি কৰিব বিচাৰে?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"বস্তুবোৰ মচক"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index c998ff026881..1e633d390212 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1315,7 +1315,7 @@ <string name="test_harness_mode_notification_title" msgid="2282785860014142511">"Test Rejimi aktivdir"</string> <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Test Rejimini deaktiv etmək üçün fabrika ayarlarına sıfırlayın."</string> <string name="console_running_notification_title" msgid="6087888939261635904">"Ardıcıl konsol aktiv edildi"</string> - <string name="console_running_notification_message" msgid="7892751888125174039">"Performansa təsir edir. Deaktiv etmək üçün yükləyicini yoxlayın."</string> + <string name="console_running_notification_message" msgid="7892751888125174039">"Performans təsirlənir. Söndürməkçün yükləyicini yoxlayın."</string> <string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB portuna maye sızıb və ya qırılıb"</string> <string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB portu avtomatik deaktiv edildi. Ətraflı məlumat üçün klikləyin."</string> <string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB portundan istifadə etmək üçün OK"</string> @@ -2029,7 +2029,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fayl</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fayl</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Paylaşmaq üçün tövsiyə edilən biri yoxdur"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Paylaşmaq üçün tövsiyə edilən bir kimsə yoxdur"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Tətbiq siyahısı"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu tətbiqə yazmaq icazəsi verilməyib, lakin, bu USB vasitəsilə səs yaza bilər."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Əsas səhifə"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 1bb162d6f3e3..abcecb7b9e93 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -2082,7 +2082,7 @@ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzacija"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupna konverzacija"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> - <string name="resolver_personal_tab" msgid="2051260504014442073">"Lični"</string> + <string name="resolver_personal_tab" msgid="2051260504014442073">"Lično"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Poslovni"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Lični prikaz"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Prikaz za posao"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 3ed334127566..9f064a2eca7a 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) এর দ্বারা অনুরোধকৃত"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"হ্যাঁ"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"না"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"জরুরি লোকেশন অ্যাক্সেস করা হয়েছে"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"সাম্প্রতিক জরুরি সেশনের সময় আপনার ডিভাইস প্রস্তুতকর্তা আপনার লোকেশন অ্যাক্সেস করেছে"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"সাম্প্রতিক জরুরি সেশনের সময় আপনার পরিষেবা প্রদানকারী আপনার লোকেশন অ্যাক্সেস করেছে"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"মুছে ফেলার সীমা ছাড়িয়ে গেছে"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> অ্যাকাউন্টে <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> এর জন্য <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g>টি মুছে ফেলা আইটেম রয়েছে৷ আপনি এগুলিকে নিয়ে কি করতে চান?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"আইটেমগুলি মুছুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index ee6bdd9a8ba3..d4fee2ef051f 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1470,7 +1470,7 @@ </plurals> <string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string> <string name="progress_erasing" msgid="6891435992721028004">"Brisanje dijeljene pohrane…"</string> - <string name="share" msgid="4157615043345227321">"Podijelite"</string> + <string name="share" msgid="4157615043345227321">"Dijeli"</string> <string name="find" msgid="5015737188624767706">"Pronađi"</string> <string name="websearch" msgid="5624340204512793290">"Internet pretraživanje"</string> <string name="find_next" msgid="5341217051549648153">"Nađi sljedeći"</string> @@ -2066,7 +2066,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajlova</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nijedna osoba nije preporučena za dijeljenje"</string> - <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Spisak aplikacija"</string> + <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista aplikacija"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ovoj aplikaciji nije dato odobrenje za snimanje, ali može snimati zvuk putem ovog USB uređaja."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Početna stranica"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"Nazad"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index ed77cddad8fa..d7211bd3b954 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1315,7 +1315,7 @@ <string name="test_harness_mode_notification_title" msgid="2282785860014142511">"S\'ha activat el mode Agent de prova"</string> <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Si vols desactivar el mode Agent de prova, restableix les dades de fàbrica."</string> <string name="console_running_notification_title" msgid="6087888939261635904">"S\'ha activat la consola de sèrie"</string> - <string name="console_running_notification_message" msgid="7892751888125174039">"El rendiment s\'ha vist afectat. Per desactivar-la, comprova el bootloader."</string> + <string name="console_running_notification_message" msgid="7892751888125174039">"Afecta el rendiment. Per desactivar-la, comprova el bootloader."</string> <string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Hi ha líquid o pols al port USB"</string> <string name="usb_contaminant_detected_message" msgid="7346100585390795743">"El port USB es desactiva automàticament. Toca per obtenir més informació."</string> <string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Ja pots utilitzar el port USB"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 7149a8304fc7..8de20cbd1943 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -2097,7 +2097,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> souborů</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> soubor</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Žádní doporučení lidé ke sdílení"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Žádní doporučení lidé, s nimiž můžete sdílet"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Seznam aplikací"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Tato aplikace nemá oprávnění k nahrávání, ale může zaznamenávat zvuk prostřednictvím tohoto zařízení USB."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Plocha"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 95d71f61d0c3..3567a96b8dde 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2029,7 +2029,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> und <xliff:g id="COUNT_3">%d</xliff:g> Dateien</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> und <xliff:g id="COUNT_1">%d</xliff:g> Datei</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Keine Personen zum Teilen empfohlen"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Keine empfohlenen Empfänger"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste der Apps"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Diese App hat noch keine Berechtigung zum Aufnehmen erhalten, könnte aber Audioaufnahmen über dieses USB-Gerät machen."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Startseite"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 0a564d79809b..d7047c57a238 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -311,7 +311,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string> - <string name="permgrouplab_phone" msgid="570318944091926620">"Telephone"</string> + <string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"make and manage phone calls"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Body sensors"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"access sensor data about your vital signs"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 613c4391e03f..a7ab4275e89a 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -311,7 +311,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string> - <string name="permgrouplab_phone" msgid="570318944091926620">"Telephone"</string> + <string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"make and manage phone calls"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Body sensors"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"access sensor data about your vital signs"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 0a564d79809b..d7047c57a238 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -311,7 +311,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string> - <string name="permgrouplab_phone" msgid="570318944091926620">"Telephone"</string> + <string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"make and manage phone calls"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Body sensors"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"access sensor data about your vital signs"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 0a564d79809b..d7047c57a238 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -311,7 +311,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"take pictures and record video"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Call logs"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"read and write phone call logs"</string> - <string name="permgrouplab_phone" msgid="570318944091926620">"Telephone"</string> + <string name="permgrouplab_phone" msgid="570318944091926620">"Phone"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"make and manage phone calls"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Body sensors"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"access sensor data about your vital signs"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 6c19031894a7..0fc7ec58523b 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"Dispositivo administrado"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Tu organización administra este dispositivo y es posible que controle el tráfico de red. Presiona para obtener más información."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Las apps pueden acceder a tu ubicación"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Para obtener más información, comunícate con tu administrador de TI"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Comunícate con el administrador por más información"</string> <string name="country_detector" msgid="7023275114706088854">"Detector de país"</string> <string name="location_service" msgid="2439187616018455546">"Servicio de ubicación"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Servicio de notificaciones del sensor"</string> @@ -230,7 +230,7 @@ <string name="shutdown_confirm_question" msgid="796151167261608447">"¿Deseas apagarlo?"</string> <string name="reboot_safemode_title" msgid="5853949122655346734">"Reiniciar en modo seguro"</string> <string name="reboot_safemode_confirm" msgid="1658357874737219624">"¿Deseas reiniciar el dispositivo en modo seguro? Las aplicaciones de terceros que instalaste se desactivarán y se restablecerán cuando vuelvas a reiniciar el dispositivo."</string> - <string name="recent_tasks_title" msgid="8183172372995396653">"Reciente"</string> + <string name="recent_tasks_title" msgid="8183172372995396653">"Recientes"</string> <string name="no_recent_tasks" msgid="9063946524312275906">"No hay aplicaciones recientes."</string> <string name="global_actions" product="tablet" msgid="4412132498517933867">"Opciones de tablet"</string> <string name="global_actions" product="tv" msgid="3871763739487450369">"Opciones de Android TV"</string> @@ -1315,7 +1315,7 @@ <string name="test_harness_mode_notification_title" msgid="2282785860014142511">"Se habilitó el modo de agente de prueba"</string> <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Restablece la configuración de fábrica para inhabilitar el modo de agente de prueba."</string> <string name="console_running_notification_title" msgid="6087888939261635904">"Se habilitó la consola en serie"</string> - <string name="console_running_notification_message" msgid="7892751888125174039">"Afecta el rendimiento. Para inhabilitarla, verifica bootloader."</string> + <string name="console_running_notification_message" msgid="7892751888125174039">"Afecta el rendimiento. Para inhabilitarla, verifica el bootloader."</string> <string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Hay líquido o suciedad en el puerto USB"</string> <string name="usb_contaminant_detected_message" msgid="7346100585390795743">"El puerto USB se inhabilitó automáticamente. Presiona para obtener más información."</string> <string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Se puede usar el puerto USB"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index f004b8adb371..a7777fd0270b 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1314,7 +1314,7 @@ <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Hautatu hau hari gabeko arazketa desgaitzeko"</string> <string name="test_harness_mode_notification_title" msgid="2282785860014142511">"Proba-materialeko modua gaitu da"</string> <string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak."</string> - <string name="console_running_notification_title" msgid="6087888939261635904">"Serie-kontsola gaituta dago"</string> + <string name="console_running_notification_title" msgid="6087888939261635904">"Serie-kontsola gaituta"</string> <string name="console_running_notification_message" msgid="7892751888125174039">"Funtzionamenduari eragiten dio. Desgaitzeko, joan abiarazlera."</string> <string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Likidoa edo zikinkeriak daude USB atakan"</string> <string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 38f9c6abc563..515637d1366e 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -704,7 +704,7 @@ <item msgid="8996339953292723951">"Domicile"</item> <item msgid="7740243458912727194">"Mobile"</item> <item msgid="8526146065496663766">"Travail"</item> - <item msgid="8150904584178569699">"Téléc. bureau"</item> + <item msgid="8150904584178569699">"Téléc. travail"</item> <item msgid="4537253139152229577">"Téléc. domicile"</item> <item msgid="6751245029698664340">"Téléavertisseur"</item> <item msgid="1692790665884224905">"Autre"</item> @@ -1013,7 +1013,7 @@ <string name="weeks" msgid="3516247214269821391">"semaines"</string> <string name="year" msgid="5182610307741238982">"an"</string> <string name="years" msgid="5797714729103773425">"ans"</string> - <string name="now_string_shortest" msgid="3684914126941650330">"mainten."</string> + <string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item> @@ -1295,7 +1295,7 @@ <string name="no_permissions" msgid="5729199278862516390">"Aucune autorisation requise"</string> <string name="perm_costs_money" msgid="749054595022779685">"cela peut engendrer des frais"</string> <string name="dlg_ok" msgid="5103447663504839312">"OK"</string> - <string name="usb_charging_notification_title" msgid="1674124518282666955">"Chargement de cet appareil par USB"</string> + <string name="usb_charging_notification_title" msgid="1674124518282666955">"Recharge de cet appareil par USB"</string> <string name="usb_supplying_notification_title" msgid="5378546632408101811">"Chargement de l\'appareil connecté par USB"</string> <string name="usb_mtp_notification_title" msgid="1065989144124499810">"Transfert de fichiers USB activé"</string> <string name="usb_ptp_notification_title" msgid="5043437571863443281">"Mode PTP par USB activé"</string> @@ -1307,7 +1307,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Un accessoire audio analogique a été détecté"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Touchez ici en savoir plus."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Débogage USB activé"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Touchez l\'écran pour désactiver le débogage USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Touchez ici pour désactiver le débogage USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Sélectionnez cette option pour désactiver le débogage USB."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Débogage sans fil connecté"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Touchez l\'écran pour désactiver le débogage sans fil"</string> @@ -2049,7 +2049,7 @@ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"Personnel"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"Bureau"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"Professionnel"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Affichage personnel"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Affichage professionnel"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Partage impossible avec les applications professionnelles"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 07e14fefd85e..c35b7e6ca0c0 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -2029,7 +2029,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"શેર કરવા માટે સૂચન આપવામાં આવેલા કોઈ લોકો નથી"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"શેર કરવા માટે સુઝાવ આપવામાં આવેલા કોઈ લોકો નથી"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ઍપની સૂચિ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"આ ઍપને રેકૉર્ડ કરવાની પરવાનગી આપવામાં આવી નથી પરંતુ તે આ USB ડિવાઇસ મારફતે ઑડિયો કૅપ્ચર કરી શકે છે."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"હોમ"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ee4741ce1b65..569b284684bf 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1458,7 +1458,7 @@ <string name="gpsVerifYes" msgid="3719843080744112940">"हां"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"नहीं"</string> <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"आपातकालीन स्थिति में जगह की जानकारी ऐक्सेस की गई"</string> - <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"हाल ही में हुए आपातकालीन स्थिति के दौरान, डिवाइस बनाने वाली कंपनी ने आपकी जगह की जानकारी को ऐक्सेस किया"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"हाल ही में आपातकालीन स्थिति के दौरान, डिवाइस बनाने वाली कंपनी ने आपकी जगह की जानकारी को ऐक्सेस किया"</string> <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"हाल ही में आपातकालीन स्थिति के दौरान, मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने आपकी जगह की जानकारी को ऐक्सेस किया"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"हटाने की सीमा पार हो गई"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खाते के <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> आइटम हटा दिए गए हैं. आप क्या करना चाहते हैं?"</string> @@ -1806,7 +1806,7 @@ <item quantity="other">%1$d मिनट के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758"> - <item quantity="one">%1$d घंटों के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item> + <item quantity="one">%1$d घंटे के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item> <item quantity="other">%1$d घंटों के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642"> @@ -1822,7 +1822,7 @@ <item quantity="other">%d मिनट के लिए</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022"> - <item quantity="one">%d घंटों के लिए</item> + <item quantity="one">%d घंटे के लिए</item> <item quantity="other">%d घंटों के लिए</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640"> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b446c2779228..a7ae6862fcdc 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -194,7 +194,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"Uređaj je upravljan"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Vaša organizacija upravlja ovim uređajem i može nadzirati mrežni promet. Dodirnite za pojedinosti."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Aplikacije mogu pristupiti vašoj lokaciji"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Obratite se svojem IT administratoru da biste saznali više"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Obratite se IT administratoru da biste saznali više"</string> <string name="country_detector" msgid="7023275114706088854">"Detektor zemlje"</string> <string name="location_service" msgid="2439187616018455546">"Usluga lokacije"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Usluga Obavijesti senzora"</string> @@ -2063,7 +2063,7 @@ <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nema preporučenih ljudi za dijeljenje"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nema preporučenih osoba za dijeljenje"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Popis aplikacija"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ta aplikacija nema dopuštenje za snimanje, no mogla bi primati zvuk putem ovog USB uređaja."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Početni zaslon"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 441a2ee7ba6e..73c0c0c722ef 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1403,8 +1403,8 @@ <string name="ime_action_default" msgid="8265027027659800121">"Կատարել"</string> <string name="dial_number_using" msgid="6060769078933953531">"Հավաքել հեռախոսահամարը`\nօգտագործելով <xliff:g id="NUMBER">%s</xliff:g>-ը"</string> <string name="create_contact_using" msgid="6200708808003692594">"Ստեղծել կոնտակտ`\nօգտագործելով <xliff:g id="NUMBER">%s</xliff:g>-ը"</string> - <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Հետևյալ մեկ կամ ավել հավելվածներ մուտքի թույլտվության հարցում են անում` այժմ և հետագայում ձեր հաշվին մուտք ունենալու համար:"</string> - <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Ցանկանու՞մ եք թույլատրել այս հարցումը:"</string> + <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Հետևյալ մեկ կամ մի քանի հավելվածներին թույլտվություն է անհրաժեշտ՝ այժմ և հետագայում ձեր հաշվի տվյալներն օգտագործելու համար։"</string> + <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Թույլատրե՞լ"</string> <string name="grant_permissions_header_text" msgid="3420736827804657201">"Մուտքի հարցում"</string> <string name="allow" msgid="6195617008611933762">"Թույլատրել"</string> <string name="deny" msgid="6632259981847676572">"Մերժել"</string> @@ -2029,7 +2029,7 @@ <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Առաջարկվող օգտատերեր չկան, որոնց հետ կարող եք կիսվել"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Չկան օգտատերեր, որոնց հետ կարող եք կիսվել"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Հավելվածների ցանկ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Հավելվածը ձայնագրելու թույլտվություն չունի, սակայն կկարողանա գրանցել ձայնն այս USB սարքի միջոցով։"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Սկիզբ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index b6ff57b11181..338471d89a51 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1458,8 +1458,8 @@ <string name="gpsVerifYes" msgid="3719843080744112940">"Ya"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"Tidak"</string> <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"Lokasi darurat diakses"</string> - <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Operator perangkat mengakses lokasi selama sesi darurat baru-baru ini"</string> - <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operator mengakses lokasi selama sesi darurat baru-baru ini"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"Operator perangkat mengakses lokasi selama sesi darurat yang terjadi baru-baru ini"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"Operator mengakses lokasi selama sesi darurat yang terjadi baru-baru ini"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"Penghapusan melebihi batas"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Terdapat <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> item yang dihapus untuk <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, akun <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. Apa yang ingin Anda lakukan?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"Hapus item"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index f656326a10f4..ed0a6bcbb0ee 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"Il dispositivo è gestito"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Questo dispositivo è gestito dalla tua organizzazione, che potrebbe monitorare il traffico di rete. Tocca per i dettagli."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Le app possono accedere alla tua posizione"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Contatta l\'amministratore IT per avere ulteriori informazioni"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Contatta l\'amministratore IT per saperne di più"</string> <string name="country_detector" msgid="7023275114706088854">"Rilevatore paese"</string> <string name="location_service" msgid="2439187616018455546">"Servizio di geolocalizzazione"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Servizio di notifica dei sensori"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 9c852857cb8e..5dac9b64da10 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1307,7 +1307,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"აღმოჩენილია ანალოგური აუდიო აქსესუარი"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"მიერთებული მოწყობილობა არაა თავსებადი ამ ტელეფონთან. მეტის გასაგებად, შეეხეთ."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB გამართვა შეერთებულია"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"შეეხეთ, რათა გამორთოთ USB შეცდომების გამართვა"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"შეეხეთ და გამორთეთ USB შეცდ. გამართვა"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"მონიშნეთ რათა შეწყვიტოთ USB-ის გამართვა"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"შეცდომების უსადენო გამართვა დაკავშირებულია"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"შეეხეთ შეცდომების უსადენო გამართვის გამოსართავად"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 3b48199e537d..48af34027ed1 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -22,8 +22,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="byteShort" msgid="202579285008794431">"B"</string> <string name="kilobyteShort" msgid="2214285521564195803">"kB"</string> - <string name="megabyteShort" msgid="6649361267635823443">"មេកាបៃ"</string> - <string name="gigabyteShort" msgid="7515809460261287991">"ជីកាបៃ"</string> + <string name="megabyteShort" msgid="6649361267635823443">"MB"</string> + <string name="gigabyteShort" msgid="7515809460261287991">"GB"</string> <string name="terabyteShort" msgid="1822367128583886496">"តេរ៉ាបៃ"</string> <string name="petabyteShort" msgid="5651571254228534832">"PB"</string> <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"ឧបករណ៍ស្ថិតក្រោមការគ្រប់គ្រង"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"ស្ថាប័នរបស់អ្នកគ្រប់គ្រងឧបករណ៍នេះ ហើយអាចនឹងតាមដានចរាចរណ៍បណ្តាញ។ ចុចដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"កម្មវិធីអាចចូលប្រើទីតាំងរបស់អ្នកបាន"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"សូមទាក់ទងអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក ដើម្បីស្វែងយល់បន្ថែម"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"ទាក់ទងអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកដើម្បីស្វែងយល់បន្ថែម"</string> <string name="country_detector" msgid="7023275114706088854">"ឧបករណ៍សម្គាល់ប្រទេស"</string> <string name="location_service" msgid="2439187616018455546">"សេវាកម្មទីតាំង"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"សេវាកម្មជូនដំណឹងឧបករណ៍ចាប់សញ្ញា"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 558b5ef0c1ec..31c723ff8b67 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"Түзмөктү ишкана башкарат"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Ишканаңыз бул түзмөктү башкарат жана тармак трафигин көзөмөлдөшү мүмкүн. Чоо-жайын билгиңиз келсе, таптап коюңуз."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Колдонмолор кайда жүргөнүңүздү көрө алат"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Толук маалымат алуу үчүн IT администраторуңузга кайрылыңыз"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Толук маалыматты IT администраторуңуздан ала аласыз"</string> <string name="country_detector" msgid="7023275114706088854">"Өлкөнү аныктагыч"</string> <string name="location_service" msgid="2439187616018455546">"Жайгашкан жерди аныктоо кызматы"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Сенсордун билдирмелеринин кызматы"</string> @@ -1306,7 +1306,7 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"Туташкан түзмөк кубатталууда. Дагы параметрлерди көрүү үчүн таптап коюңуз."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Аналогдук аудио жабдуу табылды"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Тиркелген түзмөк бул телефонго шайкеш келбейт. Көбүрөөк маалымат алуу үчүн таптап коюңуз."</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"Мүчүлүштүктөрдү USB аркылуу оңдоо иштеп жатат"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"Мүчүлүштүктөр USB аркылуу оңдолууда"</string> <string name="adb_active_notification_message" msgid="5617264033476778211">"Өчүрүү үчүн тийип коюңуз"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB аркылуу мүчүлүштүктөрдү оңдоону өчүрүүнү тандаңыз."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Мүчүлүштүктөрдү зымсыз оңдоо иштетилди"</string> @@ -1623,12 +1623,12 @@ <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Ыкчам иштетесизби?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Атайын мүмкүнчүлүктөр функциясын пайдалануу үчүн ал күйгүзүлгөндө, үндү катуулатып/акырындаткан эки баскычты тең 3 секунддай коё бербей басып туруңуз."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="8417489297036013065">"Атайын мүмкүнчүлүктөр күйгүзүлсүнбү?"</string> - <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Үнүн чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, атайын мүмкүнчүлүктөр күйгүзүлөт. Бул түзмөгүңүздүн ишин өзгөртүшү мүмкүн.\n\nУчурдагы функциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТандалган функцияларды Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн өзгөртө аласыз."</string> + <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Үндү чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, атайын мүмкүнчүлүктөр күйгүзүлөт. Бул түзмөгүңүздүн ишин өзгөртүшү мүмкүн.\n\nУчурдагы функциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТандалган функцияларды Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн өзгөртө аласыз."</string> <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_talkback_warning_title" msgid="3410100187167382427">"TalkBack күйгүзүлсүнбү?"</string> - <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Үнүн чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, TalkBack – азиздерге жана көздөрү начар көргөн адамдарга жардам берген экрандагыны окугуч күйгүзүлөт. TalkBack түзмөгүңүздүн ишин толугу менен өзгөртөт.\n\nБул ыкчам баскычты Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн башка функцияга өзгөртө аласыз."</string> + <string name="accessibility_shortcut_talkback_warning" msgid="8412954203626349109">"Үндү чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, TalkBack – азиздерге жана көздөрү начар көргөн адамдарга жардам берген экрандагыны окугуч күйгүзүлөт. TalkBack түзмөгүңүздүн ишин толугу менен өзгөртөт.\n\nБул ыкчам баскычты Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн башка функцияга өзгөртө аласыз."</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="2819109500943271385">"<xliff:g id="SERVICE">%1$s</xliff:g> күйгүзүлсүнбү?"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Үнүн чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, <xliff:g id="SERVICE">%1$s</xliff:g>, атайын мүмкүнчүлүктөр күйгүзүлөт. Бул түзмөгүңүздүн ишин өзгөртүшү мүмкүн.\n\nБул ыкчам баскычты Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн башка функцияга өзгөртө аласыз."</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Үндү чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып турса, <xliff:g id="SERVICE">%1$s</xliff:g>, атайын мүмкүнчүлүктөр күйгүзүлөт. Бул түзмөгүңүздүн ишин өзгөртүшү мүмкүн.\n\nБул ыкчам баскычты Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн башка функцияга өзгөртө аласыз."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Күйгүзүлсүн"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"Күйгүзүлбөсүн"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> кызматына түзмөгүңүздү толугу менен көзөмөлдөөгө уруксат бересизби?"</string> @@ -1650,8 +1650,8 @@ <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Кыска жолду колдонуу"</string> <string name="color_inversion_feature_name" msgid="326050048927789012">"Түстү инверсиялоо"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"Түсүн тууралоо"</string> - <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Үн деңгээлинин баскычтарын басып туруңуз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> күйгүзүлдү."</string> - <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Үн деңгээлинин баскычтарын басып туруңуз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> өчүрүлдү."</string> + <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Үндү катуулатуу/акырындатуу баскычтарын басып туруңуз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> күйгүзүлдү."</string> + <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Үндү катуулатуу/акырындатуу баскычтарын басып туруңуз. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> өчүрүлдү."</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз"</string> <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:"</string> <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):"</string> @@ -2029,7 +2029,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Бөлүшүү үчүн байланыштар сунушталган жок"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Бөлүшкөнгө эч ким сунушталган жок"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Колдонмолордун тизмеси"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Бул колдонмонун жаздырууга уруксаты жок, бирок бул USB түзмөгү аркылуу аудиону жаздыра алат."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Башкы бет"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 3c76caf408a0..4d88c993d256 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) അഭ്യർത്ഥിച്ചത്"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"വേണം"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"വേണ്ട"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"അടിയന്തര ലൊക്കേഷൻ ആക്സസ് ചെയ്തു"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"സമീപകാലത്തുണ്ടായ ഒരു അടിയന്തര സെഷനിടെ ഉപകരണ നിർമ്മാതാവ് നിങ്ങളുടെ ലൊക്കേഷൻ ആക്സസ് ചെയ്തു"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"സമീപകാലത്തുണ്ടായ ഒരു അടിയന്തര സെഷനിടെ സേവനദാതാവ് നിങ്ങളുടെ ലൊക്കേഷൻ ആക്സസ് ചെയ്തു"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"ഇല്ലാതാക്കൽ പരിധി കഴിഞ്ഞു"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> എന്ന അക്കൗണ്ടിലെ <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> എന്നതിനായി ഇല്ലാതാക്കിയ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ഇനങ്ങളുണ്ട്. നിങ്ങൾ എന്തുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"ഇനങ്ങൾ ഇല്ലാതാക്കുക"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 518724597c4c..c46cb8d97527 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारे विनंती केली"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"होय"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"नाही"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"आणीबाणी स्थान अॅक्सेस केले आहे"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"अलीकडील आणीबाणी सेशनदरम्यान तुमच्या डिव्हाइस निर्मात्याने तुमचे स्थान अॅक्सेस केले आहे"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"अलीकडील आणीबाणी सेशनदरम्यान तुमच्या वाहकाने तुमचे स्थान अॅक्सेस केले आहे"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"ओलांडलेली मर्यादा हटवा"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खात्यासाठी <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> हटविलेले आयटम आहेत. तुम्ही काय करू इच्छिता?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"आयटम हटवा"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index c42b4d5e31db..81115f835f8f 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -185,7 +185,7 @@ <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"तपाईंको कार्य प्रोफाइलका प्रशासकद्वारा"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारा"</string> <string name="work_profile_deleted" msgid="5891181538182009328">"कार्य प्रोफाइल मेटियो"</string> - <string name="work_profile_deleted_details" msgid="3773706828364418016">"उक्त कार्य प्रोफाइलको प्रशासकीय अनुप्रयोग छैन वा बिग्रेको छ। त्यसले गर्दा, तपाईंको कार्य प्रोफाइल र सम्बन्धित डेटालाई मेटिएको छ। सहायताका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="work_profile_deleted_details" msgid="3773706828364418016">"उक्त कार्य प्रोफाइलको प्रशासकीय एप छैन वा बिग्रेको छ। त्यसले गर्दा, तपाईंको कार्य प्रोफाइल र सम्बन्धित डेटालाई मेटिएको छ। सहायताका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"तपाईंको कार्य प्रोफाइल अब उप्रान्त यस यन्त्रमा उपलब्ध छैन"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"पासवर्ड प्रविष्ट गर्ने अत्यधिक गलत प्रयासहरू भए"</string> <string name="device_ownership_relinquished" msgid="4080886992183195724">"व्यवस्थापकले यन्त्रलाई व्यक्तिगत प्रयोगका लागि अस्वीकार गर्नुभयो"</string> @@ -198,11 +198,11 @@ <string name="sensor_notification_service" msgid="7474531979178682676">"सेन्सरको सूचनासम्बन्धी सेवा"</string> <string name="twilight_service" msgid="8964898045693187224">"ट्वाइलाइट सेवा"</string> <string name="factory_reset_warning" msgid="6858705527798047809">"तपाईंको यन्त्र मेटिनेछ"</string> - <string name="factory_reset_message" msgid="2657049595153992213">"प्रशासकको अनुप्रयोग प्रयोग गर्न मिल्दैन। तपाईंको यन्त्रको डेटा अब मेटाइने छ।\n\nतपाईंसँग प्रश्नहरू भएका खण्डमा आफ्नो संगठनका प्रशासकसँग सम्पर्क गर्नुहोस्।"</string> + <string name="factory_reset_message" msgid="2657049595153992213">"प्रशासकको एप प्रयोग गर्न मिल्दैन। तपाईंको यन्त्रको डेटा अब मेटाइने छ।\n\nतपाईंसँग प्रश्नहरू भएका खण्डमा आफ्नो संगठनका प्रशासकसँग सम्पर्क गर्नुहोस्।"</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ले छाप्ने कार्यलाई असक्षम पार्यो।"</string> <string name="personal_apps_suspended_title" msgid="4543693107104417750">"आफ्ना व्यक्तिगत एपमाथिको रोक हटाउनु"</string> <string name="personal_apps_suspended_tomorrow_title" msgid="6414440257969874914">"भोलि एपहरूलाई रोक लगाइने छ"</string> - <string name="personal_apps_suspended_text" msgid="8954038765131038226">"तपाईंका IT प्रशासकले तपाईंको कार्यसम्बन्धी प्रोफाइल <xliff:g id="DAYS">%1$d</xliff:g> दिनभन्दा बढी पज गर्ने अनुमति दिनुभएको छैन"</string> + <string name="personal_apps_suspended_text" msgid="8954038765131038226">"तपाईंका IT एडमिनले तपाईंको कार्यसम्बन्धी प्रोफाइल <xliff:g id="DAYS">%1$d</xliff:g> दिनभन्दा बढी पज गर्ने अनुमति दिनुभएको छैन"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"कार्यसम्बन्धी प्रोफाइल सक्रिय गर्नुहोस्"</string> <string name="me" msgid="6207584824693813140">"मलाई"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"ट्याब्लेट विकल्पहरू"</string> @@ -231,7 +231,7 @@ <string name="reboot_safemode_title" msgid="5853949122655346734">"सुरक्षित मोडमा पुनःबुट गर्नुहोस्"</string> <string name="reboot_safemode_confirm" msgid="1658357874737219624">"सुरक्षित मोडमा तपाईं पुनःबुट गर्न चाहनु हुन्छ? तपाईंले स्थापना गरेका सबै तेस्रो पक्षका अनुप्रयोगहरूलाई असक्षम गराउने छ।"</string> <string name="recent_tasks_title" msgid="8183172372995396653">"नयाँ"</string> - <string name="no_recent_tasks" msgid="9063946524312275906">"कुनै नयाँ अनुप्रयोगहरू छैनन्।"</string> + <string name="no_recent_tasks" msgid="9063946524312275906">"कुनै नयाँ एपहरू छैनन्।"</string> <string name="global_actions" product="tablet" msgid="4412132498517933867">"ट्याब्लेट विकल्पहरू"</string> <string name="global_actions" product="tv" msgid="3871763739487450369">"Android TV सम्बन्धी विकल्पहरू"</string> <string name="global_actions" product="default" msgid="6410072189971495460">"फोन विकल्पहरू"</string> @@ -283,7 +283,7 @@ <string name="notification_channel_alerts" msgid="5070241039583668427">"अलर्टहरू"</string> <string name="notification_channel_retail_mode" msgid="3732239154256431213">"खुद्रा बिक्री सम्बन्धी डेमो"</string> <string name="notification_channel_usb" msgid="1528280969406244896">"USB जडान"</string> - <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"अनुप्रयोग चलिरहेको छ"</string> + <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"एप चलिरहेको छ"</string> <string name="notification_channel_foreground_service" msgid="7102189948158885178">"अनुप्रयोगहरूले ब्याट्री खपत गर्दै छन्"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले ब्याट्री प्रयोग गर्दै छ"</string> <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> अनुप्रयोगहरूले ब्याट्री प्रयोग गर्दै छन्"</string> @@ -331,7 +331,7 @@ <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेको स्क्रिनसट लिन सकिन्छ।"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"स्थिति पट्टिलाई अक्षम वा संशोधित गर्नुहोस्"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन अनुप्रयोगलाई अनुमति दिन्छ।"</string> - <string name="permlab_statusBarService" msgid="2523421018081437981">"वस्तुस्थिति पट्टी हुन दिनुहोस्"</string> + <string name="permlab_statusBarService" msgid="2523421018081437981">"स्टाटस बार हुन दिनुहोस्"</string> <string name="permdesc_statusBarService" msgid="6652917399085712557">"अनुप्रयोगलाई स्थिति पट्टि हुन अनुमति दिन्छ।"</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"स्थिति पट्टिलाई विस्तृत/सङ्कुचित गर्नुहोस्"</string> <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"अनुप्रयोगलाई स्थिति पट्टि विस्तार वा संकुचन गर्न अनुमति दिन्छ।"</string> @@ -361,7 +361,7 @@ <string name="permdesc_readSms" product="default" msgid="774753371111699782">"यस अनुप्रयोगले तपाईंको फोनमा भण्डारण गरिएका सबै SMS (पाठ) सन्देशहरू पढ्न सक्छ।"</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"पाठ सन्देशहरू (WAP) प्राप्त गर्नुहोस्"</string> <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP सन्देशहरू प्राप्त गर्न र प्रशोधन गर्न अनुप्रयोगलाई अनुमति दिन्छ। यो अनुमतिमा मोनिटर गर्ने वा तपाईँलाई पठाइएका सन्देशहरू तपाईँलाई नदेखाई मेट्ने क्षमता समावेश हुन्छ।"</string> - <string name="permlab_getTasks" msgid="7460048811831750262">"चलिरहेका अनुप्रयोगहरू पुनःबहाली गर्नुहोस्"</string> + <string name="permlab_getTasks" msgid="7460048811831750262">"चलिरहेका एपहरू पुनःबहाली गर्नुहोस्"</string> <string name="permdesc_getTasks" msgid="7388138607018233726">"वर्तमानमा र भरखरै चलिरहेका कार्यहरू बारेको सूचना पुनःबहाली गर्न अनुप्रयोगलाई अनुमित दिन्छ। यसले उपकरणमा प्रयोग भएका अनुप्रयोगहरूको बारेमा सूचना पत्ता लगाउन अनुप्रयोगलाई अनुमति दिन सक्छ।"</string> <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"प्रोफाइल र यन्त्र मालिकहरूको व्यवस्थापन गराउनुहोस्"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"अनुप्रयोगहरूलाई प्रोफाइल र यन्त्र मालिकहरू सेट गर्न अनुमति दिनुहोस्।"</string> @@ -369,27 +369,27 @@ <string name="permdesc_reorderTasks" msgid="8796089937352344183">"कामहरूलाई अग्रभाग र पृष्ठभूमिमा सार्न अनुप्रयोगलाई अनुमति दिन्छ। अनुप्रयोगले यो तपाईँको इनपुट बिना नै गर्न सक्छ।"</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"कार मोड सक्षम गर्नुहोस्"</string> <string name="permdesc_enableCarMode" msgid="56419168820473508">"कार मोडलाई सक्षम पार्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> - <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"अनुप्रयोगहरू बन्द गर्नुहोस्"</string> + <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"एपहरू बन्द गर्नुहोस्"</string> <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"अनुप्रयोगलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य अनुप्रयोगहरूलाई चल्नबाट रोक्न सक्दछ।"</string> - <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"यो अनुप्रयोग अन्य अनुप्रयोगहरूमाथि देखा पर्न सक्छ"</string> - <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"यो अनुप्रयोग अन्य अनुप्रयोगहरूमाथि वा स्क्रिनका अन्य भागहरूमा देखा पर्न सक्छ। यसले अनुप्रयोगको सामान्य प्रयोगमा अवरोध पुर्याउन सक्छ र अन्य अनुप्रयोगहरू देखा पर्ने तरिकालाई परिवर्तन गर्न सक्छ।"</string> + <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"यो एप अन्य एपहरूमाथि देखा पर्न सक्छ"</string> + <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"यो एप अन्य एपहरूमाथि वा स्क्रिनका अन्य भागहरूमा देखा पर्न सक्छ। यसले एपको सामान्य प्रयोगमा अवरोध पुर्याउन सक्छ र अन्य एपहरू देखा पर्ने तरिकालाई परिवर्तन गर्न सक्छ।"</string> <string name="permlab_runInBackground" msgid="541863968571682785">"पृष्ठभूमिमा चलाउनुहोस्"</string> - <string name="permdesc_runInBackground" msgid="4344539472115495141">"यो अनुप्रयोग पृष्ठभूमिमा चल्न सक्छ। यसले गर्दा छिट्टै ब्याट्रीको खपत हुनसक्छ।"</string> + <string name="permdesc_runInBackground" msgid="4344539472115495141">"यो एप पृष्ठभूमिमा चल्न सक्छ। यसले गर्दा छिट्टै ब्याट्रीको खपत हुनसक्छ।"</string> <string name="permlab_useDataInBackground" msgid="783415807623038947">"पृष्ठभूमिमा डेटा प्रयोग गर्नुहोस्"</string> <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"यो अनुप्रयोगले पृष्ठभूमिमा डेटा प्रयोग गर्नसक्छ। यसले गर्दा धेरै डेटा प्रयोग हुनसक्छ।"</string> - <string name="permlab_persistentActivity" msgid="464970041740567970">"अनुप्रयोगहरू जहिले पनि चल्ने बनाउनुहोस्"</string> + <string name="permlab_persistentActivity" msgid="464970041740567970">"एपहरू जहिले पनि चल्ने बनाउनुहोस्"</string> <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि अनुप्रयोगलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य अनुप्रयोगहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string> <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"अनुप्रयोगलाई आफ्ना केही अंशहरू मेमोरीमा स्थायी रूपमा राख्ने अनुमति दिन्छ। यसले गर्दा अन्य अनुप्रयोगहरूका लागि मेमोरीको अभाव हुन सक्ने भएकाले तपाईंको Android TV यन्त्र सुस्त हुन सक्छ।"</string> <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"अनुप्रयोगलाई मेमोरीमा आफैंको निरन्तरको अंश बनाउन अनुमति दिन्छ। यसले फोनलाई ढिला बनाएर अन्य अनुप्रयोगहरूमा मेमोरी SIMित गर्न सक्दछन्।"</string> <string name="permlab_foregroundService" msgid="1768855976818467491">"अग्रभूमिको सेवा सञ्चालन गर्नुहोस्"</string> <string name="permdesc_foregroundService" msgid="8720071450020922795">"अनुप्रयोगलाई अग्रभूमिका सेवाहरू प्रयोग गर्ने अनुमति दिन्छ।"</string> - <string name="permlab_getPackageSize" msgid="375391550792886641">"अनुप्रयोग भण्डारण ठाउँको मापन गर्नुहोस्"</string> + <string name="permlab_getPackageSize" msgid="375391550792886641">"एप भण्डारण ठाउँको मापन गर्नुहोस्"</string> <string name="permdesc_getPackageSize" msgid="742743530909966782">"अनुप्रयोगलाई यसको कोड, डेटा, र क्यास आकारहरू पुनःप्राप्त गर्न अनुमति दिन्छ।"</string> <string name="permlab_writeSettings" msgid="8057285063719277394">"प्रणाली सेटिङहरू परिमार्जन गर्नुहोस्"</string> <string name="permdesc_writeSettings" msgid="8293047411196067188">"प्रणालीका सेटिङ डेटालाई परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले सायद तपाईँको प्रणालीको कन्फिगरेसनलाई क्षति पुर्याउन सक्छन्।"</string> <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"स्टार्टअपमा चलाउनुहोस्"</string> <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"आनुप्रयोगलाई प्रणाली बुट प्रक्रिया पूर्ण हुने बितिकै आफैलाई सुरु गर्ने अनुमति दिन्छ। यसले ट्याब्लेट सुरु गर्नमा ढिला गर्न सक्दछ र अनुप्रयोगलाई समग्रमा ट्याब्लेट सधैँ चालु गरेर ढिला बनाउँदछ।"</string> - <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"अनुप्रयोगलाई प्रणाली बुट हुने बित्तिकै स्वत: सुरु हुने अनुमति दिन्छ। यसो गर्दा अनुप्रयोग सधैँ चलिरहने भएकाले तपाईंको Android TV यन्त्र सुरु हुन बढी समय लाग्नुका साथै यन्त्रको समग्र कार्यसम्पादन सुस्त हुन सक्छ।"</string> + <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"एपलाई प्रणाली बुट हुने बित्तिकै स्वत: सुरु हुने अनुमति दिन्छ। यसो गर्दा एप सधैँ चलिरहने भएकाले तपाईंको Android TV यन्त्र सुरु हुन बढी समय लाग्नुका साथै यन्त्रको समग्र कार्यसम्पादन सुस्त हुन सक्छ।"</string> <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"अनुप्रयोगलाई प्रणाली बुट गरी सकेपछि जति सक्दो चाँडो आफैंमा सुरु गर्न अनुमति दिन्छ। यसले फोन सुरु गर्नमा ढिला गर्न सक्दछ र अनप्रयोगलाई समग्रमा फोन सधैँ चालु गरेर ढिला बनाउँदछ।"</string> <string name="permlab_broadcastSticky" msgid="4552241916400572230">"स्टिकि प्रसारण पठाउनुहोस्"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"औपचारिक प्रसारणलाई पठाउनको लागि एउटा अनुप्रयोगलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले ट्याब्लेटलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> @@ -410,7 +410,7 @@ <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको आगमन र बहिर्गमन कलसम्बन्धी डेटासहित कल लग परिमार्जन गर्ने अनुमति दिन्छ। हानिकारक अनुप्रयोगहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्छन्।"</string> <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"अनुप्रयोगलाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमार्जन गर्न अनुमति दिन्छ। खराब अनुप्रयोगहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्दछ।"</string> <string name="permlab_bodySensors" msgid="3411035315357380862">"शरीरका सेन्सरहरूमा पहुँच गराउनुहोस् (जस्तै हृदय धड्कन निगरानीहरू)"</string> - <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"तपाईँको हृदय गति जस्तो सेंसर बाट डेटा पहुँचको लागि अनुप्रयोग अनुमति दिन्छ जसले तपाईँको भौतिक अवस्था अनुगमन गर्छ।"</string> + <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"तपाईँको हृदय गति जस्तो सेंसर बाट डेटा पहुँचको लागि एप अनुमति दिन्छ जसले तपाईँको भौतिक अवस्था अनुगमन गर्छ।"</string> <string name="permlab_readCalendar" msgid="6408654259475396200">"पात्रोका कार्यक्रम र विवरणहरू पढ्ने"</string> <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"यस अनुप्रयोगले तपाईंको ट्याब्लेटमा भण्डारण गरिएका पात्रो सम्बन्धी सबै कार्यक्रमहरू पढ्न र तपाईंको पात्रोको डेटा आदान प्रदान वा सुरक्षित गर्न सक्छ।"</string> <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"यस अनुप्रयोगले तपाईंको Android TV यन्त्रमा भण्डार गरिएका पात्रोसम्बन्धी सबै कार्यक्रमहरू पढ्न र तपाईंको पात्रोको डेटा आदान प्रदान वा सुरक्षित गर्न सक्छ।"</string> @@ -422,11 +422,11 @@ <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"अधिक स्थान प्रदायक आदेशहरू पहुँच गर्नुहोस्"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"अनुप्रयोगलाई अतिरिक्त स्थान प्रदायक आदेशहरू पहुँच गर्न अनुमति दिन्छ। यो अनुप्रयोगलाई GPS वा अन्य स्थान स्रोतहरूको संचालन साथै हस्तक्षेप गर्न अनुमति दिन सक्छ।"</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"अग्रभूमिमा मात्र सटीक स्थानमाथि पहुँच राख्नुहोस्"</string> - <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"यो अनुप्रयोग चलाएका बेला यसले स्थानसम्बन्धी सेवाहरूबाट तपाईंको स्थानको सटीक जानकारी प्राप्त गर्न सक्छ। तपाईंको यन्त्रमा स्थानसम्बन्धी सेवाहरू सक्रिय गरिएको छ भने मात्र यो अनुप्रयोगले स्थानको जानकारी प्राप्त गर्न सक्छ। यसले ब्याट्रीको उपयोग बढाउन सक्छ।"</string> + <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"यो एप चलाएका बेला यसले स्थानसम्बन्धी सेवाहरूबाट तपाईंको स्थानको सटीक जानकारी प्राप्त गर्न सक्छ। तपाईंको यन्त्रमा स्थानसम्बन्धी सेवाहरू सक्रिय गरिएको छ भने मात्र यो एपले स्थानको जानकारी प्राप्त गर्न सक्छ। यसले ब्याट्रीको उपयोग बढाउन सक्छ।"</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"अग्रभागमा मात्र अनुमानित स्थानमाथि पहुँच राख्नुहोस्"</string> - <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"यो अनुप्रयोग चलाएका बेला यसले स्थानसम्बन्धी सेवाहरूबाट तपाईंको स्थानको अनुमानित जानकारी प्राप्त गर्न सक्छ। तपाईंको यन्त्रमा स्थानसम्बन्धी सेवाहरू सक्रिय गरिएको छ भने मात्र यो अनुप्रयोगले स्थानको जानकारी प्राप्त गर्न सक्छ।"</string> + <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"यो एप चलाएका बेला यसले स्थानसम्बन्धी सेवाहरूबाट तपाईंको स्थानको अनुमानित जानकारी प्राप्त गर्न सक्छ। तपाईंको यन्त्रमा स्थानसम्बन्धी सेवाहरू सक्रिय गरिएको छ भने मात्र यो एपले स्थानको जानकारी प्राप्त गर्न सक्छ।"</string> <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"पृष्ठभूमिमा स्थानसम्बन्धी पहुँच"</string> - <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"यो अनुप्रयोगले जुनसुकै बेला (अनुप्रयोग नचलाएका बेलामा पनि) स्थानमाथि पहुँच राख्न सक्छ।"</string> + <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"यो एपले जुनसुकै बेला (एप नचलाएका बेलामा पनि) स्थानमाथि पहुँच राख्न सक्छ।"</string> <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string> <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै भोल्युम र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string> <string name="permlab_recordAudio" msgid="1208457423054219147">"अडियो रेकर्ड गर्नुहोस्"</string> @@ -437,9 +437,9 @@ <string name="permdesc_activityRecognition" msgid="8667484762991357519">"यो अनुप्रयोगले तपाईंको शारीरिक गतिविधिको पहिचान गर्न सक्छ।"</string> <string name="permlab_camera" msgid="6320282492904119413">"तस्बिरहरू र भिडियोहरू लिनुहोस्।"</string> <string name="permdesc_camera" msgid="1354600178048761499">"यस अनुप्रयोगले जुनसुकै समय क्यामेराको प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ।"</string> - <string name="permlab_systemCamera" msgid="3642917457796210580">"अनुप्रयोग वा सेवालाई तस्बिर र भिडियो खिच्न प्रणालीका क्यामेराहरूमाथि पहुँच राख्न दिनुहोस्"</string> + <string name="permlab_systemCamera" msgid="3642917457796210580">"एप वा सेवालाई तस्बिर र भिडियो खिच्न प्रणालीका क्यामेराहरूमाथि पहुँच राख्न दिनुहोस्"</string> <string name="permdesc_systemCamera" msgid="5938360914419175986">"प्रणालीको यस विशेषाधिकार प्राप्त अनुप्रयोगले जुनसुकै बेला प्रणालीको क्यामेरा प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ। अनुप्रयोगसँग पनि android.permission.CAMERA प्रयोग गर्ने अनुमति हुनु पर्छ"</string> - <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"कुनै अनुप्रयोग वा सेवालाई खोलिँदै वा बन्द गरिँदै गरेका क्यामेरा यन्त्रहरूका बारेमा कलब्याक प्राप्त गर्ने अनुमति दिनुहोस्।"</string> + <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"कुनै एप वा सेवालाई खोलिँदै वा बन्द गरिँदै गरेका क्यामेरा यन्त्रहरूका बारेमा कलब्याक प्राप्त गर्ने अनुमति दिनुहोस्।"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"कुनै क्यामेरा यन्त्र खोलिँदा (कुन अनुप्रयोगले खोलेको भन्ने बारेमा) वा बन्द गरिँदा यो अनुप्रयोगले कलब्याक प्राप्त गर्न सक्छ।"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"कम्पन नियन्त्रण गर्नुहोस्"</string> <string name="permdesc_vibrate" msgid="8733343234582083721">"अनुप्रयोगलाई भाइब्रेटर नियन्त्रण गर्न अनुमति दिन्छ।"</string> @@ -469,9 +469,9 @@ <string name="permdesc_wakeLock" product="tv" msgid="2329298966735118796">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रलाई शयन अवस्थामा जानबाट रोक्ने अनुमति दिन्छ।"</string> <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"फोनलाई निस्क्रिय हुनबाट रोक्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> <string name="permlab_transmitIr" msgid="8077196086358004010">"infrared ट्रान्समिट गर्नुहोस्"</string> - <string name="permdesc_transmitIr" product="tablet" msgid="5884738958581810253">"ट्याबलेटको infrared transmitter प्रयोगको लागि अनुप्रयोग अनुमति दिन्छ।"</string> + <string name="permdesc_transmitIr" product="tablet" msgid="5884738958581810253">"ट्याबलेटको infrared transmitter प्रयोगको लागि एप अनुमति दिन्छ।"</string> <string name="permdesc_transmitIr" product="tv" msgid="3278506969529173281">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको इन्फ्रारेड ट्रान्समिटर प्रयोग गर्ने अनुमति दिन्छ।"</string> - <string name="permdesc_transmitIr" product="default" msgid="8484193849295581808">"फोनको infrared transmitter प्रयोगको लागि अनुप्रयोग अनुमति दिन्छ।"</string> + <string name="permdesc_transmitIr" product="default" msgid="8484193849295581808">"फोनको infrared transmitter प्रयोगको लागि एप अनुमति दिन्छ।"</string> <string name="permlab_setWallpaper" msgid="6959514622698794511">"वालपेपर सेट गर्नुहोस्"</string> <string name="permdesc_setWallpaper" msgid="2973996714129021397">"अनुप्रयोगलाई प्रणाली वालपेपर सेट गर्न अनुमति दिन्छ।"</string> <string name="permlab_setWallpaperHints" msgid="1153485176642032714">"तपाईंको वालपेपर आकार समायोजन गर्नुहोस्"</string> @@ -612,7 +612,7 @@ </string-array> <string name="face_icon_content_description" msgid="465030547475916280">"अनुहारको आइकन"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"समीकरण सेटिङहरू पढ्नुहोस्"</string> - <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"अनुप्रयोगलाई खाताको लागि सिंक सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको अनुप्रयोग खातासँग सिंक भएको नभएको निर्धारण गर्न सक्दछ।"</string> + <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"एपलाई खाताको लागि सिंक सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको एप खातासँग सिंक भएको नभएको निर्धारण गर्न सक्दछ।"</string> <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"टगल सिंक खुला र बन्द"</string> <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"अनुप्रयोगहरूलाई खाताको लागि सिंक सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ। उदाहरणको लागि, यो खातासँग व्यक्ति अनुप्रयोगको सिंक सक्षम गर्न प्रयोग गर्न सकिन्छ।"</string> <string name="permlab_readSyncStats" msgid="3747407238320105332">"सिंक तथ्याङ्कहरू पढ्नुहोस्"</string> @@ -638,7 +638,7 @@ <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"नेटवर्क उपयोगको इतिहास पढ्नुहोस्"</string> <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"निश्चित नेटवर्कहरू र अनुप्रयोगहरूको लागि ऐतिहासिक नेटवर्क उपयोग पढ्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"नेटवर्क नीति प्रबन्ध गर्नुहोस्"</string> - <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"नेटवर्क नीतिहरू व्यवस्थापन गर्न र अनुप्रयोग-विशेष नियमहरू परिभाषित गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"नेटवर्क नीतिहरू व्यवस्थापन गर्न र एप-विशेष नियमहरू परिभाषित गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"नेटवर्क उपयोग लेखालाई परिमार्जन गर्नुहोस्"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"अनुप्रयोगलाई कसरी अनुप्रयोगहरूको विरूद्धमा कसरी नेटवर्क उपयोगी अकाउन्टेड छ भनेर परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूद्वारा प्रयोगको लागि होइन।"</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"सूचनाहरू पहुँच गर्नुहोस्"</string> @@ -649,8 +649,8 @@ <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"सर्त प्रदायक सेवाको माथिल्लो स्तरको इन्टरफेसमा जोड्न बाहकलाई अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string> <string name="permlab_bindDreamService" msgid="4776175992848982706">"सपना सेवामा बाँध्नुहोस्"</string> <string name="permdesc_bindDreamService" msgid="9129615743300572973">"होल्डरलाई सपना सेवाको माथिल्लो स्तरको इन्टरफेसमा बाँध्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string> - <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"वाहक-प्रदान विन्यास अनुप्रयोग सुरु गर्नुहोस्"</string> - <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"प्रयोगकर्तालाई वाहक-प्रदान विन्यास अनुप्रयोग सुरु गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string> + <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"वाहक-प्रदान विन्यास एप सुरु गर्नुहोस्"</string> + <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"प्रयोगकर्तालाई वाहक-प्रदान विन्यास एप सुरु गर्न अनुमति दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string> <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"सञ्जाल अवस्थाका पर्यवेक्षणका लागि सुन्नुहोस्"</string> <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"सञ्जाल अवस्थाका पर्यवेक्षण सुन्नका लागि अनुप्रयोगलाई अनुमति दिन्छ।सामान्य अनुप्रयोगलाई चाँहिदै नचाँहिन सक्छ।"</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"इनपुट उपकरण क्यालिब्रेसन परिवर्तन गर्नुहोस्"</string> @@ -813,7 +813,7 @@ <string name="sipAddressTypeHome" msgid="5918441930656878367">"गृह"</string> <string name="sipAddressTypeWork" msgid="7873967986701216770">"काम गर्नुहोस्"</string> <string name="sipAddressTypeOther" msgid="6317012577345187275">"अन्य"</string> - <string name="quick_contacts_not_available" msgid="1262709196045052223">"यो सम्पर्क हेर्न कुनै पनि अनुप्रयोग फेला परेन।"</string> + <string name="quick_contacts_not_available" msgid="1262709196045052223">"यो सम्पर्क हेर्न कुनै पनि एप फेला परेन।"</string> <string name="keyguard_password_enter_pin_code" msgid="6401406801060956153">"PIN कोड टाइप गर्नुहोस्"</string> <string name="keyguard_password_enter_puk_code" msgid="3112256684547584093">"PUK र नयाँ PIN कोड टाइप गर्नुहोस्"</string> <string name="keyguard_password_enter_puk_prompt" msgid="2825313071899938305">"PUK कोड"</string> @@ -955,7 +955,7 @@ <string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"वेब बुकमार्कहरू र इतिहास लेख्नुहोस्"</string> <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"अनुप्रयोगलाई तपाईंको ट्याब्लेटमा भण्डार गरिएको ब्राउजरको इतिहास वा बुकमार्कहरू परिमार्जन गर्न अनुमति दिन्छ। यसले अनुप्रयोगलाई ब्राजर डेटा मेटाउन वा परिमार्जन गर्न अनुमति दिन सक्दछ। टिप्पणी: यो अनुमति वेब ब्राउज गर्ने क्षमताहरूको साथ तेस्रो-पार्टी ब्राउजर वा अन्य अनुप्रयोगहरूद्वारा लागू गरिएको होइन।"</string> <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रमा भण्डार गरिएका ब्राउजरको इतिहास र पुस्तक चिन्हहरू परिमार्जन गर्ने अनुमति दिन्छ। यसले अनुप्रयोगलाई ब्राउजरको डेटा मेटाउने वा परिमार्जन गर्ने अनुमति दिन सक्छ। ध्यान दिनुहोस्: तेस्रो पक्षीय ब्राउजर वा वेब ब्राउज गर्ने सुविधा प्रदान गर्ने अन्य अनुप्रयोगहरूले यो अनुमति लागू गर्न सक्दैनन्।"</string> - <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"तपाईँको फोनमा भण्डारण भएको ब्राउजरको इतिहास वा बुकमार्कहरू परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। यसले सायद ब्राउजर डेटालाई मेट्न वा परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। नोट: वेब ब्राउज गर्ने क्षमतासहितका अन्य अनुप्रयोगहरू वा तेस्रो- पक्ष ब्राउजरद्वारा सायद यस अनुमतिलाई लागु गर्न सकिंदैन।"</string> + <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"तपाईँको फोनमा भण्डारण भएको ब्राउजरको इतिहास वा बुकमार्कहरू परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। यसले सायद ब्राउजर डेटालाई मेट्न वा परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। नोट: वेब ब्राउज गर्ने क्षमतासहितका अन्य एपहरू वा तेस्रो- पक्ष ब्राउजरद्वारा सायद यस अनुमतिलाई लागु गर्न सकिंदैन।"</string> <string name="permlab_setAlarm" msgid="1158001610254173567">"एउटा आलर्म सेट गर्नुहोस्"</string> <string name="permdesc_setAlarm" msgid="2185033720060109640">"स्थापना गरिएको सङ्केत घडी अनुप्रयोगमा सङ्केत समय मिलाउन अनुप्रयोगलाई अनुमति दिन्छ। केही सङ्केत घडी अनुप्रयोगहरूले यो सुविधा कार्यान्वयन नगर्न सक्छन्।"</string> <string name="permlab_addVoicemail" msgid="4770245808840814471">"भ्वाइसमेल थप गर्नुहोस्"</string> @@ -1142,23 +1142,23 @@ <!-- no translation found for whichEditApplicationNamed (8096494987978521514) --> <skip /> <string name="whichEditApplicationLabel" msgid="1463288652070140285">"सम्पादन गर्नुहोस्"</string> - <string name="whichSendApplication" msgid="4143847974460792029">"आदान प्रदान गर्नुहोस्"</string> - <string name="whichSendApplicationNamed" msgid="4470386782693183461">"%1$s सँग साझेदारी गर्नुहोस्"</string> - <string name="whichSendApplicationLabel" msgid="7467813004769188515">"साझेदारी गर्नुहोस्"</string> + <string name="whichSendApplication" msgid="4143847974460792029">"सेयर गर्नुहोस्"</string> + <string name="whichSendApplicationNamed" msgid="4470386782693183461">"%1$s सँग सेयर गर्नुहोस्"</string> + <string name="whichSendApplicationLabel" msgid="7467813004769188515">"सेयर गर्नुहोस्"</string> <string name="whichSendToApplication" msgid="77101541959464018">"यसको प्रयोग गरी पठाउनुहोस्"</string> <string name="whichSendToApplicationNamed" msgid="3385686512014670003">"%1$s को प्रयोग गरी पठाउनुहोस्"</string> <string name="whichSendToApplicationLabel" msgid="3543240188816513303">"पठाउनुहोस्"</string> - <string name="whichHomeApplication" msgid="8276350727038396616">"गृह अनुप्रयोग चयन गर्नुहोस्"</string> + <string name="whichHomeApplication" msgid="8276350727038396616">"गृह एप चयन गर्नुहोस्"</string> <string name="whichHomeApplicationNamed" msgid="5855990024847433794">"%1$s लाई गृहको रूपमा प्रयोग गर्नुहोस्"</string> <string name="whichHomeApplicationLabel" msgid="8907334282202933959">"छविलाई कैंद गर्नुहोस्"</string> <string name="whichImageCaptureApplication" msgid="2737413019463215284">"यस मार्फत छविलाई कैंद गर्नुहोस्"</string> <string name="whichImageCaptureApplicationNamed" msgid="8820702441847612202">"%1$s मार्फत छविलाई कैंद गर्नुहोस्"</string> <string name="whichImageCaptureApplicationLabel" msgid="6505433734824988277">"छविलाई कैंद गर्नुहोस्"</string> <string name="alwaysUse" msgid="3153558199076112903">"यस कार्यको लागि पूर्वनिर्धारितबाट प्रयोग गर्नुहोस्।"</string> - <string name="use_a_different_app" msgid="4987790276170972776">"फरक अनुप्रयोग प्रयोग गर्नुहोस्"</string> - <string name="clearDefaultHintMsg" msgid="1325866337702524936">"प्रणाली सेटिङहरूमा पूर्वनिर्धारितलाई हटाउनुहोस् > अनुप्रयोगहरू > डाउनलोड।"</string> + <string name="use_a_different_app" msgid="4987790276170972776">"फरक एप प्रयोग गर्नुहोस्"</string> + <string name="clearDefaultHintMsg" msgid="1325866337702524936">"प्रणाली सेटिङहरूमा पूर्वनिर्धारितलाई हटाउनुहोस् > एपहरू > डाउनलोड।"</string> <string name="chooseActivity" msgid="8563390197659779956">"एउटा कार्यको चयन गर्नुहोस्"</string> - <string name="chooseUsbActivity" msgid="2096269989990986612">"USB उपकरणको लागि एउटा अनुप्रयोग छान्नुहोस्"</string> + <string name="chooseUsbActivity" msgid="2096269989990986612">"USB उपकरणको लागि एउटा एप छान्नुहोस्"</string> <string name="noApplications" msgid="1186909265235544019">"कुनै पनि अनुप्रयोगहरूले यो कार्य गर्न सक्दैनन्।"</string> <string name="aerr_application" msgid="4090916809370389109">"<xliff:g id="APPLICATION">%1$s</xliff:g> रोकिएको छ"</string> <string name="aerr_process" msgid="4268018696970966407">"<xliff:g id="PROCESS">%1$s</xliff:g> रोकिएको छ"</string> @@ -1169,7 +1169,7 @@ <string name="aerr_close" msgid="3398336821267021852">"बन्द गर्नुहोस्"</string> <string name="aerr_mute" msgid="2304972923480211376">"यन्त्र पुनः सुरु नभएसम्म म्यूट गर्नुहोस्"</string> <string name="aerr_wait" msgid="3198677780474548217">"पर्खनुहोस्"</string> - <string name="aerr_close_app" msgid="8318883106083050970">"अनुप्रयोग बन्द गर्नुहोस्"</string> + <string name="aerr_close_app" msgid="8318883106083050970">"एप बन्द गर्नुहोस्"</string> <string name="anr_title" msgid="7290329487067300120"></string> <string name="anr_activity_application" msgid="8121716632960340680">"<xliff:g id="APPLICATION">%2$s</xliff:g> ले प्रतिक्रिया दिइरहेको छैन"</string> <string name="anr_activity_process" msgid="3477362583767128667">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ले प्रतिक्रिया दिइरहेको छैन"</string> @@ -1179,18 +1179,18 @@ <string name="report" msgid="2149194372340349521">"रिपोर्ट गर्नुहोस्"</string> <string name="wait" msgid="7765985809494033348">"प्रतीक्षा गर्नुहोस्"</string> <string name="webpage_unresponsive" msgid="7850879412195273433">"पृष्ठ गैर जिम्मेवारी भएको छ।\n\nके तपाईं यसलाई बन्द गर्न चाहनुहुन्छ?"</string> - <string name="launch_warning_title" msgid="6725456009564953595">"अनुप्रयोग पुनः निर्देशीत"</string> + <string name="launch_warning_title" msgid="6725456009564953595">"एप पुनः निर्देशीत"</string> <string name="launch_warning_replace" msgid="3073392976283203402">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले चलिरहेको छ।"</string> <string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g> वास्तविक सुरुवात भएको थियो।"</string> <string name="screen_compat_mode_scale" msgid="8627359598437527726">"स्केल"</string> <string name="screen_compat_mode_show" msgid="5080361367584709857">"सधैँ देखाउनुहोस्"</string> - <string name="screen_compat_mode_hint" msgid="4032272159093750908">"प्रणाली सेटिङहरूमा यसलाई पुनःसक्षम गराउनुहोस् > अनुप्रयोगहरू > डाउनलोड गरेको।"</string> + <string name="screen_compat_mode_hint" msgid="4032272159093750908">"प्रणाली सेटिङहरूमा यसलाई पुनःसक्षम गराउनुहोस् > एपहरू > डाउनलोड गरेको।"</string> <string name="unsupported_display_size_message" msgid="7265211375269394699">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले हालको प्रदर्शनको आकार सम्बन्धी सेटिङलाई समर्थन गर्दैन र अप्रत्याशित तरिकाले व्यवहार गर्न सक्छ।"</string> <string name="unsupported_display_size_show" msgid="980129850974919375">"सधैँ देखाउनुहोस्"</string> <string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई Android OS को कुनै नमिल्दो संस्करणका लागि निर्माण गरिएको थियो र यसले अप्रत्याशित ढंगले कार्य गर्नसक्छ। उक्त अनुप्रयोगको कुनै अद्यावधिक संस्करण उपलब्ध हुनसक्छ।"</string> <string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"जुनसुकै बेला देखाउनुहोस्"</string> <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"अद्यावधिकका लागि जाँच गर्नुहोस्"</string> - <string name="smv_application" msgid="3775183542777792638">"अनुप्रयोग <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ले यसको स्वयं-लागु गरिएको स्ट्रिटमोड नीति उलङ्घन गरेको छ।"</string> + <string name="smv_application" msgid="3775183542777792638">"एप <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ले यसको स्वयं-लागु गरिएको स्ट्रिटमोड नीति उलङ्घन गरेको छ।"</string> <string name="smv_process" msgid="1398801497130695446">"प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> यसको आफ्नै कडामोड नीतिका कारण उल्लङ्घन गरिएको छ।"</string> <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"फोनको अद्यावधिक गरिँदै छ…"</string> <string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"ट्याब्लेटको अद्यावधिक गरिँदै छ…"</string> @@ -1202,9 +1202,9 @@ <string name="android_upgrading_fstrim" msgid="3259087575528515329">"भण्डारण आफू अनुकूल गर्दै।"</string> <string name="android_upgrading_notification_title" product="default" msgid="3509927005342279257">"प्रणालीको अद्यावधिक सम्पन्न गरिँदै छ…"</string> <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> को स्तरवृद्धि हुँदैछ…"</string> - <string name="android_upgrading_apk" msgid="1339564803894466737">"अनुप्रयोग अनुकुल हुँदै <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string> + <string name="android_upgrading_apk" msgid="1339564803894466737">"एप अनुकुल हुँदै <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string> <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> तयारी गर्दै।"</string> - <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"सुरुवात अनुप्रयोगहरू।"</string> + <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"सुरुवात एपहरू।"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"बुट पुरा हुँदै।"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"खेलमा फर्कन ट्याप गर्नुहोस्"</string> @@ -1215,7 +1215,7 @@ <string name="new_app_description" msgid="1958903080400806644">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरक्षित नगरिकनै बन्द हुने छ"</string> <string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> ले मेमोरी सीमा नाघ्यो"</string> <string name="dump_heap_ready_notification" msgid="2302452262927390268">"<xliff:g id="PROC">%1$s</xliff:g> हिप डम्प तयार छ"</string> - <string name="dump_heap_notification_detail" msgid="8431586843001054050">"हिप डम्प सङ्कलन गरियो, ट्याप गरेर आदान प्रदान गर्नुहोस्।"</string> + <string name="dump_heap_notification_detail" msgid="8431586843001054050">"हिप डम्प सङ्कलन गरियो, ट्याप गरेर सेयर गर्नुहोस्।"</string> <string name="dump_heap_title" msgid="4367128917229233901">"हिप डम्प साझेदारी गर्नुहुन्छ?"</string> <string name="dump_heap_text" msgid="1692649033835719336">"<xliff:g id="PROC">%1$s</xliff:g>प्रक्रियाले यसको मेमोरीको सीमा <xliff:g id="SIZE">%2$s</xliff:g> नाघेको छ। तपाईंका लागि विकासकर्तासँग साझेदारी गर्न एउटा हिप डम्प उपलब्ध छ। सावधान हुनुहोला: यो हिप डम्पमा अनुप्रयोगको पहुँच भएको तपाईंको जुनसुकै व्यक्तिगत जानकारी हुन सक्छ।"</string> <string name="dump_heap_system_text" msgid="6805155514925350849">"<xliff:g id="PROC">%1$s</xliff:g> प्रक्रियाले यसको मेमोरीको सीमा <xliff:g id="SIZE">%2$s</xliff:g> नाँघेको छ। आदान प्रदान गर्नका लागि तपाईंलाई एउटा हिप डम्प उपलब्ध छ। सावधान हुनुहोस्: यस हिप डम्पमा उक्त प्रक्रियाको पहुँच भएको जुनसुकै संवेदनशील व्यक्तिगत जानकारी समावेश हुन सक्छ जसमा तपाईंले टाइप गर्नुभएका कुराहरू पर्न सक्छन्।"</string> @@ -1277,7 +1277,7 @@ <string name="sms_short_code_confirm_allow" msgid="920477594325526691">"पठाउनुहोस्"</string> <string name="sms_short_code_confirm_deny" msgid="1356917469323768230">"रद्द गर्नुहोस्"</string> <string name="sms_short_code_remember_choice" msgid="1374526438647744862">"मेरो छनौट याद राख्नुहोस्"</string> - <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"तपाईं यसलाई पछि सेटिङहरूमा बदल्न सक्नु हुन्छ > अनुप्रयोगहरू"</string> + <string name="sms_short_code_remember_undo_instruction" msgid="2620984439143080410">"तपाईं यसलाई पछि सेटिङहरूमा बदल्न सक्नु हुन्छ > एपहरू"</string> <string name="sms_short_code_confirm_always_allow" msgid="2223014893129755950">"सधैँ अनुमति दिनुहोस्"</string> <string name="sms_short_code_confirm_never_allow" msgid="2688828813521652079">"कहिल्यै अनुमति नदिनुहोस्"</string> <string name="sim_removed_title" msgid="5387212933992546283">"SIM कार्ड हटाइयो"</string> @@ -1287,9 +1287,9 @@ <string name="sim_added_message" msgid="6602906609509958680">"मोबाइल नेटवर्क पहुँच गर्न तपाईँको उपकरण पुनःस्टार्ट गर्नुहोस्।"</string> <string name="sim_restart_button" msgid="8481803851341190038">"पुनः सुरु गर्नुहोस्"</string> <string name="install_carrier_app_notification_title" msgid="5712723402213090102">"मोबाइल सेवा सक्रिय गर्नुहोस्"</string> - <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"आफ्नो नयाँ SIM सक्रिय गर्न सेवा प्रदायकको अनुप्रयोग डाउनलोड गर्नुहोस्"</string> - <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"आफ्नो नयाँ SIM सक्रिय गर्न <xliff:g id="APP_NAME">%1$s</xliff:g> अनुप्रयोग डाउनलोड गर्नुहोस्"</string> - <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"अनुप्रयोग डाउनलोड गर्नुहोस्"</string> + <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"आफ्नो नयाँ SIM सक्रिय गर्न सेवा प्रदायकको एप डाउनलोड गर्नुहोस्"</string> + <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"आफ्नो नयाँ SIM सक्रिय गर्न <xliff:g id="APP_NAME">%1$s</xliff:g> एप डाउनलोड गर्नुहोस्"</string> + <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"एप डाउनलोड गर्नुहोस्"</string> <string name="carrier_app_notification_title" msgid="5815477368072060250">"नयाँ SIM घुसाइयो"</string> <string name="carrier_app_notification_text" msgid="6567057546341958637">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string> <string name="time_picker_dialog_title" msgid="9053376764985220821">"समय मिलाउनुहोस्"</string> @@ -1312,8 +1312,8 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"जडान गरिएको यन्त्र चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"एनालग अडियोको सहायक उपकरण पत्ता लाग्यो"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।"</string> - <string name="adb_active_notification_title" msgid="408390247354560331">"USB डिबग गर्ने सुविधा सुचारू छ"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB डिबग प्रक्रिया निष्क्रिय पार्न ट्याप गर्नुहोस्"</string> + <string name="adb_active_notification_title" msgid="408390247354560331">"USB डिबगिङ सक्रिय गरिएको छ"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB डिबगिङ निष्क्रिय पार्न ट्याप गर्नुहोस्"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB डिबगिङलाई असक्षम पार्न ट्याप गर्नुहोस्।"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"वायरलेस डिबगिङ जोडियो"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"वायरलेस डिबगिङ निष्क्रिय पार्न ट्याप गर्नुहोस्"</string> @@ -1329,8 +1329,8 @@ <string name="taking_remote_bugreport_notification_title" msgid="1582531382166919850">"बग रिपोर्ट लिँदै..."</string> <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"बग रिपोर्टलाई साझेदारी गर्ने हो?"</string> <string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"बग रिपोर्टलाई साझेदारी गर्दै ..."</string> - <string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"तपाईंका प्रशासकले यस यन्त्रको समस्या निवारण गर्नमा मद्दत गर्नाका लागि एउटा बग रिपोर्टको अनुरोध गर्नुभएको छ। अनुप्रयोगहरू र डेटा आदान प्रदान गर्न पनि सकिन्छ।"</string> - <string name="share_remote_bugreport_action" msgid="7630880678785123682">"साझेदारी गर्नुहोस्"</string> + <string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"तपाईंका प्रशासकले यस यन्त्रको समस्या निवारण गर्नमा मद्दत गर्नाका लागि एउटा बग रिपोर्टको अनुरोध गर्नुभएको छ। एपहरू र डेटा आदान प्रदान गर्न पनि सकिन्छ।"</string> + <string name="share_remote_bugreport_action" msgid="7630880678785123682">"सेयर गर्नुहोस्"</string> <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"अस्वीकार गर्नुहोस्"</string> <string name="select_input_method" msgid="3971267998568587025">"निवेश विधि छान्नुहोस्"</string> <string name="show_ime" msgid="6406112007347443383">"वास्तविक किबोर्ड सक्रिय हुँदा यसलाई स्क्रिनमा राख्नुहोस्"</string> @@ -1416,8 +1416,8 @@ <string name="deny" msgid="6632259981847676572">"अस्वीकार गर्नुहोस्"</string> <string name="permission_request_notification_title" msgid="1810025922441048273">"अनुरोध गरिएको अनुमति"</string> <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">\n"खाता <xliff:g id="ACCOUNT">%s</xliff:g>को लागि अनुरोध गरिएको अनुमति।"</string> - <string name="forward_intent_to_owner" msgid="4620359037192871015">"तपाईं तपाईंको कार्य प्रोफाइल बाहिर यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string> - <string name="forward_intent_to_work" msgid="3620262405636021151">"तपाईं आफ्नो कार्य प्रोफाइलमा यो अनुप्रयोग प्रयोग गरिरहनु भएको छ"</string> + <string name="forward_intent_to_owner" msgid="4620359037192871015">"तपाईं तपाईंको कार्य प्रोफाइल बाहिर यो एप प्रयोग गरिरहनु भएको छ"</string> + <string name="forward_intent_to_work" msgid="3620262405636021151">"तपाईं आफ्नो कार्य प्रोफाइलमा यो एप प्रयोग गरिरहनु भएको छ"</string> <string name="input_method_binding_label" msgid="1166731601721983656">"इनपुट विधि"</string> <string name="sync_binding_label" msgid="469249309424662147">"सिंक गर्नुहोस्"</string> <string name="accessibility_binding_label" msgid="1974602776545801715">"उपलब्धता"</string> @@ -1440,7 +1440,7 @@ <string name="no_file_chosen" msgid="4146295695162318057">"कुनै फाइल छानिएको छैन"</string> <string name="reset" msgid="3865826612628171429">"रिसेट गर्नुहोस्"</string> <string name="submit" msgid="862795280643405865">"पेस गर्नुहोस्"</string> - <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्राइभिङ अनुप्रयोग चलिरहेको छ"</string> + <string name="car_mode_disable_notification_title" msgid="8450693275833142896">"ड्राइभिङ एप चलिरहेको छ"</string> <string name="car_mode_disable_notification_message" msgid="8954550232288567515">"ड्राइभिङ अनुप्रयोगबाट बाहिर निस्कन ट्याप गर्नुहोस्।"</string> <string name="back_button_label" msgid="4078224038025043387">"पछाडि"</string> <string name="next_button_label" msgid="6040209156399907780">"अर्को"</string> @@ -1453,7 +1453,7 @@ </plurals> <string name="action_mode_done" msgid="2536182504764803222">"भयो"</string> <string name="progress_erasing" msgid="6891435992721028004">"साझेदारी गरिएको भण्डारण मेट्दै…"</string> - <string name="share" msgid="4157615043345227321">"साझेदारी गर्नुहोस्"</string> + <string name="share" msgid="4157615043345227321">"सेयर गर्नुहोस्"</string> <string name="find" msgid="5015737188624767706">"पत्ता लगाउनुहोस्"</string> <string name="websearch" msgid="5624340204512793290">"वेब खोजी"</string> <string name="find_next" msgid="5341217051549648153">"अर्को भेटाउनुहोस्"</string> @@ -1463,12 +1463,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारा अनुरोध गरिएको"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"हो"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"होइन"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"आपत्कालीन सेवा उपलब्ध गराउन स्थान प्रयोग गरेको थियो"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"तपाईंको यन्त्रका उत्पादकले हालसालै तपाईंलाई आपत्कालीन सेवा उपलब्ध गराउने प्रयोजनका लागि तपाईंको स्थान प्रयोग गरेको थियो"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"तपाईंको टेलिफोन कम्पनीले हालसालै तपाईंलाई आपत्कालीन सेवा उपलब्ध गराउने प्रयोजनका लागि तपाईंको स्थान प्रयोग गरेको थियो"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"सीमा नाघेकाहरू मेट्नुहोस्"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"त्यहाँ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> मेटाइएका आइटमहरू छन् <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>को लागि, खाता <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>। तपाईं के गर्न चाहनु हुन्छ?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"वस्तुहरू मेट्नुहोस्"</string> @@ -1502,10 +1499,10 @@ <string name="keyboardview_keycode_mode_change" msgid="2743735349997999020">"मोड परिवर्तन गर्नुहोस्"</string> <string name="keyboardview_keycode_shift" msgid="3026509237043975573">"Shift"</string> <string name="keyboardview_keycode_enter" msgid="168054869339091055">"प्रविष्टि गर्नुहोस्"</string> - <string name="activitychooserview_choose_application" msgid="3500574466367891463">"एउटा अनुप्रयोग छान्नुहोस्"</string> + <string name="activitychooserview_choose_application" msgid="3500574466367891463">"एउटा एप छान्नुहोस्"</string> <string name="activitychooserview_choose_application_error" msgid="6937782107559241734">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सुरु गर्न सकिएन"</string> - <string name="shareactionprovider_share_with" msgid="2753089758467748982">"साझेदारी गर्नुहोस्..."</string> - <string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग साझेदारी गर्नुहोस्"</string> + <string name="shareactionprovider_share_with" msgid="2753089758467748982">"सेयर गर्नुहोस्..."</string> + <string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग सेयर गर्नुहोस्"</string> <string name="content_description_sliding_handle" msgid="982510275422590757">"धिसार्ने ह्यान्डल। छुनुहोस् & समाउनुहोस्।"</string> <string name="description_target_unlock_tablet" msgid="7431571180065859551">"खोल्नलाइ हुत्त्याउनुहोस्।"</string> <string name="action_bar_home_description" msgid="1501655419158631974">"गृह खोज्नुहोस्"</string> @@ -1549,7 +1546,7 @@ <string name="sha1_fingerprint" msgid="2339915142825390774">"SHA-1 फिंगरप्रिन्ट:"</string> <string name="activity_chooser_view_see_all" msgid="3917045206812726099">"सबै हेर्नुहोस्"</string> <string name="activity_chooser_view_dialog_title_default" msgid="8880731437191978314">"गतिविधि छनौट गर्नुहोस्"</string> - <string name="share_action_provider_share_with" msgid="1904096863622941880">"साझेदारी गर्नुहोस्..."</string> + <string name="share_action_provider_share_with" msgid="1904096863622941880">"सेयर गर्नुहोस्..."</string> <string name="sending" msgid="206925243621664438">"पठाउँदै..."</string> <string name="launchBrowserDefault" msgid="6328349989932924119">"ब्राउजर सुरु गर्ने हो?"</string> <string name="SetupCallDefault" msgid="5581740063237175247">"कल स्वीकार गर्नुहुन्छ?"</string> @@ -1646,7 +1643,7 @@ <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"स्क्रिन हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string> <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"यसले स्क्रिनमा देखिने सबै सामग्री पढ्न सक्छ र अन्य अनुप्रयोगहरूमा उक्त सामग्री देखाउन सक्छ।"</string> <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"कारबाहीहरू हेर्नुहोस् र तिनमा कार्य गर्नुहोस्"</string> - <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"यसले कुनै अनुप्रयोग वा हार्डवेयर सेन्सरसँग तपाईंले गर्ने अन्तर्क्रियाको ट्र्याक गर्न सक्छ र तपाईंका तर्फबाट अनुप्रयोगहरूसँग अन्तर्क्रिया गर्न सक्छ।"</string> + <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"यसले कुनै एप वा हार्डवेयर सेन्सरसँग तपाईंले गर्ने अन्तर्क्रियाको ट्र्याक गर्न सक्छ र तपाईंका तर्फबाट एपहरूसँग अन्तर्क्रिया गर्न सक्छ।"</string> <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमति दिनुहोस्"</string> <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"इन्कार गर्नु⋯"</string> <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"कुनै सुविधा प्रयोग गर्न थाल्न उक्त सुविधामा ट्याप गर्नुहोस्:"</string> @@ -1675,7 +1672,7 @@ <string name="owner_name" msgid="8713560351570795743">"मालिक"</string> <string name="error_message_title" msgid="4082495589294631966">"त्रुटि"</string> <string name="error_message_change_not_allowed" msgid="843159705042381454">"तपाईंका प्रशासकले यो परिवर्तनलाई अनुमति दिनुहुन्न"</string> - <string name="app_not_found" msgid="3429506115332341800">"यस कार्य सम्हालने कुनै अनुप्रयोग भेटिएन"</string> + <string name="app_not_found" msgid="3429506115332341800">"यस कार्य सम्हालने कुनै एप भेटिएन"</string> <string name="revoke" msgid="5526857743819590458">"रद्द गर्नुहोस्"</string> <string name="mediasize_iso_a0" msgid="7039061159929977973">"ISO A0"</string> <string name="mediasize_iso_a1" msgid="4063589931031977223">"ISO A1"</string> @@ -1891,19 +1888,19 @@ <string name="language_picker_section_all" msgid="1985809075777564284">"सम्पूर्ण भाषाहरू"</string> <string name="region_picker_section_all" msgid="756441309928774155">"सबै क्षेत्रहरू"</string> <string name="locale_search_menu" msgid="6258090710176422934">"खोज"</string> - <string name="app_suspended_title" msgid="888873445010322650">"अनुप्रयोग उपलब्ध छैन"</string> + <string name="app_suspended_title" msgid="888873445010322650">"एप उपलब्ध छैन"</string> <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> अहिले उपलब्ध छैन। यो <xliff:g id="APP_NAME_1">%2$s</xliff:g> द्वारा व्यवस्थित छ।"</string> <string name="app_suspended_more_details" msgid="211260942831587014">"थप जान्नुहोस्"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"एपको पज हटाउनुहोस्"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"कार्य प्रोफाइल सक्रिय गर्ने?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"तपाईंका कार्यसम्बन्धी अनुप्रयोग, सूचना, डेटा र कार्य प्रोफाइलका अन्य सुविधाहरू सक्रिय गरिने छन्"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"तपाईंका कार्यसम्बन्धी एप, सूचना, डेटा र कार्य प्रोफाइलका अन्य सुविधाहरू सक्रिय गरिने छन्"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"सक्रिय गर्नुहोस्"</string> - <string name="app_blocked_title" msgid="7353262160455028160">"अनुप्रयोग उपलब्ध छैन"</string> + <string name="app_blocked_title" msgid="7353262160455028160">"एप उपलब्ध छैन"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> अहिले उपलब्ध छैन।"</string> - <string name="deprecated_target_sdk_message" msgid="5203207875657579953">"यो अनुप्रयोग Android को पुरानो संस्करणका लागि बनाइएको हुनाले यसले सही ढङ्गले काम नगर्न सक्छ। अद्यावधिकहरू उपलब्ध छन् वा छैनन् भनी जाँच गरी हेर्नुहोस् वा यसको विकासकर्तालाई सम्पर्क गर्नुहोस्।"</string> + <string name="deprecated_target_sdk_message" msgid="5203207875657579953">"यो एप Android को पुरानो संस्करणका लागि बनाइएको हुनाले यसले सही ढङ्गले काम नगर्न सक्छ। अद्यावधिकहरू उपलब्ध छन् वा छैनन् भनी जाँच गरी हेर्नुहोस् वा यसको विकासकर्तालाई सम्पर्क गर्नुहोस्।"</string> <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"अद्यावधिक उपलब्ध छ वा छैन भनी जाँच गर्नुहोस्"</string> <string name="new_sms_notification_title" msgid="6528758221319927107">"तपाईंलाई नयाँ सन्देश आएको छ"</string> - <string name="new_sms_notification_content" msgid="3197949934153460639">"हेर्नका लागि SMS अनुप्रयोग खोल्नुहोस्"</string> + <string name="new_sms_notification_content" msgid="3197949934153460639">"हेर्नका लागि SMS एप खोल्नुहोस्"</string> <string name="profile_encrypted_title" msgid="9001208667521266472">"केही सुविधा राम्ररी नचल्न सक्छन्"</string> <string name="profile_encrypted_detail" msgid="5279730442756849055">"कार्य प्रोफाइल लक भयो"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"कार्य प्रोफाइल अनलक गर्न ट्याप गर्नुहोस्"</string> @@ -1990,7 +1987,7 @@ <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"सर्टकट असक्षम पारिएको छ"</string> <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"स्थापना रद्द गर्नु…"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"जे भए पनि खोल्नुहोस्"</string> - <string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक अनुप्रयोग भेटियो"</string> + <string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक एप भेटियो"</string> <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string> <string name="screenshot_edit" msgid="7408934887203689207">"सम्पादन गर्नुहोस्"</string> <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कल तथा सूचनाहरू आउँदा कम्पन हुने छ"</string> @@ -2015,7 +2012,7 @@ <string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"ट्याब्लेटमा पर्याप्त चार्ज छ। सुविधाहरूलाई अब उप्रान्त प्रतिबन्ध लगाइँदैन।"</string> <string name="battery_saver_charged_notification_summary" product="device" msgid="1031562417867646649">"यन्त्रमा पर्याप्त चार्ज छ। सुविधाहरूलाई अब उप्रान्त प्रतिबन्ध लगाइँदैन।"</string> <string name="mime_type_folder" msgid="2203536499348787650">"फोल्डर"</string> - <string name="mime_type_apk" msgid="3168784749499623902">"Android अनुप्रयोग"</string> + <string name="mime_type_apk" msgid="3168784749499623902">"Android एप"</string> <string name="mime_type_generic" msgid="4606589110116560228">"फाइल"</string> <string name="mime_type_generic_ext" msgid="9220220924380909486">"<xliff:g id="EXTENSION">%1$s</xliff:g> फाइल"</string> <string name="mime_type_audio" msgid="4933450584432509875">"अडियो"</string> @@ -2043,7 +2040,7 @@ <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"गृहपृष्ठ"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"पछाडि फर्कनुहोस्"</string> - <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका अनुप्रयोगहरू"</string> + <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका एपहरू"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"सूचनाहरू"</string> <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"द्रुत सेटिङहरू"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string> @@ -2062,13 +2059,13 @@ <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"व्यक्तिगत दृश्य"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"यो सामग्री कामसम्बन्धी अनुप्रयोगहरूमार्फत सेयर गर्न मिल्दैन"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"तपाईंका IT प्रशासकले तपाईंलाई तपाईंको कार्य प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री सेयर गर्ने अनुमति दिनुभएको छैन"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"तपाईंका IT एडमिनले तपाईंलाई तपाईंको कार्य प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री सेयर गर्ने अनुमति दिनुभएको छैन"</string> <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"यो सामग्री कामसम्बन्धी अनुप्रयोगहरूमार्फत खोल्न मिल्दैन"</string> - <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"तपाईंका IT प्रशासकले तपाईंलाई तपाईंको कार्य प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री खोल्ने अनुमति दिनुभएको छैन"</string> + <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"तपाईंका IT एडमिनले तपाईंलाई तपाईंको कार्य प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री खोल्ने अनुमति दिनुभएको छैन"</string> <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"यो सामग्री व्यक्तिगत अनुप्रयोगहरूमार्फत सेयर गर्न मिल्दैन"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"तपाईंका IT प्रशासकले तपाईंलाई तपाईंको व्यक्तिगत प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री सेयर गर्ने अनुमति दिनुभएको छैन"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"तपाईंका IT एडमिनले तपाईंलाई तपाईंको व्यक्तिगत प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री सेयर गर्ने अनुमति दिनुभएको छैन"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"यो सामग्री व्यक्तिगत अनुप्रयोगहरूमार्फत खोल्न मिल्दैन"</string> - <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"तपाईंका IT प्रशासकले तपाईंलाई तपाईंको व्यक्तिगत प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री खोल्ने अनुमति दिनुभएको छैन"</string> + <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"तपाईंका IT एडमिनले तपाईंलाई तपाईंको व्यक्तिगत प्रोफाइलमा रहेका अनुप्रयोगहरूमार्फत यो सामग्री खोल्ने अनुमति दिनुभएको छैन"</string> <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"कार्य प्रोफाइल पज गरिएको छ"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"सक्रिय गर्नुहोस्"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"यो सामग्री कामसम्बन्धी कुनै पनि अनुप्रयोगमार्फत सेयर गर्न मिल्दैन"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 57e167b948b6..a77845f10e93 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -261,7 +261,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string> <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି"</string> <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅଫ୍ ଅଛି"</string> - <string name="global_action_settings" msgid="4671878836947494217">"ସେଟିଙ୍ଗ"</string> + <string name="global_action_settings" msgid="4671878836947494217">"ସେଟିଂସ୍"</string> <string name="global_action_assist" msgid="2517047220311505805">"ସହାୟକ"</string> <string name="global_action_voice_assist" msgid="6655788068555086695">"ଭଏସ୍ ସହାୟକ"</string> <string name="global_action_lockdown" msgid="2475471405907902963">"ଲକ୍ କରନ୍ତୁ"</string> @@ -1091,13 +1091,13 @@ <string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll" msgid="1532369154488982046">"ସବୁ ଚୟନ କରନ୍ତୁ"</string> <string name="cut" msgid="2561199725874745819">"କଟ୍"</string> - <string name="copy" msgid="5472512047143665218">"କପୀ"</string> - <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"କ୍ଲିପ୍ବୋର୍ଡକୁ କପୀ କରିହେଲା ନାହିଁ"</string> + <string name="copy" msgid="5472512047143665218">"କପି କରନ୍ତୁ"</string> + <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"କ୍ଲିପ୍ବୋର୍ଡକୁ କପି କରିହେଲା ନାହିଁ"</string> <string name="paste" msgid="461843306215520225">"ପେଷ୍ଟ କରନ୍ତୁ"</string> <string name="paste_as_plain_text" msgid="7664800665823182587">"ସାଦା ଟେକ୍ସଟ୍ ଭାବରେ ପେଷ୍ଟ କରନ୍ତୁ"</string> <string name="replace" msgid="7842675434546657444">"ବଦଳାନ୍ତୁ…"</string> <string name="delete" msgid="1514113991712129054">"ଡିଲିଟ୍ କରନ୍ତୁ"</string> - <string name="copyUrl" msgid="6229645005987260230">"URL କପୀ କରନ୍ତୁ"</string> + <string name="copyUrl" msgid="6229645005987260230">"URL କପି କରନ୍ତୁ"</string> <string name="selectTextMode" msgid="3225108910999318778">"ଟେକ୍ସଟ୍ ଚୟନ କରନ୍ତୁ"</string> <string name="undo" msgid="3175318090002654673">"ପୂର୍ବ ପରି କରନ୍ତୁ"</string> <string name="redo" msgid="7231448494008532233">"ପୁଣି କରନ୍ତୁ"</string> @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)ଙ୍କ ଦ୍ୱାରା ଅନୁରୋଧ କରାଯାଇଛି"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"ହଁ"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"ନା"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ଜରୁରୀକାଳୀନ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରାଯାଇଛି"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ବର୍ତ୍ତମାନର ଏକ ଜରୁରୀକାଳୀନ ଅବଧି ସମୟରେ ଆପଣଙ୍କ ଡିଭାଇସ୍ ନିର୍ମାତା ଆପଣଙ୍କ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିଛନ୍ତି"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ବର୍ତ୍ତମାନର ଏକ ଜରୁରୀକାଳୀନ ଅବଧି ସମୟରେ ଆପଣଙ୍କ ମୋବାଇଲ୍ କମ୍ପାନୀ ଆପଣଙ୍କ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିଛି"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"ଡିଲିଟ୍ କରିବାର ସୀମା ଅତିକ୍ରମ ହୋଇଯାଇଛି"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ଆକାଉଣ୍ଟର <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> ପାଇଁ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ଟି ଡିଲିଟ୍ କରାଯାଇଥିବା ଆଇଟମ୍ ରହିଛି। ଆପଣ କ’ଣ କରିବାକୁ ଚାହାଁନ୍ତି?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"ଆଇଟମ୍ ଡିଲିଟ୍ କରନ୍ତୁ"</string> @@ -1566,7 +1563,7 @@ <string name="media_route_chooser_title" msgid="6646594924991269208">"ଡିଭାଇସ୍ ସଂଯୋଗ କରନ୍ତୁ"</string> <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"ଡିଭାଇସରେ ସ୍କ୍ରିନ୍ କାଷ୍ଟ କରନ୍ତୁ"</string> <string name="media_route_chooser_searching" msgid="6119673534251329535">"ଡିଭାଇସ୍ ଖୋଜାଯାଉଛି…"</string> - <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"ସେଟିଙ୍ଗ"</string> + <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"ସେଟିଂସ୍"</string> <string name="media_route_controller_disconnect" msgid="7362617572732576959">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string> <string name="media_route_status_scanning" msgid="8045156315309594482">"ସ୍କାନ୍ କରୁଛି…"</string> <string name="media_route_status_connecting" msgid="5845597961412010540">"ସଂଯୋଗ କରୁଛି..."</string> @@ -1996,7 +1993,7 @@ <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string> <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="notification_app_name_system" msgid="3045196791746735601">"ସିଷ୍ଟମ୍"</string> - <string name="notification_app_name_settings" msgid="9088548800899952531">"ସେଟିଙ୍ଗ"</string> + <string name="notification_app_name_settings" msgid="9088548800899952531">"ସେଟିଂସ୍"</string> <string name="notification_appops_camera_active" msgid="8177643089272352083">"କ୍ୟାମେରା"</string> <string name="notification_appops_microphone_active" msgid="581333393214739332">"ମାଇକ୍ରୋଫୋନ୍"</string> <string name="notification_appops_overlay_active" msgid="5571732753262836481">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ଦେଖାଦେବ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 4735b57c4bb1..d2ae05212956 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ਵੱਲੋਂ ਬੇਨਤੀ ਕੀਤੀ"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"ਹਾਂ"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"ਨਹੀਂ"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ਸੰਕਟਕਾਲੀਨ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ਹਾਲੀਆ ਸੰਕਟਕਾਲੀਨ ਸੈਸ਼ਨ ਵੇਲੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਿਰਮਾਤਾ ਨੇ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕੀਤੀ"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ਹਾਲੀਆ ਸੰਕਟਕਾਲੀਨ ਸੈਸ਼ਨ ਵੇਲੇ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਨੇ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕੀਤੀ"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"ਵਧੀ ਸੀਮਾ ਮਿਟਾਓ"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ਖਾਤੇ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> ਲਈ <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> ਆਈਟਮਾਂ ਮਿਟਾਈਆਂ ਗਈਆਂ ਹਨ। ਤੁਸੀਂ ਕੀ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"ਆਈਟਮਾਂ ਹਟਾਓ"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 1354a371f2e5..624560ec822c 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"O dispositivo é gerenciado"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Sua organização gerencia este dispositivo e pode monitorar o tráfego de rede. Toque para ver detalhes."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Os apps podem acessar seu local"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Entre em contato com o administrador de TI para saber mais"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Fale com o administrador de TI para saber mais"</string> <string name="country_detector" msgid="7023275114706088854">"Detector de país"</string> <string name="location_service" msgid="2439187616018455546">"Serviço de localização"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Serviço de notificações do sensor"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index b5d2e99593b1..b0ab7264ec7c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1831,7 +1831,7 @@ </plurals> <string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string> - <string name="zen_mode_forever" msgid="740585666364912448">"Até ser desativado"</string> + <string name="zen_mode_forever" msgid="740585666364912448">"Até desativar"</string> <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Até desativar Não incomodar"</string> <string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="8009920446193610996">"Reduzir"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 1354a371f2e5..624560ec822c 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_title" msgid="554983187553845004">"O dispositivo é gerenciado"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Sua organização gerencia este dispositivo e pode monitorar o tráfego de rede. Toque para ver detalhes."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Os apps podem acessar seu local"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"Entre em contato com o administrador de TI para saber mais"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Fale com o administrador de TI para saber mais"</string> <string name="country_detector" msgid="7023275114706088854">"Detector de país"</string> <string name="location_service" msgid="2439187616018455546">"Serviço de localização"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Serviço de notificações do sensor"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 7b2e882d5331..a6d8f2504d5a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -195,8 +195,8 @@ <string name="device_ownership_relinquished" msgid="4080886992183195724">"Администратор освободил устройство для личного использования"</string> <string name="network_logging_notification_title" msgid="554983187553845004">"Это управляемое устройство"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"Ваша организация управляет этим устройством и может отслеживать сетевой трафик. Подробнее…"</string> - <string name="location_changed_notification_title" msgid="3620158742816699316">"У приложений появился доступ к данным о вашем местоположении"</string> - <string name="location_changed_notification_text" msgid="7158423339982706912">"За подробной информацией обращайтесь к системному администратору."</string> + <string name="location_changed_notification_title" msgid="3620158742816699316">"У приложений есть доступ к вашим геоданным"</string> + <string name="location_changed_notification_text" msgid="7158423339982706912">"Узнайте подробности у системного администратора."</string> <string name="country_detector" msgid="7023275114706088854">"Определение страны"</string> <string name="location_service" msgid="2439187616018455546">"Геолокация"</string> <string name="sensor_notification_service" msgid="7474531979178682676">"Сервис для обработки уведомлений от датчиков"</string> @@ -2116,8 +2116,8 @@ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групповой чат"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> - <string name="resolver_personal_tab" msgid="2051260504014442073">"Личный"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"Рабочий"</string> + <string name="resolver_personal_tab" msgid="2051260504014442073">"Личное"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"Рабочее"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Просмотр личных данных"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Просмотр рабочих данных"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Этим контентом нельзя делиться с рабочими приложениями"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 1511c18ced9f..3ac05cf352ea 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -2064,7 +2064,7 @@ <string name="notification_appops_microphone_active" msgid="581333393214739332">"Mikrofon"</string> <string name="notification_appops_overlay_active" msgid="5571732753262836481">"prekriva druge aplikacije na zaslonu"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutinsko informativno obvestilo o načinu delovanja"</string> - <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumulator se bo morda izpraznil, preden ga običajno priključite na polnjenje"</string> + <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se bo morda izpraznila, preden jo običajno priključite na polnjenje"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo akumulatorja za podaljšanje časa delovanja akumulatorja"</string> <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"Varčevanje z energijo baterije"</string> <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"Varčevanje z energijo baterije je izklopljeno"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 9f0dfb1baf0f..e1e62b5c0656 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -2082,7 +2082,7 @@ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Конверзација"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групна конверзација"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> - <string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string> + <string name="resolver_personal_tab" msgid="2051260504014442073">"Лично"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"Пословни"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Лични приказ"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Приказ за посао"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1b5d6718b507..355ad13cf0a5 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2029,7 +2029,7 @@ <item quantity="other">Faili <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item> <item quantity="one">Faili <xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g></item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Hujapendekeza watu wa kushiriki nao"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Hujapendekezewa watu wa kushiriki nao"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Orodha ya programu"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Programu hii haijapewa ruhusa ya kurekodi lakini inaweza kurekodi sauti kupitia kifaa hiki cha USB."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Mwanzo"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index f848950c82af..da5b77cfce6c 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ద్వారా అభ్యర్థించబడింది"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"అవును"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"కాదు"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ఎమర్జెన్సీ లొకేషన్ యాక్సెస్ చేయబడింది"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ఇటీవలి ఎమర్జెన్సీ సెషన్లో మీ పరికర తయారీదారు మీ లొకేషన్ను యాక్సెస్ చేశారు"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ఇటీవలి ఎమర్జెన్సీ సెషన్లో మీ లొకేషన్ను మీ క్యారియర్ యాక్సెస్ చేసింది"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"తొలగింపు పరిమితి మించిపోయింది"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, ఖాతా <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>కి సంబంధించి <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> తొలగించబడే అంశాలు ఉన్నాయి. మీరు ఏమి చేయాలనుకుంటున్నారు?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"అంశాలను తొలగించు"</string> @@ -2032,7 +2029,7 @@ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్లు</item> <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item> </plurals> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"షేర్ చేయకూడని వ్యక్తులు"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"షేర్ చేయడానికి సిఫార్సు చేయబడని వ్యక్తులు"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"యాప్ల జాబితా"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ఈ యాప్కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"హోమ్"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index f42d156ec001..55d6eca30d89 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1701,8 +1701,8 @@ <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Виберіть функцію для жесту спеціальних можливостей (проведення двома пальцями знизу вгору):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Виберіть функцію для жесту спеціальних можливостей (проведення трьома пальцями знизу вгору):"</string> <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Щоб переключитися між функціями, натисніть і утримуйте кнопку спеціальних можливостей."</string> - <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Щоб переключитися між функціями, проведіть двома пальцями вгору й утримуйте екран."</string> - <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Щоб переключитися між функціями, проведіть трьома пальцями вгору й утримуйте екран."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Щоб переключитися між функціями, проведіть по екрану знизу вгору двома пальцями й утримуйте їх."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Щоб переключитися між функціями, проведіть по екрану знизу вгору трьома пальцями й утримуйте їх."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Збільшення"</string> <string name="user_switched" msgid="7249833311585228097">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"Перехід в обліковий запис \"<xliff:g id="NAME">%1$s</xliff:g>\"…"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index db5619496b5d..d4728a107446 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -191,7 +191,7 @@ <string name="device_ownership_relinquished" msgid="4080886992183195724">"منتظم نے ذاتی استعمال کے لیے آلہ کو دستبردار کیا ہے"</string> <string name="network_logging_notification_title" msgid="554983187553845004">"آلہ زیر انتظام ہے"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"آپ کی تنظیم اس آلے کا نظم کرتی ہے اور وہ نیٹ ورک ٹریفک کی نگرانی کر سکتی ہے۔ تفاصیل کیلئے تھپتھپائیں۔"</string> - <string name="location_changed_notification_title" msgid="3620158742816699316">"ایپس آپ کے مقام تک رسائی حاصل کر سکتی ہے"</string> + <string name="location_changed_notification_title" msgid="3620158742816699316">"ایپس آپ کے مقام تک رسائی حاصل کر سکتی ہیں"</string> <string name="location_changed_notification_text" msgid="7158423339982706912">"مزید جاننے کے لیے اپنے IT منتظم سے رابطہ کریں"</string> <string name="country_detector" msgid="7023275114706088854">"ملک کا ڈیٹیکٹر"</string> <string name="location_service" msgid="2439187616018455546">"مقام کی سروس"</string> @@ -1457,12 +1457,9 @@ <string name="gpsNotifMessage" msgid="7346649122793758032">"درخواست کردہ بذریعہ <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> <string name="gpsVerifYes" msgid="3719843080744112940">"ہاں"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"نہیں"</string> - <!-- no translation found for gnss_nfw_notification_title (5004493772059563423) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_oem (3683958907027107969) --> - <skip /> - <!-- no translation found for gnss_nfw_notification_message_carrier (815888995791562151) --> - <skip /> + <string name="gnss_nfw_notification_title" msgid="5004493772059563423">"ہنگامی مقام تک رسائی حاصل کی"</string> + <string name="gnss_nfw_notification_message_oem" msgid="3683958907027107969">"ایک حالیہ ہنگامی سیشن کے دوران اپنے آلہ کے مینوفیکچرر نے آپ کے مقام تک رسائی حاصل کی"</string> + <string name="gnss_nfw_notification_message_carrier" msgid="815888995791562151">"ایک حالیہ ہنگامی سیشن کے دوران آپ کے کیریئر نے آپ کے مقام تک رسائی حاصل کی"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"حذف کرنے کی حد سے متجاوز ہو گیا"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، اکاؤنٹ <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> کیلئے <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> حذف کردہ آئٹمز ہیں۔ آپ کیا کرنا چاہتے ہیں؟"</string> <string name="sync_really_delete" msgid="5657871730315579051">"آئٹمز حذف کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index e7574b111c8b..c212627a3206 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1247,7 +1247,7 @@ <string name="private_dns_broken_detailed" msgid="3709388271074611847">"Xususiy DNS server ishlamayapti"</string> <string name="network_partial_connectivity" msgid="4791024923851432291">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> nomli tarmoqda aloqa cheklangan"</string> <string name="network_partial_connectivity_detailed" msgid="5741329444564575840">"Baribir ulash uchun bosing"</string> - <string name="network_switch_metered" msgid="1531869544142283384">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> tarmog‘iga ulanildi"</string> + <string name="network_switch_metered" msgid="1531869544142283384">"Yangi ulanish: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> <string name="network_switch_metered_detail" msgid="1358296010128405906">"Agar <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tarmoqda internet uzilsa, qurilma <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ga ulanadi. Sarflangan trafik uchun haq olinishi mumkin."</string> <string name="network_switch_metered_toast" msgid="501662047275723743">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> tarmog‘idan <xliff:g id="NEW_NETWORK">%2$s</xliff:g> tarmog‘iga o‘tildi"</string> <string-array name="network_switch_type_name"> @@ -1467,7 +1467,7 @@ <string name="sync_do_nothing" msgid="4528734662446469646">"Hozir hech nima qilinmasin"</string> <string name="choose_account_label" msgid="5557833752759831548">"Hisobni tanlang"</string> <string name="add_account_label" msgid="4067610644298737417">"Hisob kiritish"</string> - <string name="add_account_button_label" msgid="322390749416414097">"Hisob qo‘shish"</string> + <string name="add_account_button_label" msgid="322390749416414097">"Hisob kiritish"</string> <string name="number_picker_increment_button" msgid="7621013714795186298">"Ko‘paytirish"</string> <string name="number_picker_decrement_button" msgid="5116948444762708204">"Kamaytirish"</string> <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> raqamini bosib turing."</string> @@ -1657,8 +1657,8 @@ <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (ikkita barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"Maxsus imkoniyatlar ishorasi bilan ishga tushadigan funksiyani tanlang (uchta barmoq bilan ekranning pastidan tepaga surib tortilganda):"</string> <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"Funksiyalarni almashtirish uchun maxsus imkoniyatlar tugmasini bosib turing."</string> - <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Funksiyalarni almashtirish uchun ikkita barmoq bilan tepaga suring va bosib turing."</string> - <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va bosib turing."</string> + <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"Funksiyalarni almashtirish uchun ikkita barmoq bilan tepaga suring va ushlab turing."</string> + <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va ushlab turing."</string> <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Kattalashtirish"</string> <string name="user_switched" msgid="7249833311585228097">"Joriy foydalanuvchi <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="user_switching_message" msgid="1912993630661332336">"Quyidagi foydalanuvchiga o‘tilmoqda: <xliff:g id="NAME">%1$s</xliff:g>…"</string> diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index ddb39e7e8834..c328d720426d 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -40,10 +40,7 @@ import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Rect; import android.os.IBinder; -import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.view.Display; import android.view.View; @@ -310,58 +307,6 @@ public class ActivityThreadTest { } @Test - public void testHandleConfigurationChangedDoesntOverrideActivityConfig() { - final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); - - InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { - final Configuration oldActivityConfig = - new Configuration(activity.getResources().getConfiguration()); - final DisplayMetrics oldActivityMetrics = new DisplayMetrics(); - activity.getDisplay().getMetrics(oldActivityMetrics); - final Resources oldAppResources = activity.getApplication().getResources(); - final Configuration oldAppConfig = - new Configuration(oldAppResources.getConfiguration()); - final DisplayMetrics oldApplicationMetrics = new DisplayMetrics(); - oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics()); - assertEquals("Process config must match the top activity config by default", - 0, oldActivityConfig.diffPublicOnly(oldAppConfig)); - assertEquals("Process config must match the top activity config by default", - oldActivityMetrics, oldApplicationMetrics); - - // Update the application configuration separately from activity config - final Configuration newAppConfig = new Configuration(oldAppConfig); - newAppConfig.densityDpi += 100; - newAppConfig.screenHeightDp += 100; - final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds()); - newBounds.bottom += 100; - newAppConfig.windowConfiguration.setAppBounds(newBounds); - newAppConfig.windowConfiguration.setBounds(newBounds); - newAppConfig.seq++; - - final ActivityThread activityThread = activity.getActivityThread(); - activityThread.handleConfigurationChanged(newAppConfig); - - // Verify that application config update was applied, but didn't change activity config. - assertEquals("Activity config must not change if the process config changes", - oldActivityConfig, activity.getResources().getConfiguration()); - - final DisplayMetrics newActivityMetrics = new DisplayMetrics(); - activity.getDisplay().getMetrics(newActivityMetrics); - assertEquals("Activity display size must not change if the process config changes", - oldActivityMetrics, newActivityMetrics); - final Resources newAppResources = activity.getApplication().getResources(); - assertEquals("Application config must be updated", - newAppConfig, newAppResources.getConfiguration()); - final DisplayMetrics newApplicationMetrics = new DisplayMetrics(); - newApplicationMetrics.setTo(newAppResources.getDisplayMetrics()); - assertNotEquals("Application display size must be updated after config update", - oldApplicationMetrics, newApplicationMetrics); - assertNotEquals("Application display size must be updated after config update", - newActivityMetrics, newApplicationMetrics); - }); - } - - @Test public void testResumeAfterNewIntent() { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final ActivityThread activityThread = activity.getActivityThread(); @@ -461,10 +406,7 @@ public class ActivityThreadTest { private static ClientTransaction newRelaunchResumeTransaction(Activity activity) { final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null, - null, 0, new MergedConfiguration( - activity.getApplication().getResources().getConfiguration(), - new Configuration()), - false /* preserveWindow */); + null, 0, new MergedConfiguration(), false /* preserveWindow */); final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index 583c75102d52..c52555b5ed32 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -1725,6 +1725,31 @@ public class ChooserActivityTest { assertThat(chosen[0], is(personalResolvedComponentInfos.get(0).getResolveInfoAt(0))); } + @Test + public void testWorkTab_onePersonalTarget_emptyStateOnWorkTarget_autolaunch() { + // enable the work tab feature flag + ResolverActivity.ENABLE_TABBED_VIEW = true; + markWorkProfileUserAvailable(); + int workProfileTargets = 4; + List<ResolvedComponentInfo> personalResolvedComponentInfos = + createResolvedComponentsForTestWithOtherProfile(2, /* userId */ 10); + List<ResolvedComponentInfo> workResolvedComponentInfos = + createResolvedComponentsForTest(workProfileTargets); + sOverrides.hasCrossProfileIntents = false; + setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos); + Intent sendIntent = createSendTextIntent(); + ResolveInfo[] chosen = new ResolveInfo[1]; + sOverrides.onSafelyStartCallback = targetInfo -> { + chosen[0] = targetInfo.getResolveInfo(); + return true; + }; + + mActivityRule.launchActivity(sendIntent); + waitForIdle(); + + assertThat(chosen[0], is(personalResolvedComponentInfos.get(1).getResolveInfoAt(0))); + } + private Intent createSendTextIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java index 07aa654cae1e..0d5278678bb8 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java @@ -801,6 +801,32 @@ public class ResolverActivityTest { assertThat(chosen[0], is(personalResolvedComponentInfos.get(0).getResolveInfoAt(0))); } + @Test + public void testWorkTab_onePersonalTarget_emptyStateOnWorkTarget_autolaunch() { + // enable the work tab feature flag + ResolverActivity.ENABLE_TABBED_VIEW = true; + markWorkProfileUserAvailable(); + int workProfileTargets = 4; + List<ResolvedComponentInfo> personalResolvedComponentInfos = + createResolvedComponentsForTestWithOtherProfile(2, /* userId */ 10); + List<ResolvedComponentInfo> workResolvedComponentInfos = + createResolvedComponentsForTest(workProfileTargets); + sOverrides.hasCrossProfileIntents = false; + setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos); + Intent sendIntent = createSendImageIntent(); + sendIntent.setType("TestType"); + ResolveInfo[] chosen = new ResolveInfo[1]; + sOverrides.onSafelyStartCallback = targetInfo -> { + chosen[0] = targetInfo.getResolveInfo(); + return true; + }; + + mActivityRule.launchActivity(sendIntent); + waitForIdle(); + + assertThat(chosen[0], is(personalResolvedComponentInfos.get(1).getResolveInfoAt(0))); + } + private Intent createSendImageIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); diff --git a/core/tests/coretests/src/com/android/internal/policy/DecorContextTest.java b/core/tests/coretests/src/com/android/internal/policy/DecorContextTest.java index 3e40466e4b64..02870a53773e 100644 --- a/core/tests/coretests/src/com/android/internal/policy/DecorContextTest.java +++ b/core/tests/coretests/src/com/android/internal/policy/DecorContextTest.java @@ -19,20 +19,26 @@ package com.android.internal.policy; import static android.view.Display.DEFAULT_DISPLAY; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import android.app.Activity; +import android.app.EmptyActivity; import android.content.Context; import android.hardware.display.DisplayManagerGlobal; import android.platform.test.annotations.Presubmit; import android.view.Display; import android.view.DisplayAdjustments; import android.view.DisplayInfo; +import android.view.WindowManager; +import android.view.WindowManagerImpl; -import androidx.test.InstrumentationRegistry; +import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; +import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; - import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,17 +52,22 @@ public final class DecorContextTest { private Context mContext; private static final int EXTERNAL_DISPLAY = DEFAULT_DISPLAY + 1; + @Rule + public ActivityTestRule<EmptyActivity> mActivityRule = + new ActivityTestRule<>(EmptyActivity.class); + @Before - public void setUp() throws Exception { - mContext = InstrumentationRegistry.getContext(); + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); } @Test public void testDecorContextWithDefaultDisplay() { Display defaultDisplay = new Display(DisplayManagerGlobal.getInstance(), DEFAULT_DISPLAY, new DisplayInfo(), DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); - DecorContext context = new DecorContext(mContext.getApplicationContext(), - mContext.createDisplayContext(defaultDisplay)); + final Context defaultDisplayContext = mContext.createDisplayContext(defaultDisplay); + final PhoneWindow window = new PhoneWindow(defaultDisplayContext); + DecorContext context = new DecorContext(mContext.getApplicationContext(), window); assertDecorContextDisplay(DEFAULT_DISPLAY, context); } @@ -65,8 +76,9 @@ public final class DecorContextTest { public void testDecorContextWithExternalDisplay() { Display display = new Display(DisplayManagerGlobal.getInstance(), EXTERNAL_DISPLAY, new DisplayInfo(), DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); - DecorContext context = new DecorContext(mContext.getApplicationContext(), - mContext.createDisplayContext(display)); + final Context defaultDisplayContext = mContext.createDisplayContext(display); + final PhoneWindow window = new PhoneWindow(defaultDisplayContext); + DecorContext context = new DecorContext(mContext.getApplicationContext(), window); assertDecorContextDisplay(EXTERNAL_DISPLAY, context); } @@ -76,4 +88,29 @@ public final class DecorContextTest { Display associatedDisplay = decorContext.getDisplay(); assertEquals(expectedDisplayId, associatedDisplay.getDisplayId()); } + + @Test + public void testGetWindowManagerFromVisualDecorContext() throws Throwable { + mActivityRule.runOnUiThread(() -> { + Activity activity = mActivityRule.getActivity(); + final DecorContext decorContext = new DecorContext(mContext.getApplicationContext(), + (PhoneWindow) activity.getWindow()); + WindowManagerImpl actualWm = (WindowManagerImpl) + decorContext.getSystemService(WindowManager.class); + WindowManagerImpl expectedWm = (WindowManagerImpl) + activity.getSystemService(WindowManager.class); + // Verify that window manager is from activity not application context. + assertEquals(expectedWm.mContext, actualWm.mContext); + }); + } + + @Test + public void testIsUiContextFromVisualDecorContext() throws Throwable { + mActivityRule.runOnUiThread(() -> { + Activity activity = mActivityRule.getActivity(); + final DecorContext decorContext = new DecorContext(mContext.getApplicationContext(), + (PhoneWindow) activity.getWindow()); + assertTrue(decorContext.isUiContext()); + }); + } } diff --git a/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java b/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java index 9018320e479c..0390ac6b8e9c 100644 --- a/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java +++ b/core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java @@ -210,6 +210,7 @@ public class ActivityThreadClientTest { info.applicationInfo = new ApplicationInfo(); info.applicationInfo.packageName = info.packageName; info.applicationInfo.uid = UserHandle.myUserId(); + info.applicationInfo.sourceDir = "/test/sourceDir"; // mock the function for preventing NPE in emulator environment. The purpose of the // test is for activity client state changes, we don't focus on the updating for the diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 7ff15df2d65e..8a60bdebbf09 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -235,9 +235,9 @@ public final class AudioFormat implements Parcelable { public static final int ENCODING_PCM_8BIT = 3; /** Audio data format: single-precision floating-point per sample */ public static final int ENCODING_PCM_FLOAT = 4; - /** Audio data format: AC-3 compressed */ + /** Audio data format: AC-3 compressed, also known as Dolby Digital */ public static final int ENCODING_AC3 = 5; - /** Audio data format: E-AC-3 compressed */ + /** Audio data format: E-AC-3 compressed, also known as Dolby Digital Plus or DD+ */ public static final int ENCODING_E_AC3 = 6; /** Audio data format: DTS compressed */ public static final int ENCODING_DTS = 7; diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 373f6e126924..2d00010f51ee 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -199,18 +199,61 @@ public class AudioSystem /** @hide */ public static final int AUDIO_FORMAT_LDAC = 0x23000000; + /** @hide */ + @IntDef(flag = false, prefix = "AUDIO_FORMAT_", value = { + AUDIO_FORMAT_INVALID, + AUDIO_FORMAT_DEFAULT, + AUDIO_FORMAT_AAC, + AUDIO_FORMAT_SBC, + AUDIO_FORMAT_APTX, + AUDIO_FORMAT_APTX_HD, + AUDIO_FORMAT_LDAC } + ) + @Retention(RetentionPolicy.SOURCE) + public @interface AudioFormatNativeEnumForBtCodec {} + /** * @hide * Convert audio format enum values to Bluetooth codec values */ - public static int audioFormatToBluetoothSourceCodec(int audioFormat) { + public static int audioFormatToBluetoothSourceCodec( + @AudioFormatNativeEnumForBtCodec int audioFormat) { switch (audioFormat) { case AUDIO_FORMAT_AAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC; case AUDIO_FORMAT_SBC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC; case AUDIO_FORMAT_APTX: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX; case AUDIO_FORMAT_APTX_HD: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD; case AUDIO_FORMAT_LDAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC; - default: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID; + default: + Log.e(TAG, "Unknown audio format 0x" + Integer.toHexString(audioFormat) + + " for conversion to BT codec"); + return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID; + } + } + + /** + * @hide + * Convert a Bluetooth codec to an audio format enum + * @param btCodec the codec to convert. + * @return the audio format, or {@link #AUDIO_FORMAT_DEFAULT} if unknown + */ + public static @AudioFormatNativeEnumForBtCodec int bluetoothCodecToAudioFormat(int btCodec) { + switch (btCodec) { + case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC: + return AudioSystem.AUDIO_FORMAT_SBC; + case BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC: + return AudioSystem.AUDIO_FORMAT_AAC; + case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX: + return AudioSystem.AUDIO_FORMAT_APTX; + case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD: + return AudioSystem.AUDIO_FORMAT_APTX_HD; + case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC: + return AudioSystem.AUDIO_FORMAT_LDAC; + default: + Log.e(TAG, "Unknown BT codec 0x" + Integer.toHexString(btCodec) + + " for conversion to audio format"); + // TODO returning DEFAULT is the current behavior, should this return INVALID? + return AudioSystem.AUDIO_FORMAT_DEFAULT; } } diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 1d70a0dbc57c..d6496c0b3e02 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -4848,8 +4848,13 @@ final public class MediaCodec { } public MediaImage( - @NonNull Image.Plane[] planes, int width, int height, int format, boolean readOnly, + @NonNull ByteBuffer[] buffers, int[] rowStrides, int[] pixelStrides, + int width, int height, int format, boolean readOnly, long timestamp, int xOffset, int yOffset, @Nullable Rect cropRect, long context) { + if (buffers.length != rowStrides.length || buffers.length != pixelStrides.length) { + throw new IllegalArgumentException( + "buffers, rowStrides and pixelStrides should have the same length"); + } mWidth = width; mHeight = height; mFormat = format; @@ -4858,7 +4863,10 @@ final public class MediaCodec { mIsReadOnly = readOnly; mBuffer = null; mInfo = null; - mPlanes = planes; + mPlanes = new MediaPlane[buffers.length]; + for (int i = 0; i < buffers.length; ++i) { + mPlanes[i] = new MediaPlane(buffers[i], rowStrides[i], pixelStrides[i]); + } // save offsets and info mXOffset = xOffset; diff --git a/media/java/android/media/soundtrigger_middleware/Status.aidl b/media/java/android/media/soundtrigger_middleware/Status.aidl index 85ccacf21c8d..c7623f5bf491 100644 --- a/media/java/android/media/soundtrigger_middleware/Status.aidl +++ b/media/java/android/media/soundtrigger_middleware/Status.aidl @@ -30,4 +30,9 @@ enum Status { TEMPORARY_PERMISSION_DENIED = 3, /** The object on which this method is called is dead and all of its state is lost. */ DEAD_OBJECT = 4, + /** + * Unexpected internal error has occurred. Usually this will result in the service rebooting + * shortly after. The client should treat the state of the server as undefined. + */ + INTERNAL_ERROR = 5, } diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 947cfc038b7f..b2b707b00829 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -37,6 +37,7 @@ #include <C2AllocatorGralloc.h> #include <C2BlockInternal.h> #include <C2Buffer.h> +#include <C2PlatformSupport.h> #include <android/hardware/cas/native/1.0/IDescrambler.h> @@ -1862,7 +1863,7 @@ static void android_media_MediaCodec_queueSecureInputBuffer( env, err, ACTION_CODE_FATAL, errorDetailMsg.empty() ? NULL : errorDetailMsg.c_str()); } -static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jobject bufferObj) { +static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jclass, jobject bufferObj) { ALOGV("android_media_MediaCodec_mapHardwareBuffer"); AHardwareBuffer *hardwareBuffer = android_hardware_HardwareBuffer_getNativeHardwareBuffer( env, bufferObj); @@ -1878,9 +1879,9 @@ static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jobject b } bool readOnly = ((desc.usage & AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK) == 0); - uint64_t cpuUsage = desc.usage; - cpuUsage = (cpuUsage & AHARDWAREBUFFER_USAGE_CPU_READ_MASK); - cpuUsage = (cpuUsage & AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK); + uint64_t cpuUsage = 0; + cpuUsage |= (desc.usage & AHARDWAREBUFFER_USAGE_CPU_READ_MASK); + cpuUsage |= (desc.usage & AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK); AHardwareBuffer_Planes planes; int err = AHardwareBuffer_lockPlanes( @@ -1895,42 +1896,56 @@ static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jobject b return nullptr; } - ScopedLocalRef<jclass> planeClazz( - env, env->FindClass("android/media/MediaCodec$MediaImage$MediaPlane")); - ScopedLocalRef<jobjectArray> planeArray{ - env, env->NewObjectArray(3, planeClazz.get(), NULL)}; - CHECK(planeClazz.get() != NULL); - jmethodID planeConstructID = env->GetMethodID(planeClazz.get(), "<init>", - "([Ljava/nio/ByteBuffer;IIIII)V"); + ScopedLocalRef<jobjectArray> buffersArray{ + env, env->NewObjectArray(3, gByteBufferInfo.clazz, NULL)}; + ScopedLocalRef<jintArray> rowStridesArray{env, env->NewIntArray(3)}; + ScopedLocalRef<jintArray> pixelStridesArray{env, env->NewIntArray(3)}; + jboolean isCopy = JNI_FALSE; + jint *rowStrides = env->GetIntArrayElements(rowStridesArray.get(), &isCopy); + jint *pixelStrides = env->GetIntArrayElements(rowStridesArray.get(), &isCopy); + + // For Y plane + int rowSampling = 1; + int colSampling = 1; // plane indices are Y-U-V. for (uint32_t i = 0; i < 3; ++i) { const AHardwareBuffer_Plane &plane = planes.planes[i]; + int maxRowOffset = plane.rowStride * (desc.height / rowSampling - 1); + int maxColOffset = plane.pixelStride * (desc.width / colSampling - 1); + int maxOffset = maxRowOffset + maxColOffset; ScopedLocalRef<jobject> byteBuffer{env, CreateByteBuffer( env, plane.data, - plane.rowStride * (desc.height - 1) + plane.pixelStride * (desc.width - 1) + 1, + maxOffset + 1, 0, - plane.rowStride * (desc.height - 1) + plane.pixelStride * (desc.width - 1) + 1, + maxOffset + 1, readOnly, true)}; - ScopedLocalRef<jobject> planeObj{env, env->NewObject( - planeClazz.get(), planeConstructID, - byteBuffer.get(), plane.rowStride, plane.pixelStride)}; - - env->SetObjectArrayElement(planeArray.get(), i, planeObj.get()); + env->SetObjectArrayElement(buffersArray.get(), i, byteBuffer.get()); + rowStrides[i] = plane.rowStride; + pixelStrides[i] = plane.pixelStride; + // For U-V planes + rowSampling = 2; + colSampling = 2; } + env->ReleaseIntArrayElements(rowStridesArray.get(), rowStrides, 0); + env->ReleaseIntArrayElements(pixelStridesArray.get(), pixelStrides, 0); + rowStrides = pixelStrides = nullptr; + ScopedLocalRef<jclass> imageClazz( env, env->FindClass("android/media/MediaCodec$MediaImage")); CHECK(imageClazz.get() != NULL); jmethodID imageConstructID = env->GetMethodID(imageClazz.get(), "<init>", - "([Landroid/media/Image$Plane;IIIZJIILandroid/graphics/Rect;J)V"); + "([Ljava/nio/ByteBuffer;[I[IIIIZJIILandroid/graphics/Rect;J)V"); jobject img = env->NewObject(imageClazz.get(), imageConstructID, - planeArray.get(), + buffersArray.get(), + rowStridesArray.get(), + pixelStridesArray.get(), desc.width, desc.height, desc.format, // ??? @@ -1951,17 +1966,15 @@ static jobject android_media_MediaCodec_mapHardwareBuffer(JNIEnv *env, jobject b return img; } -static void android_media_MediaCodec_closeMediaImage(JNIEnv *, jlong context) { +static void android_media_MediaCodec_closeMediaImage(JNIEnv *, jclass, jlong context) { + ALOGV("android_media_MediaCodec_closeMediaImage"); if (context == 0) { return; } AHardwareBuffer *hardwareBuffer = (AHardwareBuffer *)context; - int32_t fenceFd = -1; - int err = AHardwareBuffer_unlock(hardwareBuffer, &fenceFd); - if (err == 0) { - sp<Fence> fence{new Fence(fenceFd)}; - } else { + int err = AHardwareBuffer_unlock(hardwareBuffer, nullptr); + if (err != 0) { ALOGI("closeMediaImage: failed to unlock (err=%d)", err); // Continue to release the hardwareBuffer } @@ -2171,19 +2184,30 @@ static void android_media_MediaCodec_native_queueHardwareBuffer( env, bufferObj); sp<GraphicBuffer> graphicBuffer{AHardwareBuffer_to_GraphicBuffer(hardwareBuffer)}; C2Handle *handle = WrapNativeCodec2GrallocHandle( - graphicBuffer->handle, graphicBuffer->format, - graphicBuffer->width, graphicBuffer->height, - graphicBuffer->usage, graphicBuffer->stride); - std::shared_ptr<C2GraphicBlock> block = _C2BlockFactory::CreateGraphicBlock(handle); - - if (!block) { + graphicBuffer->handle, graphicBuffer->width, graphicBuffer->height, + graphicBuffer->format, graphicBuffer->usage, graphicBuffer->stride); + static std::shared_ptr<C2Allocator> sGrallocAlloc = []() -> std::shared_ptr<C2Allocator> { + std::shared_ptr<C2Allocator> alloc; + c2_status_t err = GetCodec2PlatformAllocatorStore()->fetchAllocator( + C2PlatformAllocatorStore::GRALLOC, &alloc); + if (err == C2_OK) { + return alloc; + } + return nullptr; + }(); + std::shared_ptr<C2GraphicAllocation> alloc; + c2_status_t c2err = sGrallocAlloc->priorGraphicAllocation(handle, &alloc); + if (c2err != C2_OK) { + ALOGW("Failed to wrap AHardwareBuffer into C2GraphicAllocation"); throwExceptionAsNecessary(env, BAD_VALUE); return; } + std::shared_ptr<C2GraphicBlock> block = _C2BlockFactory::CreateGraphicBlock(alloc); std::shared_ptr<C2Buffer> buffer = C2Buffer::CreateGraphicBuffer(block->share( block->crop(), C2Fence{})); AString errorDetailMsg; - err = codec->queueBuffer(index, buffer, presentationTimeUs, flags, tunings, &errorDetailMsg); + err = codec->queueBuffer( + index, buffer, presentationTimeUs, flags, tunings, &errorDetailMsg); throwExceptionAsNecessary(env, err, ACTION_CODE_FATAL, errorDetailMsg.c_str()); } diff --git a/packages/CarSystemUI/res/values-as/strings.xml b/packages/CarSystemUI/res/values-as/strings.xml index abd090e4c4d9..87e27b360ba1 100644 --- a/packages/CarSystemUI/res/values-as/strings.xml +++ b/packages/CarSystemUI/res/values-as/strings.xml @@ -20,4 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string> <string name="hvac_max_text" msgid="3669693372074755551">"সৰ্বাধিক"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"কণ্ঠস্বৰৰ চিনাক্তকৰণ এতিয়া সংযুক্ত ব্লুটুথ ডিভাইচে নিয়ন্ত্ৰণ কৰে"</string> + <string name="car_guest" msgid="318393171202663722">"অতিথি"</string> + <string name="start_guest_session" msgid="497784785761754874">"অতিথি"</string> + <string name="car_add_user" msgid="4067337059622483269">"ব্যৱহাৰকাৰী যোগ দিয়ক"</string> + <string name="car_new_user" msgid="6637442369728092473">"নতুন ব্যৱহাৰকাৰী"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰীক যোগ কৰে, তেতিয়া তেওঁ নিজৰ ঠাই ছেট আপ কৰাটো প্ৰয়োজন হয়।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"যিকোনো ব্যৱহাৰকাৰীয়ে অন্য ব্যৱহাৰকাৰীৰ বাবে এপ্সমূহ আপডে’ট কৰিব পাৰে।"</string> </resources> diff --git a/packages/CarSystemUI/res/values-bn/strings.xml b/packages/CarSystemUI/res/values-bn/strings.xml index 1c56256a59a5..a41f67262053 100644 --- a/packages/CarSystemUI/res/values-bn/strings.xml +++ b/packages/CarSystemUI/res/values-bn/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"সর্বনিম্ন"</string> <string name="hvac_max_text" msgid="3669693372074755551">"সর্বাধিক"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"কানেক্ট করা ব্লুটুথ ডিভাইস এখন ভয়েস শনাক্তকরণ ম্যানেজ করছে"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"অতিথি"</string> + <string name="start_guest_session" msgid="497784785761754874">"অতিথি"</string> + <string name="car_add_user" msgid="4067337059622483269">"ব্যবহারকারীকে যোগ করুন"</string> + <string name="car_new_user" msgid="6637442369728092473">"নতুন ব্যবহারকারী"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"নতুন ব্যবহারকারী যোগ করলে, তার স্পেস তাকে সেট-আপ করে নিতে হবে।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string> </resources> diff --git a/packages/CarSystemUI/res/values-de/strings.xml b/packages/CarSystemUI/res/values-de/strings.xml index e5695f7661c1..84c9b785fbee 100644 --- a/packages/CarSystemUI/res/values-de/strings.xml +++ b/packages/CarSystemUI/res/values-de/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string> <string name="hvac_max_text" msgid="3669693372074755551">"Max."</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"Spracherkennung jetzt über das verbundene Bluetooth-Gerät"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"Gast"</string> + <string name="start_guest_session" msgid="497784785761754874">"Gast"</string> + <string name="car_add_user" msgid="4067337059622483269">"Nutzer hinzufügen"</string> + <string name="car_new_user" msgid="6637442369728092473">"Neuer Nutzer"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string> </resources> diff --git a/packages/CarSystemUI/res/values-gu/strings.xml b/packages/CarSystemUI/res/values-gu/strings.xml index 151fbde01059..5c694830c46f 100644 --- a/packages/CarSystemUI/res/values-gu/strings.xml +++ b/packages/CarSystemUI/res/values-gu/strings.xml @@ -20,4 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"ન્યૂનતમ"</string> <string name="hvac_max_text" msgid="3669693372074755551">"મહત્તમ"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"અવાજની ઓળખ હવે કનેક્ટેડ બ્લૂટૂથ ડિવાઇસ વડે નિયંત્રિત થશે"</string> + <string name="car_guest" msgid="318393171202663722">"અતિથિ"</string> + <string name="start_guest_session" msgid="497784785761754874">"અતિથિ"</string> + <string name="car_add_user" msgid="4067337059622483269">"વપરાશકર્તા ઉમેરો"</string> + <string name="car_new_user" msgid="6637442369728092473">"નવા વપરાશકર્તા"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિએ તેમની સ્પેસ સેટ કરવાની જરૂર રહે છે."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"કોઈપણ વપરાશકર્તા અન્ય બધા વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string> </resources> diff --git a/packages/CarSystemUI/res/values-hi/strings.xml b/packages/CarSystemUI/res/values-hi/strings.xml index 3913f277dd5a..fc8b4b5e4f30 100644 --- a/packages/CarSystemUI/res/values-hi/strings.xml +++ b/packages/CarSystemUI/res/values-hi/strings.xml @@ -21,7 +21,7 @@ <string name="hvac_max_text" msgid="3669693372074755551">"ज़्यादा से ज़्यादा"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"अब आवाज़ पहचानने का काम, कनेक्ट किए गए ब्लूटूथ डिवाइस करते हैं"</string> <string name="car_guest" msgid="318393171202663722">"मेहमान प्रोफ़ाइल"</string> - <string name="start_guest_session" msgid="497784785761754874">"मेहमान सेशन शुरू करें"</string> + <string name="start_guest_session" msgid="497784785761754874">"मेहमान के तौर पर सेशन शुरू करें"</string> <string name="car_add_user" msgid="4067337059622483269">"उपयोगकर्ता जोड़ें"</string> <string name="car_new_user" msgid="6637442369728092473">"नया उपयोगकर्ता"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं, तब उसे अपनी जगह सेट करनी होती है."</string> diff --git a/packages/CarSystemUI/res/values-ml/strings.xml b/packages/CarSystemUI/res/values-ml/strings.xml index f7934d112f95..9ee3430443de 100644 --- a/packages/CarSystemUI/res/values-ml/strings.xml +++ b/packages/CarSystemUI/res/values-ml/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"മിനിമം"</string> <string name="hvac_max_text" msgid="3669693372074755551">"മാക്സിമം"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"കണക്റ്റ് ചെയ്ത Bluetooth ഉപകരണം വഴി ഇപ്പോൾ വോയ്സ് തിരിച്ചറിയൽ കെെകാര്യം ചെയ്യുന്നു"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"അതിഥി"</string> + <string name="start_guest_session" msgid="497784785761754874">"അതിഥി"</string> + <string name="car_add_user" msgid="4067337059622483269">"ഉപയോക്താവിനെ ചേർക്കുക"</string> + <string name="car_new_user" msgid="6637442369728092473">"പുതിയ ഉപയോക്താവ്"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"ഏതൊരു ഉപയോക്താവിനും മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്ഡേറ്റ് ചെയ്യാനാവും."</string> </resources> diff --git a/packages/CarSystemUI/res/values-mr/strings.xml b/packages/CarSystemUI/res/values-mr/strings.xml index 60d9231bbc4f..27ee0a935018 100644 --- a/packages/CarSystemUI/res/values-mr/strings.xml +++ b/packages/CarSystemUI/res/values-mr/strings.xml @@ -20,4 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"मि"</string> <string name="hvac_max_text" msgid="3669693372074755551">"कमाल"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"आता कनेक्ट केलेले ब्लूटूथ डिव्हाइस व्हॉइस रेकग्निशन हाताळते"</string> + <string name="car_guest" msgid="318393171202663722">"अतिथी"</string> + <string name="start_guest_session" msgid="497784785761754874">"अतिथी"</string> + <string name="car_add_user" msgid="4067337059622483269">"वापरकर्ता जोडा"</string> + <string name="car_new_user" msgid="6637442369728092473">"नवीन वापरकर्ता"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"तुम्ही नवीन वापरकर्ता जोडता तेव्हा त्या व्यक्तीने त्यांची जागा सेट करणे आवश्यक असते."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"कोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अपडेट करू शकतो."</string> </resources> diff --git a/packages/CarSystemUI/res/values-ne/strings.xml b/packages/CarSystemUI/res/values-ne/strings.xml index b17c8b44b6ba..231559d7f821 100644 --- a/packages/CarSystemUI/res/values-ne/strings.xml +++ b/packages/CarSystemUI/res/values-ne/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"न्यूनतम"</string> <string name="hvac_max_text" msgid="3669693372074755551">"अधिकतम"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"अब ब्लुटुथ मार्फत जोडिएको यन्त्रले आवाज पहिचान गर्ने कार्य सम्हाल्छ"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"अतिथि"</string> + <string name="start_guest_session" msgid="497784785761754874">"अतिथि"</string> + <string name="car_add_user" msgid="4067337059622483269">"प्रयोगकर्ता थप्नुहोस्"</string> + <string name="car_new_user" msgid="6637442369728092473">"नयाँ प्रयोगकर्ता"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"तपाईंले नयाँ प्रयोगकर्ता थप्दा ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्छ।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"सबै प्रयोगकर्ताले अन्य प्रयोगकर्ताका अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> </resources> diff --git a/packages/CarSystemUI/res/values-or/strings.xml b/packages/CarSystemUI/res/values-or/strings.xml index 4d1a6ac99b61..1badbf9ef07f 100644 --- a/packages/CarSystemUI/res/values-or/strings.xml +++ b/packages/CarSystemUI/res/values-or/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"ସର୍ବନିମ୍ନ"</string> <string name="hvac_max_text" msgid="3669693372074755551">"ସର୍ବାଧିକ"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"ଭଏସ ଚିହ୍ନଟକରଣ ଏବେ ସଂଯୁକ୍ତ ଥିବା ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଦ୍ୱାରା ପରିଚାଳିତ"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"ଅତିଥି"</string> + <string name="start_guest_session" msgid="497784785761754874">"ଅତିଥି"</string> + <string name="car_add_user" msgid="4067337059622483269">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ"</string> + <string name="car_new_user" msgid="6637442369728092473">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"ଜଣେ ନୂଆ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରିବା ବେଳେ ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ତାଙ୍କ ସ୍ଥାନ ସେଟ୍ ଅପ୍ କରିବାର ଆବଶ୍ୟକତା ଅଛି।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"ଯେ କୌଣସି ଉପଯୋଗକର୍ତ୍ତା ଅନ୍ୟ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string> </resources> diff --git a/packages/CarSystemUI/res/values-pa/strings.xml b/packages/CarSystemUI/res/values-pa/strings.xml index 8184c2cac008..4687aa768483 100644 --- a/packages/CarSystemUI/res/values-pa/strings.xml +++ b/packages/CarSystemUI/res/values-pa/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"ਨਿਊਨਤਮ"</string> <string name="hvac_max_text" msgid="3669693372074755551">"ਅਧਿਕਤਮ"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"ਅਵਾਜ਼ ਦੀ ਪਛਾਣ ਨੂੰ ਹੁਣ ਕਨੈਕਟ ਕੀਤਾ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਸੰਭਾਲਦਾ ਹੈ"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"ਮਹਿਮਾਨ"</string> + <string name="start_guest_session" msgid="497784785761754874">"ਮਹਿਮਾਨ"</string> + <string name="car_add_user" msgid="4067337059622483269">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="car_new_user" msgid="6637442369728092473">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"ਜਦੋਂ ਤੁਸੀਂ ਕੋਈ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string> </resources> diff --git a/packages/CarSystemUI/res/values-sk/strings.xml b/packages/CarSystemUI/res/values-sk/strings.xml index 619cf2914b93..b5e9416fcd40 100644 --- a/packages/CarSystemUI/res/values-sk/strings.xml +++ b/packages/CarSystemUI/res/values-sk/strings.xml @@ -25,5 +25,5 @@ <string name="car_add_user" msgid="4067337059622483269">"Pridať používateľa"</string> <string name="car_new_user" msgid="6637442369728092473">"Nový používateľ"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Ktorýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string> </resources> diff --git a/packages/CarSystemUI/res/values-sq/strings.xml b/packages/CarSystemUI/res/values-sq/strings.xml index c75782bda486..21484f2b6402 100644 --- a/packages/CarSystemUI/res/values-sq/strings.xml +++ b/packages/CarSystemUI/res/values-sq/strings.xml @@ -20,4 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"Min."</string> <string name="hvac_max_text" msgid="3669693372074755551">"Maks."</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"Njohja zanore trajtohet nga pajisja me Bluetooth-in e lidhur"</string> + <string name="car_guest" msgid="318393171202663722">"I ftuar"</string> + <string name="start_guest_session" msgid="497784785761754874">"I ftuar"</string> + <string name="car_add_user" msgid="4067337059622483269">"Shto përdorues"</string> + <string name="car_new_user" msgid="6637442369728092473">"Përdorues i ri"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string> </resources> diff --git a/packages/CarSystemUI/res/values-te/strings.xml b/packages/CarSystemUI/res/values-te/strings.xml index bfa586f22f22..e819034c9b40 100644 --- a/packages/CarSystemUI/res/values-te/strings.xml +++ b/packages/CarSystemUI/res/values-te/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"కని."</string> <string name="hvac_max_text" msgid="3669693372074755551">"గరి."</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"నేడు వాయిస్ గుర్తింపును కనెక్ట్ అయిన బ్లూటూత్ నిర్వహిస్తోంది"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"గెస్ట్"</string> + <string name="start_guest_session" msgid="497784785761754874">"గెస్ట్"</string> + <string name="car_add_user" msgid="4067337059622483269">"యూజర్ను జోడించండి"</string> + <string name="car_new_user" msgid="6637442369728092473">"కొత్త యూజర్"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"మీరు కొత్త యూజర్ను జోడించినప్పుడు, ఆ వ్యక్తి తన స్పేస్ను సెటప్ చేసుకోవాలి."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"ఏ యూజర్ అయినా మిగతా యూజర్ల కోసం యాప్లను అప్డేట్ చేయవచ్చు."</string> </resources> diff --git a/packages/CarSystemUI/res/values-ur/strings.xml b/packages/CarSystemUI/res/values-ur/strings.xml index 50342a337690..ddfccdcbee7d 100644 --- a/packages/CarSystemUI/res/values-ur/strings.xml +++ b/packages/CarSystemUI/res/values-ur/strings.xml @@ -20,16 +20,10 @@ <string name="hvac_min_text" msgid="8167124789068494624">"کم از کم"</string> <string name="hvac_max_text" msgid="3669693372074755551">"زیادہ سے زیادہ"</string> <string name="voice_recognition_toast" msgid="1149934534584052842">"آواز کی شناخت اب منسلک کردہ بلوٹوتھ آلے سے ہوتی ہے"</string> - <!-- no translation found for car_guest (318393171202663722) --> - <skip /> - <!-- no translation found for start_guest_session (497784785761754874) --> - <skip /> - <!-- no translation found for car_add_user (4067337059622483269) --> - <skip /> - <!-- no translation found for car_new_user (6637442369728092473) --> - <skip /> - <!-- no translation found for user_add_user_message_setup (1035578846007352323) --> - <skip /> - <!-- no translation found for user_add_user_message_update (7061671307004867811) --> - <skip /> + <string name="car_guest" msgid="318393171202663722">"مہمان"</string> + <string name="start_guest_session" msgid="497784785761754874">"مہمان"</string> + <string name="car_add_user" msgid="4067337059622483269">"صارف شامل کریں"</string> + <string name="car_new_user" msgid="6637442369728092473">"نیا صارف"</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ سیٹ کرنی ہوتی ہے۔"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"کوئی بھی صارف دیگر سبھی صارفین کے لیے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string> </resources> diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index eb1d9d0dd602..050db3218a1d 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -72,11 +72,21 @@ <!-- Car System UI's OverlayViewsMediator--> <string-array name="config_carSystemUIOverlayViewsMediators" translatable="false"> - <item>com.android.systemui.car.notification.NotificationPanelViewMediator</item> + <item>@string/config_notificationPanelViewMediator</item> <item>com.android.systemui.car.keyguard.CarKeyguardViewMediator</item> <item>com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator</item> </string-array> + <!-- + Car SystemUI's notification mediator. Replace with other notification mediators to have + the notification panel show from another system bar. The system bar should be enabled to + use the mediator with that system bar. + Example: config_enableBottomNavigationBar=true + config_notificationPanelViewMediator= + com.android.systemui.car.notification.BottomNotificationPanelViewMediator --> + <string name="config_notificationPanelViewMediator" translatable="false"> + com.android.systemui.car.notification.TopNotificationPanelViewMediator</string> + <!-- List of package names that are allowed sources of app installation. --> <string-array name="config_allowedAppInstallSources" translatable="false"> <item>com.android.vending</item> @@ -111,5 +121,6 @@ <item>com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier</item> <item>com.android.systemui.car.window.SystemUIOverlayWindowManager</item> <item>com.android.systemui.car.volume.VolumeUI</item> + <item>com.android.systemui.car.sideloaded.SideLoadedAppController</item> </string-array> </resources> diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java index 58e4b9a81190..34afb132805c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java @@ -20,6 +20,7 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.bubbles.dagger.BubbleModule; import com.android.systemui.car.navigationbar.CarNavigationBar; import com.android.systemui.car.notification.CarNotificationModule; +import com.android.systemui.car.sideloaded.SideLoadedAppController; import com.android.systemui.car.statusbar.CarStatusBar; import com.android.systemui.car.statusbar.CarStatusBarModule; import com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier; @@ -192,4 +193,10 @@ public abstract class CarSystemUIBinder { @IntoMap @ClassKey(SystemUIOverlayWindowManager.class) public abstract SystemUI bindSystemUIPrimaryWindowManager(SystemUIOverlayWindowManager sysui); + + /** Inject into SideLoadedAppController. */ + @Binds + @IntoMap + @ClassKey(SideLoadedAppController.class) + public abstract SystemUI bindSideLoadedAppController(SideLoadedAppController sysui); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index b5f648b7ef3b..6a0a31bbeef9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -346,6 +346,13 @@ public class CarKeyguardViewController extends OverlayViewController implements private void revealKeyguardIfBouncerPrepared() { int reattemptDelayMillis = 50; Runnable revealKeyguard = () -> { + if (mBouncer == null) { + if (DEBUG) { + Log.d(TAG, "revealKeyguardIfBouncerPrepared: revealKeyguard request is ignored " + + "since the Bouncer has not been initialized yet."); + } + return; + } if (!mBouncer.inTransit() || !mBouncer.isSecure()) { getLayout().setVisibility(View.VISIBLE); } else { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java new file mode 100644 index 000000000000..6d140cae5442 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.notification; + +import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.car.navigationbar.CarNavigationBarController; +import com.android.systemui.car.window.OverlayPanelViewController; +import com.android.systemui.statusbar.policy.ConfigurationController; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened + * from the top navigation bar. + */ +@Singleton +public class BottomNotificationPanelViewMediator extends NotificationPanelViewMediator { + + @Inject + public BottomNotificationPanelViewMediator( + CarNavigationBarController carNavigationBarController, + NotificationPanelViewController notificationPanelViewController, + + PowerManagerHelper powerManagerHelper, + + CarDeviceProvisionedController carDeviceProvisionedController, + ConfigurationController configurationController + ) { + super(carNavigationBarController, + notificationPanelViewController, + powerManagerHelper, + carDeviceProvisionedController, + configurationController); + notificationPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR); + } + + @Override + public void registerListeners() { + super.registerListeners(); + getCarNavigationBarController().registerBottomBarTouchListener( + getNotificationPanelViewController().getDragOpenTouchListener()); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index a17a0e9d2920..cb9539ad5b1d 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -83,9 +83,9 @@ public class NotificationPanelViewController extends OverlayPanelViewController private NotificationViewController mNotificationViewController; private boolean mIsTracking; - private boolean mNotificationListAtBottom; + private boolean mNotificationListAtEnd; private float mFirstTouchDownOnGlassPane; - private boolean mNotificationListAtBottomAtTimeOfTouch; + private boolean mNotificationListAtEndAtTimeOfTouch; private boolean mIsSwipingVerticallyToClose; private boolean mIsNotificationCardSwiping; @@ -233,11 +233,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController // This allows us to initialize gesture listeners and detect when to close the notifications glassPane.setOnTouchListener((v, event) -> { if (event.getActionMasked() == MotionEvent.ACTION_UP) { - mNotificationListAtBottomAtTimeOfTouch = false; + mNotificationListAtEndAtTimeOfTouch = false; } if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { mFirstTouchDownOnGlassPane = event.getRawX(); - mNotificationListAtBottomAtTimeOfTouch = mNotificationListAtBottom; + mNotificationListAtEndAtTimeOfTouch = mNotificationListAtEnd; // Reset the tracker when there is a touch down on the glass pane. mIsTracking = false; // Pass the down event to gesture detector so that it knows where the touch event @@ -251,34 +251,34 @@ public class NotificationPanelViewController extends OverlayPanelViewController @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); - // Check if we can scroll vertically downwards. - if (!mNotificationList.canScrollVertically(/* direction= */ 1)) { - mNotificationListAtBottom = true; + // Check if we can scroll vertically in the animation direction. + if (!mNotificationList.canScrollVertically(mAnimateDirection)) { + mNotificationListAtEnd = true; return; } - mNotificationListAtBottom = false; + mNotificationListAtEnd = false; mIsSwipingVerticallyToClose = false; - mNotificationListAtBottomAtTimeOfTouch = false; + mNotificationListAtEndAtTimeOfTouch = false; } }); mNotificationList.setOnTouchListener((v, event) -> { mIsNotificationCardSwiping = Math.abs(mFirstTouchDownOnGlassPane - event.getRawX()) > SWIPE_MAX_OFF_PATH; - if (mNotificationListAtBottomAtTimeOfTouch && mNotificationListAtBottom) { + if (mNotificationListAtEndAtTimeOfTouch && mNotificationListAtEnd) { // We need to save the state here as if notification card is swiping we will - // change the mNotificationListAtBottomAtTimeOfTouch. This is to protect + // change the mNotificationListAtEndAtTimeOfTouch. This is to protect // closing the notification shade while the notification card is being swiped. mIsSwipingVerticallyToClose = true; } // If the card is swiping we should not allow the notification shade to close. - // Hence setting mNotificationListAtBottomAtTimeOfTouch to false will stop that + // Hence setting mNotificationListAtEndAtTimeOfTouch to false will stop that // for us. We are also checking for mIsTracking because while swiping the // notification shade to close if the user goes a bit horizontal while swiping // upwards then also this should close. if (mIsNotificationCardSwiping && !mIsTracking) { - mNotificationListAtBottomAtTimeOfTouch = false; + mNotificationListAtEndAtTimeOfTouch = false; } boolean handled = closeGestureDetector.onTouchEvent(event); @@ -290,7 +290,7 @@ public class NotificationPanelViewController extends OverlayPanelViewController } if (!handled && event.getActionMasked() == MotionEvent.ACTION_UP && mIsSwipingVerticallyToClose) { - if (getSettleClosePercentage() < getPercentageFromBottom() && isTracking) { + if (getSettleClosePercentage() < getPercentageFromEndingEdge() && isTracking) { animatePanel(DEFAULT_FLING_VELOCITY, false); } else if (clippedHeight != getLayout().getHeight() && isTracking) { // this can be caused when user is at the end of the list and trying to @@ -299,11 +299,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController } } - // Updating the mNotificationListAtBottomAtTimeOfTouch state has to be done after + // Updating the mNotificationListAtEndAtTimeOfTouch state has to be done after // the event has been passed to the closeGestureDetector above, such that the // closeGestureDetector sees the up event before the state has changed. if (event.getActionMasked() == MotionEvent.ACTION_UP) { - mNotificationListAtBottomAtTimeOfTouch = false; + mNotificationListAtEndAtTimeOfTouch = false; } return handled || isTracking; }); @@ -377,25 +377,31 @@ public class NotificationPanelViewController extends OverlayPanelViewController } @Override - protected void onScroll(int height) { + protected void onScroll(int y) { if (mHandleBar != null) { ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mHandleBar.getLayoutParams(); - mHandleBar.setTranslationY(height - mHandleBar.getHeight() - lp.bottomMargin); + // Adjust handlebar to new pointer position, and a little more depending on the + // animate direction so the bar can be seen fully. + if (mAnimateDirection > 0) { + mHandleBar.setTranslationY(y - mHandleBar.getHeight() - lp.bottomMargin); + } else { + mHandleBar.setTranslationY(y + mHandleBar.getHeight() + lp.topMargin); + } } if (mNotificationView.getHeight() > 0) { Drawable background = mNotificationView.getBackground().mutate(); - background.setAlpha((int) (getBackgroundAlpha(height) * 255)); + background.setAlpha((int) (getBackgroundAlpha(y) * 255)); mNotificationView.setBackground(background); } } @Override protected boolean shouldAllowClosingScroll() { - // Unless the notification list is at the bottom, the panel shouldn't be allowed to + // Unless the notification list is at the end, the panel shouldn't be allowed to // collapse on scroll. - return mNotificationListAtBottomAtTimeOfTouch; + return mNotificationListAtEndAtTimeOfTouch; } /** @@ -403,9 +409,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController * shade is visible to the user. When the notification shade is completely open then * alpha value will be 1. */ - private float getBackgroundAlpha(int height) { - return mInitialBackgroundAlpha - + ((float) height / mNotificationView.getHeight() * mBackgroundAlphaDiff); + private float getBackgroundAlpha(int y) { + float fractionCovered = + ((float) (mAnimateDirection > 0 ? y : mNotificationView.getHeight() - y)) + / mNotificationView.getHeight(); + return mInitialBackgroundAlpha + fractionCovered * mBackgroundAlphaDiff; } /** Sets the unseen count listener. */ @@ -431,13 +439,18 @@ public class NotificationPanelViewController extends OverlayPanelViewController @Override public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { - calculatePercentageFromBottom(event2.getRawY()); - // To prevent the jump in the clip bounds while closing the notification shade using + calculatePercentageFromEndingEdge(event2.getRawY()); + // To prevent the jump in the clip bounds while closing the notification panel using // the handle bar we should calculate the height using the diff of event1 and event2. // This will help the notification shade to clip smoothly as the event2 value changes // as event1 value will be fixed. - int clipHeight = getLayout().getHeight() - (int) (event1.getRawY() - event2.getRawY()); - setViewClipBounds(clipHeight); + float diff = mAnimateDirection * (event1.getRawY() - event2.getRawY()); + float y = mAnimateDirection > 0 + ? getLayout().getHeight() - diff + : diff; + // Ensure the position is within the overlay panel. + y = Math.max(0, Math.min(y, getLayout().getHeight())); + setViewClipBounds((int) y); return true; } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java index 24a84d940577..8f52638afdf1 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java @@ -19,17 +19,15 @@ package com.android.systemui.car.notification; import android.car.hardware.power.CarPowerManager; import android.content.res.Configuration; +import androidx.annotation.CallSuper; + import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayViewMediator; import com.android.systemui.statusbar.policy.ConfigurationController; -import javax.inject.Inject; -import javax.inject.Singleton; - /** The view mediator which attaches the view controller to other elements of the system ui. */ -@Singleton -public class NotificationPanelViewMediator implements OverlayViewMediator, +public abstract class NotificationPanelViewMediator implements OverlayViewMediator, ConfigurationController.ConfigurationListener { private final CarNavigationBarController mCarNavigationBarController; @@ -38,7 +36,6 @@ public class NotificationPanelViewMediator implements OverlayViewMediator, private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final ConfigurationController mConfigurationController; - @Inject public NotificationPanelViewMediator( CarNavigationBarController carNavigationBarController, NotificationPanelViewController notificationPanelViewController, @@ -56,9 +53,10 @@ public class NotificationPanelViewMediator implements OverlayViewMediator, } @Override + @CallSuper public void registerListeners() { mCarNavigationBarController.registerTopBarTouchListener( - mNotificationPanelViewController.getDragOpenTouchListener()); + mNotificationPanelViewController.getDragCloseTouchListener()); mCarNavigationBarController.registerBottomBarTouchListener( mNotificationPanelViewController.getDragCloseTouchListener()); mCarNavigationBarController.registerLeftBarTouchListener( @@ -128,4 +126,12 @@ public class NotificationPanelViewMediator implements OverlayViewMediator, mNotificationPanelViewController.reinflate(); registerListeners(); } + + protected final CarNavigationBarController getCarNavigationBarController() { + return mCarNavigationBarController; + } + + protected final NotificationPanelViewController getNotificationPanelViewController() { + return mNotificationPanelViewController; + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java new file mode 100644 index 000000000000..09a462185dac --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.notification; + +import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.car.navigationbar.CarNavigationBarController; +import com.android.systemui.car.window.OverlayPanelViewController; +import com.android.systemui.statusbar.policy.ConfigurationController; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened + * from the top navigation bar. + */ +@Singleton +public class TopNotificationPanelViewMediator extends NotificationPanelViewMediator { + + @Inject + public TopNotificationPanelViewMediator( + CarNavigationBarController carNavigationBarController, + NotificationPanelViewController notificationPanelViewController, + + PowerManagerHelper powerManagerHelper, + + CarDeviceProvisionedController carDeviceProvisionedController, + ConfigurationController configurationController + ) { + super(carNavigationBarController, + notificationPanelViewController, + powerManagerHelper, + carDeviceProvisionedController, + configurationController); + notificationPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_TOP_BAR); + } + + @Override + public void registerListeners() { + super.registerListeners(); + getCarNavigationBarController().registerBottomBarTouchListener( + getNotificationPanelViewController().getDragOpenTouchListener()); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java new file mode 100644 index 000000000000..6b41b35f7625 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.sideloaded; + +import android.app.IActivityTaskManager; +import android.content.Context; +import android.os.RemoteException; +import android.util.Log; + +import com.android.systemui.SystemUI; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Controller responsible for detecting unsafe apps. + */ +@Singleton +public class SideLoadedAppController extends SystemUI { + private static final String TAG = SideLoadedAppController.class.getSimpleName(); + + private IActivityTaskManager mActivityTaskManager; + private SideLoadedAppListener mSideLoadedAppListener; + private SideLoadedAppDetector mSideLoadedAppDetector; + private SideLoadedAppStateController mSideLoadedAppStateController; + + @Inject + public SideLoadedAppController(Context context, + IActivityTaskManager activityTaskManager, + SideLoadedAppDetector sideLoadedAppDetector, + SideLoadedAppListener sideLoadedAppListener, + SideLoadedAppStateController sideLoadedAppStateController) { + super(context); + + mSideLoadedAppDetector = sideLoadedAppDetector; + mActivityTaskManager = activityTaskManager; + mSideLoadedAppListener = sideLoadedAppListener; + mSideLoadedAppStateController = sideLoadedAppStateController; + } + + @Override + public void start() { + } + + @Override + protected void onBootCompleted() { + Log.i(TAG, "OnBootCompleted"); + + try { + mActivityTaskManager.registerTaskStackListener(mSideLoadedAppListener); + } catch (RemoteException e) { + Log.e(TAG, "Could not register car side loaded app listener.", e); + } + + if (mSideLoadedAppDetector.hasUnsafeInstalledApps()) { + mSideLoadedAppStateController.onUnsafeInstalledAppsDetected(); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetector.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java index f145b148eaf7..5dcb9de4755e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetector.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java @@ -42,15 +42,15 @@ import javax.inject.Singleton; * An app is considered safe if is a system app or installed through whitelisted sources. */ @Singleton -public class CarSideLoadedAppDetector { - private static final String TAG = "CarSideLoadedDetector"; +public class SideLoadedAppDetector { + private static final String TAG = SideLoadedAppDetector.class.getSimpleName(); private final PackageManager mPackageManager; private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final List<String> mAllowedAppInstallSources; @Inject - public CarSideLoadedAppDetector(@Main Resources resources, PackageManager packageManager, + public SideLoadedAppDetector(@Main Resources resources, PackageManager packageManager, CarDeviceProvisionedController deviceProvisionedController) { mAllowedAppInstallSources = Arrays.asList( resources.getStringArray(R.array.config_allowedAppInstallSources)); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java new file mode 100644 index 000000000000..c8c1a40b8032 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.sideloaded; + +import android.app.ActivityManager; +import android.app.ActivityManager.StackInfo; +import android.app.IActivityTaskManager; +import android.app.TaskStackListener; +import android.content.ComponentName; +import android.hardware.display.DisplayManager; +import android.os.RemoteException; +import android.util.Log; +import android.view.Display; + +import java.util.List; + +import javax.inject.Inject; + +/** + * A TaskStackListener to detect when an unsafe app is launched/foregrounded. + */ +public class SideLoadedAppListener extends TaskStackListener { + private static final String TAG = SideLoadedAppListener.class.getSimpleName(); + + private IActivityTaskManager mActivityTaskManager; + private DisplayManager mDisplayManager; + private SideLoadedAppDetector mSideLoadedAppDetector; + private SideLoadedAppStateController mSideLoadedAppStateController; + + @Inject + SideLoadedAppListener(SideLoadedAppDetector sideLoadedAppDetector, + IActivityTaskManager activityTaskManager, + DisplayManager displayManager, + SideLoadedAppStateController sideLoadedAppStateController) { + mSideLoadedAppDetector = sideLoadedAppDetector; + mActivityTaskManager = activityTaskManager; + mDisplayManager = displayManager; + mSideLoadedAppStateController = sideLoadedAppStateController; + } + + @Override + public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException { + super.onTaskCreated(taskId, componentName); + + List<StackInfo> stackInfoList = mActivityTaskManager.getAllStackInfos(); + ActivityManager.StackInfo stackInfo = getStackInfo(stackInfoList, taskId); + if (stackInfo == null) { + Log.e(TAG, "Stack info was not available for taskId: " + taskId); + return; + } + + if (!mSideLoadedAppDetector.isSafe(stackInfo)) { + Display display = mDisplayManager.getDisplay(stackInfo.displayId); + mSideLoadedAppStateController.onUnsafeTaskCreatedOnDisplay(display); + } + } + + @Override + public void onTaskStackChanged() throws RemoteException { + super.onTaskStackChanged(); + + Display[] displays = mDisplayManager.getDisplays(); + for (Display display : displays) { + // Note that the stackInfoList is ordered by recency. + List<StackInfo> stackInfoList = + mActivityTaskManager.getAllStackInfosOnDisplay(display.getDisplayId()); + + if (stackInfoList == null) { + continue; + } + StackInfo stackInfo = getTopVisibleStackInfo(stackInfoList); + if (stackInfo == null) { + continue; + } + if (mSideLoadedAppDetector.isSafe(stackInfo)) { + mSideLoadedAppStateController.onSafeTaskDisplayedOnDisplay(display); + } else { + mSideLoadedAppStateController.onUnsafeTaskDisplayedOnDisplay(display); + } + } + } + + /** + * Returns stack info for a given taskId. + */ + private ActivityManager.StackInfo getStackInfo( + List<ActivityManager.StackInfo> stackInfoList, int taskId) { + if (stackInfoList == null) { + return null; + } + for (ActivityManager.StackInfo stackInfo : stackInfoList) { + if (stackInfo.taskIds == null) { + continue; + } + for (int stackTaskId : stackInfo.taskIds) { + if (taskId == stackTaskId) { + return stackInfo; + } + } + } + return null; + } + + /** + * Returns the first visible stackInfo. + */ + private ActivityManager.StackInfo getTopVisibleStackInfo( + List<ActivityManager.StackInfo> stackInfoList) { + for (ActivityManager.StackInfo stackInfo : stackInfoList) { + if (stackInfo.visible) { + return stackInfo; + } + } + return null; + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java new file mode 100644 index 000000000000..1d66ddaf7aa9 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.sideloaded; + +import android.util.Log; +import android.view.Display; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Manager responsible for displaying proper UI when an unsafe app is detected. + */ +@Singleton +public class SideLoadedAppStateController { + private static final String TAG = SideLoadedAppStateController.class.getSimpleName(); + + @Inject + SideLoadedAppStateController() { + } + + void onUnsafeInstalledAppsDetected() { + Log.d(TAG, "Unsafe installed apps detected."); + } + + void onUnsafeTaskCreatedOnDisplay(Display display) { + Log.d(TAG, "Unsafe task created on display " + display.getDisplayId() + "."); + } + + void onSafeTaskDisplayedOnDisplay(Display display) { + Log.d(TAG, "Safe task displayed on display " + display.getDisplayId() + "."); + } + + void onUnsafeTaskDisplayedOnDisplay(Display display) { + Log.d(TAG, "Unsafe task displayed on display " + display.getDisplayId() + "."); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java index 90892d5c53e4..0fe985684543 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java @@ -19,6 +19,7 @@ package com.android.systemui.car.window; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.annotation.IntDef; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; @@ -35,13 +36,36 @@ import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.FlingAnimationUtils; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * The {@link OverlayPanelViewController} provides additional dragging animation capabilities to * {@link OverlayViewController}. */ public abstract class OverlayPanelViewController extends OverlayViewController { - private static final boolean DEBUG = true; + /** @hide */ + @IntDef(flag = true, prefix = { "OVERLAY_" }, value = { + OVERLAY_FROM_TOP_BAR, + OVERLAY_FROM_BOTTOM_BAR + }) + @Retention(RetentionPolicy.SOURCE) + public @interface OverlayDirection {} + + /** + * Indicates that the overlay panel should be opened from the top bar and expanded by dragging + * towards the bottom bar. + */ + public static final int OVERLAY_FROM_TOP_BAR = 0; + + /** + * Indicates that the overlay panel should be opened from the bottom bar and expanded by + * dragging towards the top bar. + */ + public static final int OVERLAY_FROM_BOTTOM_BAR = 1; + + private static final boolean DEBUG = false; private static final String TAG = "OverlayPanelViewController"; // used to calculate how fast to open or close the window @@ -54,14 +78,18 @@ public abstract class OverlayPanelViewController extends OverlayViewController { protected static final int SWIPE_DOWN_MIN_DISTANCE = 25; protected static final int SWIPE_MAX_OFF_PATH = 75; protected static final int SWIPE_THRESHOLD_VELOCITY = 200; + private static final int POSITIVE_DIRECTION = 1; + private static final int NEGATIVE_DIRECTION = -1; private final FlingAnimationUtils mFlingAnimationUtils; private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final View.OnTouchListener mDragOpenTouchListener; private final View.OnTouchListener mDragCloseTouchListener; + protected int mAnimateDirection = POSITIVE_DIRECTION; + private final int mSettleClosePercentage; - private int mPercentageFromBottom; + private int mPercentageFromEndingEdge; private boolean mPanelVisible; private boolean mPanelExpanded; @@ -91,8 +119,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { mSettleClosePercentage = resources.getInteger( R.integer.notification_settle_close_percentage); - // Attached to the top navigation bar (i.e. status bar) to detect pull down of the - // notification shade. + // Attached to a navigation bar to open the overlay panel GestureDetector openGestureDetector = new GestureDetector(context, new OpenGestureListener() { @Override @@ -101,8 +128,8 @@ public abstract class OverlayPanelViewController extends OverlayViewController { } }); - // Attached to the NavBars to close the notification shade - GestureDetector navBarCloseNotificationGestureDetector = new GestureDetector(context, + // Attached to the other navigation bars to close the overlay panel + GestureDetector closeGestureDetector = new GestureDetector(context, new SystemBarCloseGestureListener() { @Override protected void close() { @@ -132,7 +159,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { if (!isInflated()) { return true; } - boolean consumed = navBarCloseNotificationGestureDetector.onTouchEvent(event); + boolean consumed = closeGestureDetector.onTouchEvent(event); if (consumed) { return true; } @@ -141,6 +168,17 @@ public abstract class OverlayPanelViewController extends OverlayViewController { }; } + /** Sets the overlay panel animation direction along the x or y axis. */ + public void setOverlayDirection(@OverlayDirection int direction) { + if (direction == OVERLAY_FROM_TOP_BAR) { + mAnimateDirection = POSITIVE_DIRECTION; + } else if (direction == OVERLAY_FROM_BOTTOM_BAR) { + mAnimateDirection = NEGATIVE_DIRECTION; + } else { + throw new IllegalArgumentException("Direction not supported"); + } + } + /** Toggles the visibility of the panel. */ public void toggle() { if (!isInflated()) { @@ -207,7 +245,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { protected void maybeCompleteAnimation(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP && isPanelVisible()) { - if (mSettleClosePercentage < mPercentageFromBottom) { + if (mSettleClosePercentage < mPercentageFromEndingEdge) { animatePanel(DEFAULT_FLING_VELOCITY, false); } else { animatePanel(DEFAULT_FLING_VELOCITY, true); @@ -221,16 +259,15 @@ public abstract class OverlayPanelViewController extends OverlayViewController { * panel this method also makes the view invisible after animation ends. */ protected void animatePanel(float velocity, boolean isClosing) { - float to = 0; - if (!isClosing) { - to = getLayout().getHeight(); - } + float to = getEndPosition(isClosing); Rect rect = getLayout().getClipBounds(); - if (rect != null && rect.bottom != to) { - float from = rect.bottom; - animate(from, to, velocity, isClosing); - return; + if (rect != null) { + float from = getCurrentStartPosition(rect); + if (from != to) { + animate(from, to, velocity, isClosing); + return; + } } // We will only be here if the shade is being opened programmatically or via button when @@ -242,12 +279,32 @@ public abstract class OverlayPanelViewController extends OverlayViewController { public void onGlobalLayout() { ViewTreeObserver obs = getLayout().getViewTreeObserver(); obs.removeOnGlobalLayoutListener(this); - float to = getLayout().getHeight(); - animate(/* from= */ 0, to, velocity, isClosing); + animate( + getDefaultStartPosition(), + getEndPosition(/* isClosing= */ false), + velocity, + isClosing + ); } }); } + /* Returns the start position if the user has not started swiping. */ + private int getDefaultStartPosition() { + return mAnimateDirection > 0 ? 0 : getLayout().getHeight(); + } + + /** Returns the start position if we are in the middle of swiping. */ + private int getCurrentStartPosition(Rect clipBounds) { + return mAnimateDirection > 0 ? clipBounds.bottom : clipBounds.top; + } + + private int getEndPosition(boolean isClosing) { + return (mAnimateDirection > 0 && !isClosing) || (mAnimateDirection == -1 && isClosing) + ? getLayout().getHeight() + : 0; + } + private void animate(float from, float to, float velocity, boolean isClosing) { if (mIsAnimating) { return; @@ -356,25 +413,44 @@ public abstract class OverlayPanelViewController extends OverlayViewController { * Misc * ***************************************************************************************** */ - protected void calculatePercentageFromBottom(float height) { + /** + * Given the position of the pointer dragging the panel, return the percentage of its closeness + * to the ending edge. + */ + protected void calculatePercentageFromEndingEdge(float y) { if (getLayout().getHeight() > 0) { - mPercentageFromBottom = (int) Math.abs( - height / getLayout().getHeight() * 100); + float height = getVisiblePanelHeight(y); + mPercentageFromEndingEdge = (int) Math.abs(height / getLayout().getHeight() * 100); } } - protected void setViewClipBounds(int height) { - if (height > getLayout().getHeight()) { - height = getLayout().getHeight(); - } + private float getVisiblePanelHeight(float y) { + return mAnimateDirection > 0 ? y : getLayout().getHeight() - y; + } + + /** Sets the boundaries of the overlay panel that can be seen based on pointer position. */ + protected void setViewClipBounds(int y) { + // Bound the pointer position to be within the overlay panel. + y = Math.max(0, Math.min(y, getLayout().getHeight())); Rect clipBounds = new Rect(); - clipBounds.set(0, 0, getLayout().getWidth(), height); + int top, bottom; + if (mAnimateDirection > 0) { + top = 0; + bottom = y; + } else { + top = y; + bottom = getLayout().getHeight(); + } + clipBounds.set(0, top, getLayout().getWidth(), bottom); getLayout().setClipBounds(clipBounds); - onScroll(height); + onScroll(y); } - /** Called while scrolling. */ - protected abstract void onScroll(int height); + /** + * Called while scrolling, this passes the position of the clip boundary that is currently + * changing. + */ + protected abstract void onScroll(int y); /* ***************************************************************************************** * * Getters @@ -406,8 +482,8 @@ public abstract class OverlayPanelViewController extends OverlayViewController { } /** Returns the percentage of the panel that is open from the bottom. */ - protected final int getPercentageFromBottom() { - return mPercentageFromBottom; + protected final int getPercentageFromEndingEdge() { + return mPercentageFromEndingEdge; } /** Returns the percentage at which we've determined whether to open or close the panel. */ @@ -443,7 +519,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { // Initially the scroll starts with height being zero. This checks protects from divide // by zero error. - calculatePercentageFromBottom(event2.getRawY()); + calculatePercentageFromEndingEdge(event2.getRawY()); mIsTracking = true; return true; @@ -453,7 +529,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { - if (velocityY > SWIPE_THRESHOLD_VELOCITY) { + if (mAnimateDirection * velocityY > SWIPE_THRESHOLD_VELOCITY) { mOpeningVelocity = velocityY; open(); return true; @@ -483,19 +559,14 @@ public abstract class OverlayPanelViewController extends OverlayViewController { @Override public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { - // should not clip while scroll to the bottom of the list. if (!shouldAllowClosingScroll()) { return false; } - float actualNotificationHeight = - getLayout().getHeight() - (event1.getRawY() - event2.getRawY()); - if (actualNotificationHeight > getLayout().getHeight()) { - actualNotificationHeight = getLayout().getHeight(); - } + float y = getYPositionOfPanelEndingEdge(event1, event2); if (getLayout().getHeight() > 0) { - mPercentageFromBottom = (int) Math.abs( - actualNotificationHeight / getLayout().getHeight() * 100); - boolean isUp = distanceY > 0; + mPercentageFromEndingEdge = (int) Math.abs( + y / getLayout().getHeight() * 100); + boolean isInClosingDirection = mAnimateDirection * distanceY > 0; // This check is to figure out if onScroll was called while swiping the card at // bottom of the list. At that time we should not allow notification shade to @@ -503,23 +574,37 @@ public abstract class OverlayPanelViewController extends OverlayViewController { // possible if a user is closing the notification shade and while swiping starts // to open again but does not fling. At that time we should allow the // notification shade to close fully or else it would stuck in between. - if (Math.abs(getLayout().getHeight() - actualNotificationHeight) - > SWIPE_DOWN_MIN_DISTANCE && isUp) { - setViewClipBounds((int) actualNotificationHeight); + if (Math.abs(getLayout().getHeight() - y) + > SWIPE_DOWN_MIN_DISTANCE && isInClosingDirection) { + setViewClipBounds((int) y); mIsTracking = true; - } else if (!isUp) { - setViewClipBounds((int) actualNotificationHeight); + } else if (!isInClosingDirection) { + setViewClipBounds((int) y); } } // if we return true the items in RV won't be scrollable. return false; } + /** + * To prevent the jump in the clip bounds while closing the panel we should calculate the y + * position using the diff of event1 and event2. This will help the panel clip smoothly as + * the event2 value changes while event1 value will be fixed. + * @param event1 MotionEvent that contains the position of where the event2 started. + * @param event2 MotionEvent that contains the position of where the user has scrolled to + * on the screen. + */ + private float getYPositionOfPanelEndingEdge(MotionEvent event1, MotionEvent event2) { + float diff = mAnimateDirection * (event1.getRawY() - event2.getRawY()); + float y = mAnimateDirection > 0 ? getLayout().getHeight() - diff : diff; + y = Math.max(0, Math.min(y, getLayout().getHeight())); + return y; + } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { - // should not fling if the touch does not start when view is at the bottom of the list. + // should not fling if the touch does not start when view is at the end of the list. if (!shouldAllowClosingScroll()) { return false; } @@ -528,8 +613,8 @@ public abstract class OverlayPanelViewController extends OverlayViewController { // swipe was not vertical or was not fast enough return false; } - boolean isUp = velocityY < 0; - if (isUp) { + boolean isInClosingDirection = mAnimateDirection * velocityY < 0; + if (isInClosingDirection) { close(); return true; } else { @@ -555,7 +640,7 @@ public abstract class OverlayPanelViewController extends OverlayViewController { @Override public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { - calculatePercentageFromBottom(event2.getRawY()); + calculatePercentageFromEndingEdge(event2.getRawY()); setViewClipBounds((int) event2.getRawY()); return true; } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java index c46b287ade5a..e1918ceeaea4 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java @@ -17,7 +17,8 @@ package com.android.systemui.car.window; import com.android.systemui.car.keyguard.CarKeyguardViewMediator; -import com.android.systemui.car.notification.NotificationPanelViewMediator; +import com.android.systemui.car.notification.BottomNotificationPanelViewMediator; +import com.android.systemui.car.notification.TopNotificationPanelViewMediator; import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator; import dagger.Binds; @@ -31,12 +32,19 @@ import dagger.multibindings.IntoMap; @Module public abstract class OverlayWindowModule { - /** Injects NotificationPanelViewMediator. */ + /** Injects TopNotificationPanelViewMediator. */ @Binds @IntoMap - @ClassKey(NotificationPanelViewMediator.class) - public abstract OverlayViewMediator bindNotificationPanelViewMediator( - NotificationPanelViewMediator notificationPanelViewMediator); + @ClassKey(TopNotificationPanelViewMediator.class) + public abstract OverlayViewMediator bindTopNotificationPanelViewMediator( + TopNotificationPanelViewMediator topNotificationPanelViewMediator); + + /** Injects BottomNotificationPanelViewMediator. */ + @Binds + @IntoMap + @ClassKey(BottomNotificationPanelViewMediator.class) + public abstract OverlayViewMediator bindBottomNotificationPanelViewMediator( + BottomNotificationPanelViewMediator bottomNotificationPanelViewMediator); /** Inject into CarKeyguardViewMediator. */ @Binds diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetectorTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppDetectorTest.java index 80f3d1ee5dec..77620f3fb345 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/CarSideLoadedAppDetectorTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppDetectorTest.java @@ -47,14 +47,14 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper @SmallTest -public class CarSideLoadedAppDetectorTest extends SysuiTestCase { +public class SideLoadedAppDetectorTest extends SysuiTestCase { private static final String SAFE_VENDOR = "com.safe.vendor"; private static final String UNSAFE_VENDOR = "com.unsafe.vendor"; private static final String APP_PACKAGE_NAME = "com.test"; private static final String APP_CLASS_NAME = ".TestClass"; - private CarSideLoadedAppDetector mSideLoadedAppDetector; + private SideLoadedAppDetector mSideLoadedAppDetector; @Mock private PackageManager mPackageManager; @@ -70,7 +70,7 @@ public class CarSideLoadedAppDetectorTest extends SysuiTestCase { testableResources.addOverride(R.array.config_allowedAppInstallSources, allowedAppInstallSources); - mSideLoadedAppDetector = new CarSideLoadedAppDetector(testableResources.getResources(), + mSideLoadedAppDetector = new SideLoadedAppDetector(testableResources.getResources(), mPackageManager, mCarDeviceProvisionedController); } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java new file mode 100644 index 000000000000..73f9f6a55afc --- /dev/null +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/sideloaded/SideLoadedAppListenerTest.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.sideloaded; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.ActivityManager.StackInfo; +import android.app.IActivityTaskManager; +import android.content.ComponentName; +import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManagerGlobal; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.Display; +import android.view.DisplayAdjustments; +import android.view.DisplayInfo; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class SideLoadedAppListenerTest extends SysuiTestCase { + + private static final String APP_PACKAGE_NAME = "com.test"; + private static final String APP_CLASS_NAME = ".TestClass"; + + private SideLoadedAppListener mSideLoadedAppListener; + + @Mock + private SideLoadedAppDetector mSideLoadedAppDetector; + @Mock + private DisplayManager mDisplayManager; + @Mock + private IActivityTaskManager mActivityTaskManager; + @Mock + private SideLoadedAppStateController mSideLoadedAppStateController; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + mSideLoadedAppListener = new SideLoadedAppListener(mSideLoadedAppDetector, + mActivityTaskManager, mDisplayManager, mSideLoadedAppStateController); + } + + @Test + public void onTaskCreated_safeTask_callsNoMethods() throws Exception { + int taskId = 999; + int displayId = 123; + ComponentName componentName = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME); + + StackInfo stackInfo1 = createTask(1, /* isVisible= */ true); + stackInfo1.taskIds = new int[] { 11, 22, 33 }; + + StackInfo stackInfo2 = createTask(2, /* isVisible= */ true); + stackInfo2.taskIds = new int[] { 111, 222, 333, taskId }; + stackInfo2.displayId = displayId; + + List<StackInfo> stackInfoList = Arrays.asList(stackInfo1, stackInfo2); + + when(mActivityTaskManager.getAllStackInfos()).thenReturn(stackInfoList); + when(mSideLoadedAppDetector.isSafe(stackInfo2)).thenReturn(true); + + mSideLoadedAppListener.onTaskCreated(taskId, componentName); + + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo1); + verify(mSideLoadedAppDetector).isSafe(stackInfo2); + + verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any()); + verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any()); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any()); + } + + @Test + public void onTaskCreated_unsafeTask_callsUnsafeTaskCreated() throws Exception { + int taskId = 999; + int displayId = 123; + ComponentName componentName = new ComponentName(APP_PACKAGE_NAME, APP_CLASS_NAME); + + StackInfo stackInfo1 = createTask(1, /* isVisible= */ true); + stackInfo1.taskIds = new int[] { 11, 22, 33 }; + StackInfo stackInfo2 = createTask(2, /* isVisible= */ true); + stackInfo2.taskIds = new int[] { 111, 222, 333, taskId }; + stackInfo2.displayId = displayId; + List<StackInfo> stackInfoList = Arrays.asList(stackInfo1, stackInfo2); + + Display display = createDisplay(displayId); + + when(mActivityTaskManager.getAllStackInfos()).thenReturn(stackInfoList); + when(mSideLoadedAppDetector.isSafe(stackInfo2)).thenReturn(false); + when(mDisplayManager.getDisplay(displayId)).thenReturn(display); + + mSideLoadedAppListener.onTaskCreated(taskId, componentName); + + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo1); + verify(mSideLoadedAppDetector).isSafe(stackInfo2); + + verify(mSideLoadedAppStateController).onUnsafeTaskCreatedOnDisplay(display); + verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any()); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any()); + } + + @Test + public void onTaskStackChanged_safeTask_callsSafeTaskDisplayed() throws Exception { + Display display = createDisplay(123); + StackInfo stackInfo1 = createTask(1, /* isVisible= */ false); + StackInfo stackInfo2 = createTask(2, /* isVisible= */ true); + StackInfo stackInfo3 = createTask(3, /* isVisible= */ true); + List<StackInfo> stackInfoList = Arrays.asList(stackInfo1, stackInfo2, stackInfo3); + + when(mActivityTaskManager.getAllStackInfosOnDisplay(display.getDisplayId())) + .thenReturn(stackInfoList); + when(mSideLoadedAppDetector.isSafe(stackInfo2)).thenReturn(true); + when(mDisplayManager.getDisplays()).thenReturn(new Display[] { display }); + + mSideLoadedAppListener.onTaskStackChanged(); + + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo1); + verify(mSideLoadedAppDetector).isSafe(stackInfo2); + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo3); + + verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any()); + verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(any()); + } + + @Test + public void onTaskStackChanged_unsafeTask_callsUnsafeTaskDisplayed() throws Exception { + Display display = createDisplay(123); + StackInfo stackInfo1 = createTask(1, /* isVisible= */ false); + StackInfo stackInfo2 = createTask(2, /* isVisible= */ true); + StackInfo stackInfo3 = createTask(3, /* isVisible= */ true); + List<StackInfo> stackInfoList = Arrays.asList(stackInfo1, stackInfo2, stackInfo3); + + when(mActivityTaskManager.getAllStackInfosOnDisplay(display.getDisplayId())) + .thenReturn(stackInfoList); + when(mSideLoadedAppDetector.isSafe(stackInfo2)).thenReturn(false); + when(mDisplayManager.getDisplays()).thenReturn(new Display[] { display }); + + mSideLoadedAppListener.onTaskStackChanged(); + + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo1); + verify(mSideLoadedAppDetector).isSafe(stackInfo2); + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo3); + + verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any()); + verify(mSideLoadedAppStateController, never()).onSafeTaskDisplayedOnDisplay(any()); + verify(mSideLoadedAppStateController).onUnsafeTaskDisplayedOnDisplay(display); + } + + @Test + public void onTaskStackChanged_multiDisplay_callsTasksDisplayed() throws Exception { + Display display1 = createDisplay(1); + StackInfo stackInfo1 = createTask(1, /* isVisible= */ false); + StackInfo stackInfo2 = createTask(2, /* isVisible= */ true); + StackInfo stackInfo3 = createTask(3, /* isVisible= */ true); + List<StackInfo> display1Stack = Arrays.asList(stackInfo1, stackInfo2, stackInfo3); + + Display display2 = createDisplay(2); + StackInfo stackInfo4 = createTask(4, /* isVisible= */ true); + List<StackInfo> display2Stack = Collections.singletonList(stackInfo4); + + Display display3 = createDisplay(3); + StackInfo stackInfo5 = createTask(5, /* isVisible= */ true); + List<StackInfo> display3Stack = Collections.singletonList(stackInfo5); + + when(mActivityTaskManager.getAllStackInfosOnDisplay(display1.getDisplayId())) + .thenReturn(display1Stack); + when(mActivityTaskManager.getAllStackInfosOnDisplay(display2.getDisplayId())) + .thenReturn(display2Stack); + when(mActivityTaskManager.getAllStackInfosOnDisplay(display3.getDisplayId())) + .thenReturn(display3Stack); + + when(mSideLoadedAppDetector.isSafe(stackInfo2)).thenReturn(true); + when(mSideLoadedAppDetector.isSafe(stackInfo4)).thenReturn(false); + when(mSideLoadedAppDetector.isSafe(stackInfo5)).thenReturn(true); + + when(mDisplayManager.getDisplays()) + .thenReturn(new Display[] { display1, display2, display3}); + + mSideLoadedAppListener.onTaskStackChanged(); + + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo1); + verify(mSideLoadedAppDetector).isSafe(stackInfo2); + verify(mSideLoadedAppDetector, never()).isSafe(stackInfo3); + verify(mSideLoadedAppDetector).isSafe(stackInfo4); + verify(mSideLoadedAppDetector).isSafe(stackInfo5); + + verify(mSideLoadedAppStateController, never()).onUnsafeTaskCreatedOnDisplay(any()); + verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display1); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(display2); + verify(mSideLoadedAppStateController).onSafeTaskDisplayedOnDisplay(display3); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(display1); + verify(mSideLoadedAppStateController).onUnsafeTaskDisplayedOnDisplay(display2); + verify(mSideLoadedAppStateController, never()).onUnsafeTaskDisplayedOnDisplay(display3); + } + + private Display createDisplay(int id) { + return new Display(DisplayManagerGlobal.getInstance(), + id, + new DisplayInfo(), + DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); + } + + private StackInfo createTask(int id, boolean isVisible) { + StackInfo stackInfo = new StackInfo(); + stackInfo.stackId = id; + stackInfo.visible = isVisible; + return stackInfo; + } +} diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java index 70f1d25fe2a4..8d705a8cca1f 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java @@ -18,13 +18,16 @@ package com.android.systemui.car.window; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.animation.Animator; import android.content.Context; import android.content.res.Resources; +import android.graphics.Rect; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.LayoutInflater; @@ -42,6 +45,7 @@ import com.android.systemui.tests.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -173,6 +177,51 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { } @Test + public void animateCollapsePanel_withOverlayFromTopBar_collapsesTowardsTopBar() { + mOverlayPanelViewController.inflate(mBaseLayout); + // Mock a panel that has layout size 50 and where the panel is opened. + int size = 50; + mockPanelWithSize(size); + mOverlayPanelViewController.getLayout().setClipBounds( + new Rect(0, 0, size, size)); + mOverlayPanelViewController.setShouldAnimateCollapsePanel(true); + mOverlayPanelViewController.setPanelExpanded(true); + mOverlayPanelViewController.setPanelVisible(true); + mOverlayPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_TOP_BAR); + + mOverlayPanelViewController.animateCollapsePanel(); + + ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class); + verify(mFlingAnimationUtils).apply( + any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat()); + assertThat(endValueCaptor.getValue().intValue()).isEqualTo(0); + } + + @Test + public void animateCollapsePanel_withOverlayFromBottomBar_collapsesTowardsBottomBar() { + mOverlayPanelViewController.inflate(mBaseLayout); + // Mock a panel that has layout size 50 and where the panel is opened. + int size = 50; + mockPanelWithSize(size); + mOverlayPanelViewController.getLayout().setClipBounds( + new Rect(0, 0, size, size)); + mOverlayPanelViewController.setShouldAnimateCollapsePanel(true); + mOverlayPanelViewController.setPanelExpanded(true); + mOverlayPanelViewController.setPanelVisible(true); + mOverlayPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR); + + mOverlayPanelViewController.animateCollapsePanel(); + + ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class); + verify(mFlingAnimationUtils).apply( + any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat()); + assertThat(endValueCaptor.getValue().intValue()).isEqualTo( + mOverlayPanelViewController.getLayout().getHeight()); + } + + @Test public void animateCollapsePanel_removesWindowFocus() { mOverlayPanelViewController.inflate(mBaseLayout); mOverlayPanelViewController.setShouldAnimateCollapsePanel(true); @@ -219,6 +268,49 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { } @Test + public void animateExpandPanel_withOverlayFromTopBar_expandsToBottom() { + mOverlayPanelViewController.inflate(mBaseLayout); + // Mock a panel that has layout size 50 and where the panel is not opened. + int size = 50; + mockPanelWithSize(size); + mOverlayPanelViewController.getLayout().setClipBounds( + new Rect(0, 0, size, 0)); + mOverlayPanelViewController.setShouldAnimateExpandPanel(true); + when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true); + mOverlayPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_TOP_BAR); + + mOverlayPanelViewController.animateExpandPanel(); + + ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class); + verify(mFlingAnimationUtils).apply( + any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat()); + assertThat(endValueCaptor.getValue().intValue()).isEqualTo( + mOverlayPanelViewController.getLayout().getHeight()); + } + + @Test + public void animateExpandPanel_withOverlayFromBottomBar_expandsToTop() { + mOverlayPanelViewController.inflate(mBaseLayout); + // Mock a panel that has layout size 50 and where the panel is not opened. + int size = 50; + mockPanelWithSize(size); + mOverlayPanelViewController.getLayout().setClipBounds( + new Rect(0, size, size, size)); + mOverlayPanelViewController.setShouldAnimateExpandPanel(true); + when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true); + mOverlayPanelViewController.setOverlayDirection( + OverlayPanelViewController.OVERLAY_FROM_BOTTOM_BAR); + + mOverlayPanelViewController.animateExpandPanel(); + + ArgumentCaptor<Float> endValueCaptor = ArgumentCaptor.forClass(Float.class); + verify(mFlingAnimationUtils).apply( + any(Animator.class), anyFloat(), endValueCaptor.capture(), anyFloat()); + assertThat(endValueCaptor.getValue().intValue()).isEqualTo(0); + } + + @Test public void animateExpandPanel_setsPanelVisible() { mOverlayPanelViewController.inflate(mBaseLayout); mOverlayPanelViewController.setShouldAnimateExpandPanel(true); @@ -330,6 +422,10 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { verify(mOverlayViewGlobalStateController).inflateView(mOverlayPanelViewController); } + private void mockPanelWithSize(int size) { + mOverlayPanelViewController.getLayout().setLeftTopRightBottom(0, 0, size, size); + } + private static class TestOverlayPanelViewController extends OverlayPanelViewController { private boolean mShouldAnimateCollapsePanel; diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk Binary files differindex 7bdb2a830d6f..54ee0d07df34 100644 --- a/packages/CtsShim/apk/arm/CtsShim.apk +++ b/packages/CtsShim/apk/arm/CtsShim.apk diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk Binary files differindex 8efd3b248a88..ca34af947986 100644 --- a/packages/CtsShim/apk/arm/CtsShimPriv.apk +++ b/packages/CtsShim/apk/arm/CtsShimPriv.apk diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk Binary files differindex 7bdb2a830d6f..54ee0d07df34 100644 --- a/packages/CtsShim/apk/x86/CtsShim.apk +++ b/packages/CtsShim/apk/x86/CtsShim.apk diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk Binary files differindex eed29d1a729a..edbb1519eff6 100644 --- a/packages/CtsShim/apk/x86/CtsShimPriv.apk +++ b/packages/CtsShim/apk/x86/CtsShimPriv.apk diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 9f8e9ddc7546..bf0831983fc8 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -436,10 +436,14 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> পৰ্যন্ত"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g>ৰ ভিতৰত বেটাৰী শেষ হ\'ব পাৰে"</string> - <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g>তকৈও কম সময় বাকী আছে"</string> - <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g>তকৈও কম সময় বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>তকৈও বেছি সময় বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>তকৈও বেছি সময় বাকী আছে"</string> + <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> + <skip /> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ফ’নটো সোনকালে বন্ধ হৈ যাব পাৰে"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"টেবলেটটো সোনকালে বন্ধ হৈ যাব পাৰে"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ডিভাইচটো সোনকালে বন্ধ হৈ যাব পাৰে"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index f617a93a4a6b..85defcb1dc2d 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Έως τις <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Η μπαταρία μπορεί να εξαντληθεί έως τις <xliff:g id="TIME">%1$s</xliff:g>."</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Κάτω από <xliff:g id="THRESHOLD">%1$s</xliff:g> ακόμη"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Κάτω από <xliff:g id="THRESHOLD">%1$s</xliff:g> ακόμη (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Πάνω από <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ακόμη (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Πάνω από <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ακόμη"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Το τηλέφωνο μπορεί να απενεργοποιηθεί σύντομα"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Το tablet μπορεί να απενεργοποιηθεί σύντομα"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Η συσκευή μπορεί να απενεργοποιηθεί σύντομα"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index f6d6d77c7bf4..06be94227e1c 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index f6d6d77c7bf4..06be94227e1c 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index f6d6d77c7bf4..06be94227e1c 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index f6d6d77c7bf4..06be94227e1c 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Should last until about <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Until <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Battery may run out by <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"More than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Phone may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet may shut down soon"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Device may shut down soon"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 146fbe912dcd..bc113cd263e3 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Jusqu\'à <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"La pile risque d\'être épuisée à <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Il se peut que le téléphone s\'éteigne bientôt"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Il se peut que la tablette s\'éteigne bientôt"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Il se peut que l\'appareil s\'éteigne bientôt"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 7ff833740575..f6a237434413 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -436,10 +436,14 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> સુધી"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"બૅટરી <xliff:g id="TIME">%1$s</xliff:g> સુધીમાં પૂરી થઈ શકે છે"</string> - <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> કરતાં ઓછો સમય બાકી છે"</string> - <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> કરતાં ઓછો સમય બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> કરતાં વધુ સમય બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> કરતાં વધુ સમય બાકી છે"</string> + <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> + <skip /> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ફોન થોડીક જ વારમાં બંધ થઈ શકે છે"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ટૅબ્લેટ થોડીક જ વારમાં બંધ થઈ શકે છે"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ડિવાઇસ થોડીક જ વારમાં બંધ થઈ શકે છે"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 4be85c7ddc9c..b084123da139 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -491,7 +491,7 @@ <string name="ims_reg_title" msgid="8197592958123671062">"IMS रजिस्ट्रेशन की स्थिति"</string> <string name="ims_reg_status_registered" msgid="884916398194885457">"रजिस्टर है"</string> <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"रजिस्टर नहीं है"</string> - <string name="status_unavailable" msgid="5279036186589861608">"अनुपलब्ध"</string> + <string name="status_unavailable" msgid="5279036186589861608">"मौजूद नहीं है"</string> <string name="wifi_status_mac_randomized" msgid="466382542497832189">"एमएसी पता रैंडम पर सेट है"</string> <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139"> <item quantity="one">%1$d डिवाइस जुड़े हैं</item> @@ -537,7 +537,7 @@ <string name="user_add_user_item_title" msgid="2394272381086965029">"उपयोगकर्ता"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"प्रतिबंधित प्रोफ़ाइल"</string> <string name="user_add_user_title" msgid="5457079143694924885">"नया उपयोगकर्ता जोड़ें?"</string> - <string name="user_add_user_message_long" msgid="1527434966294733380">"आप और ज़्यादा उपयोगकर्ता बनाकर इस डिवाइस को दूसरे लोगों के साथ शेयर कर सकते हैं. हर उपयोगकर्ता के पास अपनी जगह होती है, जिसमें वह मनपसंद तरीके से ऐप्लिकेशन, वॉलपेपर और दूसरी चीज़ों में बदलाव कर सकते हैं. उपयोगकर्ता वाई-फ़ाई जैसी डिवाइस सेटिंग में भी बदलाव कर सकते हैं, जिसका असर हर किसी पर पड़ेगा.\n\nजब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उन्हें अपनी जगह सेट करनी होगी.\n\nकोई भी उपयोगकर्ता दूसरे सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकते हैं. हो सकता है कि सुलभता सेटिंग और सेवाएं नए उपयोगकर्ता को ट्रांसफ़र न हो पाएं."</string> + <string name="user_add_user_message_long" msgid="1527434966294733380">"आप और ज़्यादा उपयोगकर्ता बनाकर इस डिवाइस को दूसरे लोगों के साथ शेयर कर सकते हैं. हर उपयोगकर्ता के पास अपनी जगह होती है, जिसमें वह मनपसंद तरीके से ऐप्लिकेशन, वॉलपेपर और दूसरी चीज़ों में बदलाव कर सकते हैं. उपयोगकर्ता वाई-फ़ाई जैसी डिवाइस सेटिंग में भी बदलाव कर सकते हैं, जिसका असर हर किसी पर पड़ेगा.\n\nजब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उन्हें अपनी जगह सेट करनी होगी.\n\nकोई भी उपयोगकर्ता दूसरे सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकता है. ऐसा भी हो सकता है कि सुलभता सेटिंग और सेवाएं नए उपयोगकर्ता को ट्रांसफ़र न हो पाएं."</string> <string name="user_add_user_message_short" msgid="3295959985795716166">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उसे अपनी जगह सेट करनी होती है.\n\nकोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप अपडेट कर सकता है."</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"उपयोगकर्ता को अभी सेट करें?"</string> <string name="user_setup_dialog_message" msgid="269931619868102841">"पक्का करें कि व्यक्ति डिवाइस का इस्तेमाल करने और अपनी जगह सेट करने के लिए मौजूद है"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 3f11da392673..fade9fc2e068 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Akan bertahan kira-kira sampai pukul <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hingga <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterai mungkin habis pada <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Ponsel akan segera dimatikan"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet akan segera dimatikan"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Perangkat akan segera dimatikan"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 21ebcedd496c..965a76dad9de 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>-მდე"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g>-მდე"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ბატარეა შესაძლოა ამოიწუროს <xliff:g id="TIME">%1$s</xliff:g>-ისთვის"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"დარჩა <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"დარჩა <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"დარჩა <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"დარჩა <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ტელეფონი შეიძლება მალე გათიშოს"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ტაბლეტი შეიძლება მალე გაითიშოს"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"მოწყობილობა შეიძლება მალე გაითიშოს"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index f33a094ba584..5aec86bc5705 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -435,7 +435,7 @@ <string name="power_discharge_by" msgid="4113180890060388350">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) дейін жетеді"</string> <string name="power_discharge_by_only" msgid="92545648425937000">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> дейін жетеді"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> дейін"</string> - <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарея заряды <xliff:g id="TIME">%1$s</xliff:g> сағатқа қарай бітуі мүмкін."</string> + <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Батарея заряды сағат <xliff:g id="TIME">%1$s</xliff:g> қарай бітуі мүмкін."</string> <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> <skip /> <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index f5816b33162a..1fb181db0df8 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"ໜ້າຈະໃຊ້ໄດ້ຈົນຮອດປະມານ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"ຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"ແບັດເຕີຣີອາດຈະໝົດພາຍໃນເວລາ <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"ເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"ເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"ເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"ເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"ໂທລະສັບອາດປິດໃນໄວໆນີ້"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ແທັບເລັດອາດປິດໃນໄວໆນີ້"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"ອຸປະກອນອາດປິດໃນໄວໆນີ້"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 9b9da06f0c08..1fa3c0821269 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Līdz <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Iespējams, akumulators izlādēsies līdz <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Atlicis: mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Atlicis: mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Atlicis: mazāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Atlicis: vairāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Tālrunis, iespējams, drīz izslēgsies."</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Planšetdators, iespējams, drīz izslēgsies."</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Ierīce, iespējams, drīz izslēgsies."</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index c272c5a4e06d..1e2c7414f3ef 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"До <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Може да снема батерија до <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Преостанува помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Преостанува помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Преостанува повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Преостанува повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Телефон може да се исклучи наскоро"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Таблетот може да се исклучи наскоро"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Уредот може да се исклучи наскоро"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 8862de05b285..b382f75ac5ae 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -436,10 +436,14 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> पर्यंत"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> वाजेपर्यंत बॅटरी संपू शकते"</string> - <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> पेक्षा कमी शिल्लक आहे"</string> - <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> पेक्षा कमी वेळ शिल्लक आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> पेक्षा जास्त वेळ शिल्लक आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> हून जास्त वेळ शिल्लक आहे"</string> + <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> + <skip /> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"फोन लवकरच बंद होऊ शकतो"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"टॅबलेट लवकरच बंद होऊ शकतो"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"डिव्हाइस लवकरच बंद होऊ शकते"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 294ab2743054..f34e2b81498d 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -435,7 +435,7 @@ <string name="power_discharge_by" msgid="4113180890060388350">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only" msgid="92545648425937000">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hingga <xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateri mungkin kehabisan selewat-lewatnya <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateri mungkin habis menjelang <xliff:g id="TIME">%1$s</xliff:g>"</string> <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> <skip /> <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 7525a0fe9e05..6719badf97b2 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> အထိ"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> တွင် ဘက်ထရီကုန်သွားနိုင်သည်"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"<xliff:g id="THRESHOLD">%1$s</xliff:g> အောက် ကျန်သည်"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"<xliff:g id="THRESHOLD">%1$s</xliff:g> အောက် (<xliff:g id="LEVEL">%2$s</xliff:g>) ကျန်သည်"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> အထက် (<xliff:g id="LEVEL">%2$s</xliff:g>) ကျန်သည်"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> အထက် ကျန်သည်"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"မကြာမီ ဖုန်းပိတ်သွားနိုင်သည်"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"မကြာမီ တက်ဘလက် ပိတ်သွားနိုင်သည်"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"မကြာမီ စက်ပိတ်သွားနိုင်သည်"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 200e0ec33c6e..9a839fa0f32a 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -140,15 +140,15 @@ <string name="accessibility_wifi_security_type_none" msgid="162352241518066966">"खुला नेटवर्क"</string> <string name="accessibility_wifi_security_type_secured" msgid="2399774097343238942">"सुरक्षित नेटवर्क"</string> <string name="process_kernel_label" msgid="950292573930336765">"एन्ड्रोइड OS"</string> - <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"हटाइएका अनुप्रयोगहरू"</string> - <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"अनुप्रयोगहरू र प्रयोगकर्ताहरू हटाइयो।"</string> + <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"हटाइएका एपहरू"</string> + <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"एपहरू र प्रयोगकर्ताहरू हटाइयो।"</string> <string name="data_usage_ota" msgid="7984667793701597001">"प्रणालीसम्बन्धी अद्यावधिकहरू"</string> <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB टेथर गर्दै"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"पोर्टेबल हटस्पट"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"ब्लुटुथ टेथर गर्दै"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"टेदर गर्दै"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"टेदर गर्ने र पोर्टेबल हटस्पट"</string> - <string name="managed_user_title" msgid="449081789742645723">"कार्य प्रोफाइलका सबै अनुप्रयोगहरू"</string> + <string name="managed_user_title" msgid="449081789742645723">"कार्य प्रोफाइलका सबै एपहरू"</string> <string name="user_guest" msgid="6939192779649870792">"अतिथि"</string> <string name="unknown" msgid="3544487229740637809">"अज्ञात"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"प्रयोगकर्ता: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> @@ -198,7 +198,7 @@ <string name="category_work" msgid="4014193632325996115">"काम"</string> <string name="development_settings_title" msgid="140296922921597393">"विकासकर्ताका विकल्पहरू"</string> <string name="development_settings_enable" msgid="4285094651288242183">"विकासकर्ता विकल्प सक्रिया गर्नुहोस्"</string> - <string name="development_settings_summary" msgid="8718917813868735095">"अनुप्रयोग विकासको लागि विकल्पहरू सेट गर्नुहोस्"</string> + <string name="development_settings_summary" msgid="8718917813868735095">"एप विकासको लागि विकल्पहरू सेट गर्नुहोस्"</string> <string name="development_settings_not_available" msgid="355070198089140951">"विकासकर्ताका विकल्पहरू यस प्रयोगकर्ताका लागि उपलब्ध छैन"</string> <string name="vpn_settings_not_available" msgid="2894137119965668920">"VPN सेटिङहरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"कार्यक्षेत्र सीमा सेटिङहरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> @@ -244,9 +244,9 @@ <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"अनलक हुन बूटलोडरलाई अनुमति दिनुहोस्"</string> <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"OEM अनलक गर्न अनुमति दिने?"</string> <string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"चेतावनी: यो सेटिङ खुला हुँदा, यस उपकरणमा उपकरण सुरक्षा सुविधाहरूले काम गर्ने छैनन्।"</string> - <string name="mock_location_app" msgid="6269380172542248304">"नमूना स्थान अनुप्रयोग चयन गर्नुहोस्"</string> - <string name="mock_location_app_not_set" msgid="6972032787262831155">"कुनै नमूना स्थान अनुप्रयोग सेट गरिएन"</string> - <string name="mock_location_app_set" msgid="4706722469342913843">"नमूना स्थान अनुप्रयोग: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="mock_location_app" msgid="6269380172542248304">"नमूना स्थान एप चयन गर्नुहोस्"</string> + <string name="mock_location_app_not_set" msgid="6972032787262831155">"कुनै नमूना स्थान एप सेट गरिएन"</string> + <string name="mock_location_app_set" msgid="4706722469342913843">"नमूना स्थान एप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="6829757985772659599">"नेटवर्किङ"</string> <string name="wifi_display_certification" msgid="1805579519992520381">"ताररहित प्रदर्शन प्रमाणीकरण"</string> <string name="wifi_verbose_logging" msgid="1785910450009679371">"Wi-Fi वर्बोज लग सक्षम पार्नुहोस्"</string> @@ -303,30 +303,30 @@ <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Wi-Fi सक्रिय हुँदा पनि मोबाइल डेटा सधैँ सक्रिय राख्नुहोस् (द्रूत नेटवर्क स्विच गर्नको लागि)।"</string> <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"उपलब्ध भएमा टेदरिङको लागि हार्डवेयरको प्रवेग प्रयोग गर्नुहोस्"</string> <string name="adb_warning_title" msgid="7708653449506485728">"USB डिबग गर्न लागि अनुमति दिने हो?"</string> - <string name="adb_warning_message" msgid="8145270656419669221">"युएसबी डिबगिङ विकास प्रयोजनका लागि मात्र निर्मित हुन्छ। यसलाई तपाईँको कम्प्युटर र तपाईँको उपकरणका बीच डेटा प्रतिलिपि गर्न, बिना सूचना तपाईँको उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लग डेटा पढ्नका लागि प्रयोग गर्नुहोस्।"</string> + <string name="adb_warning_message" msgid="8145270656419669221">"युएसबी डिबगिङ विकास प्रयोजनका लागि मात्र निर्मित हुन्छ। यसलाई तपाईँको कम्प्युटर र तपाईँको उपकरणका बीच डेटा प्रतिलिपि गर्न, बिना सूचना तपाईँको उपकरणमा एपहरू स्थापना गर्न र लग डेटा पढ्नका लागि प्रयोग गर्नुहोस्।"</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"वायरलेस डिबगिङ सेवा सक्षम पार्ने हो?"</string> - <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डिबगिङ डिभलपमेन्ट प्रयोजनका लागि मात्रै हो। यसलाई आफ्ना कम्प्युटर र उपकरणका बिच डेटा प्रतिलिपि गर्न, सूचना नदिई आफ्नो उपकरणमा अनुप्रयोगहरू स्थापना गर्न र लग डेटा पढ्न प्रयोग गर्नुहोस्।"</string> + <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डिबगिङ डिभलपमेन्ट प्रयोजनका लागि मात्रै हो। यसलाई आफ्ना कम्प्युटर र उपकरणका बिच डेटा प्रतिलिपि गर्न, सूचना नदिई आफ्नो उपकरणमा एपहरू स्थापना गर्न र लग डेटा पढ्न प्रयोग गर्नुहोस्।"</string> <string name="adb_keys_warning_message" msgid="2968555274488101220">"तपाईं पहिले नै अधिकृत गर्नुभएका सबै कम्प्यूटरबाट USB डिबग गर्नको लागि पहुँच रद्द गर्ने हो?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिङहरू अनुमति दिने हो?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string> - <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB मा अनुप्रयोगहरू रुजु गर्नुहोस्"</string> + <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB मा एपहरू रुजु गर्नुहोस्"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"हानिकारक व्यवहारको लागि ADB/ADT को माध्यमबाट स्थापित अनुप्रयोगहरूको जाँच गर्नुहोस्।"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू (MAC ठेगाना भएका मात्र) देखाइनेछ"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"रिमोट यन्त्रहरूमा अस्वीकार्य चर्को आवाज वा नियन्त्रणमा कमी जस्ता आवाज सम्बन्धी समस्याहरूको अवस्थामा ब्लुटुथ निरपेक्ष आवाज सुविधालाई असक्षम गराउँछ।"</string> <string name="bluetooth_enable_gabeldorsche_summary" msgid="2054730331770712629">"ब्लुटुथ Gabeldorsche सुविधाको स्ट्याक सक्षम पार्नुहोस्।"</string> <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"यसले परिष्कृत जडानको सुविधा सक्षम पार्छ।"</string> <string name="enable_terminal_title" msgid="3834790541986303654">"स्थानीय टर्मिनल"</string> - <string name="enable_terminal_summary" msgid="2481074834856064500">"स्थानीय सेल पहुँच प्रदान गर्ने टर्मिनल अनुप्रयोग सक्षम गर्नुहोस्"</string> + <string name="enable_terminal_summary" msgid="2481074834856064500">"स्थानीय सेल पहुँच प्रदान गर्ने टर्मिनल एप सक्षम गर्नुहोस्"</string> <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP जाँच गर्दै"</string> <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP जाँच व्यवहार सेट गर्नुहोस्"</string> <string name="debug_debugging_category" msgid="535341063709248842">"डिबग गरिँदै"</string> - <string name="debug_app" msgid="8903350241392391766">"डिबग अनुप्रयोग चयन गर्नुहोस्"</string> - <string name="debug_app_not_set" msgid="1934083001283807188">"कुनै पनि डिबग अनुप्रयोग सेट छैन"</string> - <string name="debug_app_set" msgid="6599535090477753651">"डिबग गर्ने अनुप्रयोग: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="select_application" msgid="2543228890535466325">"अनुप्रयोग चयन गर्नुहोस्"</string> + <string name="debug_app" msgid="8903350241392391766">"डिबग एप चयन गर्नुहोस्"</string> + <string name="debug_app_not_set" msgid="1934083001283807188">"कुनै पनि डिबग एप सेट छैन"</string> + <string name="debug_app_set" msgid="6599535090477753651">"डिबग गर्ने एप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="select_application" msgid="2543228890535466325">"एप चयन गर्नुहोस्"</string> <string name="no_application" msgid="9038334538870247690">"केही पनि होइन"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"डिबग गर्नेलाई पर्खनुहोस्"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"डिबग भएको अनुप्रयोग कार्यन्वयन हुनु अघि संलग्न हुन डिबग गर्नेलाई पर्खन्छ"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"डिबग भएको एप कार्यन्वयन हुनु अघि संलग्न हुन डिबग गर्नेलाई पर्खन्छ"</string> <string name="debug_input_category" msgid="7349460906970849771">"इनपुट"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"रेखाचित्र"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"हार्डवेयर प्रतिपादन फुर्तिलो बनाइयो"</string> @@ -367,17 +367,17 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"संक्रमण सजीविकरण मापन"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"सजीविकरण अवधि मापन"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"सहायक प्रदर्शनलाई सिमुलेट गर्नुहोस्"</string> - <string name="debug_applications_category" msgid="5394089406638954196">"अनुप्रयोगहरू"</string> + <string name="debug_applications_category" msgid="5394089406638954196">"एपहरू"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"गतिविधिहरू नराख्नुहोस्"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"प्रयोगकर्ताले यसलाई छोड्ने बित्तिकै जति सक्दो चाँडो हरेक गतिविधि ध्वस्त पार्नुहोस्"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"पृष्ठभूमि प्रक्रिया सीमा"</string> <string name="show_all_anrs" msgid="9160563836616468726">"पृष्ठभूमिका ANR हरू देखाउनुहोस्"</string> - <string name="show_all_anrs_summary" msgid="8562788834431971392">"पृष्ठभूमिका अनुप्रयोगहरूको संवादको प्रतिक्रिया नदिइरहेका अनुप्रयोगहरू प्रदर्शन गर्नुहोस्"</string> + <string name="show_all_anrs_summary" msgid="8562788834431971392">"पृष्ठभूमिका एपहरूको संवादको प्रतिक्रिया नदिइरहेका एपहरू प्रदर्शन गर्नुहोस्"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना च्यानलका चेतावनी देखाउनुहोस्"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"अनुप्रयोगले कुनै मान्य च्यानल बिना सूचना पोस्ट गर्दा स्क्रिनमा चेतावनी देखाउँछ"</string> <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"कुराकानी नामक स्थानमा मान्य सर्टकटसँग पनि लिंक गरिएका सूचनाहरू मात्र देखाइयोस्"</string> <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"कुराकानी नामक स्थानमा सूचनाहरू देखिन सकून् भन्नाका खातिर ती सूचनामा सधैँ सक्रिय रहने (long-lived) सेयरिङ सर्टकट समावेश भएको हुनु पर्छ"</string> - <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string> + <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यमा बल प्रयोगको अनुमति प्राप्त एपहरू"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"आकार बदल्न योग्य हुने बनाउन गतिविधिहरूलाई बाध्यात्मक बनाउनुहोस्।"</string> <string name="force_resizable_activities_summary" msgid="2490382056981583062">"म्यानिफेेस्ट मानहरूको ख्याल नगरी, बहु-विन्डोको लागि सबै रिसाइज गर्न सकिने गतिविधिहरू बनाउनुहोस्।"</string> @@ -400,7 +400,7 @@ <item msgid="4548987861791236754">"आँखाले देख्ने प्राकृतिक रङ्गहरू"</item> <item msgid="1282170165150762976">"डिजिटल सामग्रीको लागि अनुकूलित रङ्गहरु"</item> </string-array> - <string name="inactive_apps_title" msgid="5372523625297212320">"स्ट्यान्डबाई अनुप्रयोगहरू"</string> + <string name="inactive_apps_title" msgid="5372523625297212320">"स्ट्यान्डबाई एपहरू"</string> <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"निष्क्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"अनुप्रयोगको स्ट्यान्डबाई अवस्था:<xliff:g id="BUCKET"> %s</xliff:g>"</string> @@ -466,7 +466,7 @@ <string name="disabled" msgid="8017887509554714950">"असक्षम पारियो"</string> <string name="external_source_trusted" msgid="1146522036773132905">"अनुमति छ"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति छैन"</string> - <string name="install_other_apps" msgid="3232595082023199454">"अज्ञात अनुप्रयोगहरू स्थापना गर्नुहोस्"</string> + <string name="install_other_apps" msgid="3232595082023199454">"अज्ञात एपहरू स्थापना गर्नुहोस्"</string> <string name="home" msgid="973834627243661438">"सेटिङहरूको गृहपृष्ठ"</string> <string-array name="battery_labels"> <item msgid="7878690469765357158">"०%"</item> @@ -489,7 +489,7 @@ <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"प्रणालीका भाषाहरू प्रयोग गर्नुहोस्"</string> <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>का लागि सेटिङहरू खोल्न विफल भयो।"</string> <string name="ime_security_warning" msgid="6547562217880551450">"यस इनपुट विधिले तपाईँले टाइप गर्नुहुने सम्पूर्ण पाठ बटु्ल्न सक्छ, व्यक्तिगत डेटा जस्तै पासवर्ड र क्रेडिट कार्ड नम्बर लगायतका। यो <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> अनुप्रयोगबाट आउँदछ। यो इनपुट विधि प्रयोग गर्ने हो?"</string> - <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"टिपोट: पुनःबुट पछि तपाईँले आफ्नो फोनलाई अनलक नगरेसम्म यो अनुप्रयोग सुरु हुन सक्दैन"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"टिपोट: पुनःबुट पछि तपाईँले आफ्नो फोनलाई अनलक नगरेसम्म यो एप सुरु हुन सक्दैन"</string> <string name="ims_reg_title" msgid="8197592958123671062">"IMS दर्ताको स्थिति"</string> <string name="ims_reg_status_registered" msgid="884916398194885457">"दर्ता गरिएको"</string> <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"दर्ता नगरिएको"</string> @@ -529,18 +529,18 @@ <string name="blob_expires_text" msgid="7882727111491739331">"<xliff:g id="DATE">%s</xliff:g> मा म्याद सकिन्छ"</string> <string name="shared_data_delete_failure_text" msgid="3842701391009628947">"सेयर गरिएको डेटा मेट्ने क्रममा त्रुटि भयो।"</string> <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"सेयर गरिएको यो डेटाका लागि कुनै ठेक्का पट्टा लिएको छैन। तपाईं यसलाई मेट्न चाहनुहुन्छ?"</string> - <string name="accessor_info_title" msgid="8289823651512477787">"साझा डेटा प्रयोग गर्ने अनुप्रयोगहरू"</string> + <string name="accessor_info_title" msgid="8289823651512477787">"साझा डेटा प्रयोग गर्ने एपहरू"</string> <string name="accessor_no_description_text" msgid="7510967452505591456">"यो अनुप्रयोगले कुनै विवरण प्रदान गरेको छैन।"</string> <string name="accessor_expires_text" msgid="4625619273236786252">"लिजको म्याद <xliff:g id="DATE">%s</xliff:g> मा सकिन्छ"</string> <string name="delete_blob_text" msgid="2819192607255625697">"साझा डेटा मेट्नुहोस्"</string> <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"तपाईंले यो साझा डेटा मेटाउन खोज्नुभएकै हो?"</string> - <string name="user_add_user_item_summary" msgid="5748424612724703400">"प्रयोगकर्ताहरूसँग आफ्नै अनुप्रयोगहरू र सामग्री हुन्छ"</string> - <string name="user_add_profile_item_summary" msgid="5418602404308968028">"तपाईं आफ्नो खाताबाट अनुप्रयोगहरू र सामग्रीहरूको पहुँचलाई प्रतिबन्ध गर्न सक्नुहुन्छ"</string> + <string name="user_add_user_item_summary" msgid="5748424612724703400">"प्रयोगकर्ताहरूसँग आफ्नै एपहरू र सामग्री हुन्छ"</string> + <string name="user_add_profile_item_summary" msgid="5418602404308968028">"तपाईं आफ्नो खाताबाट एपहरू र सामग्रीहरूको पहुँचलाई प्रतिबन्ध गर्न सक्नुहुन्छ"</string> <string name="user_add_user_item_title" msgid="2394272381086965029">"प्रयोगकर्ता"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"प्रतिबन्धित प्रोफाइल"</string> <string name="user_add_user_title" msgid="5457079143694924885">"नयाँ प्रयोगकर्ता थप्ने हो?"</string> - <string name="user_add_user_message_long" msgid="1527434966294733380">"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो यन्त्र प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै अनुप्रयोग, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छ।"</string> - <string name="user_add_user_message_short" msgid="3295959985795716166">"जब तपाईंले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यो व्यक्तिले आफ्नो ठाउँ सेट गर्न आवश्यक छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> + <string name="user_add_user_message_long" msgid="1527434966294733380">"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो यन्त्र प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै एप, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने एपहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छ।"</string> + <string name="user_add_user_message_short" msgid="3295959985795716166">"जब तपाईंले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यो व्यक्तिले आफ्नो ठाउँ सेट गर्न आवश्यक छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।"</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"अहिले प्रयोगकर्ता सेटअप गर्ने हो?"</string> <string name="user_setup_dialog_message" msgid="269931619868102841">"यी व्यक्ति यन्त्र यो यन्त्र चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्"</string> <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"अहिले प्रोफाइल सेटअप गर्ने हो?"</string> @@ -551,7 +551,7 @@ <string name="user_new_profile_name" msgid="2405500423304678841">"नयाँ प्रोफाइल"</string> <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ता जानकारी"</string> <string name="profile_info_settings_title" msgid="105699672534365099">"प्रोफाइलको जानकारी"</string> - <string name="user_need_lock_message" msgid="4311424336209509301">"निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको अनुप्रयोग र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।"</string> + <string name="user_need_lock_message" msgid="4311424336209509301">"निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको एप र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।"</string> <string name="user_set_lock_button" msgid="1427128184982594856">"लक सेट गर्नुहोस्"</string> <string name="user_switch_to_user" msgid="6975428297154968543">"प्रयोगकर्ता बदलेर <xliff:g id="USER_NAME">%s</xliff:g> पार्नुहोस्"</string> <string name="guest_new_guest" msgid="3482026122932643557">"अतिथि थप्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index a38a3ea253ff..e1610fb9406f 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -420,7 +420,7 @@ <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"ବର୍ଣ୍ଣାନ୍ଧତା (ନାଲି-ସବୁଜ)"</string> <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ପ୍ରୋଟାନୋମାଲି (ଲାଲ୍-ସବୁଜ)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ନୀଳ-ହଳଦିଆ)"</string> - <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ରଙ୍ଗ ସଠିକତା"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ରଙ୍ଗ ସଂଶୋଧନ"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"ଆପଣଙ୍କ ଡିଭାଇସରେ ରଙ୍ଗଗୁଡ଼ିକ କିପରି ଡିସପ୍ଲେ ହୁଏ ତାହା ଆଡଜଷ୍ଟ କରିବାକୁ ’କଲର୍ କରେକ୍ସନ୍’ ଆପଣଙ୍କୁ ଅନୁମତି ଦିଏ"</string> <string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ଦ୍ୱାରା ଓଭର୍ରାଇଡ୍ କରାଯାଇଛି"</string> <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string> @@ -465,7 +465,7 @@ <string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"ଅନୁମତି ନାହିଁ"</string> <string name="install_other_apps" msgid="3232595082023199454">"ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> - <string name="home" msgid="973834627243661438">"ସେଟିଙ୍ଗ ହୋମ୍"</string> + <string name="home" msgid="973834627243661438">"ସେଟିଂସ୍ ହୋମ୍"</string> <string-array name="battery_labels"> <item msgid="7878690469765357158">"0%"</item> <item msgid="8894873528875953317">"50%"</item> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 9124958af7b4..99fa60903d96 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"A bateria pode acabar neste horário: <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O smartphone pode ser desligado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet pode ser desligado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo pode ser desligado em breve"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 6082965cac25..e3adb389484c 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até à(s) <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Poderá ficar sem bateria à(s) <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O telemóvel poderá ser encerrado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet poderá ser encerrado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo poderá ser encerrado em breve"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 9124958af7b4..99fa60903d96 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Deve durar até por volta de <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Até <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"A bateria pode acabar neste horário: <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s) (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"O smartphone pode ser desligado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"O tablet pode ser desligado em breve"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"O dispositivo pode ser desligado em breve"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 9595bd19a7a2..bbf40db32572 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"<xliff:g id="TIME">%1$s</xliff:g> පමණ වන තෙක් තිබිය යුතුය"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> දක්වා"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"බැටරි බලය <xliff:g id="TIME">%1$s</xliff:g> වන විට අවසන් විය හැකිය"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිය"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිය (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ට වඩා වැඩියෙන් ඉතිරිය (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ට වඩා වැඩියෙන් ඉතිරිය"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"දුරකථනය ඉක්මනින් වැසිය හැකිය"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ටැබ්ලට් පරිගණකය ඉක්මනින් වැසිය හැකිය"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"උපාංගය ඉක්මනින් වැසිය හැකිය"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 4debe7479973..72b28ce5ece6 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Deri në <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Bateria mund të mbarojë deri në <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> e mbetur"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> e mbetur (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g> e mbetur (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g> e mbetur"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefoni mund të fiket së shpejti"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tableti mund të fiket së shpejti"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Pajisja mund të fiket së shpejti"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 66846fa25242..25424b0e2c16 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Hadi <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Huenda chaji ikaisha kufikia <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"Zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Huenda simu ikazima hivi karibuni"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Huenda kompyuta yako kibao ikazima hivi karibuni"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Huenda kifaa kikazima hivi karibuni"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 26f94bf1a2af..f41b8ff05b31 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Şu saate kadar: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Pilin tahmini bitiş zamanı: <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"En çok <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"En çok <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"En az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"En az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"Telefon kısa süre içinde kapanabilir"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"Tablet kısa süre içinde kapanabilir"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"Cihaz kısa süre içinde kapanabilir"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index df1e46fd7014..32515ace5b4a 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -436,10 +436,14 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"<xliff:g id="TIME">%1$s</xliff:g> تک"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"<xliff:g id="TIME">%1$s</xliff:g> تک بیٹری ختم ہو سکتی ہے"</string> - <string name="power_remaining_less_than_duration_only" msgid="5802195288324091585">"<xliff:g id="THRESHOLD">%1$s</xliff:g> سے کم باقی ہے"</string> - <string name="power_remaining_less_than_duration" msgid="1812668275239801236">"<xliff:g id="THRESHOLD">%1$s</xliff:g> سے کم باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_more_than_subtext" msgid="7919119719242734848">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> سے زیادہ باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_remaining_only_more_than_subtext" msgid="3274496164769110480">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> سے زیادہ باقی ہے"</string> + <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> + <skip /> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"فون جلد ہی بند ہو سکتا ہے"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"ٹیبلیٹ جلد ہی بند ہو سکتا ہے"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"آلہ جلد ہی بند ہو سکتا ہے"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index b6ad4fdf7b46..974831f19cfe 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -436,14 +436,10 @@ <string name="power_discharge_by_only" msgid="92545648425937000">"電量大約可用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"還可用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"電池電量可能將於<xliff:g id="TIME">%1$s</xliff:g>耗盡"</string> - <!-- no translation found for power_remaining_less_than_duration_only (8956656616031395152) --> - <skip /> - <!-- no translation found for power_remaining_less_than_duration (318215464914990578) --> - <skip /> - <!-- no translation found for power_remaining_more_than_subtext (446388082266121894) --> - <skip /> - <!-- no translation found for power_remaining_only_more_than_subtext (4873750633368888062) --> - <skip /> + <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"剩餘電量少於 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> + <string name="power_remaining_less_than_duration" msgid="318215464914990578">"剩餘電量少於 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"剩餘電量時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"剩餘電量時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="137330009791560774">"手機可能即將關閉"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="145489081521468132">"平板電腦可能即將關機"</string> <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="1070562682853942350">"裝置可能即將關機"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java index ee8fb38ef08c..74a59399feee 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java @@ -89,6 +89,13 @@ public class BluetoothMediaDevice extends MediaDevice { } @Override + public boolean isFastPairDevice() { + return mCachedDevice != null + && BluetoothUtils.getBooleanMetaData( + mCachedDevice.getDevice(), BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET); + } + + @Override public boolean isConnected() { return mCachedDevice.getBondState() == BluetoothDevice.BOND_BONDED && mCachedDevice.isConnected(); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 19c8b20b7822..002bbec60924 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -17,11 +17,16 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_DOCK; import static android.media.MediaRoute2Info.TYPE_GROUP; +import static android.media.MediaRoute2Info.TYPE_HDMI; import static android.media.MediaRoute2Info.TYPE_HEARING_AID; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; import static android.media.MediaRoute2Info.TYPE_UNKNOWN; +import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY; +import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; +import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR; @@ -339,7 +344,7 @@ public class InfoMediaManager extends MediaManager { for (MediaRoute2Info route : mRouterManager.getAllRoutes()) { if (DEBUG) { Log.d(TAG, "buildAllRoutes() route : " + route.getName() + ", volume : " - + route.getVolume()); + + route.getVolume() + ", type : " + route.getType()); } if (route.isSystemRoute()) { addMediaDevice(route); @@ -350,13 +355,15 @@ public class InfoMediaManager extends MediaManager { private void buildAvailableRoutes() { for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) { if (DEBUG) { - Log.d(TAG, "buildAvailableRoutes() route : " + route.getName()); + Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + + ", type : " + route.getType()); } addMediaDevice(route); } } - private void addMediaDevice(MediaRoute2Info route) { + @VisibleForTesting + void addMediaDevice(MediaRoute2Info route) { final int deviceType = route.getType(); MediaDevice mediaDevice = null; switch (deviceType) { @@ -374,6 +381,11 @@ public class InfoMediaManager extends MediaManager { } break; case TYPE_BUILTIN_SPEAKER: + case TYPE_USB_DEVICE: + case TYPE_USB_HEADSET: + case TYPE_USB_ACCESSORY: + case TYPE_DOCK: + case TYPE_HDMI: case TYPE_WIRED_HEADSET: case TYPE_WIRED_HEADPHONES: mediaDevice = @@ -385,8 +397,10 @@ public class InfoMediaManager extends MediaManager { BluetoothAdapter.getDefaultAdapter().getRemoteDevice(route.getOriginalId()); final CachedBluetoothDevice cachedDevice = mBluetoothManager.getCachedDeviceManager().findDevice(device); - mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice, mRouterManager, - route, mPackageName); + if (cachedDevice != null) { + mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice, mRouterManager, + route, mPackageName); + } break; default: Log.w(TAG, "addMediaDevice() unknown device type : " + deviceType); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index a62d76f732da..af691783e85d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -35,6 +35,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -185,7 +186,7 @@ public class LocalMediaManager implements BluetoothCallback { } void dispatchDeviceListUpdate() { - //TODO(b/149260820): Use new rule to rank device once device type api is ready. + Collections.sort(mMediaDevices, COMPARATOR); for (DeviceCallback callback : getCallbacks()) { callback.onDeviceListUpdate(new ArrayList<>(mMediaDevices)); } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 6aff301f57d4..f1c0f6b44150 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -17,11 +17,16 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_DOCK; import static android.media.MediaRoute2Info.TYPE_GROUP; +import static android.media.MediaRoute2Info.TYPE_HDMI; import static android.media.MediaRoute2Info.TYPE_HEARING_AID; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; import static android.media.MediaRoute2Info.TYPE_UNKNOWN; +import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY; +import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; +import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; @@ -102,6 +107,13 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { case TYPE_WIRED_HEADPHONES: mType = MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE; break; + case TYPE_USB_DEVICE: + case TYPE_USB_HEADSET: + case TYPE_USB_ACCESSORY: + case TYPE_DOCK: + case TYPE_HDMI: + mType = MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE; + break; case TYPE_HEARING_AID: case TYPE_BLUETOOTH_A2DP: mType = MediaDeviceType.TYPE_BLUETOOTH_DEVICE; @@ -266,16 +278,22 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { /** * Rules: - * 1. If there is one of the connected devices identified as a carkit, this carkit will - * be always on the top of the device list. Rule 2 and Rule 3 can’t overrule this rule. + * 1. If there is one of the connected devices identified as a carkit or fast pair device, + * the fast pair device will be always on the first of the device list and carkit will be + * second. Rule 2 and Rule 3 can’t overrule this rule. * 2. For devices without any usage data yet * WiFi device group sorted by alphabetical order + BT device group sorted by alphabetical * order + phone speaker * 3. For devices with usage record. * The most recent used one + device group with usage info sorted by how many times the * device has been used. - * 4. Phone device always in the top and the connected Bluetooth devices, cast devices and - * phone device will be always above on the disconnect Bluetooth devices. + * 4. The order is followed below rule: + * 1. USB-C audio device + * 2. 3.5 mm audio device + * 3. Bluetooth device + * 4. Cast device + * 5. Cast group device + * 6. Phone * * So the device list will look like 5 slots ranked as below. * Rule 4 + Rule 1 + the most recently used device + Rule 3 + Rule 2 @@ -295,39 +313,50 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { } } - // Phone device always in the top. - if (mType == MediaDeviceType.TYPE_PHONE_DEVICE) { - return -1; - } else if (another.mType == MediaDeviceType.TYPE_PHONE_DEVICE) { - return 1; - } - // Check carkit - if (isCarKitDevice()) { - return -1; - } else if (another.isCarKitDevice()) { - return 1; - } - // Set last used device at the first item - String lastSelectedDevice = ConnectionRecordManager.getInstance().getLastSelectedDevice(); - if (TextUtils.equals(lastSelectedDevice, getId())) { - return -1; - } else if (TextUtils.equals(lastSelectedDevice, another.getId())) { - return 1; - } - // Sort by how many times the device has been used if there is usage record - if ((mConnectedRecord != another.mConnectedRecord) - && (another.mConnectedRecord > 0 || mConnectedRecord > 0)) { - return (another.mConnectedRecord - mConnectedRecord); - } - // Both devices have never been used - // To devices with the same type, sort by alphabetical order if (mType == another.mType) { + // Check fast pair device + if (isFastPairDevice()) { + return -1; + } else if (another.isFastPairDevice()) { + return 1; + } + + // Check carkit + if (isCarKitDevice()) { + return -1; + } else if (another.isCarKitDevice()) { + return 1; + } + + // Set last used device at the first item + final String lastSelectedDevice = ConnectionRecordManager.getInstance() + .getLastSelectedDevice(); + if (TextUtils.equals(lastSelectedDevice, getId())) { + return -1; + } else if (TextUtils.equals(lastSelectedDevice, another.getId())) { + return 1; + } + // Sort by how many times the device has been used if there is usage record + if ((mConnectedRecord != another.mConnectedRecord) + && (another.mConnectedRecord > 0 || mConnectedRecord > 0)) { + return (another.mConnectedRecord - mConnectedRecord); + } + + // Both devices have never been used + // To devices with the same type, sort by alphabetical order final String s1 = getName(); final String s2 = another.getName(); return s1.compareToIgnoreCase(s2); + } else { + // Both devices have never been used, the priority is: + // 1. USB-C audio device + // 2. 3.5 mm audio device + // 3. Bluetooth device + // 4. Cast device + // 5. Cast group device + // 6. Phone + return mType < another.mType ? -1 : 1; } - // Both devices have never been used, the priority is Phone > Cast > Bluetooth - return mType - another.mType; } /** @@ -338,6 +367,14 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { return false; } + /** + * Check if it is FastPair device + * @return {@code true} if it is FastPair device, otherwise return {@code false} + */ + protected boolean isFastPairDevice() { + return false; + } + @Override public boolean equals(Object obj) { if (!(obj instanceof MediaDevice)) { diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index c6c5ade90eb5..42f2542e5c30 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -16,6 +16,11 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_DOCK; +import static android.media.MediaRoute2Info.TYPE_HDMI; +import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY; +import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; +import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; @@ -53,6 +58,13 @@ public class PhoneMediaDevice extends MediaDevice { switch (mRouteInfo.getType()) { case TYPE_WIRED_HEADSET: case TYPE_WIRED_HEADPHONES: + name = mContext.getString(R.string.media_transfer_wired_device_name); + break; + case TYPE_USB_DEVICE: + case TYPE_USB_HEADSET: + case TYPE_USB_ACCESSORY: + case TYPE_DOCK: + case TYPE_HDMI: name = mRouteInfo.getName(); break; case TYPE_BUILTIN_SPEAKER: @@ -78,6 +90,11 @@ public class PhoneMediaDevice extends MediaDevice { int getDrawableResId() { int resId; switch (mRouteInfo.getType()) { + case TYPE_USB_DEVICE: + case TYPE_USB_HEADSET: + case TYPE_USB_ACCESSORY: + case TYPE_DOCK: + case TYPE_HDMI: case TYPE_WIRED_HEADSET: case TYPE_WIRED_HEADPHONES: resId = com.android.internal.R.drawable.ic_bt_headphones_a2dp; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java index a39bcb7f08f6..8973d116e438 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java @@ -18,6 +18,7 @@ package com.android.settingslib.media; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothDevice; @@ -69,4 +70,30 @@ public class BluetoothMediaDeviceTest { assertThat(mBluetoothMediaDevice.isConnected()).isFalse(); } + + @Test + public void isFastPairDevice_isUntetheredHeadset_returnTrue() { + final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); + when(mDevice.getDevice()).thenReturn(bluetoothDevice); + + final String value = "True"; + final byte[] bytes = value.getBytes(); + when(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn(bytes); + + assertThat(mBluetoothMediaDevice.isFastPairDevice()).isTrue(); + } + + @Test + public void isFastPairDevice_isNotUntetheredHeadset_returnFalse() { + final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); + when(mDevice.getDevice()).thenReturn(bluetoothDevice); + + final String value = "asjdaioshfaio"; + final byte[] bytes = value.getBytes(); + when(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn(bytes); + + assertThat(mBluetoothMediaDevice.isFastPairDevice()).isFalse(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index c21582cdf203..76eea67f9765 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -16,20 +16,29 @@ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; +import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import static android.media.MediaRoute2ProviderService.REASON_NETWORK_ERROR; import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; import android.media.RoutingSessionInfo; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.testutils.shadow.ShadowRouter2Manager; @@ -601,4 +610,60 @@ public class InfoMediaManagerTest { assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size()); verify(mCallback).onConnectedDeviceChanged(null); } + + @Test + public void addMediaDevice_verifyDeviceTypeCanCorrespondToMediaDevice() { + final MediaRoute2Info route2Info = mock(MediaRoute2Info.class); + final CachedBluetoothDeviceManager cachedBluetoothDeviceManager = + mock(CachedBluetoothDeviceManager.class); + final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); + + when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER); + mInfoMediaManager.addMediaDevice(route2Info); + assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof InfoMediaDevice).isTrue(); + + when(route2Info.getType()).thenReturn(TYPE_USB_DEVICE); + mInfoMediaManager.mMediaDevices.clear(); + mInfoMediaManager.addMediaDevice(route2Info); + assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); + + when(route2Info.getType()).thenReturn(TYPE_WIRED_HEADSET); + mInfoMediaManager.mMediaDevices.clear(); + mInfoMediaManager.addMediaDevice(route2Info); + assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); + + when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP); + when(route2Info.getOriginalId()).thenReturn("00:00:00:00:00:00"); + when(mLocalBluetoothManager.getCachedDeviceManager()) + .thenReturn(cachedBluetoothDeviceManager); + when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))) + .thenReturn(cachedDevice); + mInfoMediaManager.mMediaDevices.clear(); + mInfoMediaManager.addMediaDevice(route2Info); + assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof BluetoothMediaDevice).isTrue(); + + when(route2Info.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); + mInfoMediaManager.mMediaDevices.clear(); + mInfoMediaManager.addMediaDevice(route2Info); + assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); + } + + @Test + public void addMediaDevice_cachedBluetoothDeviceIsNull_shouldNotAdded() { + final MediaRoute2Info route2Info = mock(MediaRoute2Info.class); + final CachedBluetoothDeviceManager cachedBluetoothDeviceManager = + mock(CachedBluetoothDeviceManager.class); + + when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP); + when(route2Info.getOriginalId()).thenReturn("00:00:00:00:00:00"); + when(mLocalBluetoothManager.getCachedDeviceManager()) + .thenReturn(cachedBluetoothDeviceManager); + when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))) + .thenReturn(null); + + mInfoMediaManager.mMediaDevices.clear(); + mInfoMediaManager.addMediaDevice(route2Info); + + assertThat(mInfoMediaManager.mMediaDevices.size()).isEqualTo(0); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java index 206c8590a952..f3b49a69201b 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java @@ -16,6 +16,7 @@ package com.android.settingslib.media; +import static android.bluetooth.BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES; import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR; import static com.google.common.truth.Truth.assertThat; @@ -28,6 +29,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.MediaRoute2Info; @@ -659,6 +661,7 @@ public class LocalMediaManagerTest { final BluetoothDevice bluetoothDevice4 = mock(BluetoothDevice.class); final BluetoothDevice bluetoothDevice5 = mock(BluetoothDevice.class); final BluetoothDevice bluetoothDevice6 = mock(BluetoothDevice.class); + final BluetoothClass bluetoothClass = mock(BluetoothClass.class); final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); final CachedBluetoothDeviceManager cachedManager = mock(CachedBluetoothDeviceManager.class); bluetoothDevices.add(bluetoothDevice); @@ -678,6 +681,9 @@ public class LocalMediaManagerTest { when(cachedManager.findDevice(bluetoothDevice6)).thenReturn(cachedDevice); when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.getDevice()).thenReturn(bluetoothDevice); + when(bluetoothDevice.getBluetoothClass()).thenReturn(bluetoothClass); + when(bluetoothClass.getDeviceClass()).thenReturn(AUDIO_VIDEO_HEADPHONES); when(device1.getId()).thenReturn(TEST_DEVICE_ID_1); when(device2.getId()).thenReturn(TEST_DEVICE_ID_2); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java index db05b768f5db..6664870a6257 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java @@ -18,9 +18,11 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -210,14 +212,14 @@ public class MediaDeviceTest { } @Test - public void compareTo_carKit_phone_phoneFirst() { + public void compareTo_carKit_phone_carKitFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); - mMediaDevices.add(mBluetoothMediaDevice1); mMediaDevices.add(mPhoneMediaDevice); + mMediaDevices.add(mBluetoothMediaDevice1); - assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); - Collections.sort(mMediaDevices, COMPARATOR); assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); } @Test @@ -281,7 +283,7 @@ public class MediaDeviceTest { } @Test - public void compareTo_info_bluetooth_infoFirst() { + public void compareTo_info_bluetooth_bluetoothFirst() { mMediaDevices.add(mInfoMediaDevice1); mMediaDevices.add(mBluetoothMediaDevice1); @@ -291,13 +293,45 @@ public class MediaDeviceTest { } @Test - public void compareTo_bluetooth_phone_phoneFirst() { - mMediaDevices.add(mBluetoothMediaDevice1); + public void compareTo_bluetooth_phone_bluetoothFirst() { mMediaDevices.add(mPhoneMediaDevice); + mMediaDevices.add(mBluetoothMediaDevice1); + + assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + } + + @Test + public void compareTo_bluetooth_wiredHeadset_wiredHeadsetFirst() { + final MediaRoute2Info phoneRouteInfo = mock(MediaRoute2Info.class); + when(phoneRouteInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + + final PhoneMediaDevice phoneMediaDevice = new PhoneMediaDevice(mContext, + mMediaRouter2Manager, phoneRouteInfo, TEST_PACKAGE_NAME); + + mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(phoneMediaDevice); assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); Collections.sort(mMediaDevices, COMPARATOR); - assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + assertThat(mMediaDevices.get(0)).isEqualTo(phoneMediaDevice); + } + + @Test + public void compareTo_info_wiredHeadset_wiredHeadsetFirst() { + final MediaRoute2Info phoneRouteInfo = mock(MediaRoute2Info.class); + when(phoneRouteInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + + final PhoneMediaDevice phoneMediaDevice = new PhoneMediaDevice(mContext, + mMediaRouter2Manager, phoneRouteInfo, TEST_PACKAGE_NAME); + + mMediaDevices.add(mInfoMediaDevice1); + mMediaDevices.add(phoneMediaDevice); + + assertThat(mMediaDevices.get(0)).isEqualTo(mInfoMediaDevice1); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(phoneMediaDevice); } @Test @@ -338,7 +372,7 @@ public class MediaDeviceTest { // 5.mBluetoothMediaDevice2: * 2 times usage // 6.mBluetoothMediaDevice3: * 1 time usage // 7.mPhoneMediaDevice: * 0 time usage - // Order: 7 -> 2 -> 1 -> 5 -> 3 -> 6 -> 4 + // Order: 2 -> 5 -> 6 -> 1 -> 3 -> 4 -> 7 @Test public void compareTo_mixedDevices_carKitFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); @@ -360,13 +394,13 @@ public class MediaDeviceTest { mInfoMediaDevice1.connect(); Collections.sort(mMediaDevices, COMPARATOR); - assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); - assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice1); - assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice1); - assertThat(mMediaDevices.get(3)).isEqualTo(mBluetoothMediaDevice2); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice2); + assertThat(mMediaDevices.get(2)).isEqualTo(mBluetoothMediaDevice3); + assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice1); assertThat(mMediaDevices.get(4)).isEqualTo(mInfoMediaDevice2); - assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice3); - assertThat(mMediaDevices.get(6)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(5)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(6)).isEqualTo(mPhoneMediaDevice); } // 1.mInfoMediaDevice1: Last Selected device @@ -376,7 +410,7 @@ public class MediaDeviceTest { // 5.mBluetoothMediaDevice2: * 4 times usage not connected // 6.mBluetoothMediaDevice3: * 1 time usage // 7.mPhoneMediaDevice: * 0 time usage - // Order: 7 -> 1 -> 3 -> 6 -> 4 -> 2 -> 5 + // Order: 6 -> 1 -> 3 -> 4 -> 7 -> 2 -> 5 @Test public void compareTo_mixedDevices_connectDeviceFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); @@ -402,11 +436,11 @@ public class MediaDeviceTest { mInfoMediaDevice1.connect(); Collections.sort(mMediaDevices, COMPARATOR); - assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice3); assertThat(mMediaDevices.get(1)).isEqualTo(mInfoMediaDevice1); assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice2); - assertThat(mMediaDevices.get(3)).isEqualTo(mBluetoothMediaDevice3); - assertThat(mMediaDevices.get(4)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(4)).isEqualTo(mPhoneMediaDevice); assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice1); assertThat(mMediaDevices.get(6)).isEqualTo(mBluetoothMediaDevice2); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index 4c5cd9682b0f..6f265dd603e5 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -17,6 +17,7 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; @@ -95,9 +96,9 @@ public class PhoneMediaDeviceTest { when(mInfo.getName()).thenReturn(deviceName); assertThat(mPhoneMediaDevice.getName()) - .isEqualTo(deviceName); + .isEqualTo(mContext.getString(R.string.media_transfer_wired_device_name)); - when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADSET); + when(mInfo.getType()).thenReturn(TYPE_USB_DEVICE); assertThat(mPhoneMediaDevice.getName()) .isEqualTo(deviceName); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 133d375b8c6e..37900fb13496 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -219,6 +219,7 @@ <!-- accessibility --> <uses-permission android:name="android.permission.MODIFY_ACCESSIBILITY_DATA" /> <uses-permission android:name="android.permission.MANAGE_ACCESSIBILITY" /> + <uses-permission android:name="android.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY" /> <!-- to control accessibility volume --> <uses-permission android:name="android.permission.CHANGE_ACCESSIBILITY_VOLUME" /> diff --git a/packages/SystemUI/res/color/control_foreground.xml b/packages/SystemUI/res/color/control_foreground.xml index 339f1e20b8b9..de702cdc0263 100644 --- a/packages/SystemUI/res/color/control_foreground.xml +++ b/packages/SystemUI/res/color/control_foreground.xml @@ -2,5 +2,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:color="@color/control_default_foreground" /> - <item android:color="@color/GM2_blue_200" /> + <item android:color="@color/control_enabled_default_foreground" /> </selector> diff --git a/packages/SystemUI/res/color/thermo_cool_foreground.xml b/packages/SystemUI/res/color/thermo_cool_foreground.xml index 339f1e20b8b9..ffce33acfcf7 100644 --- a/packages/SystemUI/res/color/thermo_cool_foreground.xml +++ b/packages/SystemUI/res/color/thermo_cool_foreground.xml @@ -2,5 +2,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:color="@color/control_default_foreground" /> - <item android:color="@color/GM2_blue_200" /> + <item android:color="@color/control_enabled_cool_foreground" /> </selector> diff --git a/packages/SystemUI/res/color/thermo_heat_foreground.xml b/packages/SystemUI/res/color/thermo_heat_foreground.xml index ffcf55098103..f6ebd0bfdcba 100644 --- a/packages/SystemUI/res/color/thermo_heat_foreground.xml +++ b/packages/SystemUI/res/color/thermo_heat_foreground.xml @@ -2,5 +2,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:color="@color/control_default_foreground" /> - <item android:color="@color/GM2_red_200" /> + <item android:color="@color/control_enabled_heat_foreground" /> </selector> diff --git a/packages/SystemUI/res/layout/controls_base_item.xml b/packages/SystemUI/res/layout/controls_base_item.xml index fd75d91f0994..e7bb3afc25af 100644 --- a/packages/SystemUI/res/layout/controls_base_item.xml +++ b/packages/SystemUI/res/layout/controls_base_item.xml @@ -92,12 +92,12 @@ android:ellipsize="end" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/favorite" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="@id/favorite" /> <CheckBox android:id="@+id/favorite" - android:visibility="gone" + android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 1008d2bb24fd..48248e1c24d0 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Beheer borrels enige tyd"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tik op Bestuur om borrels vanaf hierdie program af te skakel"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Het dit"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-instellings"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 7e2ec10fd90d..d3dd22b2c8d8 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"በማንኛውም ጊዜ አረፋዎችን ይቆጣጠሩ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"የዚህ መተግበሪያ አረፋዎችን ለማጥፋት አቀናብርን መታ ያድርጉ"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ገባኝ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"የ<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ቅንብሮች"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 0ada0dc0f9c8..dd108d0497fc 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1019,15 +1019,14 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"التحكّم في فقاعات المحادثات في أي وقت"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"انقر على \"إدارة\" لإيقاف فقاعات المحادثات من هذا التطبيق."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"حسنًا"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"إعدادات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"تظهر في أعلى قسم المحادثات"</string> - <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"إظهار صورة الملف الشخصي على شاشة القفل"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"تظهر صورة الملف الشخصي على شاشة القفل"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"تظهر كفقاعة عائمة فوق التطبيقات"</string> - <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"مقاطعة ميزة \"عدم الإزعاج\""</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"لا تتقيّد بميزة \"عدم الإزعاج\""</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"حسنًا"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"نافذة تراكب التكبير"</string> <string name="magnification_window_title" msgid="4863914360847258333">"نافذة التكبير"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 99cc25d63834..5e0f65c4b3b4 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱাওক"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্ৰীনত প্ৰ\'ফাইল-চিত্ৰ দেখুৱাওক"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"এপ্সমূহৰ ওপৰত ওপঙা বাবল হিচাপে দেখা পোৱা যাব"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"অসুবিধা নিদিব সুবিধাটোত ব্যাঘাত জন্মাওক"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুজি পালোঁ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"বিবৰ্ধন অ’ভাৰলে’ৰ ৱিণ্ড’"</string> <string name="magnification_window_title" msgid="4863914360847258333">"বিবৰ্ধন ৱিণ্ড’"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"বিবৰ্ধন ৱিণ্ড’ৰ নিয়ন্ত্ৰণসমূহ"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index bbb51e140252..708d79b6aed0 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Yumrucuqları istənilən vaxt idarə edin"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu tətbiqdə yumrucuqları deaktiv etmək üçün \"İdarə edin\" seçiminə toxunun"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Anladım"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index cef3cceb9cdc..76e30cadad66 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1004,8 +1004,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrolišite oblačiće u bilo kom trenutku"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljajte da biste isključili oblačiće iz ove aplikacije"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Važi"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Podešavanja za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index a4aea02f98aa..40c083e98936 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Кіруйце ўсплывальнымі апавяшчэннямі ў любы час"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Каб выключыць усплывальныя апавяшчэнні з гэтай праграмы, націсніце \"Кіраваць\""</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Зразумела"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Налады \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 9a505cbb8d92..4393f9524272 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Управление на балончетата по всяко време"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Докоснете „Управление“, за да изключите балончетата от това приложение"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Разбрах"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Настройки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index ca0296415510..452a4aead149 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"কথোপকথনের বিভাগের উপরে দেখান"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"লক স্ক্রিনে প্রোফাইল ছবি দেখান"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"অ্যাপের উপরে একটি ভাসমান বুদবুদ হিসেবে দেখা যাবে"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"বিরক্ত করবে না মোডে ব্যাঘাত ঘটাতে পারে"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"বুঝেছি"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ওভারলে উইন্ডো বড় করে দেখা"</string> <string name="magnification_window_title" msgid="4863914360847258333">"উইন্ডো বড় করে দেখা"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"উইন্ডো কন্ট্রোল বড় করে দেখা"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 4692c0bd4400..28dda35c178e 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -101,7 +101,7 @@ <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Snimanje ekrana"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Snimanje ekrana i zvuka"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Prikaži dodire na ekranu"</string> - <string name="screenrecord_stop_text" msgid="6549288689506057686">"Dodirnite za zaustavljanje"</string> + <string name="screenrecord_stop_text" msgid="6549288689506057686">"Dodirnite da zaustavite"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Zaustavi"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Pauza"</string> <string name="screenrecord_resume_label" msgid="4972223043729555575">"Nastavi"</string> @@ -511,7 +511,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historija"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obavještenja"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Obavještenja koja privlače pažnju"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Zvučna obavještenja"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string> @@ -1006,7 +1006,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Upravljajte oblačićima u svakom momentu"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljaj da isključite oblačiće iz ove aplikacije"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Razumijem"</string> - <string name="bubbles_app_settings" msgid="5779443644062348657">"Postavke za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Postavke aplikacije <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Postavke da ažurirate navigiranje sistemom"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 3697151f900a..1d08662b3e0a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -416,13 +416,13 @@ <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Llum nocturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Al vespre"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Fins a l\'alba"</string> - <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Activat a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Tema fosc"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Estalvi de bateria"</string> <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Al vespre"</string> <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Fins a l\'alba"</string> - <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Activat a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"L\'NFC està desactivada"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla les bombolles en qualsevol moment"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestiona per desactivar les bombolles d\'aquesta aplicació"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entesos"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Configuració de l\'aplicació <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ves a Configuració per actualitzar el sistema de navegació"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index f996cb9fe152..f228e802437b 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Styr bobler når som helst"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryk på Administrer for at deaktivere bobler fra denne app"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Indstillinger for <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Indstillinger for at opdatere systemnavigationen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index b3142e9b9616..c1df6d54e2f6 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ελέγξτε τα συννεφάκια ανά πάσα στιγμή."</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Πατήστε Διαχείριση για να απενεργοποιήσετε τα συννεφάκια από αυτήν την εφαρμογή."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Το κατάλαβα."</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Ρυθμίσεις <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 879fc35811a3..53dda2fe729f 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla las burbujas en todo momento"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Presiona Administrar para desactivar las burbujas de esta app"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Configuración para actualizar la navegación del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 7e3fdc7868da..01fdb37efde9 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controla las burbujas en cualquier momento"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestionar para desactivar las burbujas de esta aplicación"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Ajustes de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index fa6447b20e71..5966e0d7930c 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -416,7 +416,7 @@ <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Öövalgus"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Sissel. päikeselooj."</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Kuni päikesetõusuni"</string> - <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Sisselülitam. kell <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Sisse kell <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Tume teema"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Akusäästja"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Juhtige mulle igal ajal"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Selle rakenduse puhul mullide väljalülitamiseks puudutage valikut Haldamine"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Selge"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Rakenduse <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> seaded"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 5860af67e0e1..2b2959e22825 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"کنترل ابزارک اعلان در هرزمانی"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"برای خاموش کردن «ابزارک اعلان» از این برنامه، روی «مدیریت» ضربه بزنید"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"متوجهام"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"تنظیمات <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"پیمایش سیستم بهروزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 04204535dc08..4bab845eaf38 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Muuta kuplien asetuksia milloin tahansa"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Valitse Hallinnoi, jos haluat poistaa kuplat käytöstä tästä sovelluksesta"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Selvä"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: asetukset"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Vaihda järjestelmän navigointitapaa asetuksista"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index da44d8894251..6917db510491 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -36,7 +36,7 @@ <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Activer l\'économiseur de pile?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"À propos du mode Économiseur de pile"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Activer"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer la fonction Économiseur de pile"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"Activer l\'économiseur de pile"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Paramètres"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Rotation auto de l\'écran"</string> @@ -101,7 +101,7 @@ <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Enregistrement de l\'écran"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Enregistrement de l\'écran et de l\'audio"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Afficher les endroits touchés à l\'écran"</string> - <string name="screenrecord_stop_text" msgid="6549288689506057686">"Toucher pour arrêter"</string> + <string name="screenrecord_stop_text" msgid="6549288689506057686">"Touchez ici pour arrêter"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Arrêter"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Pause"</string> <string name="screenrecord_resume_label" msgid="4972223043729555575">"Reprendre"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 0899e0971af4..8ef8334acdbc 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Contrôler les paramètres des bulles"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Appuyez sur \"Gérer\" pour désactiver les bulles de cette application"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Paramètres <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez aux paramètres pour mettre à jour la navigation système"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 2e910c77f346..bb5ee8e78593 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controlar as burbullas en calquera momento"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Para desactivar as burbullas nesta aplicación, toca Xestionar"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Entendido"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Configuración de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Para actualizar a navegación do sistema, vai a Configuración"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> @@ -1008,7 +1007,7 @@ <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Mostrar imaxe do perfil na pantalla de bloqueo"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Mostrar como burbulla flotante sobre outras apps"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Interromper modo Non molestar"</string> - <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Listo"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"Entendido"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"Ampliación da ventá de superposición"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Ventá de superposición"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Controis de ampliación da ventá"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 715c40b93c4a..fb539003ae40 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -345,7 +345,7 @@ <string name="quick_settings_dnd_alarms_label" msgid="1241780970469630835">"ફક્ત એલાર્મ્સ"</string> <string name="quick_settings_dnd_none_label" msgid="8420869988472836354">"સાવ શાંતિ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"બ્લૂટૂથ"</string> - <string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"બ્લૂટૂથ (<xliff:g id="NUMBER">%d</xliff:g> ઉપકરણો)"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="6595808498429809855">"બ્લૂટૂથ (<xliff:g id="NUMBER">%d</xliff:g> ડિવાઇસ)"</string> <string name="quick_settings_bluetooth_off_label" msgid="6375098046500790870">"બ્લૂટૂથ બંધ"</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> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"બબલને કોઈપણ સમયે નિયંત્રિત કરો"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"સમજાઈ ગયું"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> સેટિંગ"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index af45c6805fb8..19799839e7a9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1001,8 +1001,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"जब चाहें, बबल्स को कंट्रोल करें"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"इस ऐप्लिकेशन पर बबल्स को बंद करने के लिए \'प्रबंधित करें\' पर टैप करें"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"ठीक है"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> की सेटिंग"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index b5e6474aa343..521ca575525e 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Buborékok vezérlése bármikor"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"A Kezelés gombra koppintva kapcsolhatja ki az alkalmazásból származó buborékokat"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Értem"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> beállításai"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index f2ec4b9960ca..93f0001f625c 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -99,7 +99,7 @@ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Սարքի բարձրախոսը և խոսափողը"</string> <string name="screenrecord_start" msgid="330991441575775004">"Սկսել"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Էկրանի տեսագրում"</string> - <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Էկրանի տեսագրում և աուդիո ձայնագրում"</string> + <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Էկրանի տեսագրում և ձայնագրում"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Ցուցադրել էկրանի հպումները"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"Հպեք՝ դադարեցնելու համար"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Կանգնեցնել"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ամպիկների կարգավորումներ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Հպեք «Կառավարել» կոճակին՝ այս հավելվածի ամպիկներն անջատելու համար։"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Եղավ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – կարգավորումներ"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index f9126db5f131..ac011a3dfc8f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -192,7 +192,7 @@ <string name="accessibility_data_two_bars" msgid="4576231688545173059">"Data dua batang."</string> <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Data tiga batang."</string> <string name="accessibility_data_signal_full" msgid="283507058258113551">"Sinyal data penuh."</string> - <string name="accessibility_wifi_name" msgid="4863440268606851734">"Tersambung ke <xliff:g id="WIFI">%s</xliff:g>."</string> + <string name="accessibility_wifi_name" msgid="4863440268606851734">"Terhubung ke <xliff:g id="WIFI">%s</xliff:g>."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tersambung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Terhubung ke <xliff:g id="CAST">%s</xliff:g>."</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"Tidak ada WiMAX."</string> @@ -203,7 +203,7 @@ <string name="accessibility_ethernet_disconnected" msgid="2097190491174968655">"Ethernet terputus."</string> <string name="accessibility_ethernet_connected" msgid="3988347636883115213">"Ethernet tersambung."</string> <string name="accessibility_no_signal" msgid="1115622734914921920">"Tidak ada sinyal."</string> - <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak tersambung."</string> + <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak terhubung."</string> <string name="accessibility_zero_bars" msgid="1364823964848784827">"0 baris."</string> <string name="accessibility_one_bar" msgid="6312250030039240665">"Satu garis."</string> <string name="accessibility_two_bars" msgid="1335676987274417121">"Dua baris."</string> @@ -373,7 +373,7 @@ <string name="quick_settings_user_title" msgid="8673045967216204537">"Pengguna"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Pengguna baru"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> - <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Tidak Tersambung"</string> + <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Tidak Terhubung"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Tidak Ada Jaringan"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi Mati"</string> <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi Aktif"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index e8e5b7af7b90..0a5c8faee1cd 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Hægt er að stjórna blöðrum hvenær sem er"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ýttu á „Stjórna“ til að slökkva á blöðrum frá þessu forriti"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ég skil"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Stillingar <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index c4b167bff07a..fab1eab2a9e2 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -91,7 +91,7 @@ <string name="screenrecord_name" msgid="2596401223859996572">"Registrazione dello schermo"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Avviare la registrazione?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Durante la registrazione, il sistema Android può catturare dati sensibili visibili sullo schermo o riprodotti sul tuo dispositivo. Sono incluse password, dati di pagamento, foto, messaggi e audio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Durante la registrazione, il sistema Android può acquisire dati sensibili visibili sullo schermo o riprodotti sul tuo dispositivo, tra cui password, dati di pagamento, foto, messaggi e audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Registra audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio del dispositivo"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Suoni del dispositivo, come musica, chiamate e suonerie"</string> @@ -373,7 +373,7 @@ <string name="quick_settings_user_title" msgid="8673045967216204537">"Utente"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Nuovo utente"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> - <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non connesso"</string> + <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Non connessa"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nessuna rete"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi disattivato"</string> <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi attivo"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 894bb03cacb0..09b53b51f574 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"שליטה בבועות, בכל זמן"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"יש להקיש על \'ניהול\' כדי להשבית את הבועות מהאפליקציה הזו"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"הבנתי"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"הגדרות <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 82f77530f1ab..b8e0ef5227fd 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Қалқыма хабарларды реттеу"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бұл қолданбадан қалқыма хабарларды өшіру үшін \"Басқару\" түймесін түртіңіз."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Түсінікті"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> параметрлері"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index aa1d77660cc1..ebe3659bd09e 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"គ្រប់គ្រងពពុះបានគ្រប់ពេល"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"ចុច \"គ្រប់គ្រង\" ដើម្បីបិទពពុះពីកម្មវិធីនេះ"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"យល់ហើយ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"ការកំណត់ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"បានធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅកាន់ការកំណត់។"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ចូលទៅកាន់ការកំណត់ ដើម្បីធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index f8e6b1f54066..38ae28d61cf3 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"언제든지 대화창을 제어하세요"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"이 앱에서 대화창을 사용 중지하려면 관리를 탭하세요."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"확인"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> 설정"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ae6c50adf7bd..0e422d4778b8 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -36,7 +36,7 @@ <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Батареяны үнөмдөө режимин күйгүзөсүзбү?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Батареяны үнөмдөгүч режими жөнүндө маалымат"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Күйгүзүү"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"Батареяны үнөмдөгүч режимин күйгүзүү"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"Батареяны үнөмдөгүчтү күйгүзүү"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Жөндөөлөр"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi‑Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Экранды авто буруу"</string> @@ -90,8 +90,8 @@ <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string> <string name="screenrecord_name" msgid="2596401223859996572">"экрандан видео жаздырып алуу"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> - <string name="screenrecord_start_label" msgid="1750350278888217473">"Жаздырып башталсынбы?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойнотулуп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."</string> + <string name="screenrecord_start_label" msgid="1750350278888217473">"Жаздырып баштайсызбы?"</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Аудио жаздыруу"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Түзмөктүн аудиосу"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Музыка, чалуулар жана рингтондор сыяктуу түзмөгүңүздөгү добуштар"</string> @@ -101,7 +101,7 @@ <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Экран жаздырылууда"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Экран жана аудио жаздырылууда"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Экранды басууларды көрсөтүү"</string> - <string name="screenrecord_stop_text" msgid="6549288689506057686">"Токтотуш үчүн басыңыз"</string> + <string name="screenrecord_stop_text" msgid="6549288689506057686">"Токтотуу үчүн басып коюңуз"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Токтотуу"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Тындыруу"</string> <string name="screenrecord_resume_label" msgid="4972223043729555575">"Улантуу"</string> @@ -373,7 +373,7 @@ <string name="quick_settings_user_title" msgid="8673045967216204537">"Колдонуучу"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Жаңы колдонуучу"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> - <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Интернет жок"</string> + <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Туташкан жок"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Желе жок"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi өчүк"</string> <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi күйүк"</string> @@ -498,7 +498,7 @@ <string name="user_remove_user_remove" msgid="8387386066949061256">"Алып салуу"</string> <string name="battery_saver_notification_title" msgid="8419266546034372562">"Батареяны үнөмдөгүч режими күйүк"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Иштин майнаптуулугун начарлатып, фондук дайын-даректерди чектейт"</string> - <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Батареяны үнөмдөгүч режимин өчүрүү"</string> + <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Батареяны үнөмдөгүчтү өчүрүү"</string> <string name="media_projection_dialog_text" msgid="1755705274910034772">"Бул функцияны аткарган <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> кызматы экраныңызда көрүнүп турган бардык маалыматты же жаздыруу жана тышкы экранга чыгаруу учурунда түзмөгүңүздө ойнотулган маалыматты колдоно алат. Буга сырсөздөр, төлөмдүн чоо-жайы, сүрөттөр, билдирүүлөр жана ойнотулган аудио кирет."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Бул функцияны аткарган кызматка экраныңыздагы бардык маалымат же түзмөктө ойнотулуп жаткан нерсе, сырсөздөр, төлөмдөрдүн чоо-жайы, сүрөттөр, билдирүүлөр жана аудио файлдар жеткиликтүү болот."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Жаздырып же тышкы экранга чыгарып баштайсызбы?"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Калкып чыкма билдирмелерди каалаган убакта көзөмөлдөңүз"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн \"Башкарууну\" басыңыз"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Түшүндүм"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> жөндөөлөрү"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Тутум чабыттоосу жаңырды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 7374acd07afc..17be731c06c6 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Bet kada valdyti burbulus"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Palieskite „Tvarkyti“, kad išjungtumėte burbulus šioje programoje"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Supratau"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ nustatymai"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 2ace26779b95..f402323deac3 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1004,8 +1004,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Pārvaldīt burbuļus jebkurā laikā"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Pieskarieties pogai “Pārvaldīt”, lai izslēgtu burbuļus no šīs lietotnes."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Labi"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Lietotnes <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iestatījumi"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 67392bb14d52..03af224a320b 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -91,7 +91,7 @@ <string name="screenrecord_name" msgid="2596401223859996572">"Снимач на екран"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се започне со снимање?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"При снимањето, системот на Android може да ги сними сите чувствителни податоци што се видливи на вашиот екран или пуштени на уредот. Ова вклучува лозинки, податоци за плаќање, фотографии, пораки и аудио."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"При снимањето, системот Android може да ги сними сите чувствителни податоци што се видливи на вашиот екран или пуштени на уредот. Ова вклучува лозинки, податоци за плаќање, фотографии, пораки и аудио."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Снимај аудио"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Аудио од уредот"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук од вашиот уред, како на пр., музика, повици и мелодии"</string> @@ -211,7 +211,7 @@ <string name="accessibility_signal_full" msgid="5920148525598637311">"Полн сигнал."</string> <string name="accessibility_desc_on" msgid="2899626845061427845">"Вклучена."</string> <string name="accessibility_desc_off" msgid="8055389500285421408">"Исклучено."</string> - <string name="accessibility_desc_connected" msgid="3082590384032624233">"Поврзана."</string> + <string name="accessibility_desc_connected" msgid="3082590384032624233">"Поврзано."</string> <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Се поврзува."</string> <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string> <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string> @@ -416,7 +416,7 @@ <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Ноќно светло"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Вклуч. на зајдисонце"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"До изгрејсонце"</string> - <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Ќе се вклучи во <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Вклучување: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Темна тема"</string> <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Штедач на батерија"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Контролирајте ги балончињата во секое време"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Допрете „Управувајте“ за да ги исклучите балончињата од апликацијава"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Сфатив"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Поставки за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 44a2aa11bbc2..da4dae0c12d6 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"സംഭാഷണ വിഭാഗത്തിന്റെ മുകളിൽ കാണിക്കുക"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം കാണിക്കുക"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ആപ്പുകളുടെ മുകളിൽ ഫ്ലോട്ടിംഗ് ബബിൾ ആയി ദൃശ്യമാകും"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ശല്യപ്പെടുത്തരുത്\' തടസ്സപ്പെടുത്തുക"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"മനസ്സിലായി"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"മാഗ്നിഫിക്കേഷൻ ഓവർലേ വിൻഡോ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"മാഗ്നിഫിക്കേഷൻ വിൻഡോ നിയന്ത്രണങ്ങൾ"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0f17270ac3cc..1e646bc1ac4a 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -36,7 +36,7 @@ <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Батарей хэмнэгчийг асаах уу?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Батарей хэмнэгчийн тухай"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Асаах"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"Тэжээл хэмнэгчийг асаах"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"Батарей хэмнэгчийг асаах"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Тохиргоо"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Дэлгэцийг автоматаар эргүүлэх"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Дурын үед бөмбөлгийг хянаарай"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Энэ аппын бөмбөлгүүдийг унтраахын тулд Удирдах дээр товшино уу"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ойлголоо"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-н тохиргоо"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 926b636439bc..cd6aa2acdc25 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"संभाषण विभागाच्या सर्वात वरती दाखवा"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लॉक स्क्रीनवर प्रोफाइल फोटो दाखवा"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ॲप्सच्या सर्वात वरती फ्लोटिंग बबल म्हणून दिसतील"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"व्यत्यय आणू नका मध्ये अडथळा आणतील"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"समजले"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"मॅग्निफिकेशन ओव्हरले विंडो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"मॅग्निफिकेशन विंडो नियंत्रणे"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index efd2c851e409..c1c35a1dbfcb 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kawal gelembung pada bila-bila masa"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ketik Urus untuk mematikan gelembung daripada apl ini"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Tetapan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5ee07ae4dfc4..088371e2449e 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrollér bobler når som helst"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trykk på Administrer for å slå av bobler for denne appen"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Greit"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>-innstillinger"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index ec7efdbc2b25..f072dc41af07 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -52,7 +52,7 @@ <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> को व्यवस्थापन गर्न <xliff:g id="APPLICATION">%1$s</xliff:g> खोल्ने हो?"</string> <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> सञ्चालन गर्न खोल्ने हो?\nयो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> को व्यवस्थापन गर्न <xliff:g id="APPLICATION">%1$s</xliff:g> खोल्ने हो?"</string> - <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"यस USB उपकरणसँग स्थापित अनुप्रयोग काम गर्दैन। यस उपकरणको बारेमा <xliff:g id="URL">%1$s</xliff:g> मा धेरै जान्नुहोस्"</string> + <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"यस USB उपकरणसँग स्थापित एप काम गर्दैन। यस उपकरणको बारेमा <xliff:g id="URL">%1$s</xliff:g> मा धेरै जान्नुहोस्"</string> <string name="title_usb_accessory" msgid="1236358027511638648">"USB सहयोगी"</string> <string name="label_view" msgid="6815442985276363364">"दृश्य"</string> <string name="always_use_device" msgid="210535878779644679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> जडान भएको बेला सधैँ <xliff:g id="APPLICATION">%1$s</xliff:g> खोल्नुहोस्"</string> @@ -85,14 +85,13 @@ <string name="screenshot_failed_title" msgid="3259148215671936891">"स्क्रिनसट सुरक्षित गर्न सकिएन"</string> <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"स्क्रिनसट फेरि लिएर हेर्नुहोस्"</string> <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"भण्डारण ठाउँ सीमित भएका कारण स्क्रिनसट सुरक्षित गर्न सकिएन"</string> - <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त अनुप्रयोग वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string> + <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"उक्त एप वा तपाईंको संगठनले स्क्रिनसटहरू लिन दिँदैन"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रिनसट हटाउनुहोस्"</string> - <!-- no translation found for screenshot_preview_description (7606510140714080474) --> - <skip /> + <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकर्ड गर्न थाल्ने हो?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको यन्त्रमा प्ले गरिने जुनसुकै संवेदनशील जानकारी समावेश गर्न सक्छ। यसमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string> + <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको यन्त्रमा प्ले गरिने सबै संवेदनशील जानकारी रेकर्ड गर्न सक्छ। यो जानकारीमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"अडियो रेकर्ड गर्नुहोस्"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"यन्त्रको अडियो"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"तपाईंको यन्त्रका सङ्गीत, कल र रिङटोन जस्ता आवाज"</string> @@ -101,13 +100,13 @@ <string name="screenrecord_start" msgid="330991441575775004">"सुरु गर्नुहोस्"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"स्क्रिन रेकर्ड गर्दै"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"स्क्रिन र अडियो रेकर्ड गर्दै"</string> - <string name="screenrecord_taps_label" msgid="1595690528298857649">"स्क्रिन रेकर्ड गर्ने क्रममा स्पर्श गरिएका स्थानहरू देखाउनुहोस्"</string> + <string name="screenrecord_taps_label" msgid="1595690528298857649">"स्पर्श गरिएका स्थानहरू देखाउनुहोस्"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"रोक्न ट्याप गर्नुहोस्"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"रोक्नुहोस्"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"पज गर्नुहोस्"</string> <string name="screenrecord_resume_label" msgid="4972223043729555575">"जारी राख्नुहोस्"</string> <string name="screenrecord_cancel_label" msgid="7850926573274483294">"रद्द गर्नुहोस्"</string> - <string name="screenrecord_share_label" msgid="5025590804030086930">"आदान प्रदान गर्नुहोस्"</string> + <string name="screenrecord_share_label" msgid="5025590804030086930">"सेयर गर्नुहोस्"</string> <string name="screenrecord_delete_label" msgid="1376347010553987058">"मेट्नुहोस्"</string> <string name="screenrecord_cancel_success" msgid="1775448688137393901">"स्क्रिन रेकर्ड गर्ने कार्य रद्द गरियो"</string> <string name="screenrecord_save_message" msgid="490522052388998226">"स्क्रिन रेकर्डिङ सुरक्षित गरियो, हेर्न ट्याप गर्नुहोस्"</string> @@ -118,7 +117,7 @@ <string name="usb_preference_title" msgid="1439924437558480718">"USB फाइल सार्ने विकल्पहरू"</string> <string name="use_mtp_button_title" msgid="5036082897886518086">"मिडिया प्लेयर(MTP)को रूपमा माउन्ट गर्नुहोस्"</string> <string name="use_ptp_button_title" msgid="7676427598943446826">"क्यामेराको रूपमा माउन्ट गर्नुहोस् (PTP)"</string> - <string name="installer_cd_button_title" msgid="5499998592841984743">"म्याकको लागि एन्ड्रोइड फाइल ट्रान्सफर अनुप्रयोग स्थापना गर्नुहोस्"</string> + <string name="installer_cd_button_title" msgid="5499998592841984743">"म्याकको लागि एन्ड्रोइड फाइल ट्रान्सफर एप स्थापना गर्नुहोस्"</string> <string name="accessibility_back" msgid="6530104400086152611">"पछाडि"</string> <string name="accessibility_home" msgid="5430449841237966217">"गृह"</string> <string name="accessibility_menu" msgid="2701163794470513040">"मेनु"</string> @@ -356,7 +355,7 @@ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"श्रवण यन्त्रहरू"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"सक्रिय गर्दै…"</string> <string name="quick_settings_brightness_label" msgid="680259653088849563">"चमक"</string> - <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"स्वतःघुम्ने"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"अटो रोटेट"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"स्क्रिन स्वतःघुम्ने"</string> <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> मोड"</string> <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"परिक्रमण लक गरिएको छ"</string> @@ -431,8 +430,8 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"स्रिनको रेकर्ड"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"सुरु गर्नुहोस्"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"रोक्नुहोस्"</string> - <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string> - <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"अनुप्रयोगहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string> + <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"एपहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string> + <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"एपहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"परिदृश्य टगल गर्नुहोस्"</string> <string name="expanded_header_battery_charged" msgid="5307907517976548448">"चार्ज भयो"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"चार्ज हुँदै"</string> @@ -475,27 +474,27 @@ <string name="user_add_user" msgid="4336657383006913022">"प्रयोगकर्ता थप्नुहोस्"</string> <string name="user_new_user_name" msgid="2019166282704195789">"नयाँ प्रयोगकर्ता"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"अतिथि हटाउने हो?"</string> - <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"यस सत्रमा सबै अनुप्रयोगहरू र डेटा मेटाइनेछ।"</string> + <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"यस सत्रमा सबै एपहरू र डेटा मेटाइनेछ।"</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"हटाउनुहोस्"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"पुनः स्वागत, अतिथि!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"तपाईं आफ्नो सत्र जारी गर्न चाहनुहुन्छ?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"सुरु गर्नुहोस्"</string> <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"हो, जारी राख्नुहोस्"</string> <string name="guest_notification_title" msgid="4434456703930764167">"अतिथि प्रयोगकर्ता"</string> - <string name="guest_notification_text" msgid="4202692942089571351">"अनुप्रयोगहरू र डेटा मेटाउन, अतिथि प्रयोगकर्ता हटाउनुहोस्"</string> + <string name="guest_notification_text" msgid="4202692942089571351">"एपहरू र डेटा मेटाउन, अतिथि प्रयोगकर्ता हटाउनुहोस्"</string> <string name="guest_notification_remove_action" msgid="4153019027696868099">"अतिथिलाई हटाउनुहोस्"</string> <string name="user_logout_notification_title" msgid="3644848998053832589">"प्रयोगकर्ता लगआउट गर्नुहोस्"</string> <string name="user_logout_notification_text" msgid="7441286737342997991">"वर्तमान प्रयोगकर्ता लगआउट गर्नुहोस्"</string> <string name="user_logout_notification_action" msgid="7974458760719361881">"प्रयोगकर्ता लगआउट गर्नुहोस्"</string> <string name="user_add_user_title" msgid="4172327541504825032">"नयाँ प्रयोगकर्ता थप्ने हो?"</string> - <string name="user_add_user_message_short" msgid="2599370307878014791">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> + <string name="user_add_user_message_short" msgid="2599370307878014791">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।"</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"प्रयोगकर्ताको सीमा पुग्यो"</string> <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398"> <item quantity="other">तपाईं अधिकतम <xliff:g id="COUNT">%d</xliff:g> प्रयोगहरू मात्र थप्न सक्नुहुन्छ।</item> <item quantity="one">एउटा प्रयोगकर्ता मात्र सिर्जना गर्न सकिन्छ।</item> </plurals> <string name="user_remove_user_title" msgid="9124124694835811874">"प्रयोगकर्ता हटाउन चाहनुहुन्छ?"</string> - <string name="user_remove_user_message" msgid="6702834122128031833">"यस प्रयोगकर्ताको सबै अनुप्रयोगहरू तथा डेटा हटाइने छ।"</string> + <string name="user_remove_user_message" msgid="6702834122128031833">"यस प्रयोगकर्ताको सबै एपहरू तथा डेटा हटाइने छ।"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"हटाउनुहोस्"</string> <string name="battery_saver_notification_title" msgid="8419266546034372562">"ब्याट्री सेभर सक्रिय छ"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string> @@ -542,35 +541,35 @@ <string name="disable_vpn" msgid="482685974985502922">"VPN असक्षम गर्नुहोस्"</string> <string name="disconnect_vpn" msgid="26286850045344557">"विच्छेद VPN"</string> <string name="monitoring_button_view_policies" msgid="3869724835853502410">"नीतिहरू हेर्नुहोस्"</string> - <string name="monitoring_description_named_management" msgid="7424612629468754552">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> - <string name="monitoring_description_management" msgid="8081910434889677718">"तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_named_management" msgid="7424612629468754552">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, एपहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_management" msgid="8081910434889677718">"तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, एपहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापित गऱ्यो। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरेको छ। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"यस यन्त्रमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"तपाईंका प्रशासकले तपाईंको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्क लग गर्ने प्रक्रियालाई सक्रिय गर्नुभएको छ।"</string> - <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string> - <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP_0">%1$s</xliff:g> र <xliff:g id="VPN_APP_1">%2$s</xliff:g> मा जडान हुनुहुन्छ।"</string> - <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"तपाईंको कार्य प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string> - <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"तपाईंको व्यक्तिगत प्रोफाइल इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string> + <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"तपाईं इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string> + <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"तपाईं इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP_0">%1$s</xliff:g> र <xliff:g id="VPN_APP_1">%2$s</xliff:g> मा जडान हुनुहुन्छ।"</string> + <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"तपाईंको कार्य प्रोफाइल तपाईंका इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string> + <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"तपाईंको व्यक्तिगत प्रोफाइल इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string> <string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"तपाईंको यन्त्र <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> द्वारा व्यवस्थापन गरिएको छ।"</string> <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्न <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> को प्रयोग गर्दछ।"</string> - <string name="monitoring_description_do_body" msgid="7700878065625769970">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string> + <string name="monitoring_description_do_body" msgid="7700878065625769970">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, एप, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string> <string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string> <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"थप जान्नुहोस्"</string> - <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"तपाईं <xliff:g id="VPN_APP">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"तपाईं <xliff:g id="VPN_APP">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, एप र वेबसाइटहरू लगायत तपाईंको नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN सम्बन्धी सेटिङहरू खोल्नुहोस्"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"खुला विश्वसनीय प्रमाणहरू"</string> <string name="monitoring_description_network_logging" msgid="577305979174002252">"तपाईँको प्रशासकले तपाईँको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्कको लगिङलाई सक्रिय पार्नुभएको छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> - <string name="monitoring_description_vpn" msgid="1685428000684586870">"तपाईँले VPN जडान गर्न अनुप्रयोगलाई अनुमति दिनुभयो।\n\nयो अनुप्रयोगले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, अनुप्रयोग र वेबसाइटहरू अनुगमन गर्न सक्छ।"</string> - <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"तपाईंको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> ले व्यवस्थापन गर्दछ।\n\nतपाईंको प्रशासकले तपाईंको इमेल, अनुप्रयोग र वेबसाइट सहित नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईं एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_vpn" msgid="1685428000684586870">"तपाईँले VPN जडान गर्न एपलाई अनुमति दिनुभयो।\n\nयो एपले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, एप र वेबसाइटहरू अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"तपाईंको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> ले व्यवस्थापन गर्दछ।\n\nतपाईंको प्रशासकले तपाईंको इमेल, एप र वेबसाइट सहित नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईं एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईंको गतिविधिको अनुगमन गर्न सक्छ।"</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> - <string name="monitoring_description_app" msgid="376868879287922929">"तपाईं आफ्ना इमेल, अनुप्रयोग र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string> - <string name="monitoring_description_app_personal" msgid="1970094872688265987">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईंको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।"</string> - <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> - <string name="monitoring_description_app_work" msgid="3713084153786663662">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION">%2$s</xliff:g> मा जडान छ।\n\nथप जानकारीका लागि, आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> - <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> मा जडान छ। \n\nतपाईं आफ्नो व्यक्तिगत नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> मा पनि जडान हुनुहुन्छ।"</string> + <string name="monitoring_description_app" msgid="376868879287922929">"तपाईं आफ्ना इमेल, एप र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string> + <string name="monitoring_description_app_personal" msgid="1970094872688265987">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> सँग जडित हुनुहुन्छ जसले इ-मेल, एपहरू र वेबसाइट लगायतका तपाईंको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।"</string> + <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, एप र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_app_work" msgid="3713084153786663662">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, एप र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION">%2$s</xliff:g> मा जडान छ।\n\nथप जानकारीका लागि, आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, एप र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> मा जडान छ। \n\nतपाईं आफ्नो व्यक्तिगत नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> मा पनि जडान हुनुहुन्छ।"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ले खुला राखेको"</string> <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"तपाईँले नखोले सम्म उपकरण बन्द रहनेछ"</string> <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string> @@ -639,7 +638,7 @@ <string name="output_service_bt_wifi" msgid="7186882540475524124">"ब्लुटुथ र Wi-Fi"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"प्रणाली UI ट्युनर"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"इम्बेड गरिएको ब्याट्री प्रतिशत देखाउनुहोस्"</string> - <string name="show_battery_percentage_summary" msgid="9053024758304102915">"चार्ज नगरेको बेला वस्तुस्थिति पट्टी आइकन भित्र ब्याट्री प्रतिशत स्तर देखाउनुहोस्"</string> + <string name="show_battery_percentage_summary" msgid="9053024758304102915">"चार्ज नगरेको बेला स्टाटस बार आइकन भित्र ब्याट्री प्रतिशत स्तर देखाउनुहोस्"</string> <string name="quick_settings" msgid="6211774484997470203">"द्रुत सेटिङहरू"</string> <string name="status_bar" msgid="4357390266055077437">"स्थिति पट्टी"</string> <string name="overview" msgid="3522318590458536816">"परिदृश्य"</string> @@ -666,7 +665,7 @@ <string name="tuner_toast" msgid="3812684836514766951">"बधाईँ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ"</string> <string name="remove_from_settings" msgid="633775561782209994">"सेटिङहरूबाट हटाउनुहोस्"</string> <string name="remove_from_settings_prompt" msgid="551565437265615426">"प्रणाली UI ट्युनर सेटिङहरूबाट हटाउने र यसका सबै सुविधाहरू प्रयोग गर्न रोक्ने हो?"</string> - <string name="activity_not_found" msgid="8711661533828200293">"तपाईँको यन्त्रमा अनुप्रयोग स्थापना भएको छैन"</string> + <string name="activity_not_found" msgid="8711661533828200293">"तपाईँको यन्त्रमा एप स्थापना भएको छैन"</string> <string name="clock_seconds" msgid="8709189470828542071">"घडीमा सेकेन्ड देखाउनुहोस्"</string> <string name="clock_seconds_desc" msgid="2415312788902144817">"वस्तुस्थिति पट्टीको घडीमा सेकेन्ड देखाउनुहोस्। ब्याट्री आयु प्रभावित हुन सक्छ।"</string> <string name="qs_rearrange" msgid="484816665478662911">"द्रुत सेटिङहरू पुनः व्यवस्थित गर्नुहोस्"</string> @@ -796,7 +795,7 @@ <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाहरू"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"किबोर्ड सर्टकटहरू"</string> <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"किबोर्डको लेआउट बदल्नुहोस्"</string> - <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"अनुप्रयोगहरू"</string> + <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"एपहरू"</string> <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"सहायता"</string> <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउजर"</string> <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"सम्पर्कहरू"</string> @@ -915,7 +914,7 @@ <string name="pip_skip_to_prev" msgid="3742589641443049237">"अघिल्लोमा जानुहोस्"</string> <string name="thermal_shutdown_title" msgid="2702966892682930264">"फोन अति नै तातिएकाले चिसिन बन्द भयो"</string> <string name="thermal_shutdown_message" msgid="7432744214105003895">"तपाईंको फोन अब सामान्य ढंगले चल्दै छ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने अनुप्रयोगहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन अनुप्रयोगहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग"</string> + <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने एपहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन एपहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग"</string> <string name="high_temp_title" msgid="2218333576838496100">"फोन तातो भइरहेको छ"</string> <string name="high_temp_notif_message" msgid="163928048626045592">"फोन चिसो हुँदै गर्दा केही विशेषताहरूलाई सीमित गरिन्छ"</string> <string name="high_temp_dialog_message" msgid="3793606072661253968">"तपाईंको फोन स्वतः चिसो हुने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।"</string> @@ -928,24 +927,24 @@ <string name="lockscreen_unlock_right" msgid="4658008735541075346">"दायाँतिरको सर्टकटले पनि अनलक गर्छ"</string> <string name="lockscreen_none" msgid="4710862479308909198">"कुनै पनि होइन"</string> <string name="tuner_launch_app" msgid="3906265365971743305">"<xliff:g id="APP">%1$s</xliff:g> सुरु गर्नुहोस्"</string> - <string name="tuner_other_apps" msgid="7767462881742291204">"अन्य अनुप्रयोगहरू"</string> + <string name="tuner_other_apps" msgid="7767462881742291204">"अन्य एपहरू"</string> <string name="tuner_circle" msgid="5270591778160525693">"सर्कल"</string> <string name="tuner_plus" msgid="4130366441154416484">"प्लस चिन्ह"</string> <string name="tuner_minus" msgid="5258518368944598545">"माइनस चिन्ह"</string> <string name="tuner_left" msgid="5758862558405684490">"बायाँ"</string> <string name="tuner_right" msgid="8247571132790812149">"दायाँ"</string> <string name="tuner_menu" msgid="363690665924769420">"मेनु"</string> - <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> अनुप्रयोग"</string> + <string name="tuner_app" msgid="6949280415826686972">"<xliff:g id="APP">%1$s</xliff:g> एप"</string> <string name="notification_channel_alerts" msgid="3385787053375150046">"सतर्कताहरू"</string> <string name="notification_channel_battery" msgid="9219995638046695106">"ब्याट्री"</string> <string name="notification_channel_screenshot" msgid="7665814998932211997">"स्क्रिनशटहरू"</string> <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> + <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> @@ -960,7 +959,7 @@ <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> - <string name="running_foreground_services_title" msgid="5137313173431186685">"पृष्ठभूमिमा चल्ने अनुप्रयोगहरू"</string> + <string name="running_foreground_services_title" msgid="5137313173431186685">"पृष्ठभूमिमा चल्ने एपहरू"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ब्याट्री र डेटाका प्रयोग सम्बन्धी विवरणहरूका लागि ट्याप गर्नुहोस्"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string> <string name="mobile_data_disable_message" msgid="8604966027899770415">"तपाईं <xliff:g id="CARRIER">%s</xliff:g> मार्फत डेटा वा इन्टरनेट प्रयोग गर्न सक्नुहुने छैन। Wi-Fi मार्फत मात्र इन्टरनेट उपलब्ध हुने छ।"</string> @@ -983,7 +982,7 @@ <string name="sensor_privacy_mode" msgid="4462866919026513692">"सेन्सरहरू निष्क्रिय छन्"</string> <string name="device_services" msgid="1549944177856658705">"यन्त्रका सेवाहरू"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string> - <string name="restart_button_description" msgid="6916116576177456480">"यो अनुप्रयोग पुनः सुरु गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> + <string name="restart_button_description" msgid="6916116576177456480">"यो एप पुनः सुरु गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलसम्बन्धी सेटिङहरू"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापन गर्नुहोस्"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> को <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1005,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"वार्तालाप खण्डको सिरानमा देखाइयोस्"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लक स्क्रिनमा प्रोफाइल तस्बिर देखाइयोस्"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"एपहरूमाथि तैरिने बबलका रूपमा देखाइयोस्"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"बाधा नपुऱ्याउनुहोस् मोडलाई बेवास्ता गरियोस्"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"बुझेँ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"म्याग्निफिकेसन ओभरले विन्डो"</string> <string name="magnification_window_title" msgid="4863914360847258333">"म्याग्निफिकेसन विन्डो"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"म्याग्निफिकेसन विन्डोका नियन्त्रणहरू"</string> @@ -1022,7 +1016,7 @@ <string name="quick_controls_subtitle" msgid="1667408093326318053">"आफ्ना जोडिएका यन्त्रहरूका लागि नियन्त्रण सुविधाहरू थप्नुहोस्"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"यन्त्र नियन्त्रण गर्ने विजेटहरू सेटअप गर्नुहोस्"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"आफ्ना नियन्त्रणहरूमाथि पहुँच राख्न पावर बटन थिचिराख्नुहोस्"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"नियन्त्रणहरू थप्न अनुप्रयोग छनौट गर्नुहोस्"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"नियन्त्रणहरू थप्न एप छनौट गर्नुहोस्"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> वटा नियन्त्र थपियो।</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> नियन्त्र थपियो</item> @@ -1047,7 +1041,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"थप हेर्न स्वाइप गर्नुहोस्"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"सिफारिसहरू लोड गर्दै"</string> <string name="controls_media_close_session" msgid="9023534788828414585">"यो मिडिया सत्र बन्द गर्नुहोस्"</string> - <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, अनुप्रयोग जाँच गर्नु…"</string> + <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, एप जाँच गर्नु…"</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> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index cde084f3d27e..8acd97cbf003 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -32,12 +32,12 @@ <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> + <string name="battery_low_why" msgid="2056750982959359863">"ସେଟିଂସ୍"</string> <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ବ୍ୟାଟେରୀ ସେଭର୍ ଚାଲୁ କରିବେ?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"ବ୍ୟାଟେରୀ ସେଭର୍ ବିଷୟରେ"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ଅନ୍ କରନ୍ତୁ"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ କରନ୍ତୁ"</string> - <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ସେଟିଙ୍ଗ"</string> + <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ସେଟିଂସ୍"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"ୱାଇ-ଫାଇ"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରିନ୍"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"ମ୍ୟୁଟ୍"</string> @@ -91,7 +91,7 @@ <string name="screenrecord_name" msgid="2596401223859996572">"ସ୍କ୍ରିନ୍ ରେକର୍ଡର୍"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବେ?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"ରେକର୍ଡିଂ ସମୟରେ, Android ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ଚାଲୁଥିବା ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନାକୁ କ୍ୟାପଚର୍ କରିପାରିବ। ଏହା ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ, ମେସେଜଗୁଡ଼ିକ ଏବଂ ଅଡିଓ ଅନ୍ତର୍ଭୁକ୍ତ କରେ।"</string> + <string name="screenrecord_description" msgid="1123231719680353736">"ରେକର୍ଡିଂ ସମୟରେ, Android ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ଚାଲୁଥିବା ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନାକୁ କ୍ୟାପଚର୍ କରିପାରିବ। ଏଥିରେ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ, ମେସେଜ ଏବଂ ଅଡିଓ ଅନ୍ତର୍ଭୁକ୍ତ।"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"ଡିଭାଇସ୍ ଅଡିଓ"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"ଆପଣଙ୍କ ଡିଭାଇସରୁ ସାଉଣ୍ଡ, ଯେପରିକି ସଙ୍ଗୀତ, କଲ୍ ଏବଂ ରିଂଟୋନଗୁଡ଼ିକ"</string> @@ -241,7 +241,7 @@ <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_charging" msgid="8892191177774027364">"ବ୍ୟାଟେରୀ ଚାର୍ଜ ହେଉଛି, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> ଶତକଡ଼ା।"</string> - <string name="accessibility_settings_button" msgid="2197034218538913880">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ।"</string> + <string name="accessibility_settings_button" msgid="2197034218538913880">"ସିଷ୍ଟମ୍ ସେଟିଂସ୍।"</string> <string name="accessibility_notifications_button" msgid="3960913924189228831">"ବିଜ୍ଞପ୍ତି"</string> <string name="accessibility_overflow_action" msgid="8555835828182509104">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଦେଖନ୍ତୁ"</string> <string name="accessibility_remove_notification" msgid="1641455251495815527">"ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string> @@ -256,9 +256,9 @@ <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> - <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ଦ୍ରୁତ ସେଟିଙ୍ଗ।"</string> + <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ଦ୍ରୁତ ସେଟିଂସ୍।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> - <string name="accessibility_desc_settings" msgid="6728577365389151969">"ସେଟିଙ୍ଗ"</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> @@ -328,8 +328,8 @@ <item quantity="one">ଭିତରେ ଆଉ <xliff:g id="NUMBER_0">%s</xliff:g>ଟି ଅଧିକ ବିଜ୍ଞପ୍ତି ରହିଛି।</item> </plurals> <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string> - <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"ବିଜ୍ଞପ୍ତି ସେଟିଙ୍ଗ"</string> - <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> ସେଟିଙ୍ଗ"</string> + <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"ବିଜ୍ଞପ୍ତି ସେଟିଂସ୍"</string> + <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> ସେଟିଂସ୍"</string> <string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"ସ୍କ୍ରୀନ୍ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"ପୋର୍ଟ୍ରେଟ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string> @@ -355,7 +355,7 @@ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"ଶ୍ରବଣ ଯନ୍ତ୍ର"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"ଅନ୍ ହେଉଛି…"</string> <string name="quick_settings_brightness_label" msgid="680259653088849563">"ଉଜ୍ଜ୍ୱଳତା"</string> - <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"ଅଟୋ-ରୋଟେଟ୍"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରିନ୍"</string> <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> ମୋଡ୍"</string> <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"ଘୂର୍ଣ୍ଣନ ଲକ୍ ହୋଇଛି"</string> @@ -367,11 +367,11 @@ <string name="quick_settings_media_device_label" msgid="8034019242363789941">"ମିଡିଆ ଡିଭାଇସ୍"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"କେବଳ ଜରୁରୀକାଳୀନ କଲ୍"</string> - <string name="quick_settings_settings_label" msgid="2214639529565474534">"ସେଟିଙ୍ଗ"</string> + <string name="quick_settings_settings_label" msgid="2214639529565474534">"ସେଟିଂସ୍"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"ସମୟ"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"ମୁଁ"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"ୟୁଜର୍"</string> - <string name="quick_settings_user_new_user" msgid="3347905871336069666">"ନୂଆ ୟୁଜର୍"</string> + <string name="quick_settings_user_new_user" msgid="3347905871336069666">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"ୱାଇ-ଫାଇ"</string> <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"ନେଟ୍ୱର୍କ ନାହିଁ"</string> @@ -389,7 +389,7 @@ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"ସ୍ୱଚାଳିତ"</string> <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> + <string name="quick_settings_more_settings" msgid="2878235926753776694">"ଅଧିକ ସେଟିଂସ୍"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</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> @@ -471,8 +471,8 @@ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="5759855008166759399">"ୟୁଜର୍ ବଦଳାନ୍ତୁ, ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_inactive" msgid="383168614528618402">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"ପ୍ରୋଫାଇଲ୍ ଦେଖାନ୍ତୁ"</string> - <string name="user_add_user" msgid="4336657383006913022">"ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string> - <string name="user_new_user_name" msgid="2019166282704195789">"ନୂତନ ୟୁଜର୍"</string> + <string name="user_add_user" msgid="4336657383006913022">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ"</string> + <string name="user_new_user_name" msgid="2019166282704195789">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"ଅତିଥିଙ୍କୁ କାଢ଼ିଦେବେ?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ଏହି ଅବଧିର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"କାଢ଼ିଦିଅନ୍ତୁ"</string> @@ -486,7 +486,7 @@ <string name="user_logout_notification_title" msgid="3644848998053832589">"ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string> <string name="user_logout_notification_text" msgid="7441286737342997991">"ବର୍ତ୍ତମାନର ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string> <string name="user_logout_notification_action" msgid="7974458760719361881">"ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍ କରନ୍ତୁ"</string> - <string name="user_add_user_title" msgid="4172327541504825032">"ନୂତନ ୟୁଜର୍ ଯୋଡ଼ିବେ?"</string> + <string name="user_add_user_title" msgid="4172327541504825032">"ନୂତନ ଉପଯୋଗକର୍ତ୍ତା ଯୋଗ କରିବେ?"</string> <string name="user_add_user_message_short" msgid="2599370307878014791">"ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍ ଆପ୍ଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"ଉପଯୋଗକର୍ତ୍ତା ସୀମାରେ ପହଞ୍ଚିଛି"</string> <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398"> @@ -558,7 +558,7 @@ <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"ଅଧିକ ଜାଣନ୍ତୁ"</string> <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"ଆପଣ <xliff:g id="VPN_APP">%1$s</xliff:g>ରେ ସଂଯୁକ୍ତ ଅଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ନେଟ୍ୱର୍କର ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> - <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ"</string> + <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN ସେଟିଂସ୍ ଖୋଲନ୍ତୁ"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"ମୁକ୍ତ ବିଶ୍ୱସ୍ତ କ୍ରୀଡେନଶିଆଲ୍"</string> <string name="monitoring_description_network_logging" msgid="577305979174002252">"ଆପଣଙ୍କ ଆଡମିନ୍ ନେଟ୍ୱର୍କ ଲଗଇନ୍ କରିବା ଅନ୍ କରିଛନ୍ତି, ଯାହା ଆପଣଙ୍କ ଡିଭାଇସରେ ଟ୍ରାଫିକ୍ ନିରୀକ୍ଷଣ କରେ।\n\nଅଧିକ ସୂଚନା ପାଇଁ, ନିଜ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string> @@ -579,7 +579,7 @@ <string name="hidden_notifications_setup" msgid="2064795578526982467">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="5901885672973736563">"ବର୍ତ୍ତମାନ ଅଫ୍ କରନ୍ତୁ"</string> - <string name="accessibility_volume_settings" msgid="1458961116951564784">"ସାଉଣ୍ଡ ସେଟିଙ୍ଗ"</string> + <string name="accessibility_volume_settings" msgid="1458961116951564784">"ସାଉଣ୍ଡ ସେଟିଂସ୍"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"ବଢ଼ାନ୍ତୁ"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"ଛୋଟ କରନ୍ତୁ"</string> <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ସ୍ବଚାଳିତ କ୍ୟାପ୍ସନ୍ ମିଡିଆ"</string> @@ -610,7 +610,7 @@ <string name="stream_music" msgid="2188224742361847580">"ମିଡିଆ"</string> <string name="stream_alarm" msgid="16058075093011694">"ଆଲାର୍ମ"</string> <string name="stream_notification" msgid="7930294049046243939">"ବିଜ୍ଞପ୍ତି"</string> - <string name="stream_bluetooth_sco" msgid="6234562365528664331">"ବ୍ଲୁଟୂଥ୍"</string> + <string name="stream_bluetooth_sco" msgid="6234562365528664331">"ବ୍ଲୁଟୁଥ୍"</string> <string name="stream_dtmf" msgid="7322536356554673067">"ଡୁଆଲ୍ ମଲ୍ଟି ଟୋନ୍ ଫ୍ରିକ୍ୱେନ୍ସୀ"</string> <string name="stream_accessibility" msgid="3873610336741987152">"ଆକ୍ସେସିବିଲିଟୀ"</string> <string name="ring_toggle_title" msgid="5973120187287633224">"କଲ୍"</string> @@ -726,12 +726,12 @@ <string name="appops_camera_overlay" msgid="6466845606058816484">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି ଏବଂ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string> <string name="appops_mic_overlay" msgid="4609326508944233061">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରୁଛି।"</string> <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ଓ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string> - <string name="notification_appops_settings" msgid="5208974858340445174">"ସେଟିଙ୍ଗ"</string> + <string name="notification_appops_settings" msgid="5208974858340445174">"ସେଟିଂସ୍"</string> <string name="notification_appops_ok" msgid="2177609375872784124">"ଠିକ୍ ଅଛି"</string> <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ ଖୋଲା ଯାଇଛି"</string> <string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ ବନ୍ଦ ହୋଇଛି"</string> <string name="notification_channel_switch_accessibility" msgid="8979885820432540252">"ଏହି ଚ୍ୟାନେଲରୁ ବିଜ୍ଞପ୍ତିକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <string name="notification_more_settings" msgid="4936228656989201793">"ଅଧିକ ସେଟିଙ୍ଗ"</string> + <string name="notification_more_settings" msgid="4936228656989201793">"ଅଧିକ ସେଟିଂସ୍"</string> <string name="notification_app_settings" msgid="8963648463858039377">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string> <string name="notification_done" msgid="6215117625922713976">"ହୋଇଗଲା"</string> <string name="inline_undo" msgid="9026953267645116526">"ପୂର୍ବସ୍ଥାନକୁ ଫେରାଇଆଣନ୍ତୁ"</string> @@ -811,7 +811,7 @@ <string name="battery" msgid="769686279459897127">"ବ୍ୟାଟେରୀ"</string> <string name="clock" msgid="8978017607326790204">"ଘଣ୍ଟା"</string> <string name="headset" msgid="4485892374984466437">"ହେଡସେଟ୍"</string> - <string name="accessibility_long_click_tile" msgid="210472753156768705">"ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ"</string> + <string name="accessibility_long_click_tile" msgid="210472753156768705">"ସେଟିଂସ୍ ଖୋଲନ୍ତୁ"</string> <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"ହେଡଫୋନ୍ ସଂଯୁକ୍ତ"</string> <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"ହେଡସେଟ୍ ସଂଯୁକ୍ତ"</string> <string name="data_saver" msgid="3484013368530820763">"ଡାଟା ସେଭର୍"</string> @@ -888,9 +888,9 @@ <string name="dock_non_resizeble_failed_to_dock_text" msgid="7284915968096153808">"ଆପ୍ ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string> <string name="forced_resizable_secondary_display" msgid="522558907654394940">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ କାମ ନକରିପାରେ।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="8446727617187998208">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ ଲଞ୍ଚ ସପୋର୍ଟ କରେ ନାହିଁ।"</string> - <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string> + <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"ସେଟିଂସ୍ ଖୋଲନ୍ତୁ।"</string> <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ଖୋଲନ୍ତୁ।"</string> - <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"ଦ୍ରୁତ ସେଟିଙ୍ଗ ବନ୍ଦ କରନ୍ତୁ।"</string> + <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"ଦ୍ରୁତ ସେଟିଂସ୍ ବନ୍ଦ କରନ୍ତୁ।"</string> <string name="accessibility_quick_settings_alarm_set" msgid="7237918261045099853">"ଆଲାର୍ମ ସେଟ୍।"</string> <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> ଭାବରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"କୌଣସି ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ନାହିଁ"</string> @@ -903,7 +903,7 @@ <string name="pip_phone_expand" msgid="1424988917240616212">"ବଢ଼ାନ୍ତୁ"</string> <string name="pip_phone_minimize" msgid="9057117033655996059">"ଛୋଟ କରନ୍ତୁ"</string> <string name="pip_phone_close" msgid="8801864042095341824">"ବନ୍ଦ କରନ୍ତୁ"</string> - <string name="pip_phone_settings" msgid="5687538631925004341">"ସେଟିଙ୍ଗ"</string> + <string name="pip_phone_settings" msgid="5687538631925004341">"ସେଟିଂସ୍"</string> <string name="pip_phone_dismiss_hint" msgid="5825740708095316710">"ଖାରଜ କରିବାକୁ ତଳକୁ ଟାଣନ୍ତୁ"</string> <string name="pip_menu_title" msgid="6365909306215631910">"ମେନୁ"</string> <string name="pip_notification_title" msgid="8661573026059630525">"<xliff:g id="NAME">%s</xliff:g> \"ଛବି-ଭିତରେ-ଛବି\"ରେ ଅଛି"</string> @@ -976,7 +976,7 @@ <string name="no_auto_saver_action" msgid="7467924389609773835">"ନାହିଁ, ଥାଉ"</string> <string name="auto_saver_enabled_title" msgid="4294726198280286333">"ଆଗରୁ ସେଟ୍ କରିଥିବା ସମୟ ଅନୁସାରେ ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ହୋଇଛି"</string> <string name="auto_saver_enabled_text" msgid="7889491183116752719">"ଚାର୍ଜ <xliff:g id="PERCENTAGE">%d</xliff:g>%%ରୁ କମ୍ ହେଲେ ବ୍ୟାଟେରୀ ସେଭର୍ ଆପେ ଅନ୍ ହୋଇଯିବ।"</string> - <string name="open_saver_setting_action" msgid="2111461909782935190">"ସେଟିଙ୍ଗ"</string> + <string name="open_saver_setting_action" msgid="2111461909782935190">"ସେଟିଂସ୍"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"ବୁଝିଗଲି"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"SysUI ହିପ୍ ଡମ୍ପ୍ କରନ୍ତୁ"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"ସେନ୍ସର୍ଗୁଡ଼ିକ ବନ୍ଦ ଅଛି"</string> @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଦେଖାନ୍ତୁ"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ଆପଗୁଡ଼ିକ ଉପରେ ଫ୍ଲୋଟିଂ ବବଲ୍ ପରି ଦେଖାଯିବ"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ମୋଡରେ ବାଧା ଉପୁଯାଇପାରିବ"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ବୁଝିଗଲି"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ଓଭର୍ଲେ ୱିଣ୍ଡୋ"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ମ୍ୟାଗ୍ନିଫିକେସନ୍ ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 4e6247acd3ab..4602968b1151 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਓ"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਦਿਖਾਓ"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ਐਪਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਫਲੋਟਿੰਗ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਵਿਘਨ ਪੈ ਸਕਦਾ ਹੈ"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"ਸਮਝ ਲਿਆ"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਓਵਰਲੇ Window"</string> <string name="magnification_window_title" msgid="4863914360847258333">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"ਵੱਡਦਰਸ਼ੀਕਰਨ Window ਦੇ ਕੰਟਰੋਲ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index e577fd2cf5ac..4caf6ae5abb2 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -90,7 +90,7 @@ <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> - <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć rejestrowanie?"</string> + <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć nagrywanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Podczas nagrywania system Android może rejestrować wszelkie informacji poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nagraj dźwięk"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Dźwięki odtwarzane na urządzeniu"</string> @@ -108,7 +108,7 @@ <string name="screenrecord_cancel_label" msgid="7850926573274483294">"Anuluj"</string> <string name="screenrecord_share_label" msgid="5025590804030086930">"Udostępnij"</string> <string name="screenrecord_delete_label" msgid="1376347010553987058">"Usuń"</string> - <string name="screenrecord_cancel_success" msgid="1775448688137393901">"Anulowano rejestrowanie zawartości ekranu"</string> + <string name="screenrecord_cancel_success" msgid="1775448688137393901">"Anulowano nagrywanie zawartości ekranu"</string> <string name="screenrecord_save_message" msgid="490522052388998226">"Zapisano nagranie zawartości ekranu – kliknij, by je obejrzeć"</string> <string name="screenrecord_delete_description" msgid="1604522770162810570">"Usunięto nagranie zawartości ekranu"</string> <string name="screenrecord_delete_error" msgid="2870506119743013588">"Błąd podczas usuwania nagrania zawartości ekranu"</string> @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Zarządzaj dymkami w dowolnym momencie"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Kliknij Zarządzaj, aby wyłączyć dymki z tej aplikacji"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – ustawienia"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 9a7f8174bc4b..db7dc624d842 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -101,7 +101,7 @@ <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"A gravar o ecrã…"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"A gravar o ecrã e o áudio…"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Mostrar toques no ecrã"</string> - <string name="screenrecord_stop_text" msgid="6549288689506057686">"Tocar para parar"</string> + <string name="screenrecord_stop_text" msgid="6549288689506057686">"Toque para parar"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Parar"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Colocar em pausa"</string> <string name="screenrecord_resume_label" msgid="4972223043729555575">"Retomar"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controle os balões em qualquer altura"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em Gerir para desativar os balões desta app."</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Definições de <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Aceda às Definições para atualizar a navegação no sistema."</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index dc5c682a9985..37896aaa14a8 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -374,7 +374,7 @@ <string name="quick_settings_user_title" msgid="8673045967216204537">"Utilizator"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Utilizator nou"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> - <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Neconectat"</string> + <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Neconectată"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nicio rețea"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi deconectat"</string> <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi activat"</string> @@ -1004,8 +1004,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Controlați oricând baloanele"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Atingeți Gestionați pentru a dezactiva baloanele din această aplicație"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Setări <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accesați Setările pentru a actualiza navigarea în sistem"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 1fde1e29a5e7..70083b037127 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ඕනෑම වේලාවක බුබුලු පාලනය කරන්න"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"මෙම යෙදුමෙන් බුබුලු ක්රියාවිරහිත කිරීමට කළමනාකරණය කරන්න තට්ටු කරන්න"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"තේරුණා"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සැකසීම්"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 7504f1510476..c71e4fa613e4 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Ovládajte bubliny kedykoľvek"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Klepnutím na Spravovať vypnite bubliny z tejto aplikácie"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Dobre"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Nastavenia upozornenia <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index b4276015aa1f..d41b2a34727b 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -33,10 +33,10 @@ <string name="invalid_charger_title" msgid="938685362320735167">"Ni mogoče polniti prek USB-ja"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Uporabite polnilnik, ki je bil priložen napravi"</string> <string name="battery_low_why" msgid="2056750982959359863">"Nastavitve"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Želite vklopiti varčevanje z energijo baterije?"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Želite vklopiti varčevanje z baterijo?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"O varčevanju z energijo baterije"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Vklopi"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"Vklop varčevanja z energijo baterije"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"Vklop varčevanja z baterijo"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Nastavitve"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Samodejno zasukaj zaslon"</string> @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Upravljanje oblačkov kadar koli"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dotaknite se »Upravljanje«, da izklopite oblačke iz te aplikacije"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Razumem"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Nastavitve za <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index ae6089151c4b..bc07100c82c8 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -90,7 +90,7 @@ <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> - <string name="screenrecord_start_label" msgid="1750350278888217473">"Të niset regjistrimi?"</string> + <string name="screenrecord_start_label" msgid="1750350278888217473">"Të nis regjistrimi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Gjatë regjistrimit, sistemi Android mund të regjistrojë çdo informacion delikat që është i dukshëm në ekranin tënd ose që luhet në pajisje. Kjo përfshin fjalëkalimet, informacionin e pagesave, fotografitë, mesazhet dhe audion."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Regjistro audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audioja e pajisjes"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrollo flluskat në çdo moment"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trokit \"Menaxho\" për të çaktivizuar flluskat nga ky aplikacion"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"E kuptova"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Cilësimet e <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index c32626c917cb..b01dc4fd21bf 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1004,8 +1004,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Контролишите облачиће у било ком тренутку"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Додирните Управљајте да бисте искључили облачиће из ове апликације"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Важи"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Подешавања за <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 6ef1dfdc3e7d..c7943980b0e8 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -91,7 +91,7 @@ <string name="screenrecord_name" msgid="2596401223859996572">"Skärminspelare"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vill du starta inspelningen?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"När du spelar kan Android-systemet registrera alla känsliga uppgifter som visas på skärmen eller spelas upp på enheten. Detta omfattar lösenord, betalningsuppgifter, foton, meddelanden och ljud."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"När du spelar in kan Android-systemet registrera alla känsliga uppgifter som visas på skärmen eller spelas upp på enheten. Detta omfattar lösenord, betalningsuppgifter, foton, meddelanden och ljud."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Spela in ljud"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Ljud på enheten"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Ljud från enheten, till exempel musik, samtal och ringsignaler"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Styr bubblor när som helst"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryck på Hantera för att stänga av bubblor från den här appen"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Inställningar för <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Öppna inställningarna och uppdatera systemnavigeringen"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index a0e31d2ceafb..6951872bde02 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -87,8 +87,7 @@ <string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"போதுமான சேமிப்பிடம் இல்லாததால் ஸ்கிரீன்ஷாட்டைச் சேமிக்க முடியவில்லை"</string> <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ஸ்கிரீன் ஷாட்டுகளை எடுப்பதை, ஆப்ஸ் அல்லது உங்கள் நிறுவனம் அனுமதிக்கவில்லை"</string> <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ஸ்கிரீன்ஷாட்டை நிராகரி"</string> - <!-- no translation found for screenshot_preview_description (7606510140714080474) --> - <skip /> + <string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ரெக்கார்டிங்கைத் தொடங்கவா?"</string> @@ -708,8 +707,7 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"பபிள்"</string> <string name="notification_channel_summary_low" msgid="7300447764759926720">"ஒலியோ அதிர்வோ இல்லாமல் முழு கவனம் செலுத்த உதவும்."</string> <string name="notification_channel_summary_default" msgid="3539949463907902037">"ஒலியோ அதிர்வோ ஏற்படுத்தி உங்கள் கவனத்தை ஈர்க்கும்."</string> - <!-- no translation found for notification_channel_summary_default_with_bubbles (6298026344552480458) --> - <skip /> + <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"ஒலியோ அதிர்வோ ஏற்படுத்தி உங்கள் கவனத்தை ஈர்க்கும். <xliff:g id="APP_NAME">%1$s</xliff:g> இலிருந்து வரும் உரையாடல்கள் இயல்பாகவே குமிழ் வடிவில் தோன்றும்."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"இந்த உள்ளடக்கத்திற்கான மிதக்கும் ஷார்ட்கட் மூலம் உங்கள் கவனத்தைப் பெற்றிருக்கும்."</string> <string name="notification_channel_summary_priority" msgid="7415770044553264622">"உரையாடல் பிரிவின் மேற்பகுதியில் ஒரு குமிழாகக் காட்டப்படும்."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index e74700923292..4d90e7866cd7 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"సంభాషణ విభాగంలో ఎగువున చూపబడుతుంది"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"లాక్ స్క్రీన్ మీద ప్రొఫైల్ ఫోటో చూపబడుతుంది"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"యాప్ల పైన తేలియాడే బబుల్లాగా కనిపిస్తాయి"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"\'అంతరాయం కలిగించవద్దు\' మోడ్కు అంతరాయం"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"అర్థమైంది"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"మాగ్నిఫికేషన్ ఓవర్లే విండో"</string> <string name="magnification_window_title" msgid="4863914360847258333">"మాగ్నిఫికేషన్ విండో"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"మాగ్నిఫికేషన్ నియంత్రణల విండో"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index bde22a53f15a..a51f62ee782a 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"ควบคุมบับเบิลได้ทุกเมื่อ"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"แตะ \"จัดการ\" เพื่อปิดบับเบิลจากแอปนี้"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"รับทราบ"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"การตั้งค่า <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index cafaaace6fdf..082b5c72ad0e 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kontrolin ang mga bubble anumang oras"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"I-tap ang Pamahalaan para i-off ang mga bubble mula sa app na ito"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Mga setting ng <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c9d53357caf6..d81066cb3c16 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Baloncukları istediğiniz zaman kontrol edin"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu uygulamanın baloncuklarını kapatmak için Yönet\'e dokunun"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Anladım"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ayarları"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 00e9d58dd06f..a6da1b4b2a18 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1009,8 +1009,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Налаштовуйте спливаючі чати будь-коли"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Натисніть \"Налаштувати\", щоб вимкнути спливаючі чати від цього додатка"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Зрозуміло"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Налаштування параметра \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\""</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 6cc8dd3f75c8..b9cc796434ff 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1004,16 +1004,11 @@ <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string> - <!-- no translation found for priority_onboarding_show_at_top_text (1678400241025513541) --> - <skip /> - <!-- no translation found for priority_onboarding_show_avatar_text (5756291381124091508) --> - <skip /> - <!-- no translation found for priority_onboarding_appear_as_bubble_text (4227039772250263122) --> - <skip /> - <!-- no translation found for priority_onboarding_ignores_dnd_text (2918952762719600529) --> - <skip /> - <!-- no translation found for priority_onboarding_done_button_title (4569550984286506007) --> - <skip /> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"گفتگو کے سیکشن میں سب سے اوپر دکھائیں"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"مقفل سکرین پر پروفائل کی تصویر دکھائیں"</string> + <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"ایپس کے سب سے اوپر فلوٹنگ بلبلہ کے طور پر ظاہر ہوں"</string> + <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"مداخلت کریں ڈسٹرب نہ کریں"</string> + <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"سمجھ آ گئی"</string> <string name="magnification_overlay_title" msgid="6584179429612427958">"میگنیفیکیشن اوورلے ونڈو"</string> <string name="magnification_window_title" msgid="4863914360847258333">"میگنیفکیشن ونڈو"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"میگنیفکیشن ونڈو کنٹرولز"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 43099f4f060d..b926d753b5db 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -508,7 +508,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"Boshqarish"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Tarix"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Sokin bildirishnomalar"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Bildirishnomalar bildirilishi"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Bildirishnomalarning yuborilishi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha sokin bildirishnomalarni tozalash"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index c0996af8051b..ed8b3a556998 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Kiểm soát tùy chọn cài đặt bong bóng trò chuyện bất mọi lúc"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Nhấn vào nút Quản lý để tắt bong bóng trò chuyện từ ứng dụng này"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"OK"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"Cài đặt <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index fba35b2fe36e..6fe19c9efede 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"随时控制对话泡"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"点按“管理”按钮,可关闭来自此应用的对话泡"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"知道了"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>设置"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系统导航已更新。要进行更改,请转到“设置”。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 3c0654292d94..9f4bf907ef98 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -97,7 +97,7 @@ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"裝置播放的音效,例如音樂、通話和鈴聲"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"麥克風"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"裝置音訊和麥克風"</string> - <string name="screenrecord_start" msgid="330991441575775004">"開始錄影"</string> + <string name="screenrecord_start" msgid="330991441575775004">"開始"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"正在錄影螢幕畫面"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"錄影螢幕畫面和音訊"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示輕觸螢幕的位置"</string> @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"隨時控制小視窗設定"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕按「管理」即可關閉此應用程式的小視窗"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"知道了"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統導覽已更新。如需變更,請前往「設定」。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"前往「設定」更新系統導覽"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index de15aff3adc0..94990c79b829 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"你隨時可以控管對話框的各項設定"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕觸 [管理] 即可關閉來自這個應用程式的對話框"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"我知道了"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"「<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>」設定"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統操作機制已更新。如要進行變更,請前往「設定」。"</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"請前往「設定」更新系統操作機制"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index e9793422ebde..c9bef049e05e 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -999,8 +999,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Lawula amabhamuza noma nini"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"Thepha okuthi Phatha ukuvala amabhamuza kusuka kulolu hlelo lokusebenza"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"Ngiyezwa"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> izilungiselelo"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 2e217a5e83ea..82eda311da6a 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -246,10 +246,13 @@ <color name="control_list_popup_background">@*android:color/background_floating_material_dark</color> <color name="control_spinner_dropdown">@*android:color/foreground_material_dark</color> <color name="control_more_vert">@*android:color/foreground_material_dark</color> - <color name="control_enabled_light_background">@color/GM2_yellow_200</color> - <color name="control_enabled_thermo_heat_background">@color/GM2_red_200</color> - <color name="control_enabled_thermo_cool_background">@color/GM2_blue_200</color> - <color name="control_enabled_default_background">@color/GM2_blue_200</color> + <color name="control_enabled_light_background">#413C2D</color> + <color name="control_enabled_thermo_heat_background">#41312E</color> + <color name="control_enabled_thermo_cool_background">#303744</color> + <color name="control_enabled_default_background">#3C3D40</color> + <color name="control_enabled_heat_foreground">#FF8B66</color> + <color name="control_enabled_default_foreground">@color/GM2_blue_300</color> + <color name="control_enabled_cool_foreground">@color/GM2_blue_300</color> <!-- Docked misalignment message --> <color name="misalignment_text_color">#F28B82</color> diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt index 8b3454a2bc7c..0bc6579739db 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/AppAdapter.kt @@ -102,7 +102,9 @@ class AppAdapter( fun bindData(data: ControlsServiceInfo) { icon.setImageDrawable(data.loadIcon()) title.text = data.loadLabel() - favorites.text = favRenderer.renderFavoritesForComponent(data.componentName) + val text = favRenderer.renderFavoritesForComponent(data.componentName) + favorites.text = text + favorites.visibility = if (text == null) View.GONE else View.VISIBLE } } } @@ -112,12 +114,12 @@ class FavoritesRenderer( private val favoriteFunction: (ComponentName) -> Int ) { - fun renderFavoritesForComponent(component: ComponentName): String { + fun renderFavoritesForComponent(component: ComponentName): String? { val qty = favoriteFunction(component) if (qty != 0) { return resources.getQuantityString(R.plurals.controls_number_of_favorites, qty, qty) } else { - return "" + return null } } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt index 0af29bec04b3..a93d223d565e 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt @@ -18,28 +18,46 @@ package com.android.systemui.controls.ui import android.app.Dialog import android.content.Intent +import android.os.Vibrator +import android.os.VibrationEffect import android.service.controls.Control import android.service.controls.actions.BooleanAction import android.service.controls.actions.CommandAction import android.view.HapticFeedbackConstants import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.util.concurrency.DelayableExecutor object ControlActionCoordinator { const val MIN_LEVEL = 0 const val MAX_LEVEL = 10000 private var dialog: Dialog? = null + private var vibrator: Vibrator? = null + + lateinit var bgExecutor: DelayableExecutor fun closeDialog() { dialog?.dismiss() dialog = null } + /** + * Create custom vibrations, all intended to create very subtle feedback while interacting + * with the controls. + */ + fun initialize(vibrator: Vibrator, bgExecutor: DelayableExecutor) { + this.vibrator = vibrator + this.bgExecutor = bgExecutor + } + fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) { + val effect = if (isChecked) Vibrations.toggleOnEffect else Vibrations.toggleOffEffect + vibrate(effect) cvh.action(BooleanAction(templateId, !isChecked)) } fun touch(cvh: ControlViewHolder, templateId: String, control: Control) { + vibrate(Vibrations.toggleOnEffect) if (cvh.usePanel()) { showDialog(cvh, control.getAppIntent().getIntent()) } else { @@ -47,6 +65,14 @@ object ControlActionCoordinator { } } + fun drag(isEdge: Boolean) { + if (isEdge) { + vibrate(Vibrations.rangeEdgeEffect) + } else { + vibrate(Vibrations.rangeMiddleEffect) + } + } + /** * All long presses will be shown in a 3/4 height bottomsheet panel, in order for the user to * retain context with their favorited controls in the power menu. @@ -59,6 +85,12 @@ object ControlActionCoordinator { } } + private fun vibrate(effect: VibrationEffect) { + vibrator?.let { + bgExecutor.execute { it.vibrate(effect) } + } + } + private fun showDialog(cvh: ControlViewHolder, intent: Intent) { dialog = DetailDialog(cvh, intent).also { it.setOnDismissListener { _ -> dialog = null } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index 5be2f221ebcb..ba053a83ccbd 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -58,7 +58,7 @@ class ControlViewHolder( companion object { const val STATE_ANIMATION_DURATION = 700L private const val UPDATE_DELAY_IN_MILLIS = 3000L - private const val ALPHA_ENABLED = (255.0 * 0.2).toInt() + private const val ALPHA_ENABLED = 255 private const val ALPHA_DISABLED = 0 private val FORCE_PANEL_DEVICES = setOf( DeviceTypes.TYPE_THERMOSTAT, diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index bf0f1c85249c..42db0051b8e6 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -30,6 +30,7 @@ import android.content.res.Configuration import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Process +import android.os.Vibrator import android.service.controls.Control import android.service.controls.actions.ControlAction import android.util.Log @@ -109,6 +110,11 @@ class ControlsUiControllerImpl @Inject constructor ( private lateinit var listingCallback: ControlsListingController.ControlsListingCallback + init { + val vibratorService = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + ControlActionCoordinator.initialize(vibratorService, bgExecutor) + } + private fun createCallback( onResult: (List<SelectionItem>) -> Unit ): ControlsListingController.ControlsListingCallback { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index dafd8b25ec2e..4ba2486193ca 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -181,9 +181,13 @@ class ToggleRangeBehavior : Behavior { fun updateRange(level: Int, checked: Boolean, isDragging: Boolean) { val newLevel = if (checked) Math.max(MIN_LEVEL, Math.min(MAX_LEVEL, level)) else MIN_LEVEL + if (newLevel == clipLayer.level) return + rangeAnimator?.cancel() if (isDragging) { clipLayer.level = newLevel + val isEdge = newLevel == MIN_LEVEL || newLevel == MAX_LEVEL + ControlActionCoordinator.drag(isEdge) } else { rangeAnimator = ValueAnimator.ofInt(cvh.clipLayer.level, newLevel).apply { addUpdateListener { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt new file mode 100644 index 000000000000..a97113cc598b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/Vibrations.kt @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.controls.ui + +import android.os.VibrationEffect +import android.os.VibrationEffect.Composition.PRIMITIVE_TICK + +object Vibrations { + private const val TOGGLE_TICK_COUNT = 12 + + val toggleOnEffect = initToggleOnEffect() + val toggleOffEffect = initToggleOffEffect() + val rangeEdgeEffect = initRangeEdgeEffect() + val rangeMiddleEffect = initRangeMiddleEffect() + + private fun initToggleOnEffect(): VibrationEffect { + val composition = VibrationEffect.startComposition() + var i = 0 + while (i++ < TOGGLE_TICK_COUNT) { + composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 0) + } + composition.addPrimitive(PRIMITIVE_TICK, 0.5f, 100) + return composition.compose() + } + + private fun initToggleOffEffect(): VibrationEffect { + val composition = VibrationEffect.startComposition() + composition.addPrimitive(PRIMITIVE_TICK, 0.5f, 0) + composition.addPrimitive(PRIMITIVE_TICK, 0.05f, 100) + var i = 0 + while (i++ < TOGGLE_TICK_COUNT) { + composition?.addPrimitive(PRIMITIVE_TICK, 0.05f, 0) + } + return composition.compose() + } + + private fun initRangeEdgeEffect(): VibrationEffect { + val composition = VibrationEffect.startComposition() + composition.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f) + return composition.compose() + } + + private fun initRangeMiddleEffect(): VibrationEffect { + val composition = VibrationEffect.startComposition() + composition.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.1f) + return composition.compose() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java index 8f3dc224384b..2b27436c85dd 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java @@ -37,6 +37,7 @@ import android.content.pm.PackageManager; import android.content.pm.ShortcutManager; import android.content.res.Resources; import android.hardware.SensorPrivacyManager; +import android.hardware.display.DisplayManager; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.NetworkScoreManager; @@ -113,6 +114,12 @@ public class SystemServicesModule { } @Provides + @Singleton + static DevicePolicyManager provideDevicePolicyManager(Context context) { + return context.getSystemService(DevicePolicyManager.class); + } + + @Provides @DisplayId static int provideDisplayId(Context context) { return context.getDisplayId(); @@ -120,8 +127,8 @@ public class SystemServicesModule { @Provides @Singleton - static DevicePolicyManager provideDevicePolicyManager(Context context) { - return context.getSystemService(DevicePolicyManager.class); + static DisplayManager provideDisplayManager(Context context) { + return context.getSystemService(DisplayManager.class); } @Singleton diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index eb80a2bc73bb..6aa4f8684928 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -415,16 +415,19 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, * * @param keyguardShowing True if keyguard is showing */ - public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned, + public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned, GlobalActionsPanelPlugin panelPlugin) { mKeyguardShowing = keyguardShowing; mDeviceProvisioned = isDeviceProvisioned; mPanelPlugin = panelPlugin; - if (mDialog != null) { + if (mDialog != null && mDialog.isShowing()) { + // In order to force global actions to hide on the same affordance press, we must + // register a call to onGlobalActionsShown() first to prevent the default actions + // menu from showing. This will be followed by a subsequent call to + // onGlobalActionsHidden() on dismiss() + mWindowManagerFuncs.onGlobalActionsShown(); mDialog.dismiss(); mDialog = null; - // Show delayed, so that the dismiss of the previous dialog completes - mHandler.sendEmptyMessage(MESSAGE_SHOW); } else { handleShow(); } @@ -1805,7 +1808,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private static final int MESSAGE_DISMISS = 0; private static final int MESSAGE_REFRESH = 1; - private static final int MESSAGE_SHOW = 2; private static final int DIALOG_DISMISS_DELAY = 300; // ms private static final int DIALOG_PRESS_DELAY = 850; // ms @@ -1830,9 +1832,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; - case MESSAGE_SHOW: - handleShow(); - break; } } }; diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java index 15cf1a060f4c..09757a4d6204 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java @@ -88,7 +88,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks public void showGlobalActions(GlobalActionsManager manager) { if (mDisabled) return; mGlobalActionsDialog = mGlobalActionsDialogLazy.get(); - mGlobalActionsDialog.showDialog(mKeyguardStateController.isShowing(), + mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(), mDeviceProvisionedController.isDeviceProvisioned(), mPanelExtension.get()); Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth(); diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java index a827f59ac7d1..f900f1e1db63 100644 --- a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java +++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java @@ -60,6 +60,11 @@ public class SysUiState implements Dumpable { mCallbacks.remove(callback); } + /** Returns the current sysui state flags. */ + public int getFlags() { + return mFlags; + } + /** Methods to this call can be chained together before calling {@link #commitUpdate(int)}. */ public SysUiState setFlag(int flag, boolean enabled) { if (enabled) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java index 4f812bc1059c..c22463964a19 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java @@ -37,11 +37,15 @@ public abstract class SecureSetting extends ContentObserver implements Listenabl protected abstract void handleValueChanged(int value, boolean observedChange); - public SecureSetting(Context context, Handler handler, String settingName) { + protected SecureSetting(Context context, Handler handler, String settingName) { + this(context, handler, settingName, ActivityManager.getCurrentUser()); + } + + public SecureSetting(Context context, Handler handler, String settingName, int userId) { super(handler); mContext = context; mSettingName = settingName; - mUserId = ActivityManager.getCurrentUser(); + mUserId = userId; } public int getValue() { @@ -80,4 +84,8 @@ public abstract class SecureSetting extends ContentObserver implements Listenabl setListening(true); } } + + public int getCurrentUser() { + return mUserId; + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java index 79a7df24e217..db77e08c204b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java @@ -118,6 +118,7 @@ public class TileQueryHelper { if (tile == null) { continue; } else if (!tile.isAvailable()) { + tile.setTileSpec(spec); tile.destroy(); continue; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java index 4449d483118b..f2495048bf26 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java @@ -20,6 +20,7 @@ import android.provider.Settings.Secure; import android.service.quicksettings.Tile; import android.widget.Switch; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; import com.android.systemui.plugins.qs.QSTile.BooleanState; @@ -34,7 +35,8 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements BatteryController.BatteryStateChangeCallback { private final BatteryController mBatteryController; - private final SecureSetting mSetting; + @VisibleForTesting + protected final SecureSetting mSetting; private int mLevel; private boolean mPowerSave; @@ -48,7 +50,9 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements super(host); mBatteryController = batteryController; mBatteryController.observe(getLifecycle(), this); - mSetting = new SecureSetting(mContext, mHandler, Secure.LOW_POWER_WARNING_ACKNOWLEDGED) { + int currentUser = host.getUserContext().getUserId(); + mSetting = new SecureSetting(mContext, mHandler, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, + currentUser) { @Override protected void handleValueChanged(int value, boolean observedChange) { handleRefreshState(null); @@ -68,6 +72,11 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements } @Override + protected void handleUserSwitch(int newUserId) { + mSetting.setUserId(newUserId); + } + + @Override public int getMetricsCategory() { return MetricsEvent.QS_BATTERY_TILE; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 2c0ba605f295..34a9e28b943a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -495,8 +495,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } dispatchNavButtonBounds(); - // Update the systemui state flags + // Force-update the systemui state flags updateSystemUiStateFlags(); + notifySystemUiStateFlags(mSysUiState.getFlags()); notifyConnectionChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index bcc81a8b967f..23b911b6f687 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -88,8 +88,8 @@ public class NotificationConversationInfo extends LinearLayout implements private INotificationManager mINotificationManager; ShortcutManager mShortcutManager; private PackageManager mPm; - private VisualStabilityManager mVisualStabilityManager; private ConversationIconFactory mIconFactory; + private VisualStabilityManager mVisualStabilityManager; private String mPackageName; private String mAppName; @@ -108,7 +108,9 @@ public class NotificationConversationInfo extends LinearLayout implements private TextView mPriorityDescriptionView; private TextView mDefaultDescriptionView; private TextView mSilentDescriptionView; + private @Action int mSelectedAction = -1; + private boolean mPressedApply; private OnSnoozeClickListener mOnSnoozeClickListener; private OnSettingsClickListener mOnSettingsClickListener; @@ -160,6 +162,7 @@ public class NotificationConversationInfo extends LinearLayout implements }; private OnClickListener mOnDone = v -> { + mPressedApply = true; closeControls(v, true); }; @@ -521,6 +524,7 @@ public class NotificationConversationInfo extends LinearLayout implements bgHandler.post( new UpdateChannelRunnable(mINotificationManager, mPackageName, mAppUid, mSelectedAction, mNotificationChannel)); + mVisualStabilityManager.temporarilyAllowReordering(); } private boolean shouldShowPriorityOnboarding() { @@ -587,7 +591,7 @@ public class NotificationConversationInfo extends LinearLayout implements @Override public boolean shouldBeSaved() { - return mSelectedAction == ACTION_FAVORITE || mSelectedAction == ACTION_MUTE; + return mPressedApply; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java index abae4d8eb96e..9bf14e43da03 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java @@ -77,7 +77,6 @@ public final class DozeServiceHost implements DozeHost { private final BatteryController mBatteryController; private final ScrimController mScrimController; private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy; - private BiometricUnlockController mBiometricUnlockController; private final KeyguardViewMediator mKeyguardViewMediator; private final Lazy<AssistManager> mAssistManagerLazy; private final DozeScrimController mDozeScrimController; @@ -148,9 +147,9 @@ public final class DozeServiceHost implements DozeHost { mNotificationPanel = notificationPanel; mNotificationShadeWindowViewController = notificationShadeWindowViewController; mAmbientIndicationContainer = ambientIndicationContainer; - mBiometricUnlockController = mBiometricUnlockControllerLazy.get(); } + @Override public String toString() { return "PSB.DozeServiceHost[mCallbacks=" + mCallbacks.size() + "]"; @@ -206,11 +205,11 @@ public final class DozeServiceHost implements DozeHost { boolean dozing = mDozingRequested && mStatusBarStateController.getState() == StatusBarState.KEYGUARD - || mBiometricUnlockController.getMode() + || mBiometricUnlockControllerLazy.get().getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; // When in wake-and-unlock we may not have received a change to StatusBarState // but we still should not be dozing, manually set to false. - if (mBiometricUnlockController.getMode() + if (mBiometricUnlockControllerLazy.get().getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK) { dozing = false; } @@ -311,7 +310,7 @@ public final class DozeServiceHost implements DozeHost { @Override public boolean isPulsingBlocked() { - return mBiometricUnlockController.getMode() + return mBiometricUnlockControllerLazy.get().getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK; } @@ -323,7 +322,7 @@ public final class DozeServiceHost implements DozeHost { @Override public boolean isBlockingDoze() { - if (mBiometricUnlockController.hasPendingAuthentication()) { + if (mBiometricUnlockControllerLazy.get().hasPendingAuthentication()) { Log.i(StatusBar.TAG, "Blocking AOD because fingerprint has authenticated"); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 408b3a619ff1..53ac65700a05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -57,7 +57,6 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.core.view.inputmethod.EditorInfoCompat; import androidx.core.view.inputmethod.InputConnectionCompat; import androidx.core.view.inputmethod.InputContentInfoCompat; @@ -656,9 +655,10 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - String[] allowedDataTypes = mRemoteInputView.mRemoteInput.getAllowedDataTypes() - .toArray(new String[0]); - EditorInfoCompat.setContentMimeTypes(outAttrs, allowedDataTypes); + // TODO: Pass RemoteInput data types to allow image insertion. + // String[] allowedDataTypes = mRemoteInputView.mRemoteInput.getAllowedDataTypes() + // .toArray(new String[0]); + // EditorInfoCompat.setContentMimeTypes(outAttrs, allowedDataTypes); final InputConnection inputConnection = super.onCreateInputConnection(outAttrs); final InputConnectionCompat.OnCommitContentListener callback = diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 4c681023175b..72a65034922c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; @@ -49,6 +50,10 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.tiles.HotspotTile; +import com.android.systemui.statusbar.policy.DataSaverController; +import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -94,6 +99,8 @@ public class TileQueryHelperTest extends SysuiTestCase { private QSTileHost mQSTileHost; @Mock private PackageManager mPackageManager; + @Mock + private QSLogger mQSLogger; @Captor private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor; @@ -106,6 +113,7 @@ public class TileQueryHelperTest extends SysuiTestCase { public void setup() { MockitoAnnotations.initMocks(this); mContext.setMockPackageManager(mPackageManager); + when(mQSTileHost.getQSLogger()).thenReturn(mQSLogger); mState = new QSTile.State(); doAnswer(invocation -> { @@ -269,4 +277,21 @@ public class TileQueryHelperTest extends SysuiTestCase { STOCK_TILES); mTileQueryHelper.queryTiles(mQSTileHost); } + + @Test + public void testQueryTiles_notAvailableDestroyed_isNotNullSpec() { + HotspotController mockHC = mock(HotspotController.class); + DataSaverController mockDSC = mock(DataSaverController.class); + when(mockHC.isHotspotSupported()).thenReturn(false); + HotspotTile t = new HotspotTile(mQSTileHost, mockHC, mockDSC); + when(mQSTileHost.createTile("hotspot")).thenReturn(t); + + mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, + "hotspot"); + + mTileQueryHelper.queryTiles(mQSTileHost); + + FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); + verify(mQSLogger).logTileDestroyed(eq("hotspot"), anyString()); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt new file mode 100644 index 000000000000..31992875df07 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.tiles + +import android.content.Context +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import androidx.test.filters.SmallTest +import com.android.systemui.Dependency +import com.android.systemui.SysuiTestCase +import com.android.systemui.qs.QSHost +import com.android.systemui.statusbar.policy.BatteryController +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +@SmallTest +class BatterySaverTileTest : SysuiTestCase() { + + companion object { + private const val USER = 10 + } + + @Mock + private lateinit var userContext: Context + @Mock + private lateinit var qsHost: QSHost + @Mock + private lateinit var batteryController: BatteryController + private lateinit var testableLooper: TestableLooper + private lateinit var tile: BatterySaverTile + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + mDependency.injectTestDependency(Dependency.BG_LOOPER, testableLooper.looper) + `when`(qsHost.userContext).thenReturn(userContext) + `when`(userContext.userId).thenReturn(USER) + + tile = BatterySaverTile(qsHost, batteryController) + } + + @Test + fun testSettingWithCorrectUser() { + assertEquals(USER, tile.mSetting.currentUser) + } + + @Test + fun testSettingChangesUser() { + tile.userSwitch(USER + 1) + + testableLooper.processAllMessages() + + assertEquals(USER + 1, tile.mSetting.currentUser) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java index 6db868563d3d..3847028a25df 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java @@ -597,6 +597,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { .isEqualTo(GONE); // no changes until hit done + assertFalse(mNotificationInfo.shouldBeSaved()); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( anyString(), anyInt(), any()); assertFalse(mConversationChannel.isImportantConversation()); @@ -637,6 +638,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { .isEqualTo(GONE); // no changes until hit done + assertFalse(mNotificationInfo.shouldBeSaved()); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( anyString(), anyInt(), any()); assertFalse(mConversationChannel.isImportantConversation()); @@ -679,6 +681,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase { .isEqualTo(VISIBLE); // no changes until save + assertFalse(mNotificationInfo.shouldBeSaved()); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( anyString(), anyInt(), any()); assertEquals(IMPORTANCE_DEFAULT, mConversationChannel.getImportance()); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index fe5d4533a598..20850af97429 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -603,7 +603,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // Make sure the reported package is one the caller has access to. event.setPackageName(mSecurityPolicy.resolveValidReportedPackageLocked( - event.getPackageName(), UserHandle.getCallingAppId(), resolvedUserId)); + event.getPackageName(), UserHandle.getCallingAppId(), resolvedUserId, + getCallingPid())); // This method does nothing for a background user. if (resolvedUserId == mCurrentUserId) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java index d98e31eadb22..41f32075fb77 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java @@ -167,11 +167,12 @@ public class AccessibilitySecurityPolicy { * @param packageName The package name the app wants to expose * @param appId The app's id * @param userId The app's user id + * @param pid The app's process pid that requested this * @return A package name that is valid to report */ @Nullable public String resolveValidReportedPackageLocked( - @Nullable CharSequence packageName, int appId, int userId) { + @Nullable CharSequence packageName, int appId, int userId, int pid) { // Okay to pass no package if (packageName == null) { return null; @@ -191,6 +192,11 @@ public class AccessibilitySecurityPolicy { .getHostedWidgetPackages(resolvedUid), packageNameStr)) { return packageName.toString(); } + // If app has the targeted permission to act as another package + if (mContext.checkPermission(Manifest.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY, + pid, resolvedUid) == PackageManager.PERMISSION_GRANTED) { + return packageName.toString(); + } // Otherwise, set the package to the first one in the UID final String[] packageNames = mPackageManager.getPackagesForUid(resolvedUid); if (ArrayUtils.isEmpty(packageNames)) { @@ -403,8 +409,7 @@ public class AccessibilitySecurityPolicy { || userId == UserHandle.USER_CURRENT_OR_SELF) { return currentUserId; } - throw new IllegalArgumentException("Calling user can be changed to only " - + "UserHandle.USER_CURRENT or UserHandle.USER_CURRENT_OR_SELF."); + return resolveProfileParentLocked(userId); } /** diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java index 5d97d213928f..468e93a8f683 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java @@ -955,7 +955,8 @@ public class AccessibilityWindowManager { // Makes sure the reported package is one the caller has access to. packageName = mSecurityPolicy.resolveValidReportedPackageLocked( - packageName, UserHandle.getCallingAppId(), resolvedUserId); + packageName, UserHandle.getCallingAppId(), resolvedUserId, + Binder.getCallingPid()); windowId = sNextWindowId++; // If the window is from a process that runs across users such as diff --git a/services/core/java/com/android/server/DynamicSystemService.java b/services/core/java/com/android/server/DynamicSystemService.java index 191a9bc7651d..b6bbe1912a16 100644 --- a/services/core/java/com/android/server/DynamicSystemService.java +++ b/services/core/java/com/android/server/DynamicSystemService.java @@ -25,6 +25,7 @@ import android.gsi.IGsiServiceCallback; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.image.IDynamicSystemService; @@ -55,7 +56,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { if (mGsiService != null) { return mGsiService; } - return IGsiService.Stub.asInterface(waitForService("gsiservice")); + return IGsiService.Stub.asInterface(ServiceManager.waitForService("gsiservice")); } private void checkPermission() { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5d7590d7a458..0bd134c8dfac 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -18779,6 +18779,15 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override + public void onUserRemoved(@UserIdInt int userId) { + // Clean up any ActivityTaskManager state (by telling it the user is stopped) + mAtmInternal.onUserStopped(userId); + // Clean up various services by removing the user + mBatteryStatsService.onUserRemoved(userId); + mUserController.onUserRemoved(userId); + } + + @Override public void killForegroundAppsForUser(@UserIdInt int userId) { synchronized (ActivityManagerService.this) { final ArrayList<ProcessRecord> procs = new ArrayList<>(); @@ -20045,7 +20054,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (uid == mTargetUid && isTargetOp(code)) { final long identity = Binder.clearCallingIdentity(); try { - return superImpl.apply(code, Process.SHELL_UID, "com.android.shell", featureId, + return mAppOpsService.noteProxyOperation(code, Process.SHELL_UID, + "com.android.shell", null, uid, packageName, featureId, shouldCollectAsyncNotedOp, message); } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java index 5bf0ed6d2438..6d4a9f42ccd9 100644 --- a/services/core/java/com/android/server/am/ProcessStatsService.java +++ b/services/core/java/com/android/server/am/ProcessStatsService.java @@ -590,7 +590,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { } if (doAggregate) { mergedStats.add(stats); - } else { + } else if (committedStats != null) { committedStats.add(protoToParcelFileDescriptor(stats, section)); } if (stats.mReadError != null) { @@ -604,7 +604,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { Slog.w(TAG, "Failure to read and parse commit file " + fileName, e); } } - if (doAggregate) { + if (doAggregate && committedStats != null) { committedStats.add(protoToParcelFileDescriptor(mergedStats, section)); } return newHighWaterMark; @@ -789,11 +789,16 @@ public final class ProcessStatsService extends IProcessStats.Stub { long ident = Binder.clearCallingIdentity(); try { - if (args.length > 0 && "--proto".equals(args[0])) { - dumpProto(fd); - } else { - dumpInner(pw, args); + if (args.length > 0) { + if ("--proto".equals(args[0])) { + dumpProto(fd); + return; + } else if ("--statsd".equals(args[0])) { + dumpProtoForStatsd(fd); + return; + } } + dumpInner(pw, args); } finally { Binder.restoreCallingIdentity(ident); } @@ -1251,4 +1256,17 @@ public final class ProcessStatsService extends IProcessStats.Stub { proto.flush(); } + + /** + * Dump proto for the statsd, mainly for testing. + */ + private void dumpProtoForStatsd(FileDescriptor fd) { + final ProtoOutputStream proto = new ProtoOutputStream(fd); + + ProcessStats procStats = new ProcessStats(false); + getCommittedStatsMerged(0, 0, true, null, procStats); + procStats.dumpAggregatedProtoForStatsd(proto); + + proto.flush(); + } } diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 032ad63a8570..40b6f42309bd 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -25,7 +25,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.media.AudioDeviceAttributes; -import android.media.AudioManager; import android.media.AudioRoutesInfo; import android.media.AudioSystem; import android.media.IAudioRoutesObserver; @@ -38,7 +37,6 @@ import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.SystemClock; -import android.os.UserHandle; import android.util.Log; import android.util.PrintWriterPrinter; @@ -71,6 +69,8 @@ import java.io.PrintWriter; private final AudioDeviceInventory mDeviceInventory; // Manages notifications to BT service private final BtHelper mBtHelper; + // Adapter for system_server-reserved operations + private final SystemServerAdapter mSystemServer; //------------------------------------------------------------------- @@ -97,17 +97,21 @@ import java.io.PrintWriter; mAudioService = service; mBtHelper = new BtHelper(this); mDeviceInventory = new AudioDeviceInventory(this); + mSystemServer = SystemServerAdapter.getDefaultAdapter(mContext); init(); } - /** for test purposes only, inject AudioDeviceInventory */ + /** for test purposes only, inject AudioDeviceInventory and adapter for operations running + * in system_server */ AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service, - @NonNull AudioDeviceInventory mockDeviceInventory) { + @NonNull AudioDeviceInventory mockDeviceInventory, + @NonNull SystemServerAdapter mockSystemServer) { mContext = context; mAudioService = service; mBtHelper = new BtHelper(this); mDeviceInventory = mockDeviceInventory; + mSystemServer = mockSystemServer; init(); } @@ -251,7 +255,21 @@ import java.io.PrintWriter; // redefine equality op so we can match messages intended for this device @Override public boolean equals(Object o) { - return mDevice.equals(o); + if (o == null) { + return false; + } + if (this == o) { + return true; + } + if (o instanceof BtDeviceConnectionInfo) { + return mDevice.equals(((BtDeviceConnectionInfo) o).mDevice); + } + return false; + } + + @Override + public String toString() { + return "BtDeviceConnectionInfo dev=" + mDevice.toString(); } } @@ -262,27 +280,45 @@ import java.io.PrintWriter; final BtDeviceConnectionInfo info = new BtDeviceConnectionInfo(device, state, profile, suppressNoisyIntent, a2dpVolume); - // when receiving a request to change the connection state of a device, this last request - // is the source of truth, so cancel all previous requests - removeAllA2dpConnectionEvents(device); - - sendLMsgNoDelay( - state == BluetoothProfile.STATE_CONNECTED - ? MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION - : MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, - SENDMSG_QUEUE, info); + // operations of removing and posting messages related to A2DP device state change must be + // mutually exclusive + synchronized (mDeviceStateLock) { + // when receiving a request to change the connection state of a device, this last + // request is the source of truth, so cancel all previous requests that are already in + // the handler + removeScheduledA2dpEvents(device); + + sendLMsgNoDelay( + state == BluetoothProfile.STATE_CONNECTED + ? MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION + : MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, + SENDMSG_QUEUE, info); + } } - /** remove all previously scheduled connection and disconnection events for the given device */ - private void removeAllA2dpConnectionEvents(@NonNull BluetoothDevice device) { - mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, - device); - mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION, - device); - mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, - device); - mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, - device); + /** remove all previously scheduled connection and state change events for the given device */ + @GuardedBy("mDeviceStateLock") + private void removeScheduledA2dpEvents(@NonNull BluetoothDevice device) { + mBrokerHandler.removeEqualMessages(MSG_L_A2DP_DEVICE_CONFIG_CHANGE, device); + + final BtDeviceConnectionInfo connectionInfoToRemove = new BtDeviceConnectionInfo(device, + // the next parameters of the constructor will be ignored when finding the message + // to remove as the equality of the message's object is tested on the device itself + // (see BtDeviceConnectionInfo.equals() method override) + BluetoothProfile.STATE_CONNECTED, 0, false, -1); + mBrokerHandler.removeEqualMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, + connectionInfoToRemove); + mBrokerHandler.removeEqualMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION, + connectionInfoToRemove); + + final BtHelper.BluetoothA2dpDeviceInfo devInfoToRemove = + new BtHelper.BluetoothA2dpDeviceInfo(device); + mBrokerHandler.removeEqualMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, + devInfoToRemove); + mBrokerHandler.removeEqualMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, + devInfoToRemove); + mBrokerHandler.removeEqualMessages(MSG_L_A2DP_ACTIVE_DEVICE_CHANGE, + devInfoToRemove); } private static final class HearingAidDeviceConnectionInfo { @@ -489,6 +525,7 @@ import java.io.PrintWriter; sendMsgNoDelay(MSG_BROADCAST_AUDIO_BECOMING_NOISY, SENDMSG_REPLACE); } + @GuardedBy("mDeviceStateLock") /*package*/ void postA2dpSinkConnection(@AudioService.BtProfileConnectionState int state, @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo, int delay) { sendILMsg(state == BluetoothA2dp.STATE_CONNECTED @@ -620,10 +657,12 @@ import java.io.PrintWriter; // must be called synchronized on mConnectedDevices /*package*/ boolean hasScheduledA2dpSinkConnectionState(BluetoothDevice btDevice) { - return (mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, - new BtHelper.BluetoothA2dpDeviceInfo(btDevice)) - || mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, - new BtHelper.BluetoothA2dpDeviceInfo(btDevice))); + final BtHelper.BluetoothA2dpDeviceInfo devInfoToCheck = + new BtHelper.BluetoothA2dpDeviceInfo(btDevice); + return (mBrokerHandler.hasEqualMessages( + MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, devInfoToCheck) + || mBrokerHandler.hasEqualMessages( + MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, devInfoToCheck)); } /*package*/ void setA2dpTimeout(String address, int a2dpCodec, int delayMs) { @@ -682,7 +721,7 @@ import java.io.PrintWriter; private void onSendBecomingNoisyIntent() { AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent( "broadcast ACTION_AUDIO_BECOMING_NOISY")).printLog(TAG)); - sendBroadcastToAll(new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); + mSystemServer.sendDeviceBecomingNoisyIntent(); } //--------------------------------------------------------------------- @@ -804,6 +843,9 @@ import java.io.PrintWriter; final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; synchronized (mDeviceStateLock) { a2dpCodec = mBtHelper.getA2dpCodec(btDevice); + // TODO: name of method being called on AudioDeviceInventory is currently + // misleading (config change vs active device change), to be + // reconciliated once the BT side has been updated. mDeviceInventory.onBluetoothA2dpActiveDeviceChange( new BtHelper.BluetoothA2dpDeviceInfo(btDevice, -1, a2dpCodec), BtHelper.EVENT_DEVICE_CONFIG_CHANGE); @@ -896,7 +938,7 @@ import java.io.PrintWriter; case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION: { final BtDeviceConnectionInfo info = (BtDeviceConnectionInfo) msg.obj; AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent( - "setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent " + "msg: setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent " + " state=" + info.mState // only querying address as this is the only readily available // field on the device @@ -913,7 +955,7 @@ import java.io.PrintWriter; final HearingAidDeviceConnectionInfo info = (HearingAidDeviceConnectionInfo) msg.obj; AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent( - "setHearingAidDeviceConnectionState state=" + info.mState + "msg: setHearingAidDeviceConnectionState state=" + info.mState + " addr=" + info.mDevice.getAddress() + " supprNoisy=" + info.mSupprNoisy + " src=" + info.mEventSource)).printLog(TAG)); @@ -958,13 +1000,19 @@ import java.io.PrintWriter; private static final int MSG_IL_SET_HEARING_AID_CONNECTION_STATE = 8; private static final int MSG_BT_HEADSET_CNCT_FAILED = 9; private static final int MSG_IL_BTA2DP_TIMEOUT = 10; + + // process change of A2DP device configuration, obj is BluetoothDevice private static final int MSG_L_A2DP_DEVICE_CONFIG_CHANGE = 11; + private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 12; private static final int MSG_REPORT_NEW_ROUTES = 13; private static final int MSG_II_SET_HEARING_AID_VOLUME = 14; private static final int MSG_I_SET_AVRCP_ABSOLUTE_VOLUME = 15; private static final int MSG_I_DISCONNECT_BT_SCO = 16; + + // process active A2DP device change, obj is BtHelper.BluetoothA2dpDeviceInfo private static final int MSG_L_A2DP_ACTIVE_DEVICE_CHANGE = 18; + private static final int MSG_DISCONNECT_A2DP = 19; private static final int MSG_DISCONNECT_A2DP_SINK = 20; private static final int MSG_DISCONNECT_BT_HEARING_AID = 21; @@ -973,13 +1021,18 @@ import java.io.PrintWriter; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_A2DP_SINK = 24; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEARING_AID = 25; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEADSET = 26; + + // process change of state, obj is BtHelper.BluetoothA2dpDeviceInfo private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED = 27; private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED = 28; - // process external command to (dis)connect an A2DP device + + // process external command to (dis)connect an A2DP device, obj is BtDeviceConnectionInfo private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION = 29; private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION = 30; + // process external command to (dis)connect a hearing aid device private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31; + // a ScoClient died in BtHelper private static final int MSG_L_SCOCLIENT_DIED = 32; private static final int MSG_IL_SAVE_PREF_DEVICE_FOR_STRATEGY = 33; @@ -1100,17 +1153,4 @@ import java.io.PrintWriter; time); } } - - //------------------------------------------------------------- - // internal utilities - private void sendBroadcastToAll(Intent intent) { - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - final long ident = Binder.clearCallingIdentity(); - try { - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); - } finally { - Binder.restoreCallingIdentity(ident); - } - } } diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 3e97a1e136c6..b1f8feeb37f0 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -289,11 +289,11 @@ public class AudioDeviceInventory { address = ""; } - final int a2dpCodec = btInfo.getCodec(); + final @AudioSystem.AudioFormatNativeEnumForBtCodec int a2dpCodec = btInfo.getCodec(); AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( "A2DP sink connected: device addr=" + address + " state=" + state - + " codec=" + a2dpCodec + + " codec=" + AudioSystem.audioFormatToString(a2dpCodec) + " vol=" + a2dpVolume)); new MediaMetrics.Item(mMetricsId + "a2dp") @@ -422,7 +422,7 @@ public class AudioDeviceInventory { Log.d(TAG, "onBluetoothA2dpActiveDeviceChange btDevice=" + btDevice); } int a2dpVolume = btInfo.getVolume(); - final int a2dpCodec = btInfo.getCodec(); + @AudioSystem.AudioFormatNativeEnumForBtCodec final int a2dpCodec = btInfo.getCodec(); String address = btDevice.getAddress(); if (!BluetoothAdapter.checkBluetoothAddress(address)) { @@ -435,7 +435,8 @@ public class AudioDeviceInventory { synchronized (mDevicesLock) { if (mDeviceBroker.hasScheduledA2dpSinkConnectionState(btDevice)) { AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( - "A2dp config change ignored (scheduled connection change)")); + "A2dp config change ignored (scheduled connection change)") + .printLog(TAG)); mmi.set(MediaMetrics.Property.EARLY_RETURN, "A2dp config change ignored") .record(); return; @@ -476,8 +477,9 @@ public class AudioDeviceInventory { if (res != AudioSystem.AUDIO_STATUS_OK) { AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( - "APM handleDeviceConfigChange failed for A2DP device addr=" - + address + " codec=" + a2dpCodec).printLog(TAG)); + "APM handleDeviceConfigChange failed for A2DP device addr=" + address + + " codec=" + AudioSystem.audioFormatToString(a2dpCodec)) + .printLog(TAG)); int musicDevice = mDeviceBroker.getDeviceForStream(AudioSystem.STREAM_MUSIC); // force A2DP device disconnection in case of error so that AudioService state is @@ -488,8 +490,9 @@ public class AudioDeviceInventory { -1 /* a2dpVolume */); } else { AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( - "APM handleDeviceConfigChange success for A2DP device addr=" - + address + " codec=" + a2dpCodec).printLog(TAG)); + "APM handleDeviceConfigChange success for A2DP device addr=" + address + + " codec=" + AudioSystem.audioFormatToString(a2dpCodec)) + .printLog(TAG)); } } mmi.record(); @@ -816,20 +819,17 @@ public class AudioDeviceInventory { if (AudioService.DEBUG_DEVICES) { Log.i(TAG, "setBluetoothA2dpDeviceConnectionState device: " + device - + " state: " + state + " delay(ms): " + delay + "codec:" + a2dpCodec + + " state: " + state + " delay(ms): " + delay + + " codec:" + Integer.toHexString(a2dpCodec) + " suppressNoisyIntent: " + suppressNoisyIntent); } final BtHelper.BluetoothA2dpDeviceInfo a2dpDeviceInfo = new BtHelper.BluetoothA2dpDeviceInfo(device, a2dpVolume, a2dpCodec); if (profile == BluetoothProfile.A2DP) { - if (delay == 0) { - onSetA2dpSinkConnectionState(a2dpDeviceInfo, state); - } else { - mDeviceBroker.postA2dpSinkConnection(state, + mDeviceBroker.postA2dpSinkConnection(state, a2dpDeviceInfo, delay); - } } else { //profile == BluetoothProfile.A2DP_SINK mDeviceBroker.postA2dpSourceConnection(state, a2dpDeviceInfo, @@ -1118,7 +1118,7 @@ public class AudioDeviceInventory { && AudioSystem.isSingleAudioDeviceType(devices, device) && !mDeviceBroker.hasMediaDynamicPolicy() && (musicDevice != AudioSystem.DEVICE_OUT_REMOTE_SUBMIX)) { - if (!AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0 /*not looking in past*/) + if (!mAudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0 /*not looking in past*/) && !mDeviceBroker.hasAudioFocusUsers()) { // no media playback, not a "becoming noisy" situation, otherwise it could cause // the pausing of some apps that are playing remotely diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java index 40c13904fbc9..e60243fc481c 100644 --- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java +++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java @@ -19,7 +19,6 @@ package com.android.server.audio; import android.annotation.NonNull; import android.media.AudioDeviceAttributes; import android.media.AudioSystem; -import android.util.Log; /** * Provides an adapter to access functionality of the android.media.AudioSystem class for device @@ -39,15 +38,6 @@ public class AudioSystemAdapter { } /** - * Create an adapter for AudioSystem that always succeeds, and does nothing. - * Overridden methods can be configured - * @return a no-op AudioSystem adapter with configurable adapter - */ - static final @NonNull AudioSystemAdapter getConfigurableAdapter() { - return new AudioSystemConfigurableAdapter(); - } - - /** * Same as {@link AudioSystem#setDeviceConnectionState(int, int, String, String, int)} * @param device * @param state @@ -143,75 +133,10 @@ public class AudioSystemAdapter { return AudioSystem.setCurrentImeUid(uid); } - //-------------------------------------------------------------------- - protected static class AudioSystemConfigurableAdapter extends AudioSystemAdapter { - private static final String TAG = "ASA"; - private boolean mIsMicMuted = false; - private boolean mMuteMicrophoneFails = false; - - public void configureIsMicrophoneMuted(boolean muted) { - mIsMicMuted = muted; - } - - public void configureMuteMicrophoneToFail(boolean fail) { - mMuteMicrophoneFails = fail; - } - - //----------------------------------------------------------------- - // Overrides of AudioSystemAdapter - @Override - public int setDeviceConnectionState(int device, int state, String deviceAddress, - String deviceName, int codecFormat) { - Log.i(TAG, String.format("setDeviceConnectionState(0x%s, %s, %s, 0x%s", - Integer.toHexString(device), state, deviceAddress, deviceName, - Integer.toHexString(codecFormat))); - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int getDeviceConnectionState(int device, String deviceAddress) { - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int handleDeviceConfigChange(int device, String deviceAddress, - String deviceName, int codecFormat) { - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int setPreferredDeviceForStrategy(int strategy, - @NonNull AudioDeviceAttributes device) { - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int removePreferredDeviceForStrategy(int strategy) { - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int setParameters(String keyValuePairs) { - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public boolean isMicrophoneMuted() { - return mIsMicMuted; - } - - @Override - public int muteMicrophone(boolean on) { - if (mMuteMicrophoneFails) { - return AudioSystem.AUDIO_STATUS_ERROR; - } - mIsMicMuted = on; - return AudioSystem.AUDIO_STATUS_OK; - } - - @Override - public int setCurrentImeUid(int uid) { - return AudioSystem.AUDIO_STATUS_OK; - } + /** + * Same as {@link AudioSystem#isStreamActive(int, int)} + */ + public boolean isStreamActive(int stream, int inPastMs) { + return AudioSystem.isStreamActive(stream, inPastMs); } } diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java index accb90cc3c0c..0654f86c6a67 100644 --- a/services/core/java/com/android/server/audio/BtHelper.java +++ b/services/core/java/com/android/server/audio/BtHelper.java @@ -135,7 +135,7 @@ public class BtHelper { /*package*/ static class BluetoothA2dpDeviceInfo { private final @NonNull BluetoothDevice mBtDevice; private final int mVolume; - private final int mCodec; + private final @AudioSystem.AudioFormatNativeEnumForBtCodec int mCodec; BluetoothA2dpDeviceInfo(@NonNull BluetoothDevice btDevice) { this(btDevice, -1, AudioSystem.AUDIO_FORMAT_DEFAULT); @@ -155,15 +155,26 @@ public class BtHelper { return mVolume; } - public int getCodec() { + public @AudioSystem.AudioFormatNativeEnumForBtCodec int getCodec() { return mCodec; } // redefine equality op so we can match messages intended for this device @Override public boolean equals(Object o) { - return mBtDevice.equals(o); + if (o == null) { + return false; + } + if (this == o) { + return true; + } + if (o instanceof BluetoothA2dpDeviceInfo) { + return mBtDevice.equals(((BluetoothA2dpDeviceInfo) o).getBtDevice()); + } + return false; } + + } // A2DP device events @@ -249,7 +260,8 @@ public class BtHelper { mA2dp.setAvrcpAbsoluteVolume(index); } - /*package*/ synchronized int getA2dpCodec(@NonNull BluetoothDevice device) { + /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec int getA2dpCodec( + @NonNull BluetoothDevice device) { if (mA2dp == null) { return AudioSystem.AUDIO_FORMAT_DEFAULT; } @@ -261,7 +273,7 @@ public class BtHelper { if (btCodecConfig == null) { return AudioSystem.AUDIO_FORMAT_DEFAULT; } - return mapBluetoothCodecToAudioFormat(btCodecConfig.getCodecType()); + return AudioSystem.bluetoothCodecToAudioFormat(btCodecConfig.getCodecType()); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @@ -967,23 +979,6 @@ public class BtHelper { return result; } - private int mapBluetoothCodecToAudioFormat(int btCodecType) { - switch (btCodecType) { - case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC: - return AudioSystem.AUDIO_FORMAT_SBC; - case BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC: - return AudioSystem.AUDIO_FORMAT_AAC; - case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX: - return AudioSystem.AUDIO_FORMAT_APTX; - case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD: - return AudioSystem.AUDIO_FORMAT_APTX_HD; - case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC: - return AudioSystem.AUDIO_FORMAT_LDAC; - default: - return AudioSystem.AUDIO_FORMAT_DEFAULT; - } - } - /** * Returns the String equivalent of the btCodecType. * diff --git a/services/core/java/com/android/server/audio/SystemServerAdapter.java b/services/core/java/com/android/server/audio/SystemServerAdapter.java index 509f6be76f17..68893f8ca6c7 100644 --- a/services/core/java/com/android/server/audio/SystemServerAdapter.java +++ b/services/core/java/com/android/server/audio/SystemServerAdapter.java @@ -21,8 +21,11 @@ import android.annotation.Nullable; import android.content.Context; import android.content.Intent; import android.media.AudioManager; +import android.os.Binder; import android.os.UserHandle; +import java.util.Objects; + /** * Provides an adapter to access functionality reserved to components running in system_server * Functionality such as sending privileged broadcasts is to be accessed through the default @@ -32,7 +35,7 @@ public class SystemServerAdapter { protected final Context mContext; - private SystemServerAdapter(@Nullable Context context) { + protected SystemServerAdapter(@Nullable Context context) { mContext = context; } /** @@ -40,19 +43,11 @@ public class SystemServerAdapter { * @return the adapter */ static final @NonNull SystemServerAdapter getDefaultAdapter(Context context) { + Objects.requireNonNull(context); return new SystemServerAdapter(context); } /** - * Create an adapter that does nothing. - * Use for running non-privileged tests, such as unit tests - * @return a no-op adapter - */ - static final @NonNull SystemServerAdapter getNoOpAdapter() { - return new NoOpSystemServerAdapter(); - } - - /** * @return true if this is supposed to be run in system_server, false otherwise (e.g. for a * unit test) */ @@ -70,21 +65,21 @@ public class SystemServerAdapter { UserHandle.ALL); } - //-------------------------------------------------------------------- - protected static class NoOpSystemServerAdapter extends SystemServerAdapter { - - NoOpSystemServerAdapter() { - super(null); - } - - @Override - public boolean isPrivileged() { - return false; + /** + * Broadcast ACTION_AUDIO_BECOMING_NOISY + */ + public void sendDeviceBecomingNoisyIntent() { + if (mContext == null) { + return; } - - @Override - public void sendMicrophoneMuteChangedIntent() { - // no-op + final Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + final long ident = Binder.clearCallingIdentity(); + try { + mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + } finally { + Binder.restoreCallingIdentity(ident); } } } diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java index ad08663a7d76..87fe785ca614 100644 --- a/services/core/java/com/android/server/incident/IncidentCompanionService.java +++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java @@ -50,9 +50,6 @@ import java.util.List; */ public class IncidentCompanionService extends SystemService { static final String TAG = "IncidentCompanionService"; - // TODO(b/152289743): Expose below intent. - private static final String INTENT_CHECK_USER_CONSENT = - "com.android.internal.intent.action.CHECK_USER_CONSENT"; /** * Dump argument for proxying restricted image dumps to the services @@ -92,12 +89,6 @@ public class IncidentCompanionService extends SystemService { final long ident = Binder.clearCallingIdentity(); try { - Intent intent = new Intent(INTENT_CHECK_USER_CONSENT); - intent.setPackage(callingPackage); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); - getContext().sendBroadcast(intent, android.Manifest.permission.DUMP); - mPendingReports.authorizeReport(callingUid, callingPackage, receiverClass, reportId, flags, listener); } finally { diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java index 3c6e8d29cae0..8888108100e1 100644 --- a/services/core/java/com/android/server/lights/LightsService.java +++ b/services/core/java/com/android/server/lights/LightsService.java @@ -25,6 +25,7 @@ import android.hardware.light.ILights; import android.hardware.lights.ILightsManager; import android.hardware.lights.Light; import android.hardware.lights.LightState; +import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -37,16 +38,17 @@ import android.util.Slog; import android.util.SparseArray; import android.view.SurfaceControl; +import com.android.internal.BrightnessSynchronizer; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; -import com.android.internal.BrightnessSynchronizer; import com.android.server.SystemService; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Supplier; public class LightsService extends SystemService { static final String TAG = "LightsService"; @@ -55,7 +57,8 @@ public class LightsService extends SystemService { private final LightImpl[] mLightsByType = new LightImpl[LightsManager.LIGHT_ID_COUNT]; private final SparseArray<LightImpl> mLightsById = new SparseArray<>(); - private ILights mVintfLights = null; + @Nullable + private final Supplier<ILights> mVintfLights; @VisibleForTesting final LightsManagerBinderService mManagerService; @@ -391,7 +394,7 @@ public class LightsService extends SystemService { lightState.flashOnMs = onMS; lightState.flashOffMs = offMS; lightState.brightnessMode = (byte) brightnessMode; - mVintfLights.setLightState(mHwLight.id, lightState); + mVintfLights.get().setLightState(mHwLight.id, lightState); } else { setLight_native(mHwLight.id, color, mode, onMS, offMS, brightnessMode); } @@ -435,19 +438,17 @@ public class LightsService extends SystemService { } public LightsService(Context context) { - this(context, - ILights.Stub.asInterface( - ServiceManager.getService("android.hardware.light.ILights/default")), - Looper.myLooper()); + this(context, new VintfHalCache(), Looper.myLooper()); } @VisibleForTesting - LightsService(Context context, ILights service, Looper looper) { + LightsService(Context context, Supplier<ILights> service, Looper looper) { super(context); mH = new Handler(looper); - mVintfLights = service; - mManagerService = new LightsManagerBinderService(); + mVintfLights = service.get() != null ? service : null; + populateAvailableLights(context); + mManagerService = new LightsManagerBinderService(); } private void populateAvailableLights(Context context) { @@ -467,7 +468,7 @@ public class LightsService extends SystemService { private void populateAvailableLightsFromAidl(Context context) { try { - for (HwLight hwLight : mVintfLights.getLights()) { + for (HwLight hwLight : mVintfLights.get().getLights()) { mLightsById.put(hwLight.id, new LightImpl(context, hwLight)); } } catch (RemoteException ex) { @@ -514,6 +515,33 @@ public class LightsService extends SystemService { } }; + private static class VintfHalCache implements Supplier<ILights>, IBinder.DeathRecipient { + @GuardedBy("this") + private ILights mInstance = null; + + @Override + public synchronized ILights get() { + if (mInstance == null) { + IBinder binder = Binder.allowBlocking(ServiceManager.waitForDeclaredService( + "android.hardware.light.ILights/default")); + if (binder != null) { + mInstance = ILights.Stub.asInterface(binder); + try { + binder.linkToDeath(this, 0); + } catch (RemoteException e) { + Slog.e(TAG, "Unable to register DeathRecipient for " + mInstance); + } + } + } + return mInstance; + } + + @Override + public synchronized void binderDied() { + mInstance = null; + } + } + static native void setLight_native(int light, int color, int mode, int onMS, int offMS, int brightnessMode); } diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java index 0b9697840a1f..3a29622556cc 100644 --- a/services/core/java/com/android/server/media/MediaKeyDispatcher.java +++ b/services/core/java/com/android/server/media/MediaKeyDispatcher.java @@ -33,29 +33,28 @@ import java.util.Map; /** * Provides a way to customize behavior for media key events. * <p> - * In order to override the implementation of the single/double/triple click or long press, + * In order to override the implementation of the single/double/triple tap or long press, * {@link #setOverriddenKeyEvents(int, int)} should be called for each key code with the * overridden {@link KeyEventType} bit value set, and the corresponding method, - * {@link #onSingleClick(KeyEvent)}, {@link #onDoubleClick(KeyEvent)}, - * {@link #onTripleClick(KeyEvent)}, {@link #onLongPress(KeyEvent)} should be implemented. + * {@link #onSingleTap(KeyEvent)}, {@link #onDoubleTap(KeyEvent)}, + * {@link #onTripleTap(KeyEvent)}, {@link #onLongPress(KeyEvent)} should be implemented. * <p> * Note: When instantiating this class, {@link MediaSessionService} will only use the constructor * without any parameters. */ -// TODO: Change API names from using "click" to "tap" // TODO: Move this class to apex/media/ public abstract class MediaKeyDispatcher { @IntDef(flag = true, value = { - KEY_EVENT_SINGLE_CLICK, - KEY_EVENT_DOUBLE_CLICK, - KEY_EVENT_TRIPLE_CLICK, + KEY_EVENT_SINGLE_TAP, + KEY_EVENT_DOUBLE_TAP, + KEY_EVENT_TRIPLE_TAP, KEY_EVENT_LONG_PRESS }) @Retention(RetentionPolicy.SOURCE) @interface KeyEventType {} - static final int KEY_EVENT_SINGLE_CLICK = 1 << 0; - static final int KEY_EVENT_DOUBLE_CLICK = 1 << 1; - static final int KEY_EVENT_TRIPLE_CLICK = 1 << 2; + static final int KEY_EVENT_SINGLE_TAP = 1 << 0; + static final int KEY_EVENT_DOUBLE_TAP = 1 << 1; + static final int KEY_EVENT_TRIPLE_TAP = 1 << 2; static final int KEY_EVENT_LONG_PRESS = 1 << 3; private Map<Integer, Integer> mOverriddenKeyEvents; @@ -110,16 +109,16 @@ public abstract class MediaKeyDispatcher { return mOverriddenKeyEvents; } - static boolean isSingleClickOverridden(@KeyEventType int overriddenKeyEvents) { - return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_SINGLE_CLICK) != 0; + static boolean isSingleTapOverridden(@KeyEventType int overriddenKeyEvents) { + return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_SINGLE_TAP) != 0; } - static boolean isDoubleClickOverridden(@KeyEventType int overriddenKeyEvents) { - return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_DOUBLE_CLICK) != 0; + static boolean isDoubleTapOverridden(@KeyEventType int overriddenKeyEvents) { + return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_DOUBLE_TAP) != 0; } - static boolean isTripleClickOverridden(@KeyEventType int overriddenKeyEvents) { - return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_TRIPLE_CLICK) != 0; + static boolean isTripleTapOverridden(@KeyEventType int overriddenKeyEvents) { + return (overriddenKeyEvents & MediaKeyDispatcher.KEY_EVENT_TRIPLE_TAP) != 0; } static boolean isLongPressOverridden(@KeyEventType int overriddenKeyEvents) { @@ -150,11 +149,11 @@ public abstract class MediaKeyDispatcher { } /** - * Customized implementation for single click event. Will be run if - * {@link #KEY_EVENT_SINGLE_CLICK} flag is on for the corresponding key code from + * Customized implementation for single tap event. Will be run if + * {@link #KEY_EVENT_SINGLE_TAP} flag is on for the corresponding key code from * {@link #getOverriddenKeyEvents()}. * - * It is considered a single click if only one {@link KeyEvent} with the same + * It is considered a single tap if only one {@link KeyEvent} with the same * {@link KeyEvent#getKeyCode()} is dispatched within * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds. Change the * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval. @@ -163,15 +162,15 @@ public abstract class MediaKeyDispatcher { * * @param keyEvent */ - void onSingleClick(KeyEvent keyEvent) { + void onSingleTap(KeyEvent keyEvent) { } /** - * Customized implementation for double click event. Will be run if - * {@link #KEY_EVENT_DOUBLE_CLICK} flag is on for the corresponding key code from + * Customized implementation for double tap event. Will be run if + * {@link #KEY_EVENT_DOUBLE_TAP} flag is on for the corresponding key code from * {@link #getOverriddenKeyEvents()}. * - * It is considered a double click if two {@link KeyEvent}s with the same + * It is considered a double tap if two {@link KeyEvent}s with the same * {@link KeyEvent#getKeyCode()} are dispatched within * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds of each other. Change the * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval. @@ -180,15 +179,15 @@ public abstract class MediaKeyDispatcher { * * @param keyEvent */ - void onDoubleClick(KeyEvent keyEvent) { + void onDoubleTap(KeyEvent keyEvent) { } /** - * Customized implementation for triple click event. Will be run if - * {@link #KEY_EVENT_TRIPLE_CLICK} flag is on for the corresponding key code from + * Customized implementation for triple tap event. Will be run if + * {@link #KEY_EVENT_TRIPLE_TAP} flag is on for the corresponding key code from * {@link #getOverriddenKeyEvents()}. * - * It is considered a triple click if three {@link KeyEvent}s with the same + * It is considered a triple tap if three {@link KeyEvent}s with the same * {@link KeyEvent#getKeyCode()} are dispatched within * {@link ViewConfiguration#getMultiPressTimeout()} milliseconds of each other. Change the * {@link android.provider.Settings.Secure#MULTI_PRESS_TIMEOUT} value to adjust the interval. @@ -197,7 +196,7 @@ public abstract class MediaKeyDispatcher { * * @param keyEvent */ - void onTripleClick(KeyEvent keyEvent) { + void onTripleTap(KeyEvent keyEvent) { } /** diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 476c9f879ca2..bc0e8166fb42 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -18,6 +18,12 @@ package com.android.server.media; import static android.os.UserHandle.USER_ALL; +import static com.android.server.media.MediaKeyDispatcher.KEY_EVENT_LONG_PRESS; +import static com.android.server.media.MediaKeyDispatcher.isDoubleTapOverridden; +import static com.android.server.media.MediaKeyDispatcher.isLongPressOverridden; +import static com.android.server.media.MediaKeyDispatcher.isSingleTapOverridden; +import static com.android.server.media.MediaKeyDispatcher.isTripleTapOverridden; + import android.app.ActivityManager; import android.app.INotificationManager; import android.app.KeyguardManager; @@ -105,7 +111,7 @@ public class MediaSessionService extends SystemService implements Monitor { private static final int SESSION_CREATION_LIMIT_PER_UID = 100; private static final int LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout() + /* Buffer for delayed delivery of key event */ 50; - private static final int MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); + private static final int MULTI_TAP_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); private final Context mContext; private final SessionManagerImpl mSessionManagerImpl; @@ -1101,9 +1107,12 @@ public class MediaSessionService extends SystemService implements Monitor { "android.media.AudioService.WAKELOCK_ACQUIRED"; private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number - private KeyEvent mPendingFirstDownKeyEvent = null; + private KeyEvent mTrackingFirstDownKeyEvent = null; private boolean mIsLongPressing = false; private Runnable mLongPressTimeoutRunnable = null; + private int mMultiTapCount = 0; + private int mMultiTapKeyCode = 0; + private Runnable mMultiTapTimeoutRunnable = null; @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, @@ -2117,10 +2126,12 @@ public class MediaSessionService extends SystemService implements Monitor { } // A long press is determined by: - // 1) A KeyEvent with KeyEvent.ACTION_DOWN and repeat count of 0, followed by - // 2) A KeyEvent with KeyEvent.ACTION_DOWN and repeat count of 1 and FLAG_LONG_PRESS within - // ViewConfiguration.getLongPressTimeout(). - // TODO: Add description about what a click is determined by. + // 1) A KeyEvent.ACTION_DOWN KeyEvent and repeat count of 0, followed by + // 2) A KeyEvent.ACTION_DOWN KeyEvent with the same key code, a repeat count of 1, and + // FLAG_LONG_PRESS received within ViewConfiguration.getLongPressTimeout(). + // A tap is determined by: + // 1) A KeyEvent.ACTION_DOWN KeyEvent followed by + // 2) A KeyEvent.ACTION_UP KeyEvent with the same key code. private void handleKeyEventLocked(String packageName, int pid, int uid, boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) { if (keyEvent.isCanceled()) { @@ -2129,61 +2140,121 @@ public class MediaSessionService extends SystemService implements Monitor { int overriddenKeyEvents = (mCustomMediaKeyDispatcher == null) ? 0 : mCustomMediaKeyDispatcher.getOverriddenKeyEvents().get(keyEvent.getKeyCode()); - cancelPendingIfNeeded(keyEvent); - if (!needPending(keyEvent, overriddenKeyEvents)) { + cancelTrackingIfNeeded(packageName, pid, uid, asSystemService, keyEvent, needWakeLock, + overriddenKeyEvents); + if (!needTracking(keyEvent, overriddenKeyEvents)) { dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService, keyEvent, needWakeLock); return; } if (isFirstDownKeyEvent(keyEvent)) { - mPendingFirstDownKeyEvent = keyEvent; + mTrackingFirstDownKeyEvent = keyEvent; mIsLongPressing = false; return; } + // Long press is always overridden here, otherwise the key event would have been already + // handled if (isFirstLongPressKeyEvent(keyEvent)) { mIsLongPressing = true; } if (mIsLongPressing) { handleLongPressLocked(keyEvent, needWakeLock, overriddenKeyEvents); - } else if (keyEvent.getAction() == KeyEvent.ACTION_UP) { - mPendingFirstDownKeyEvent = null; - // TODO: Replace this with code to determine whether - // single/double/triple click and run custom implementations, - // if they exist. - dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService, - keyEvent, needWakeLock); + return; + } + + if (keyEvent.getAction() == KeyEvent.ACTION_UP) { + mTrackingFirstDownKeyEvent = null; + if (shouldTrackForMultipleTapsLocked(overriddenKeyEvents)) { + if (mMultiTapCount == 0) { + mMultiTapTimeoutRunnable = createSingleTapRunnable(packageName, pid, uid, + asSystemService, keyEvent, needWakeLock, + isSingleTapOverridden(overriddenKeyEvents)); + if (isSingleTapOverridden(overriddenKeyEvents) + && !isDoubleTapOverridden(overriddenKeyEvents) + && !isTripleTapOverridden(overriddenKeyEvents)) { + mMultiTapTimeoutRunnable.run(); + } else { + mHandler.postDelayed(mMultiTapTimeoutRunnable, + MULTI_TAP_TIMEOUT); + mMultiTapCount = 1; + mMultiTapKeyCode = keyEvent.getKeyCode(); + } + } else if (mMultiTapCount == 1) { + mHandler.removeCallbacks(mMultiTapTimeoutRunnable); + mMultiTapTimeoutRunnable = createDoubleTapRunnable(packageName, pid, uid, + asSystemService, keyEvent, needWakeLock, + isSingleTapOverridden(overriddenKeyEvents), + isDoubleTapOverridden(overriddenKeyEvents)); + if (isTripleTapOverridden(overriddenKeyEvents)) { + mHandler.postDelayed(mMultiTapTimeoutRunnable, MULTI_TAP_TIMEOUT); + mMultiTapCount = 2; + } else { + mMultiTapTimeoutRunnable.run(); + } + } else if (mMultiTapCount == 2) { + mHandler.removeCallbacks(mMultiTapTimeoutRunnable); + onTripleTap(keyEvent); + } + } else { + dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService, + keyEvent, needWakeLock); + } } } - private void cancelPendingIfNeeded(KeyEvent keyEvent) { - if (mPendingFirstDownKeyEvent == null) { + private boolean shouldTrackForMultipleTapsLocked(int overriddenKeyEvents) { + return isSingleTapOverridden(overriddenKeyEvents) + || isDoubleTapOverridden(overriddenKeyEvents) + || isTripleTapOverridden(overriddenKeyEvents); + } + + private void cancelTrackingIfNeeded(String packageName, int pid, int uid, + boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock, + int overriddenKeyEvents) { + if (mTrackingFirstDownKeyEvent == null && mMultiTapTimeoutRunnable == null) { return; } + if (isFirstDownKeyEvent(keyEvent)) { if (mLongPressTimeoutRunnable != null) { mHandler.removeCallbacks(mLongPressTimeoutRunnable); mLongPressTimeoutRunnable.run(); - } else { - resetLongPressTracking(); } + if (mMultiTapTimeoutRunnable != null && keyEvent.getKeyCode() != mMultiTapKeyCode) { + runExistingMultiTapRunnableLocked(); + } + resetLongPressTracking(); return; } - if (mPendingFirstDownKeyEvent.getDownTime() == keyEvent.getDownTime() - && mPendingFirstDownKeyEvent.getKeyCode() == keyEvent.getKeyCode() - && keyEvent.getAction() == KeyEvent.ACTION_DOWN - && keyEvent.getRepeatCount() > 1 && !mIsLongPressing) { - resetLongPressTracking(); + + if (mTrackingFirstDownKeyEvent != null + && mTrackingFirstDownKeyEvent.getDownTime() == keyEvent.getDownTime() + && mTrackingFirstDownKeyEvent.getKeyCode() == keyEvent.getKeyCode() + && keyEvent.getAction() == KeyEvent.ACTION_DOWN) { + if (isFirstLongPressKeyEvent(keyEvent)) { + if (mMultiTapTimeoutRunnable != null) { + runExistingMultiTapRunnableLocked(); + } + if ((overriddenKeyEvents & KEY_EVENT_LONG_PRESS) == 0 + && !isVoiceKey(keyEvent.getKeyCode())) { + dispatchMediaKeyEventLocked(packageName, pid, uid, asSystemService, + mTrackingFirstDownKeyEvent, needWakeLock); + mTrackingFirstDownKeyEvent = null; + } + } else if (keyEvent.getRepeatCount() > 1 && !mIsLongPressing) { + resetLongPressTracking(); + } } } - private boolean needPending(KeyEvent keyEvent, int overriddenKeyEvents) { + private boolean needTracking(KeyEvent keyEvent, int overriddenKeyEvents) { if (!isFirstDownKeyEvent(keyEvent)) { - if (mPendingFirstDownKeyEvent == null) { + if (mTrackingFirstDownKeyEvent == null) { return false; - } else if (mPendingFirstDownKeyEvent.getDownTime() != keyEvent.getDownTime() - || mPendingFirstDownKeyEvent.getKeyCode() != keyEvent.getKeyCode()) { + } else if (mTrackingFirstDownKeyEvent.getDownTime() != keyEvent.getDownTime() + || mTrackingFirstDownKeyEvent.getKeyCode() != keyEvent.getKeyCode()) { return false; } } @@ -2193,10 +2264,21 @@ public class MediaSessionService extends SystemService implements Monitor { return true; } + private void runExistingMultiTapRunnableLocked() { + mHandler.removeCallbacks(mMultiTapTimeoutRunnable); + mMultiTapTimeoutRunnable.run(); + } + + private void resetMultiTapTrackingLocked() { + mMultiTapCount = 0; + mMultiTapTimeoutRunnable = null; + mMultiTapKeyCode = 0; + } + private void handleLongPressLocked(KeyEvent keyEvent, boolean needWakeLock, int overriddenKeyEvents) { if (mCustomMediaKeyDispatcher != null - && mCustomMediaKeyDispatcher.isLongPressOverridden(overriddenKeyEvents)) { + && isLongPressOverridden(overriddenKeyEvents)) { mCustomMediaKeyDispatcher.onLongPress(keyEvent); if (mLongPressTimeoutRunnable != null) { @@ -2230,7 +2312,7 @@ public class MediaSessionService extends SystemService implements Monitor { } private void resetLongPressTracking() { - mPendingFirstDownKeyEvent = null; + mTrackingFirstDownKeyEvent = null; mIsLongPressing = false; mLongPressTimeoutRunnable = null; } @@ -2259,6 +2341,50 @@ public class MediaSessionService extends SystemService implements Monitor { keyEvent, needWakeLock); } + Runnable createSingleTapRunnable(String packageName, int pid, int uid, + boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock, + boolean overridden) { + return new Runnable() { + @Override + public void run() { + resetMultiTapTrackingLocked(); + if (overridden) { + mCustomMediaKeyDispatcher.onSingleTap(keyEvent); + } else { + dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService, + keyEvent, needWakeLock); + } + } + }; + }; + + Runnable createDoubleTapRunnable(String packageName, int pid, int uid, + boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock, + boolean singleTapOverridden, boolean doubleTapOverridden) { + return new Runnable() { + @Override + public void run() { + resetMultiTapTrackingLocked(); + if (doubleTapOverridden) { + mCustomMediaKeyDispatcher.onDoubleTap(keyEvent); + } else if (singleTapOverridden) { + mCustomMediaKeyDispatcher.onSingleTap(keyEvent); + mCustomMediaKeyDispatcher.onSingleTap(keyEvent); + } else { + dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService, + keyEvent, needWakeLock); + dispatchDownAndUpKeyEventsLocked(packageName, pid, uid, asSystemService, + keyEvent, needWakeLock); + } + } + }; + }; + + private void onTripleTap(KeyEvent keyEvent) { + resetMultiTapTrackingLocked(); + mCustomMediaKeyDispatcher.onTripleTap(keyEvent); + } + private void dispatchMediaKeyEventLocked(String packageName, int pid, int uid, boolean asSystemService, KeyEvent keyEvent, boolean needWakeLock) { if (mCurrentFullUserRecord.getMediaButtonSessionLocked() diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 341e974bc82d..6c3177fe253a 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5692,6 +5692,9 @@ public class NotificationManagerService extends SystemService { ShortcutInfo info = mShortcutHelper != null ? mShortcutHelper.getValidShortcutInfo(notification.getShortcutId(), pkg, user) : null; + if (notification.getShortcutId() != null && info == null) { + Slog.w(TAG, "notification " + r.getKey() + " added an invalid shortcut"); + } r.setShortcutInfo(info); if (!checkDisqualifyingFeatures(userId, notificationUid, id, tag, r, diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java index fce488da87d5..47fcc0872029 100644 --- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java +++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java @@ -297,6 +297,12 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub { } @Override + public void onUiIntensiveBugreportDumpsFinished(String callingPackage) + throws RemoteException { + mListener.onUiIntensiveBugreportDumpsFinished(callingPackage); + } + + @Override public void binderDied() { synchronized (mLock) { if (!mDone) { diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index daf4bf271ca2..1c41c2eb4702 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -35,6 +35,7 @@ import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.os.Binder; import android.os.Environment; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.Trace; import android.sysprop.ApexProperties; import android.util.ArrayMap; @@ -398,13 +399,9 @@ public abstract class ApexManager { */ @VisibleForTesting protected IApexService waitForApexService() { - try { - // Since apexd is a trusted platform component, synchronized calls are allowable - return IApexService.Stub.asInterface( - Binder.allowBlocking(Binder.waitForService("apexservice"))); - } catch (RemoteException e) { - throw new IllegalStateException("Required service apexservice not available"); - } + // Since apexd is a trusted platform component, synchronized calls are allowable + return IApexService.Stub.asInterface( + Binder.allowBlocking(ServiceManager.waitForService("apexservice"))); } @Override diff --git a/services/core/java/com/android/server/pm/DataLoaderManagerService.java b/services/core/java/com/android/server/pm/DataLoaderManagerService.java index dec3f1a86e01..81ee7d9eeef7 100644 --- a/services/core/java/com/android/server/pm/DataLoaderManagerService.java +++ b/services/core/java/com/android/server/pm/DataLoaderManagerService.java @@ -190,13 +190,10 @@ public class DataLoaderManagerService extends SystemService { onNullBinding(className); return; } - synchronized (mServiceConnections) { - if (mServiceConnections.get(mId) != null) { - // Another connection already bound for this ID. - mContext.unbindService(this); - return; - } - mServiceConnections.append(mId, this); + if (!append()) { + // Another connection already bound for this ID. + mContext.unbindService(this); + return; } callListener(IDataLoaderStatusListener.DATA_LOADER_BOUND); } @@ -234,13 +231,33 @@ public class DataLoaderManagerService extends SystemService { } mDataLoader = null; } - mContext.unbindService(this); + try { + mContext.unbindService(this); + } catch (Exception ignored) { + } remove(); } + private boolean append() { + synchronized (mServiceConnections) { + DataLoaderServiceConnection bound = mServiceConnections.get(mId); + if (bound == this) { + return true; + } + if (bound != null) { + // Another connection already bound for this ID. + return false; + } + mServiceConnections.append(mId, this); + return true; + } + } + private void remove() { synchronized (mServiceConnections) { - mServiceConnections.remove(mId); + if (mServiceConnections.get(mId) == this) { + mServiceConnections.remove(mId); + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 28987ed8e7b3..8b191dda5590 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2376,7 +2376,7 @@ public class PackageManagerService extends IPackageManager.Stub for (String packageName : packages) { PackageSetting setting = mSettings.mPackages.get(packageName); if (setting != null - && shouldFilterApplicationLocked(setting, callingUid, callingUserId)) { + && !shouldFilterApplicationLocked(setting, callingUid, callingUserId)) { notifyInstallObserver(packageName); } } @@ -21007,11 +21007,15 @@ public class PackageManagerService extends IPackageManager.Stub false /* requireFullPermission */, false /* checkShell */, "get enabled"); // reader synchronized (mLock) { - if (shouldFilterApplicationLocked( - mSettings.getPackageLPr(packageName), callingUid, userId)) { - return COMPONENT_ENABLED_STATE_DISABLED; + try { + if (shouldFilterApplicationLocked( + mSettings.getPackageLPr(packageName), callingUid, userId)) { + throw new PackageManager.NameNotFoundException(packageName); + } + return mSettings.getApplicationEnabledSettingLPr(packageName, userId); + } catch (PackageManager.NameNotFoundException e) { + throw new IllegalArgumentException("Unknown package: " + packageName); } - return mSettings.getApplicationEnabledSettingLPr(packageName, userId); } } @@ -21023,12 +21027,16 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "getComponentEnabled"); synchronized (mLock) { - if (shouldFilterApplicationLocked( - mSettings.getPackageLPr(component.getPackageName()), callingUid, - component, TYPE_UNKNOWN, userId)) { - return COMPONENT_ENABLED_STATE_DISABLED; + try { + if (shouldFilterApplicationLocked( + mSettings.getPackageLPr(component.getPackageName()), callingUid, + component, TYPE_UNKNOWN, userId)) { + throw new PackageManager.NameNotFoundException(component.getPackageName()); + } + return mSettings.getComponentEnabledSettingLPr(component, userId); + } catch (PackageManager.NameNotFoundException e) { + throw new IllegalArgumentException("Unknown component: " + component); } - return mSettings.getComponentEnabledSettingLPr(component, userId); } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index ddeab29c5b78..7158af6d5310 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4363,19 +4363,21 @@ public final class Settings { return pkg.installSource.isOrphaned; } - int getApplicationEnabledSettingLPr(String packageName, int userId) { + int getApplicationEnabledSettingLPr(String packageName, int userId) + throws PackageManager.NameNotFoundException { final PackageSetting pkg = mPackages.get(packageName); if (pkg == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); + throw new PackageManager.NameNotFoundException(packageName); } return pkg.getEnabled(userId); } - int getComponentEnabledSettingLPr(ComponentName componentName, int userId) { + int getComponentEnabledSettingLPr(ComponentName componentName, int userId) + throws PackageManager.NameNotFoundException { final String packageName = componentName.getPackageName(); final PackageSetting pkg = mPackages.get(packageName); if (pkg == null) { - throw new IllegalArgumentException("Unknown component: " + componentName); + throw new PackageManager.NameNotFoundException(componentName.getPackageName()); } final String classNameStr = componentName.getClassName(); return pkg.getCurrentEnabledStateLPr(classNameStr, userId); diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING index 9e7561026fd7..eb79b6ec652a 100644 --- a/services/core/java/com/android/server/pm/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/TEST_MAPPING @@ -122,6 +122,9 @@ "imports": [ { "path": "frameworks/base/core/java/android/content/pm" + }, + { + "path": "vendor/xts/gts-tests/hostsidetests/stagedinstall" } ] } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 4561d2e7a8b2..e6af86e52035 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3890,9 +3890,8 @@ public class UserManagerService extends IUserManager.Stub { new Thread() { @Override public void run() { - // Clean up any ActivityTaskManager state - LocalServices.getService(ActivityTaskManagerInternal.class) - .onUserStopped(userId); + LocalServices.getService(ActivityManagerInternal.class) + .onUserRemoved(userId); removeUserState(userId); } }.start(); diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index e3faffa0699b..a635f982d37d 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -125,6 +125,7 @@ public final class DefaultPermissionGrantPolicy { static { + PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE); PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE); PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG); PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG); diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 27288d852fb2..6ff1ba7e7dbb 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -16,14 +16,17 @@ package com.android.server.policy; +import static android.Manifest.permission.READ_PHONE_STATE; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.MODE_IGNORED; import static android.app.AppOpsManager.OP_NONE; import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; +import static android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT; import static android.content.pm.PackageManager.GET_PERMISSIONS; +import static android.content.pm.PackageManager.MATCH_ALL; import android.annotation.NonNull; import android.annotation.Nullable; @@ -42,6 +45,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManagerInternal.PackageListObserver; import android.content.pm.PermissionInfo; import android.os.Build; +import android.os.Handler; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; @@ -53,6 +57,7 @@ import android.provider.Telephony; import android.telecom.TelecomManager; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.Log; import android.util.LongSparseLongArray; import android.util.Pair; import android.util.Slog; @@ -318,12 +323,52 @@ public final class PermissionPolicyService extends SystemService { // Force synchronization as permissions might have changed synchronizePermissionsAndAppOpsForUser(userId); + restoreReadPhoneStatePermissions(); + // Tell observers we are initialized for this user. if (callback != null) { callback.onInitialized(userId); } } + /** + * Ensure READ_PHONE_STATE user sensitive flags are assigned properly + * TODO ntmyren: Remove once propagated, and state is repaired + */ + private void restoreReadPhoneStatePermissions() { + PermissionControllerManager manager = new PermissionControllerManager(this.getContext(), + Handler.getMain()); + PackageManager pm = getContext().getPackageManager(); + List<PackageInfo> packageInfos = pm.getInstalledPackages(MATCH_ALL | GET_PERMISSIONS); + for (int i = packageInfos.size() - 1; i >= 0; i--) { + PackageInfo pI = packageInfos.get(i); + if (pI.requestedPermissions == null) { + continue; + } + + boolean hasReadPhoneState = false; + for (int j = pI.requestedPermissions.length - 1; j >= 0; j--) { + if (pI.requestedPermissions[j].equals(READ_PHONE_STATE)) { + hasReadPhoneState = true; + } + } + if (!hasReadPhoneState) { + continue; + } + + Log.i(LOG_TAG, "Updating read phone state for " + pI.packageName + " " + + pI.applicationInfo.uid); + manager.updateUserSensitiveForApp(pI.applicationInfo.uid); + + UserHandle user = UserHandle.getUserHandleForUid(pI.applicationInfo.uid); + int permFlags = pm.getPermissionFlags(READ_PHONE_STATE, pI.packageName, user); + if ((permFlags & FLAG_PERMISSION_AUTO_REVOKED) != 0) { + pm.updatePermissionFlags(READ_PHONE_STATE, pI.packageName, + FLAG_PERMISSION_AUTO_REVOKED, 0, user); + } + } + } + @Override public void onStopUser(@UserIdInt int userId) { if (DEBUG) Slog.i(LOG_TAG, "onStopUser(" + userId + ")"); diff --git a/services/core/java/com/android/server/soundtrigger_middleware/InternalServerError.java b/services/core/java/com/android/server/soundtrigger_middleware/InternalServerError.java deleted file mode 100644 index e1fb2266b7c6..000000000000 --- a/services/core/java/com/android/server/soundtrigger_middleware/InternalServerError.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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. - */ - -package com.android.server.soundtrigger_middleware; - -import android.annotation.NonNull; - -/** - * An internal server error. - * <p> - * This exception wraps any exception thrown from a service implementation, which is a result of a - * bug in the server implementation (or any of its dependencies). - * <p> - * Specifically, this type is excluded from the set of whitelisted exceptions that binder would - * tunnel to the client process, since these exceptions are ambiguous regarding whether the client - * had done something wrong or the server is buggy. For example, a client getting an - * IllegalArgumentException cannot easily determine whether they had provided illegal arguments to - * the method they were calling, or whether the method implementation provided illegal arguments to - * some method it was calling due to a bug. - * - * @hide - */ -public class InternalServerError extends RuntimeException { - public InternalServerError(@NonNull Throwable cause) { - super(cause); - } -} diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java index a18b690f08cd..d98ad74a9d6b 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java @@ -23,6 +23,7 @@ import android.hardware.soundtrigger.V2_3.Properties; import android.hardware.soundtrigger.V2_3.RecognitionConfig; import android.os.IHwBinder; import android.os.RemoteException; +import android.os.SystemProperties; import android.util.Log; import java.util.HashMap; @@ -48,83 +49,130 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { @Override public Properties getProperties() { - return mUnderlying.getProperties(); + try { + return mUnderlying.getProperties(); + } catch (RuntimeException e) { + throw handleException(e); + } } @Override public int loadSoundModel(ISoundTriggerHw.SoundModel soundModel, Callback callback, int cookie) { - int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); - synchronized (mModelStates) { - mModelStates.put(handle, false); + try { + int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), + cookie); + synchronized (mModelStates) { + mModelStates.put(handle, false); + } + return handle; + } catch (RuntimeException e) { + throw handleException(e); } - return handle; } @Override public int loadPhraseSoundModel(ISoundTriggerHw.PhraseSoundModel soundModel, Callback callback, int cookie) { - int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), - cookie); - synchronized (mModelStates) { - mModelStates.put(handle, false); + try { + int handle = mUnderlying.loadPhraseSoundModel(soundModel, + new CallbackEnforcer(callback), + cookie); + synchronized (mModelStates) { + mModelStates.put(handle, false); + } + return handle; + } catch (RuntimeException e) { + throw handleException(e); } - return handle; } @Override public void unloadSoundModel(int modelHandle) { - mUnderlying.unloadSoundModel(modelHandle); - synchronized (mModelStates) { - mModelStates.remove(modelHandle); + try { + mUnderlying.unloadSoundModel(modelHandle); + synchronized (mModelStates) { + mModelStates.remove(modelHandle); + } + } catch (RuntimeException e) { + throw handleException(e); } } @Override public void stopRecognition(int modelHandle) { - mUnderlying.stopRecognition(modelHandle); - synchronized (mModelStates) { - mModelStates.replace(modelHandle, false); + try { + mUnderlying.stopRecognition(modelHandle); + synchronized (mModelStates) { + mModelStates.replace(modelHandle, false); + } + } catch (RuntimeException e) { + throw handleException(e); } } @Override public void stopAllRecognitions() { - mUnderlying.stopAllRecognitions(); - synchronized (mModelStates) { - for (Map.Entry<Integer, Boolean> entry : mModelStates.entrySet()) { - entry.setValue(false); + try { + mUnderlying.stopAllRecognitions(); + synchronized (mModelStates) { + for (Map.Entry<Integer, Boolean> entry : mModelStates.entrySet()) { + entry.setValue(false); + } } + } catch (RuntimeException e) { + throw handleException(e); } } @Override public void startRecognition(int modelHandle, RecognitionConfig config, Callback callback, int cookie) { - mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), cookie); - synchronized (mModelStates) { - mModelStates.replace(modelHandle, true); + try { + mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), + cookie); + synchronized (mModelStates) { + mModelStates.replace(modelHandle, true); + } + } catch (RuntimeException e) { + throw handleException(e); } } @Override public void getModelState(int modelHandle) { - mUnderlying.getModelState(modelHandle); + try { + mUnderlying.getModelState(modelHandle); + } catch (RuntimeException e) { + throw handleException(e); + } } @Override public int getModelParameter(int modelHandle, int param) { - return mUnderlying.getModelParameter(modelHandle, param); + try { + return mUnderlying.getModelParameter(modelHandle, param); + } catch (RuntimeException e) { + throw handleException(e); + } } @Override public void setModelParameter(int modelHandle, int param, int value) { - mUnderlying.setModelParameter(modelHandle, param, value); + try { + mUnderlying.setModelParameter(modelHandle, param, value); + } catch (RuntimeException e) { + throw handleException(e); + } } @Override public ModelParameterRange queryParameter(int modelHandle, int param) { - return mUnderlying.queryParameter(modelHandle, param); + try { + return mUnderlying.queryParameter(modelHandle, param); + } catch (RuntimeException e) { + throw handleException(e); + } } @Override @@ -142,6 +190,17 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { return mUnderlying.interfaceDescriptor(); } + private static RuntimeException handleException(RuntimeException e) { + Log.e(TAG, "Exception caught from HAL, rebooting HAL"); + rebootHal(); + throw e; + } + + private static void rebootHal() { + // This property needs to be defined in an init.rc script and trigger a HAL reboot. + SystemProperties.set("sys.audio.restart.hal", "1"); + } + private class CallbackEnforcer implements Callback { private final Callback mUnderlying; @@ -157,6 +216,8 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { synchronized (mModelStates) { if (!mModelStates.getOrDefault(model, false)) { Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); + rebootHal(); + return; } if (event.header.status != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { @@ -173,6 +234,8 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { synchronized (mModelStates) { if (!mModelStates.getOrDefault(model, false)) { Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); + rebootHal(); + return; } if (event.common.header.status != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java index 635cb613b934..4b464d2d3e04 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java @@ -27,9 +27,7 @@ import android.media.soundtrigger_middleware.PhraseSoundModel; import android.media.soundtrigger_middleware.RecognitionConfig; import android.media.soundtrigger_middleware.SoundModel; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; -import android.os.Parcel; import android.os.RemoteException; -import android.os.SystemProperties; import android.util.Log; import com.android.server.SystemService; @@ -101,28 +99,6 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic } } - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) - throws RemoteException { - try { - return super.onTransact(code, data, reply, flags); - } catch (InternalServerError e) { - if (e.getCause() instanceof HalException) { - // We recover from any sort of HAL failure by rebooting the HAL process. - // This will likely reboot more than just the sound trigger HAL. - // The rest of the system should be able to tolerate that. - rebootHal(); - } - throw e; - } - } - - private static void rebootHal() { - Log.i(TAG, "Rebooting the sound trigger HAL"); - // This property needs to be defined in an init.rc script and trigger a HAL reboot. - SystemProperties.set("sys.audio.restart.hal", "1"); - } - private final static class ModuleService extends ISoundTriggerModule.Stub { private final ISoundTriggerModule mDelegate; @@ -182,22 +158,6 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic public void detach() throws RemoteException { mDelegate.detach(); } - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) - throws RemoteException { - try { - return super.onTransact(code, data, reply, flags); - } catch (InternalServerError e) { - if (e.getCause() instanceof HalException) { - // We recover from any sort of HAL failure by rebooting the HAL process. - // This will likely reboot more than just the sound trigger HAL. - // The rest of the system should be able to tolerate that. - rebootHal(); - } - throw e; - } - } } /** diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java index bae244179346..ec394a224cd7 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java @@ -96,12 +96,12 @@ import java.util.Set; * {@link NullPointerException} or {@link * IllegalStateException}, respectively. All those exceptions are treated specially by Binder and * will get sent back to the client.<br> - * Once this is done, any subsequent fault is considered a server fault. Only {@link - * RecoverableException}s thrown by the implementation are special-cased: they would get sent back - * to the caller as a {@link ServiceSpecificException}, which is the behavior of Binder. Any other - * exception gets wrapped with a {@link InternalServerError}, which is specifically chosen as a type - * that <b>does NOT</b> get forwarded by binder. Those exceptions would be handled by a high-level - * exception handler on the server side, typically resulting in rebooting the server. + * Once this is done, any subsequent fault is considered either a recoverable (expected) or + * unexpected server fault. Those will be delivered to the client as a + * {@link ServiceSpecificException}. {@link RecoverableException}s thrown by the implementation are + * considered recoverable and will include a specific error code to indicate the problem. Any other + * exceptions will use the INTERNAL_ERROR code. They may also cause the module to become invalid + * asynchronously, and the client would be notified via the moduleDied() callback. * * {@hide} */ @@ -159,7 +159,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware } Log.wtf(TAG, "Unexpected exception", e); - throw new InternalServerError(e); + throw new ServiceSpecificException(Status.INTERNAL_ERROR, e.getMessage()); } @Override @@ -273,8 +273,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware throw new ServiceSpecificException(Status.TEMPORARY_PERMISSION_DENIED, String.format("Caller must have the %s permission.", permission)); default: - throw new InternalServerError( - new RuntimeException("Unexpected perimission check result.")); + throw new RuntimeException("Unexpected perimission check result."); } } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 6fd7250b205c..299592d33a11 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -206,6 +206,8 @@ public class StatsPullAtomService extends SystemService { private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXY; private static final String COMMON_PERMISSION_PREFIX = "android.permission."; private static final String APP_OPS_TARGET_COLLECTION_SIZE = "app_ops_target_collection_size"; + private static final String DANGEROUS_PERMISSION_STATE_SAMPLE_RATE = + "dangerous_permission_state_sample_rate"; private final Object mNetworkStatsLock = new Object(); @GuardedBy("mNetworkStatsLock") @@ -2583,6 +2585,8 @@ public class StatsPullAtomService extends SystemService { int pullDangerousPermissionState(int atomTag, List<StatsEvent> pulledData) { final long token = Binder.clearCallingIdentity(); + float samplingRate = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_PERMISSIONS, + DANGEROUS_PERMISSION_STATE_SAMPLE_RATE, 0.02f); Set<Integer> reportedUids = new HashSet<>(); try { PackageManager pm = mContext.getPackageManager(); @@ -2611,7 +2615,7 @@ public class StatsPullAtomService extends SystemService { reportedUids.add(pkg.applicationInfo.uid); if (atomTag == FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED - && ThreadLocalRandom.current().nextFloat() > 0.01f) { + && ThreadLocalRandom.current().nextFloat() > samplingRate) { continue; } diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index b8c2f90cf047..6734ce76675d 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -1126,17 +1126,18 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } } } - if (pi.forceUriPermissions) { - // When provider requires dynamic permission checks, the only - // way to be safe is to issue permission grants for each item by - // assuming no generic access - allowed = false; - } if (allowed) { targetHoldsPermission = true; } } + if (pi.forceUriPermissions) { + // When provider requires dynamic permission checks, the only + // way to be safe is to issue permission grants for each item by + // assuming no generic access + targetHoldsPermission = false; + } + final boolean basicGrant = (modeFlags & ~(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION)) == 0; if (basicGrant && targetHoldsPermission) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index d48df9ff8e6c..4181f4be30f7 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -306,11 +306,9 @@ public abstract class ActivityTaskManagerInternal { public abstract void setAllowAppSwitches(@NonNull String type, int uid, int userId); /** - * Called when a user has been deleted. This can happen during normal device usage - * or just at startup, when partially removed users are purged. Any state persisted by the - * ActivityManager should be purged now. + * Called when a user has been stopped. * - * @param userId The user being cleaned up. + * @param userId The user being stopped. */ public abstract void onUserStopped(int userId); public abstract boolean isGetTasksAllowed(String caller, int callingPid, int callingUid); diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index 537ca08f49fc..5efc9241a494 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -382,8 +382,8 @@ class Dimmer { @Override public void apply(SurfaceControl.Transaction t, SurfaceControl sc, long currentPlayTime) { - float alpha = ((float) currentPlayTime / getDuration()) * (mToAlpha - mFromAlpha) - + mFromAlpha; + final float fraction = getFraction(currentPlayTime); + final float alpha = fraction * (mToAlpha - mFromAlpha) + mFromAlpha; t.setAlpha(sc, alpha); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 8f7fc9e354a0..c41029b20651 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3577,17 +3577,22 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, true); final WindowState visibleNotDrawnWindow = getWindow(w -> { - if (w.mViewVisibility == View.VISIBLE && !w.mObscured && !w.isDrawnLw()) { + boolean isVisible = w.mViewVisibility == View.VISIBLE && !w.mObscured; + boolean hasDrawn = w.isDrawnLw() && w.hasDrawnLw(); + if (isVisible && !hasDrawn) { return true; } - if (w.isDrawnLw()) { - final int type = w.mAttrs.type; - if (type == TYPE_BOOT_PROGRESS || type == TYPE_BASE_APPLICATION - || type == TYPE_WALLPAPER) { - drawnWindowTypes.put(type, true); - } else if (type == TYPE_NOTIFICATION_SHADE) { - drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, - mWmService.mPolicy.isKeyguardDrawnLw()); + if (hasDrawn) { + switch (w.mAttrs.type) { + case TYPE_BOOT_PROGRESS: + case TYPE_BASE_APPLICATION: + case TYPE_WALLPAPER: + drawnWindowTypes.put(w.mAttrs.type, true); + break; + case TYPE_NOTIFICATION_SHADE: + drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, + mWmService.mPolicy.isKeyguardDrawnLw()); + break; } } return false; diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 656dca531a22..1b1898b76506 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -27,7 +27,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.graphics.Rect; @@ -38,7 +37,6 @@ import android.os.Process; import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; -import android.util.Log; import android.util.Slog; import android.view.InputApplicationHandle; import android.view.InputChannel; @@ -138,18 +136,6 @@ final class InputMonitor { // If there's a drag in flight, provide a pseudo-window to catch drag input final boolean inDrag = mService.mDragDropController.dragDropActiveLocked(); - final boolean inPositioning = - mService.mTaskPositioningController.isPositioningLocked(); - if (inPositioning) { - if (DEBUG_TASK_POSITIONING) { - Log.d(TAG_WM, "Inserting window handle for repositioning"); - } - mService.mTaskPositioningController.showInputSurface(mInputTransaction, - mDisplayId); - } else { - mService.mTaskPositioningController.hideInputSurface(mInputTransaction, - mDisplayId); - } // Add all windows on the default display. mUpdateInputForAllWindowsConsumer.updateInputWindows(inDrag); diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index 765f98065dd0..9798d77c5975 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -170,8 +170,13 @@ class InsetsStateController { } if (aboveIme) { - state = new InsetsState(state); - state.setSourceVisible(ITYPE_IME, false); + InsetsSource imeSource = state.peekSource(ITYPE_IME); + if (imeSource != null && imeSource.isVisible()) { + imeSource = new InsetsSource(imeSource); + imeSource.setVisible(false); + state = new InsetsState(state); + state.addSource(imeSource); + } } return state; diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 7c1a6161236a..f0629fa953fc 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -130,6 +130,16 @@ class LocalAnimationAdapter implements AnimationAdapter { */ default boolean needsEarlyWakeup() { return false; } + /** + * @return The fraction of the animation, returns 1 if duration is 0. + * + * @param currentPlayTime The current play time. + */ + default float getFraction(float currentPlayTime) { + final float duration = getDuration(); + return duration > 0 ? currentPlayTime / duration : 1.0f; + } + void dump(PrintWriter pw, String prefix); default void dumpDebug(ProtoOutputStream proto, long fieldId) { diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 86e081854597..90936efe6715 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -646,8 +646,8 @@ class ScreenRotationAnimation { @Override public void apply(SurfaceControl.Transaction t, SurfaceControl leash, long currentPlayTime) { - float fraction = (float)currentPlayTime / (float)getDuration(); - int color = (Integer) va.evaluate(fraction, startColor, endColor); + final float fraction = getFraction(currentPlayTime); + final int color = (Integer) va.evaluate(fraction, startColor, endColor); Color middleColor = Color.valueOf(color); rgbTmpFloat[0] = middleColor.red(); rgbTmpFloat[1] = middleColor.green(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 93c6b6e7b83c..2115a591a6b7 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2694,9 +2694,16 @@ class Task extends WindowContainer<WindowContainer> { return null; } + final ActivityStack rootTask = (ActivityStack) focusableTask.getRootTask(); + if (!moveParentsToTop) { + // Only move the next stack to top in its task container. + WindowContainer parent = focusableTask.getParent(); + parent.positionChildAt(POSITION_TOP, focusableTask, false /* includingParents */); + return rootTask; + } + final String myReason = reason + " adjustFocusToNextFocusableStack"; final ActivityRecord top = focusableTask.topRunningActivity(); - final ActivityStack rootTask = (ActivityStack) focusableTask.getRootTask(); if (focusableTask.isActivityTypeHome() && (top == null || !top.mVisibleRequested)) { // If we will be focusing on the home stack next and its current top activity isn't // visible, then use the move the home stack task to top to make the activity visible. @@ -2704,13 +2711,6 @@ class Task extends WindowContainer<WindowContainer> { return rootTask; } - if (!moveParentsToTop) { - // Only move the next stack to top in its task container. - WindowContainer parent = focusableTask.getParent(); - parent.positionChildAt(POSITION_TOP, focusableTask, false /* includingParents */); - return rootTask; - } - // Move the entire hierarchy to top with updating global top resumed activity // and focused application if needed. focusableTask.moveToFront(myReason); diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java index be0d6f8a0b9f..c68b660bb76f 100644 --- a/services/core/java/com/android/server/wm/TaskPositioner.java +++ b/services/core/java/com/android/server/wm/TaskPositioner.java @@ -53,7 +53,6 @@ import android.view.InputDevice; import android.view.InputEvent; import android.view.InputWindowHandle; import android.view.MotionEvent; -import android.view.SurfaceControl; import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; @@ -268,9 +267,7 @@ class TaskPositioner implements IBinder.DeathRecipient { mDisplayContent.getDisplayRotation().pause(); // Notify InputMonitor to take mDragWindowHandle. - final SurfaceControl.Transaction t = mService.mTransactionFactory.get(); - mDisplayContent.getInputMonitor().updateInputWindowsImmediately(t); - t.syncInputWindows().apply(); + mService.mTaskPositioningController.showInputSurface(win.getDisplayId()); final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics(); mMinVisibleWidth = dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, displayMetrics); @@ -301,6 +298,7 @@ class TaskPositioner implements IBinder.DeathRecipient { return; } + mService.mTaskPositioningController.hideInputSurface(mDisplayContent.getDisplayId()); mService.mInputManager.unregisterInputChannel(mServerChannel); mInputEventReceiver.dispose(); diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java index 2d303faa7921..d343daf46f13 100644 --- a/services/core/java/com/android/server/wm/TaskPositioningController.java +++ b/services/core/java/com/android/server/wm/TaskPositioningController.java @@ -55,6 +55,8 @@ class TaskPositioningController { return mTaskPositioner != null; } + final SurfaceControl.Transaction mTransaction; + InputWindowHandle getDragWindowHandleLocked() { return mTaskPositioner != null ? mTaskPositioner.mDragWindowHandle : null; } @@ -65,16 +67,18 @@ class TaskPositioningController { mInputManager = inputManager; mActivityManager = activityManager; mHandler = new Handler(looper); + mTransaction = service.mTransactionFactory.get(); } - void hideInputSurface(SurfaceControl.Transaction t, int displayId) { + void hideInputSurface(int displayId) { if (mPositioningDisplay != null && mPositioningDisplay.getDisplayId() == displayId && mInputSurface != null) { - t.hide(mInputSurface); + mTransaction.hide(mInputSurface); + mTransaction.syncInputWindows().apply(); } } - void showInputSurface(SurfaceControl.Transaction t, int displayId) { + void showInputSurface(int displayId) { if (mPositioningDisplay == null || mPositioningDisplay.getDisplayId() != displayId) { return; } @@ -92,16 +96,17 @@ class TaskPositioningController { return; } - t.show(mInputSurface); - t.setInputWindowInfo(mInputSurface, h); - t.setLayer(mInputSurface, Integer.MAX_VALUE); + mTransaction.show(mInputSurface); + mTransaction.setInputWindowInfo(mInputSurface, h); + mTransaction.setLayer(mInputSurface, Integer.MAX_VALUE); final Display display = dc.getDisplay(); final Point p = new Point(); display.getRealSize(p); mTmpClipRect.set(0, 0, p.x, p.y); - t.setWindowCrop(mInputSurface, mTmpClipRect); + mTransaction.setWindowCrop(mInputSurface, mTmpClipRect); + mTransaction.syncInputWindows().apply(); } boolean startMovingTask(IWindow window, float startX, float startY) { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 160978dadcba..1784e2186aa5 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS; +import static com.android.server.wm.ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowContainer.POSITION_TOP; @@ -173,6 +174,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub f.recycle(); } } + + if ((effects & TRANSACT_EFFECTS_CLIENT_CONFIG) == 0) { + mService.addWindowLayoutReasons(LAYOUT_REASON_CONFIG_CHANGED); + } } finally { mService.continueWindowLayout(); if (syncId >= 0) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index bbe5d942874d..a3387ab42ab3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2114,6 +2114,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP void removeIfPossible() { super.removeIfPossible(); removeIfPossible(false /*keepVisibleDeadWindow*/); + finishDrawing(null); } private void removeIfPossible(boolean keepVisibleDeadWindow) { @@ -2490,6 +2491,23 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } /** + * Expands the given rectangle by the region of window resize handle for freeform window. + * @param inOutRect The rectangle to update. + */ + private void adjustRegionInFreefromWindowMode(Rect inOutRect) { + if (!inFreeformWindowingMode()) { + return; + } + + // For freeform windows, we need the touch region to include the whole + // surface for the shadows. + final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics(); + final int delta = WindowManagerService.dipToPixel( + RESIZE_HANDLE_WIDTH_IN_DP, displayMetrics); + inOutRect.inset(-delta, -delta); + } + + /** * Updates the region for a window in an Activity that was a touch modal. This will limit * the outer touch to the activity stack region. * @param outRegion The region to update. @@ -2512,14 +2530,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP getRootTask().getDimBounds(mTmpRect); } } - if (inFreeformWindowingMode()) { - // For freeform windows, we need the touch region to include the whole - // surface for the shadows. - final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics(); - final int delta = WindowManagerService.dipToPixel( - RESIZE_HANDLE_WIDTH_IN_DP, displayMetrics); - mTmpRect.inset(-delta, -delta); - } + adjustRegionInFreefromWindowMode(mTmpRect); outRegion.set(mTmpRect); cropRegionToStackBoundsIfNeeded(outRegion); } @@ -3334,7 +3345,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } final ActivityStack stack = task.getStack(); - if (stack == null) { + if (stack == null || inFreeformWindowingMode()) { return; } @@ -3353,6 +3364,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } stack.getDimBounds(mTmpRect); + adjustRegionInFreefromWindowMode(mTmpRect); region.op(mTmpRect, Region.Op.INTERSECT); } @@ -3454,7 +3466,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final Rect visibleInsets = mWindowFrames.mLastVisibleInsets; final Rect stableInsets = mWindowFrames.mLastStableInsets; final MergedConfiguration mergedConfiguration = mLastReportedConfiguration; - final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING; + final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING || useBLASTSync(); final boolean forceRelayout = reportOrientation || isDragResizeChanged(); final int displayId = getDisplayId(); final DisplayCutout displayCutout = getWmDisplayCutout().getDisplayCutout(); @@ -5594,7 +5606,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override public void apply(Transaction t, SurfaceControl leash, long currentPlayTime) { - final float fraction = (float) currentPlayTime / getDuration(); + final float fraction = getFraction(currentPlayTime); final float v = mInterpolator.getInterpolation(fraction); t.setPosition(leash, mFrom.x + (mTo.x - mFrom.x) * v, mFrom.y + (mTo.y - mFrom.y) * v); diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index a1b4f2442153..cae5027250e1 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -761,7 +761,10 @@ int IncrementalService::unbind(StorageId storage, std::string_view target) { std::unique_lock l2(ifs->lock); if (ifs->bindPoints.size() <= 1) { ifs->bindPoints.clear(); - deleteStorageLocked(*ifs, std::move(l2)); + std::thread([this, ifs, l2 = std::move(l2)]() mutable { + mJni->initializeForCurrentThread(); + deleteStorageLocked(*ifs, std::move(l2)); + }).detach(); } else { const std::string savedFile = std::move(bindIt->second.savedFilename); ifs->bindPoints.erase(bindIt); @@ -770,6 +773,7 @@ int IncrementalService::unbind(StorageId storage, std::string_view target) { mIncFs->unlink(ifs->control, path::join(ifs->root, constants().mount, savedFile)); } } + return 0; } @@ -1676,6 +1680,20 @@ void IncrementalService::DataLoaderStub::cleanupResources() { mId = kInvalidStorageId; } +sp<content::pm::IDataLoader> IncrementalService::DataLoaderStub::getDataLoader() { + sp<IDataLoader> dataloader; + auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader); + if (!status.isOk()) { + LOG(ERROR) << "Failed to get dataloader: " << status.toString8(); + return {}; + } + if (!dataloader) { + LOG(ERROR) << "DataLoader is null: " << status.toString8(); + return {}; + } + return dataloader; +} + bool IncrementalService::DataLoaderStub::requestCreate() { return setTargetStatus(IDataLoaderStatusListener::DATA_LOADER_CREATED); } @@ -1720,17 +1738,11 @@ bool IncrementalService::DataLoaderStub::bind() { } bool IncrementalService::DataLoaderStub::create() { - sp<IDataLoader> dataloader; - auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader); - if (!status.isOk()) { - LOG(ERROR) << "Failed to get dataloader: " << status.toString8(); - return false; - } + auto dataloader = getDataLoader(); if (!dataloader) { - LOG(ERROR) << "DataLoader is null: " << status.toString8(); return false; } - status = dataloader->create(mId, mParams, mControl, this); + auto status = dataloader->create(mId, mParams, mControl, this); if (!status.isOk()) { LOG(ERROR) << "Failed to start DataLoader: " << status.toString8(); return false; @@ -1739,17 +1751,11 @@ bool IncrementalService::DataLoaderStub::create() { } bool IncrementalService::DataLoaderStub::start() { - sp<IDataLoader> dataloader; - auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader); - if (!status.isOk()) { - LOG(ERROR) << "Failed to get dataloader: " << status.toString8(); - return false; - } + auto dataloader = getDataLoader(); if (!dataloader) { - LOG(ERROR) << "DataLoader is null: " << status.toString8(); return false; } - status = dataloader->start(mId); + auto status = dataloader->start(mId); if (!status.isOk()) { LOG(ERROR) << "Failed to start DataLoader: " << status.toString8(); return false; @@ -1758,8 +1764,7 @@ bool IncrementalService::DataLoaderStub::start() { } bool IncrementalService::DataLoaderStub::destroy() { - mService.mDataLoaderManager->unbindFromDataLoader(mId); - return true; + return mService.mDataLoaderManager->unbindFromDataLoader(mId).isOk(); } bool IncrementalService::DataLoaderStub::fsmStep() { @@ -1823,8 +1828,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount if (mCurrentStatus == newStatus) { return binder::Status::ok(); } - mCurrentStatus = newStatus; oldStatus = mCurrentStatus; + mCurrentStatus = newStatus; targetStatus = mTargetStatus; } diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index 1de00700cad0..81fbe74be606 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -179,6 +179,7 @@ private: binder::Status onStatusChanged(MountId mount, int newStatus) final; bool isValid() const { return mId != kInvalidStorageId; } + sp<content::pm::IDataLoader> getDataLoader(); bool bind(); bool create(); diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java index 09af4421406d..ca8e50aa19c9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java @@ -46,7 +46,6 @@ import static com.android.server.AlarmManagerService.Constants.KEY_MAX_INTERVAL; import static com.android.server.AlarmManagerService.Constants.KEY_MIN_FUTURITY; import static com.android.server.AlarmManagerService.Constants.KEY_MIN_INTERVAL; import static com.android.server.AlarmManagerService.IS_WAKEUP_MASK; -import static com.android.server.AlarmManagerService.MILLIS_IN_DAY; import static com.android.server.AlarmManagerService.TIME_CHANGED_MASK; import static com.android.server.AlarmManagerService.WORKING_INDEX; @@ -107,9 +106,9 @@ import java.util.ArrayList; public class AlarmManagerServiceTest { private static final String TAG = AlarmManagerServiceTest.class.getSimpleName(); private static final String TEST_CALLING_PACKAGE = "com.android.framework.test-package"; - private static final int SYSTEM_UI_UID = 123456789; - private static final int TEST_CALLING_UID = 12345; - private static final long RESTRICTED_WINDOW_MS = MILLIS_IN_DAY; + private static final int SYSTEM_UI_UID = 12345; + private static final int TEST_CALLING_UID = 67890; + private static final int TEST_CALLING_USER = UserHandle.getUserId(TEST_CALLING_UID); private long mAppStandbyWindow; private AlarmManagerService mService; @@ -257,6 +256,7 @@ public class AlarmManagerServiceTest { .mockStatic(LocalServices.class) .spyStatic(Looper.class) .spyStatic(Settings.Global.class) + .spyStatic(UserHandle.class) .strictness(Strictness.WARN) .startMocking(); doReturn(mIActivityManager).when(ActivityManager::getService); @@ -268,9 +268,9 @@ public class AlarmManagerServiceTest { doCallRealMethod().when((MockedVoidMethod) () -> LocalServices.addService(eq(AlarmManagerInternal.class), any())); doCallRealMethod().when(() -> LocalServices.getService(AlarmManagerInternal.class)); + doReturn(false).when(() -> UserHandle.isCore(TEST_CALLING_UID)); when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), - eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong())) - .thenReturn(STANDBY_BUCKET_ACTIVE); + eq(TEST_CALLING_USER), anyLong())).thenReturn(STANDBY_BUCKET_ACTIVE); doReturn(Looper.getMainLooper()).when(Looper::myLooper); when(mMockContext.getContentResolver()).thenReturn(mMockResolver); @@ -461,6 +461,19 @@ public class AlarmManagerServiceTest { } @Test + public void testMinFuturityCoreUid() { + doReturn("min_futurity=10").when(() -> + Settings.Global.getString(mMockResolver, Settings.Global.ALARM_MANAGER_CONSTANTS)); + mService.mConstants.onChange(false, null); + assertEquals(10, mService.mConstants.MIN_FUTURITY); + final long triggerTime = mNowElapsedTest + 1; + doReturn(true).when(() -> UserHandle.isCore(TEST_CALLING_UID)); + final long expectedTriggerTime = triggerTime; + setTestAlarm(ELAPSED_REALTIME_WAKEUP, triggerTime, getNewMockPendingIntent()); + assertEquals(expectedTriggerTime, mTestTimer.getElapsed()); + } + + @Test public void testEarliestAlarmSet() { final PendingIntent pi6 = getNewMockPendingIntent(); final PendingIntent pi8 = getNewMockPendingIntent(); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java index 5a96347c4ae1..cc8ac86d6b59 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java @@ -28,10 +28,12 @@ import static org.junit.Assert.assertThat; import static org.mockito.AdditionalAnswers.returnsFirstArg; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.Manifest; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.AppOpsManager; import android.appwidget.AppWidgetManagerInternal; @@ -71,6 +73,8 @@ public class AccessibilitySecurityPolicyTest { private static final int WINDOWID = 0x000a; private static final int WINDOWID2 = 0x000b; private static final int APP_UID = 10400; + private static final int APP_PID = 2000; + private static final int SYSTEM_PID = 558; private static final String PERMISSION = "test-permission"; private static final String FUNCTION = "test-function-name"; @@ -196,13 +200,13 @@ public class AccessibilitySecurityPolicyTest { @Test public void resolveValidReportedPackage_nullPkgName_returnNull() { assertNull(mA11ySecurityPolicy.resolveValidReportedPackageLocked( - null, Process.SYSTEM_UID, UserHandle.USER_SYSTEM)); + null, Process.SYSTEM_UID, UserHandle.USER_SYSTEM, SYSTEM_PID)); } @Test public void resolveValidReportedPackage_uidIsSystem_returnPkgName() { assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( - PACKAGE_NAME, Process.SYSTEM_UID, UserHandle.USER_SYSTEM), + PACKAGE_NAME, Process.SYSTEM_UID, UserHandle.USER_SYSTEM, SYSTEM_PID), PACKAGE_NAME); } @@ -213,7 +217,7 @@ public class AccessibilitySecurityPolicyTest { .thenReturn(APP_UID); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( - PACKAGE_NAME, APP_UID, UserHandle.USER_SYSTEM), + PACKAGE_NAME, APP_UID, UserHandle.USER_SYSTEM, APP_PID), PACKAGE_NAME); } @@ -221,6 +225,7 @@ public class AccessibilitySecurityPolicyTest { public void resolveValidReportedPackage_uidIsWidgetHost_pkgNameIsAppWidget_returnPkgName() throws PackageManager.NameNotFoundException { final int widgetHostUid = APP_UID; + final int widgetHostPid = APP_PID; final String hostPackageName = PACKAGE_NAME; final String widgetPackageName = PACKAGE_NAME2; final ArraySet<String> widgetPackages = new ArraySet<>(); @@ -232,7 +237,7 @@ public class AccessibilitySecurityPolicyTest { .thenReturn(widgetHostUid); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( - widgetPackageName, widgetHostUid, UserHandle.USER_SYSTEM), + widgetPackageName, widgetHostUid, UserHandle.USER_SYSTEM, widgetHostPid), widgetPackageName); } @@ -247,10 +252,52 @@ public class AccessibilitySecurityPolicyTest { .thenThrow(PackageManager.NameNotFoundException.class); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); + when(mMockContext.checkPermission( + eq(Manifest.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY), anyInt(), eq(APP_UID))) + .thenReturn(PackageManager.PERMISSION_DENIED); - assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( - invalidPackageName, APP_UID, UserHandle.USER_SYSTEM), - PACKAGE_NAME); + assertEquals(PACKAGE_NAME, mA11ySecurityPolicy.resolveValidReportedPackageLocked( + invalidPackageName, APP_UID, UserHandle.USER_SYSTEM, APP_PID)); + } + + @Test + public void resolveValidReportedPackage_anotherPkgNameWithActAsPkgPermission_returnPkg() + throws PackageManager.NameNotFoundException { + final String wantedPackageName = PACKAGE_NAME2; + final int wantedUid = APP_UID + 1; + final String[] uidPackages = {PACKAGE_NAME}; + when(mMockPackageManager.getPackagesForUid(APP_UID)) + .thenReturn(uidPackages); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, UserHandle.USER_SYSTEM)) + .thenReturn(wantedUid); + when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) + .thenReturn(new ArraySet<>()); + when(mMockContext.checkPermission( + eq(Manifest.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY), anyInt(), eq(APP_UID))) + .thenReturn(PackageManager.PERMISSION_GRANTED); + + assertEquals(wantedPackageName, mA11ySecurityPolicy.resolveValidReportedPackageLocked( + wantedPackageName, APP_UID, UserHandle.USER_SYSTEM, APP_PID)); + } + + @Test + public void resolveValidReportedPackage_anotherPkgNameWithoutActAsPkgPermission_returnUidPkg() + throws PackageManager.NameNotFoundException { + final String wantedPackageName = PACKAGE_NAME2; + final int wantedUid = APP_UID + 1; + final String[] uidPackages = {PACKAGE_NAME}; + when(mMockPackageManager.getPackagesForUid(APP_UID)) + .thenReturn(uidPackages); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, UserHandle.USER_SYSTEM)) + .thenReturn(wantedUid); + when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) + .thenReturn(new ArraySet<>()); + when(mMockContext.checkPermission( + eq(Manifest.permission.ACT_AS_PACKAGE_FOR_ACCESSIBILITY), anyInt(), eq(APP_UID))) + .thenReturn(PackageManager.PERMISSION_DENIED); + + assertEquals(PACKAGE_NAME, mA11ySecurityPolicy.resolveValidReportedPackageLocked( + wantedPackageName, APP_UID, UserHandle.USER_SYSTEM, APP_PID)); } @Test @@ -432,21 +479,59 @@ public class AccessibilitySecurityPolicyTest { UserHandle.USER_CURRENT_OR_SELF); } - @Test(expected = IllegalArgumentException.class) - public void resolveCallingUserId_callingParentNotCurrentUser_userIdIsInvalid_shouldException() { + @Test + public void resolveCallingUserId_anotherUserIdWithCrossUserPermission_returnUserId() { final AccessibilitySecurityPolicy spySecurityPolicy = Mockito.spy(mA11ySecurityPolicy); final int callingUserId = UserHandle.getUserId(Process.myUid()); final int callingParentId = 20; final int currentUserId = 30; - final int invalidUserId = 40; + final int wantedUserId = 40; when(mMockA11yUserManager.getCurrentUserIdLocked()) .thenReturn(currentUserId); doReturn(callingParentId).when(spySecurityPolicy).resolveProfileParentLocked( callingUserId); - when(mMockContext.checkCallingPermission(any())) + when(mMockContext.checkCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS)) + .thenReturn(PackageManager.PERMISSION_GRANTED); + + assertEquals(wantedUserId, + spySecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked(wantedUserId)); + } + + @Test + public void resolveCallingUserId_anotherUserIdWithCrossUserFullPermission_returnUserId() { + final AccessibilitySecurityPolicy spySecurityPolicy = Mockito.spy(mA11ySecurityPolicy); + final int callingUserId = UserHandle.getUserId(Process.myUid()); + final int callingParentId = 20; + final int currentUserId = 30; + final int wantedUserId = 40; + when(mMockA11yUserManager.getCurrentUserIdLocked()) + .thenReturn(currentUserId); + doReturn(callingParentId).when(spySecurityPolicy).resolveProfileParentLocked( + callingUserId); + when(mMockContext.checkCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)) .thenReturn(PackageManager.PERMISSION_GRANTED); - spySecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked(invalidUserId); + assertEquals(wantedUserId, + spySecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked(wantedUserId)); + } + + @Test(expected = SecurityException.class) + public void resolveCallingUserId_anotherUserIdWithoutCrossUserPermission_shouldException() { + final AccessibilitySecurityPolicy spySecurityPolicy = Mockito.spy(mA11ySecurityPolicy); + final int callingUserId = UserHandle.getUserId(Process.myUid()); + final int callingParentId = 20; + final int currentUserId = 30; + final int wantedUserId = 40; + when(mMockA11yUserManager.getCurrentUserIdLocked()) + .thenReturn(currentUserId); + doReturn(callingParentId).when(spySecurityPolicy).resolveProfileParentLocked( + callingUserId); + when(mMockContext.checkCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS)) + .thenReturn(PackageManager.PERMISSION_DENIED); + when(mMockContext.checkCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)) + .thenReturn(PackageManager.PERMISSION_DENIED); + + spySecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked(wantedUserId); } @Test diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java index 10a86f9ea527..e4d51e4374a7 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java @@ -134,7 +134,7 @@ public class AccessibilityWindowManagerTest { when(mMockA11ySecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked( USER_SYSTEM_ID)).thenReturn(USER_SYSTEM_ID); when(mMockA11ySecurityPolicy.resolveValidReportedPackageLocked( - anyString(), anyInt(), anyInt())).thenReturn(PACKAGE_NAME); + anyString(), anyInt(), anyInt(), anyInt())).thenReturn(PACKAGE_NAME); mA11yWindowManager = new AccessibilityWindowManager(new Object(), mHandler, mMockWindowManagerInternal, diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java index 22f8b9c8ae92..4ecaac55ce96 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java @@ -58,6 +58,7 @@ public class AudioDeviceBrokerTest { @Mock private AudioService mMockAudioService; @Spy private AudioDeviceInventory mSpyDevInventory; @Spy private AudioSystemAdapter mSpyAudioSystem; + private SystemServerAdapter mSystemServer; private BluetoothDevice mFakeBtDevice; @@ -66,9 +67,11 @@ public class AudioDeviceBrokerTest { mContext = InstrumentationRegistry.getTargetContext(); mMockAudioService = mock(AudioService.class); - mSpyAudioSystem = spy(AudioSystemAdapter.getConfigurableAdapter()); + mSpyAudioSystem = spy(new NoOpAudioSystemAdapter()); mSpyDevInventory = spy(new AudioDeviceInventory(mSpyAudioSystem)); - mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory); + mSystemServer = new NoOpSystemServerAdapter(); + mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory, + mSystemServer); mSpyDevInventory.setDeviceBroker(mAudioDeviceBroker); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); @@ -79,8 +82,8 @@ public class AudioDeviceBrokerTest { @After public void tearDown() throws Exception { } - @Test - public void testSetUpAndTearDown() { } +// @Test +// public void testSetUpAndTearDown() { } /** * postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent() for connection: @@ -90,7 +93,7 @@ public class AudioDeviceBrokerTest { */ @Test public void testPostA2dpDeviceConnectionChange() throws Exception { - Log.i(TAG, "testPostA2dpDeviceConnectionChange"); + Log.i(TAG, "starting testPostA2dpDeviceConnectionChange"); Assert.assertNotNull("invalid null BT device", mFakeBtDevice); mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, @@ -104,13 +107,8 @@ public class AudioDeviceBrokerTest { ArgumentMatchers.eq(1) /*a2dpVolume*/ ); - final String expectedName = mFakeBtDevice.getName() == null ? "" : mFakeBtDevice.getName(); - verify(mSpyAudioSystem, times(1)).setDeviceConnectionState( - ArgumentMatchers.eq(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP), - ArgumentMatchers.eq(AudioSystem.DEVICE_STATE_AVAILABLE), - ArgumentMatchers.eq(mFakeBtDevice.getAddress()), - ArgumentMatchers.eq(expectedName), - anyInt() /*codec*/); + // verify the connection was reported to AudioSystem + checkSingleSystemConnection(mFakeBtDevice); } /** @@ -121,31 +119,70 @@ public class AudioDeviceBrokerTest { */ @Test public void testA2dpDeviceConnectionDisconnectionConnectionChange() throws Exception { - Log.i(TAG, "testA2dpDeviceConnectionDisconnectionConnectionChange"); + Log.i(TAG, "starting testA2dpDeviceConnectionDisconnectionConnectionChange"); - doTestConnectionDisconnectionReconnection(0); + doTestConnectionDisconnectionReconnection(0, false, + // cannot guarantee single connection since commands are posted in separate thread + // than they are processed + false); } /** * Verify device disconnection and reconnection within the BECOMING_NOISY window + * in the absence of media playback * @throws Exception */ @Test public void testA2dpDeviceReconnectionWithinBecomingNoisyDelay() throws Exception { - Log.i(TAG, "testA2dpDeviceReconnectionWithinBecomingNoisyDelay"); + Log.i(TAG, "starting testA2dpDeviceReconnectionWithinBecomingNoisyDelay"); + + doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2, + false, + // do not check single connection since the connection command will come much + // after the disconnection command + false); + } - doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2); + /** + * Same as testA2dpDeviceConnectionDisconnectionConnectionChange() but with mock media playback + * @throws Exception + */ + @Test + public void testA2dpConnectionDisconnectionConnectionChange_MediaPlayback() throws Exception { + Log.i(TAG, "starting testA2dpConnectionDisconnectionConnectionChange_MediaPlayback"); + + doTestConnectionDisconnectionReconnection(0, true, + // guarantee single connection since because of media playback the disconnection + // is supposed to be delayed, and thus cancelled because of the connection + true); + } + + /** + * Same as testA2dpDeviceReconnectionWithinBecomingNoisyDelay() but with mock media playback + * @throws Exception + */ + @Test + public void testA2dpReconnectionWithinBecomingNoisyDelay_MediaPlayback() throws Exception { + Log.i(TAG, "starting testA2dpReconnectionWithinBecomingNoisyDelay_MediaPlayback"); + + doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2, + true, + // guarantee single connection since because of media playback the disconnection + // is supposed to be delayed, and thus cancelled because of the connection + true); } - private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection) - throws Exception { + private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection, + boolean mockMediaPlayback, boolean guaranteeSingleConnection) throws Exception { when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC)) .thenReturn(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); when(mMockAudioService.isInCommunication()).thenReturn(false); when(mMockAudioService.hasMediaDynamicPolicy()).thenReturn(false); when(mMockAudioService.hasAudioFocusUsers()).thenReturn(false); - // first connection + ((NoOpAudioSystemAdapter) mSpyAudioSystem).configureIsStreamActive(mockMediaPlayback); + + // first connection: ensure the device is connected as a starting condition for the test mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1); Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); @@ -169,5 +206,26 @@ public class AudioDeviceBrokerTest { ArgumentMatchers.eq(BluetoothProfile.STATE_CONNECTED)); Assert.assertTrue("Mock device not connected", mSpyDevInventory.isA2dpDeviceConnected(mFakeBtDevice)); + + if (guaranteeSingleConnection) { + // when the disconnection was expected to be cancelled, there should have been a single + // call to AudioSystem to declare the device connected (available) + checkSingleSystemConnection(mFakeBtDevice); + } + } + + /** + * Verifies the given device was reported to AudioSystem exactly once as available + * @param btDevice + * @throws Exception + */ + private void checkSingleSystemConnection(BluetoothDevice btDevice) throws Exception { + final String expectedName = btDevice.getName() == null ? "" : btDevice.getName(); + verify(mSpyAudioSystem, times(1)).setDeviceConnectionState( + ArgumentMatchers.eq(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP), + ArgumentMatchers.eq(AudioSystem.DEVICE_STATE_AVAILABLE), + ArgumentMatchers.eq(btDevice.getAddress()), + ArgumentMatchers.eq(expectedName), + anyInt() /*codec*/); } } diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java index 6185ae6d93f9..54945fbc2dd2 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java @@ -57,8 +57,8 @@ public class AudioServiceTest { sLooperPrepared = true; } mContext = InstrumentationRegistry.getTargetContext(); - mAudioSystem = AudioSystemAdapter.getConfigurableAdapter(); - mSpySystemServer = spy(SystemServerAdapter.getNoOpAdapter()); + mAudioSystem = new NoOpAudioSystemAdapter(); + mSpySystemServer = spy(new NoOpSystemServerAdapter()); mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer); } @@ -70,8 +70,7 @@ public class AudioServiceTest { public void testMuteMicrophone() throws Exception { Log.i(TAG, "running testMuteMicrophone"); Assert.assertNotNull(mAudioService); - final AudioSystemAdapter.AudioSystemConfigurableAdapter testAudioSystem = - (AudioSystemAdapter.AudioSystemConfigurableAdapter) mAudioSystem; + final NoOpAudioSystemAdapter testAudioSystem = (NoOpAudioSystemAdapter) mAudioSystem; testAudioSystem.configureMuteMicrophoneToFail(false); for (boolean muted : new boolean[] { true, false}) { testAudioSystem.configureIsMicrophoneMuted(!muted); @@ -96,8 +95,7 @@ public class AudioServiceTest { public void testMuteMicrophoneWhenFail() throws Exception { Log.i(TAG, "running testMuteMicrophoneWhenFail"); Assert.assertNotNull(mAudioService); - final AudioSystemAdapter.AudioSystemConfigurableAdapter testAudioSystem = - (AudioSystemAdapter.AudioSystemConfigurableAdapter) mAudioSystem; + final NoOpAudioSystemAdapter testAudioSystem = (NoOpAudioSystemAdapter) mAudioSystem; testAudioSystem.configureMuteMicrophoneToFail(true); for (boolean muted : new boolean[] { true, false}) { testAudioSystem.configureIsMicrophoneMuted(!muted); diff --git a/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java b/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java new file mode 100644 index 000000000000..a9cef20268f4 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java @@ -0,0 +1,107 @@ +/* + * 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. + */ + +package com.android.server.audio; + +import android.annotation.NonNull; +import android.media.AudioDeviceAttributes; +import android.media.AudioSystem; +import android.util.Log; + +/** + * Provides an adapter for AudioSystem that does nothing. + * Overridden methods can be configured. + */ +public class NoOpAudioSystemAdapter extends AudioSystemAdapter { + private static final String TAG = "ASA"; + private boolean mIsMicMuted = false; + private boolean mMuteMicrophoneFails = false; + private boolean mIsStreamActive = false; + + public void configureIsMicrophoneMuted(boolean muted) { + mIsMicMuted = muted; + } + + public void configureIsStreamActive(boolean active) { + mIsStreamActive = active; + } + + public void configureMuteMicrophoneToFail(boolean fail) { + mMuteMicrophoneFails = fail; + } + + //----------------------------------------------------------------- + // Overrides of AudioSystemAdapter + @Override + public int setDeviceConnectionState(int device, int state, String deviceAddress, + String deviceName, int codecFormat) { + Log.i(TAG, String.format("setDeviceConnectionState(0x%s, %d, %s, %s, 0x%s", + Integer.toHexString(device), state, deviceAddress, deviceName, + Integer.toHexString(codecFormat))); + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int getDeviceConnectionState(int device, String deviceAddress) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int handleDeviceConfigChange(int device, String deviceAddress, + String deviceName, int codecFormat) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int setPreferredDeviceForStrategy(int strategy, + @NonNull AudioDeviceAttributes device) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int removePreferredDeviceForStrategy(int strategy) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int setParameters(String keyValuePairs) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public boolean isMicrophoneMuted() { + return mIsMicMuted; + } + + @Override + public int muteMicrophone(boolean on) { + if (mMuteMicrophoneFails) { + return AudioSystem.AUDIO_STATUS_ERROR; + } + mIsMicMuted = on; + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public int setCurrentImeUid(int uid) { + return AudioSystem.AUDIO_STATUS_OK; + } + + @Override + public boolean isStreamActive(int stream, int inPastMs) { + return mIsStreamActive; + } +} diff --git a/services/tests/servicestests/src/com/android/server/audio/NoOpSystemServerAdapter.java b/services/tests/servicestests/src/com/android/server/audio/NoOpSystemServerAdapter.java new file mode 100644 index 000000000000..83c566376e44 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/audio/NoOpSystemServerAdapter.java @@ -0,0 +1,42 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.audio; + +/** + * Provides a no-op adapter that implements SystemServerAdapter + */ +public class NoOpSystemServerAdapter extends SystemServerAdapter { + + NoOpSystemServerAdapter() { + super(null); + } + + @Override + public boolean isPrivileged() { + return false; + } + + @Override + public void sendMicrophoneMuteChangedIntent() { + // no-op + } + + @Override + public void sendDeviceBecomingNoisyIntent() { + // no-op + } +} diff --git a/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java b/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java index aa923e22444d..3e9709d55268 100644 --- a/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java @@ -16,12 +16,11 @@ package com.android.server.lights; -import static android.hardware.lights.LightsRequest.Builder; - -import static android.graphics.Color.BLACK; import static android.graphics.Color.BLUE; import static android.graphics.Color.GREEN; +import static android.graphics.Color.TRANSPARENT; import static android.graphics.Color.WHITE; +import static android.hardware.lights.LightsRequest.Builder; import static com.google.common.truth.Truth.assertThat; @@ -93,7 +92,7 @@ public class LightsServiceTest { @Test public void testGetLights_filtersSystemLights() { - LightsService service = new LightsService(mContext, mHal, Looper.getMainLooper()); + LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper()); LightsManager manager = new LightsManager(mContext, service.mManagerService); // When lights are listed, only the 4 MICROPHONE lights should be visible. @@ -102,7 +101,7 @@ public class LightsServiceTest { @Test public void testControlMultipleLights() { - LightsService service = new LightsService(mContext, mHal, Looper.getMainLooper()); + LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper()); LightsManager manager = new LightsManager(mContext, service.mManagerService); // When the session requests to turn 3/4 lights on: @@ -124,12 +123,12 @@ public class LightsServiceTest { @Test public void testControlLights_onlyEffectiveForLifetimeOfClient() { - LightsService service = new LightsService(mContext, mHal, Looper.getMainLooper()); + LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper()); LightsManager manager = new LightsManager(mContext, service.mManagerService); Light micLight = manager.getLights().get(0); // The light should begin by being off. - assertThat(manager.getLightState(micLight).getColor()).isEqualTo(BLACK); + assertThat(manager.getLightState(micLight).getColor()).isEqualTo(TRANSPARENT); // When a session commits changes: LightsManager.LightsSession session = manager.openSession(); @@ -140,12 +139,12 @@ public class LightsServiceTest { // When the session goes away: session.close(); // Then the light should turn off. - assertThat(manager.getLightState(micLight).getColor()).isEqualTo(BLACK); + assertThat(manager.getLightState(micLight).getColor()).isEqualTo(TRANSPARENT); } @Test public void testControlLights_firstCallerWinsContention() { - LightsService service = new LightsService(mContext, mHal, Looper.getMainLooper()); + LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper()); LightsManager manager = new LightsManager(mContext, service.mManagerService); Light micLight = manager.getLights().get(0); @@ -171,7 +170,7 @@ public class LightsServiceTest { @Test public void testClearLight() { - LightsService service = new LightsService(mContext, mHal, Looper.getMainLooper()); + LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper()); LightsManager manager = new LightsManager(mContext, service.mManagerService); Light micLight = manager.getLights().get(0); diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java index cf1978ec47a1..e5486473e93b 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java @@ -21,14 +21,17 @@ import static com.android.server.uri.UriGrantsMockContext.FLAG_PREFIX; import static com.android.server.uri.UriGrantsMockContext.FLAG_READ; import static com.android.server.uri.UriGrantsMockContext.PKG_CAMERA; import static com.android.server.uri.UriGrantsMockContext.PKG_COMPLEX; +import static com.android.server.uri.UriGrantsMockContext.PKG_FORCE; import static com.android.server.uri.UriGrantsMockContext.PKG_SOCIAL; import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_CAMERA; import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_COMPLEX; +import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_FORCE; import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_PRIVATE; import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_PUBLIC; import static com.android.server.uri.UriGrantsMockContext.UID_PRIMARY_SOCIAL; import static com.android.server.uri.UriGrantsMockContext.UID_SECONDARY_CAMERA; import static com.android.server.uri.UriGrantsMockContext.UID_SECONDARY_SOCIAL; +import static com.android.server.uri.UriGrantsMockContext.URI_FORCE; import static com.android.server.uri.UriGrantsMockContext.URI_PHOTO_1; import static com.android.server.uri.UriGrantsMockContext.URI_PRIVATE; import static com.android.server.uri.UriGrantsMockContext.URI_PUBLIC; @@ -125,6 +128,19 @@ public class UriGrantsManagerServiceTest { } /** + * Verify that {@link ProviderInfo#forceUriPermissions} forces permission + * grants, even when receiver already holds permission. + */ + @Test + public void testNeeded_force() { + final Intent intent = new Intent(Intent.ACTION_VIEW, URI_FORCE) + .addFlags(FLAG_READ); + final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( + UID_PRIMARY_FORCE, PKG_FORCE, intent, intent.getFlags(), null, USER_PRIMARY); + assertEquals(asSet(new GrantUri(USER_PRIMARY, URI_FORCE, 0)), needed.uris); + } + + /** * Verify that we can't grant permissions to top level of a provider with * complex permission model. */ diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java index 989928dbbcc4..d5aee5d208f5 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsMockContext.java @@ -62,6 +62,8 @@ public class UriGrantsMockContext extends ContextWrapper { static final String PKG_PRIVATE = "com.example.private"; /** Completely public app/provider that needs no grants */ static final String PKG_PUBLIC = "com.example.public"; + /** Completely public app/provider that forces grants */ + static final String PKG_FORCE = "com.example.force"; /** Complex provider that offers nested grants */ static final String PKG_COMPLEX = "com.example.complex"; @@ -69,24 +71,28 @@ public class UriGrantsMockContext extends ContextWrapper { private static final int UID_CAMERA = android.os.Process.LAST_APPLICATION_UID - 2; private static final int UID_PRIVATE = android.os.Process.LAST_APPLICATION_UID - 3; private static final int UID_PUBLIC = android.os.Process.LAST_APPLICATION_UID - 4; - private static final int UID_COMPLEX = android.os.Process.LAST_APPLICATION_UID - 5; + private static final int UID_FORCE = android.os.Process.LAST_APPLICATION_UID - 5; + private static final int UID_COMPLEX = android.os.Process.LAST_APPLICATION_UID - 6; static final int UID_PRIMARY_SOCIAL = UserHandle.getUid(USER_PRIMARY, UID_SOCIAL); static final int UID_PRIMARY_CAMERA = UserHandle.getUid(USER_PRIMARY, UID_CAMERA); static final int UID_PRIMARY_PRIVATE = UserHandle.getUid(USER_PRIMARY, UID_PRIVATE); static final int UID_PRIMARY_PUBLIC = UserHandle.getUid(USER_PRIMARY, UID_PUBLIC); + static final int UID_PRIMARY_FORCE = UserHandle.getUid(USER_PRIMARY, UID_FORCE); static final int UID_PRIMARY_COMPLEX = UserHandle.getUid(USER_PRIMARY, UID_COMPLEX); static final int UID_SECONDARY_SOCIAL = UserHandle.getUid(USER_SECONDARY, UID_SOCIAL); static final int UID_SECONDARY_CAMERA = UserHandle.getUid(USER_SECONDARY, UID_CAMERA); static final int UID_SECONDARY_PRIVATE = UserHandle.getUid(USER_SECONDARY, UID_PRIVATE); static final int UID_SECONDARY_PUBLIC = UserHandle.getUid(USER_SECONDARY, UID_PUBLIC); - static final int UID_SECONDARY_COMPLEX = UserHandle.getUid(USER_PRIMARY, UID_COMPLEX); + static final int UID_SECONDARY_FORCE = UserHandle.getUid(USER_SECONDARY, UID_FORCE); + static final int UID_SECONDARY_COMPLEX = UserHandle.getUid(USER_SECONDARY, UID_COMPLEX); static final Uri URI_PHOTO_1 = Uri.parse("content://" + PKG_CAMERA + "/1"); static final Uri URI_PHOTO_2 = Uri.parse("content://" + PKG_CAMERA + "/2"); static final Uri URI_PRIVATE = Uri.parse("content://" + PKG_PRIVATE + "/42"); static final Uri URI_PUBLIC = Uri.parse("content://" + PKG_PUBLIC + "/42"); + static final Uri URI_FORCE = Uri.parse("content://" + PKG_FORCE + "/42"); private final File mDir; @@ -122,6 +128,8 @@ public class UriGrantsMockContext extends ContextWrapper { .thenReturn(UserHandle.getUid(userId, UID_PRIVATE)); when(mPmInternal.getPackageUidInternal(eq(PKG_PUBLIC), anyInt(), eq(userId))) .thenReturn(UserHandle.getUid(userId, UID_PUBLIC)); + when(mPmInternal.getPackageUidInternal(eq(PKG_FORCE), anyInt(), eq(userId))) + .thenReturn(UserHandle.getUid(userId, UID_FORCE)); when(mPmInternal.getPackageUidInternal(eq(PKG_COMPLEX), anyInt(), eq(userId))) .thenReturn(UserHandle.getUid(userId, UID_COMPLEX)); @@ -131,6 +139,8 @@ public class UriGrantsMockContext extends ContextWrapper { .thenReturn(buildPrivateProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_PUBLIC), anyInt(), eq(userId))) .thenReturn(buildPublicProvider(userId)); + when(mPmInternal.resolveContentProvider(eq(PKG_FORCE), anyInt(), eq(userId))) + .thenReturn(buildForceProvider(userId)); when(mPmInternal.resolveContentProvider(eq(PKG_COMPLEX), anyInt(), eq(userId))) .thenReturn(buildComplexProvider(userId)); } @@ -170,6 +180,18 @@ public class UriGrantsMockContext extends ContextWrapper { return pi; } + private static ProviderInfo buildForceProvider(int userId) { + final ProviderInfo pi = new ProviderInfo(); + pi.packageName = PKG_FORCE; + pi.authority = PKG_FORCE; + pi.exported = true; + pi.grantUriPermissions = true; + pi.forceUriPermissions = true; + pi.applicationInfo = new ApplicationInfo(); + pi.applicationInfo.uid = UserHandle.getUid(userId, UID_FORCE); + return pi; + } + private static ProviderInfo buildComplexProvider(int userId) { final ProviderInfo pi = new ProviderInfo(); pi.packageName = PKG_COMPLEX; diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 80fcf2e121f4..e02ea813cdd7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -97,9 +97,7 @@ import android.view.InsetsState; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceControl.Transaction; -import android.view.ViewRootImpl; import android.view.WindowManager; -import android.view.test.InsetsModeSession; import androidx.test.filters.SmallTest; @@ -448,7 +446,7 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot()); // Verify not waiting for drawn windows. - makeWindowsDrawn(windows); + makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN); assertFalse(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot()); } @@ -469,10 +467,26 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot()); // Verify not waiting for drawn windows on display with system decorations. - makeWindowsDrawn(windows); + makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN); assertFalse(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot()); } + @Test + public void testShouldWaitForSystemDecorWindowsOnBoot_OnWindowReadyToShowAndDrawn() { + mWm.mSystemBooted = true; + final DisplayContent defaultDisplay = mWm.getDefaultDisplayContentLocked(); + final WindowState[] windows = createNotDrawnWindowsOn(defaultDisplay, + TYPE_WALLPAPER, TYPE_APPLICATION); + + // Verify waiting for windows to be drawn. + makeWindowsDrawnState(windows, WindowStateAnimator.READY_TO_SHOW); + assertTrue(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot()); + + // Verify not waiting for drawn windows. + makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN); + assertFalse(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot()); + } + private WindowState[] createNotDrawnWindowsOn(DisplayContent displayContent, int... types) { final WindowState[] windows = new WindowState[types.length]; for (int i = 0; i < types.length; i++) { @@ -483,10 +497,10 @@ public class DisplayContentTests extends WindowTestsBase { return windows; } - private static void makeWindowsDrawn(WindowState[] windows) { + private static void makeWindowsDrawnState(WindowState[] windows, int state) { for (WindowState window : windows) { window.mHasSurface = true; - window.mWinAnimator.mDrawState = WindowStateAnimator.HAS_DRAWN; + window.mWinAnimator.mDrawState = state; } } diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 9f28f45a05d0..2af98d85b1ca 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -153,6 +153,21 @@ public class InsetsStateControllerTest extends WindowTestsBase { } @Test + public void testStripForDispatch_independentSources() { + getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null); + + final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1"); + app1.mBehindIme = true; + + final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); + app2.mBehindIme = false; + + getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true); + assertFalse(getController().getInsetsForDispatch(app2).getSource(ITYPE_IME).isVisible()); + assertTrue(getController().getInsetsForDispatch(app1).getSource(ITYPE_IME).isVisible()); + } + + @Test public void testStripForDispatch_belowIme() { getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null); diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java index 33a43c1e0319..1e5ce05ff28a 100644 --- a/telephony/java/android/telephony/CellIdentity.java +++ b/telephony/java/android/telephony/CellIdentity.java @@ -211,7 +211,7 @@ public abstract class CellIdentity implements Parcelable { } /** @hide */ - protected String getPlmn() { + public @Nullable String getPlmn() { if (mMccStr == null || mMncStr == null) return null; return mMccStr + mMncStr; } diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java index f21277cdd83c..68c833c37c99 100644 --- a/telephony/java/android/telephony/CellIdentityCdma.java +++ b/telephony/java/android/telephony/CellIdentityCdma.java @@ -279,6 +279,7 @@ public final class CellIdentityCdma extends CellIdentity { mLongitude = in.readInt(); mLatitude = in.readInt(); + updateGlobalCellId(); if (DBG) log(toString()); } diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java index 1a913105db2e..849c613da748 100644 --- a/telephony/java/android/telephony/CellIdentityGsm.java +++ b/telephony/java/android/telephony/CellIdentityGsm.java @@ -323,6 +323,7 @@ public final class CellIdentityGsm extends CellIdentity { mBsic = in.readInt(); mAdditionalPlmns = (ArraySet<String>) in.readArraySet(null); + updateGlobalCellId(); if (DBG) log(toString()); } diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java index 13a8273d64d4..1993550d52b8 100644 --- a/telephony/java/android/telephony/CellIdentityLte.java +++ b/telephony/java/android/telephony/CellIdentityLte.java @@ -403,6 +403,8 @@ public final class CellIdentityLte extends CellIdentity { mBandwidth = in.readInt(); mAdditionalPlmns = (ArraySet<String>) in.readArraySet(null); mCsgInfo = in.readParcelable(null); + + updateGlobalCellId(); if (DBG) log(toString()); } diff --git a/telephony/java/android/telephony/CellIdentityNr.java b/telephony/java/android/telephony/CellIdentityNr.java index f0d878001bf4..8dd7bdd57841 100644 --- a/telephony/java/android/telephony/CellIdentityNr.java +++ b/telephony/java/android/telephony/CellIdentityNr.java @@ -273,6 +273,8 @@ public final class CellIdentityNr extends CellIdentity { mBands = in.createIntArray(); mNci = in.readLong(); mAdditionalPlmns = (ArraySet<String>) in.readArraySet(null); + + updateGlobalCellId(); } /** Implement the Parcelable interface */ diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java index 6dffe922ffd1..e74b70939d14 100644 --- a/telephony/java/android/telephony/CellIdentityTdscdma.java +++ b/telephony/java/android/telephony/CellIdentityTdscdma.java @@ -321,6 +321,8 @@ public final class CellIdentityTdscdma extends CellIdentity { mUarfcn = in.readInt(); mAdditionalPlmns = (ArraySet<String>) in.readArraySet(null); mCsgInfo = in.readParcelable(null); + + updateGlobalCellId(); if (DBG) log(toString()); } diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java index eab174ade3b7..40cb27e95151 100644 --- a/telephony/java/android/telephony/CellIdentityWcdma.java +++ b/telephony/java/android/telephony/CellIdentityWcdma.java @@ -336,6 +336,8 @@ public final class CellIdentityWcdma extends CellIdentity { mUarfcn = in.readInt(); mAdditionalPlmns = (ArraySet<String>) in.readArraySet(null); mCsgInfo = in.readParcelable(null); + + updateGlobalCellId(); if (DBG) log(toString()); } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 2facd5a16bc8..801d63905af9 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -34,6 +34,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.app.PendingIntent; +import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; @@ -130,6 +131,33 @@ public class SubscriptionManager { @UnsupportedAppUsage public static final Uri CONTENT_URI = SimInfo.CONTENT_URI; + /** @hide */ + public static final String CACHE_KEY_DEFAULT_SUB_ID_PROPERTY = + "cache_key.telephony.get_default_sub_id"; + + private static final int DEFAULT_SUB_ID_CACHE_SIZE = 1; + + private static PropertyInvalidatedCache<Void, Integer> sDefaultSubIdCache = + new PropertyInvalidatedCache<Void, Integer>( + DEFAULT_SUB_ID_CACHE_SIZE, + CACHE_KEY_DEFAULT_SUB_ID_PROPERTY) { + @Override + protected Integer recompute(Void query) { + int subId = INVALID_SUBSCRIPTION_ID; + + try { + ISub iSub = TelephonyManager.getSubscriptionService(); + if (iSub != null) { + subId = iSub.getDefaultSubId(); + } + } catch (RemoteException ex) { + // ignore it + } + + if (VDBG) logd("getDefaultSubId=" + subId); + return subId; + } + }; /** * Generates a content {@link Uri} used to receive updates on simInfo change * on the given subscriptionId @@ -1840,19 +1868,7 @@ public class SubscriptionManager { * @return the "system" default subscription id. */ public static int getDefaultSubscriptionId() { - int subId = INVALID_SUBSCRIPTION_ID; - - try { - ISub iSub = TelephonyManager.getSubscriptionService(); - if (iSub != null) { - subId = iSub.getDefaultSubId(); - } - } catch (RemoteException ex) { - // ignore it - } - - if (VDBG) logd("getDefaultSubId=" + subId); - return subId; + return sDefaultSubIdCache.query(null); } /** @@ -3274,4 +3290,18 @@ public class SubscriptionManager { intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId); intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); } + + /** @hide */ + public static void invalidateDefaultSubIdCaches() { + PropertyInvalidatedCache.invalidateCache(CACHE_KEY_DEFAULT_SUB_ID_PROPERTY); + } + + /** + * Clears all process-local binder caches. + * + * @hide + */ + public static void clearCaches() { + sDefaultSubIdCache.clear(); + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 835ef59f9ef3..97a4f4e4f050 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -13119,6 +13119,7 @@ public class TelephonyManager { if (sISub != null) { sISub.asBinder().unlinkToDeath(sServiceDeath, 0); sISub = null; + SubscriptionManager.clearCaches(); } if (sISms != null) { sISms.asBinder().unlinkToDeath(sServiceDeath, 0); diff --git a/tests/net/common/java/android/net/DhcpInfoTest.java b/tests/net/common/java/android/net/DhcpInfoTest.java new file mode 100644 index 000000000000..bd5533f33910 --- /dev/null +++ b/tests/net/common/java/android/net/DhcpInfoTest.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2009 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.net; + +import static android.net.shared.Inet4AddressUtils.inet4AddressToIntHTL; + +import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; +import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import android.annotation.Nullable; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.Inet4Address; +import java.net.InetAddress; + +@RunWith(AndroidJUnit4.class) +public class DhcpInfoTest { + private static final String STR_ADDR1 = "255.255.255.255"; + private static final String STR_ADDR2 = "127.0.0.1"; + private static final String STR_ADDR3 = "192.168.1.1"; + private static final String STR_ADDR4 = "192.168.1.0"; + private static final int LEASE_TIME = 9999; + + private int ipToInteger(String ipString) throws Exception { + return inet4AddressToIntHTL((Inet4Address) InetAddress.getByName(ipString)); + } + + private DhcpInfo createDhcpInfoObject() throws Exception { + final DhcpInfo dhcpInfo = new DhcpInfo(); + dhcpInfo.ipAddress = ipToInteger(STR_ADDR1); + dhcpInfo.gateway = ipToInteger(STR_ADDR2); + dhcpInfo.netmask = ipToInteger(STR_ADDR3); + dhcpInfo.dns1 = ipToInteger(STR_ADDR4); + dhcpInfo.dns2 = ipToInteger(STR_ADDR4); + dhcpInfo.serverAddress = ipToInteger(STR_ADDR2); + dhcpInfo.leaseDuration = LEASE_TIME; + return dhcpInfo; + } + + @Test + public void testConstructor() { + new DhcpInfo(); + } + + @Test + public void testToString() throws Exception { + final String expectedDefault = "ipaddr 0.0.0.0 gateway 0.0.0.0 netmask 0.0.0.0 " + + "dns1 0.0.0.0 dns2 0.0.0.0 DHCP server 0.0.0.0 lease 0 seconds"; + + DhcpInfo dhcpInfo = new DhcpInfo(); + + // Test default string. + assertEquals(expectedDefault, dhcpInfo.toString()); + + dhcpInfo = createDhcpInfoObject(); + + final String expected = "ipaddr " + STR_ADDR1 + " gateway " + STR_ADDR2 + " netmask " + + STR_ADDR3 + " dns1 " + STR_ADDR4 + " dns2 " + STR_ADDR4 + " DHCP server " + + STR_ADDR2 + " lease " + LEASE_TIME + " seconds"; + // Test with new values + assertEquals(expected, dhcpInfo.toString()); + } + + private boolean dhcpInfoEquals(@Nullable DhcpInfo left, @Nullable DhcpInfo right) { + if (left == null && right == null) return true; + + if (left == null || right == null) return false; + + return left.ipAddress == right.ipAddress + && left.gateway == right.gateway + && left.netmask == right.netmask + && left.dns1 == right.dns1 + && left.dns2 == right.dns2 + && left.serverAddress == right.serverAddress + && left.leaseDuration == right.leaseDuration; + } + + @Test + public void testParcelDhcpInfo() throws Exception { + // Cannot use assertParcelSane() here because this requires .equals() to work as + // defined, but DhcpInfo has a different legacy behavior that we cannot change. + final DhcpInfo dhcpInfo = createDhcpInfoObject(); + assertFieldCountEquals(7, DhcpInfo.class); + + final DhcpInfo dhcpInfoRoundTrip = parcelingRoundTrip(dhcpInfo); + assertTrue(dhcpInfoEquals(null, null)); + assertFalse(dhcpInfoEquals(null, dhcpInfoRoundTrip)); + assertFalse(dhcpInfoEquals(dhcpInfo, null)); + assertTrue(dhcpInfoEquals(dhcpInfo, dhcpInfoRoundTrip)); + } +} diff --git a/tests/net/java/android/net/NetworkStackTest.java b/tests/net/common/java/android/net/NetworkStackTest.java index f7c6c99ba622..a99aa0106655 100644 --- a/tests/net/java/android/net/NetworkStackTest.java +++ b/tests/net/common/java/android/net/NetworkStackTest.java @@ -22,16 +22,23 @@ import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; import static android.net.NetworkStack.checkNetworkStackPermission; import static android.net.NetworkStack.checkNetworkStackPermissionOr; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.when; import android.content.Context; +import android.os.Build; +import android.os.IBinder; import androidx.test.runner.AndroidJUnit4; +import com.android.testutils.DevSdkIgnoreRule; +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; + import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -41,7 +48,11 @@ import org.mockito.MockitoAnnotations; public class NetworkStackTest { private static final String [] OTHER_PERMISSION = {"otherpermission1", "otherpermission2"}; + @Rule + public DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule(); + @Mock Context mCtx; + @Mock private IBinder mConnectorBinder; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -72,4 +83,10 @@ public class NetworkStackTest { fail("Expect fail but permission granted."); } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + public void testGetService() { + NetworkStack.setServiceForTest(mConnectorBinder); + assertEquals(NetworkStack.getService(), mConnectorBinder); + } } |