diff options
517 files changed, 6047 insertions, 1673 deletions
diff --git a/Android.bp b/Android.bp index 240d803ef337..7c2f80265252 100644 --- a/Android.bp +++ b/Android.bp @@ -544,6 +544,7 @@ java_library { "android.hardware.vibrator-V1.3-java", "android.security.apc-java", "android.security.authorization-java", + "android.security.usermanager-java", "android.system.keystore2-V1-java", "android.system.suspend.control.internal-java", "cameraprotosnano", diff --git a/apex/media/framework/java/android/media/MediaTranscodeManager.java b/apex/media/framework/java/android/media/MediaTranscodeManager.java index c924d9a309d2..ca5aeb88bf33 100644 --- a/apex/media/framework/java/android/media/MediaTranscodeManager.java +++ b/apex/media/framework/java/android/media/MediaTranscodeManager.java @@ -295,8 +295,8 @@ public final class MediaTranscodeManager { /* ignore */ } } - - throw new UnsupportedOperationException("Failed to connect to MediaTranscoding service"); + Log.w(TAG, "Failed to get service"); + return null; } /* @@ -463,8 +463,7 @@ public final class MediaTranscodeManager { } }; - private ITranscodingClient registerClient(IMediaTranscodingService service) - throws UnsupportedOperationException { + private ITranscodingClient registerClient(IMediaTranscodingService service) { synchronized (mLock) { try { // Registers the client with MediaTranscoding service. @@ -476,13 +475,12 @@ public final class MediaTranscodeManager { if (mTranscodingClient != null) { mTranscodingClient.asBinder().linkToDeath(() -> onClientDied(), /* flags */ 0); } - return mTranscodingClient; - } catch (RemoteException re) { - Log.e(TAG, "Failed to register new client due to exception " + re); + } catch (Exception ex) { + Log.e(TAG, "Failed to register new client due to exception " + ex); mTranscodingClient = null; } } - throw new UnsupportedOperationException("Failed to register new client"); + return mTranscodingClient; } /** @@ -495,7 +493,9 @@ public final class MediaTranscodeManager { mUid = Os.getuid(); mPid = Os.getpid(); IMediaTranscodingService service = getService(false /*retry*/); - mTranscodingClient = registerClient(service); + if (service != null) { + mTranscodingClient = registerClient(service); + } } public static final class TranscodingRequest { @@ -1567,6 +1567,10 @@ public final class MediaTranscodeManager { if (mTranscodingClient == null) { // Try to register with the service again. IMediaTranscodingService service = getService(false /*retry*/); + if (service == null) { + throw new MediaTranscodingException.ServiceNotAvailableException( + "Service rebooting. Try again later"); + } mTranscodingClient = registerClient(service); // If still fails, throws an exception to tell client to try later. if (mTranscodingClient == null) { diff --git a/config/preloaded-classes b/config/preloaded-classes index 0c440e810ea8..c6ec37690d88 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -400,6 +400,9 @@ android.app.INotificationManager android.app.IProcessObserver$Stub$Proxy android.app.IProcessObserver$Stub android.app.IProcessObserver +android.app.IRequestFinishCallback$Stub$Proxy +android.app.IRequestFinishCallback$Stub +android.app.IRequestFinishCallback android.app.ISearchManager$Stub$Proxy android.app.ISearchManager$Stub android.app.ISearchManager diff --git a/core/api/current.txt b/core/api/current.txt index 5dee65509423..d6c783dc71b0 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -5556,6 +5556,7 @@ package android.app { method public android.graphics.drawable.Icon getSmallIcon(); method public String getSortKey(); method public long getTimeoutAfter(); + method public boolean hasImage(); method public void writeToParcel(android.os.Parcel, int); field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT; field public static final int BADGE_ICON_LARGE = 2; // 0x2 @@ -40739,7 +40740,6 @@ package android.telephony { field public static final String KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL = "simplified_network_settings_bool"; field public static final String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool"; field public static final String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool"; - field public static final String KEY_STORE_SIM_PIN_FOR_UNATTENDED_REBOOT_BOOL = "store_sim_pin_for_unattended_reboot_bool"; field public static final String KEY_SUPPORTS_CALL_COMPOSER_BOOL = "supports_call_composer_bool"; field public static final String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = "support_3gpp_call_forwarding_while_roaming_bool"; field public static final String KEY_SUPPORT_ADD_CONFERENCE_PARTICIPANTS_BOOL = "support_add_conference_participants_bool"; @@ -40840,7 +40840,6 @@ package android.telephony { field public static final int INTEGRITY_ALGORITHM_HMAC_SHA2_512_256 = 14; // 0xe field public static final int INTEGRITY_ALGORITHM_NONE = 0; // 0x0 field public static final String KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL = "iwlan.add_ke_to_child_session_rekey_bool"; - field public static final String KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL = "iwlan.add_wifi_mac_addr_to_nai_bool"; field public static final String KEY_CHILD_SA_REKEY_HARD_TIMER_SEC_INT = "iwlan.child_sa_rekey_hard_timer_sec_int"; field public static final String KEY_CHILD_SA_REKEY_SOFT_TIMER_SEC_INT = "iwlan.child_sa_rekey_soft_timer_sec_int"; field public static final String KEY_CHILD_SESSION_AES_CBC_KEY_SIZE_INT_ARRAY = "iwlan.child_session_aes_cbc_key_size_int_array"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 9c31435f78e6..7b7518d05345 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2192,6 +2192,7 @@ package android.content { field public static final String ACTION_PENDING_INCIDENT_REPORTS_CHANGED = "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED"; field public static final String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED"; field public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART"; + field public static final String ACTION_REBOOT_READY = "android.intent.action.REBOOT_READY"; field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE"; field @RequiresPermission(android.Manifest.permission.REVIEW_ACCESSIBILITY_SERVICES) public static final String ACTION_REVIEW_ACCESSIBILITY_SERVICES = "android.intent.action.REVIEW_ACCESSIBILITY_SERVICES"; field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_ONGOING_PERMISSION_USAGE = "android.intent.action.REVIEW_ONGOING_PERMISSION_USAGE"; @@ -2215,6 +2216,7 @@ package android.content { field public static final String EXTRA_INSTANT_APP_HOSTNAME = "android.intent.extra.INSTANT_APP_HOSTNAME"; field public static final String EXTRA_INSTANT_APP_SUCCESS = "android.intent.extra.INSTANT_APP_SUCCESS"; field public static final String EXTRA_INSTANT_APP_TOKEN = "android.intent.extra.INSTANT_APP_TOKEN"; + field public static final String EXTRA_IS_READY_TO_REBOOT = "android.intent.extra.IS_READY_TO_REBOOT"; field public static final String EXTRA_LONG_VERSION_CODE = "android.intent.extra.LONG_VERSION_CODE"; field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"; field public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES"; @@ -10182,6 +10184,7 @@ package android.service.notification { method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel); method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel, @NonNull android.service.notification.NotificationListenerService.RankingMap); method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean); + method public void onNotificationFeedbackReceived(@NonNull String, @NonNull android.service.notification.NotificationListenerService.RankingMap, @NonNull android.os.Bundle); method public abstract void onNotificationSnoozedUntilContext(@NonNull android.service.notification.StatusBarNotification, @NonNull String); method public void onNotificationVisibilityChanged(@NonNull String, boolean); method public void onNotificationsSeen(@NonNull java.util.List<java.lang.String>); @@ -10189,6 +10192,7 @@ package android.service.notification { method public void onPanelRevealed(int); method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int); method public final void unsnoozeNotification(@NonNull String); + field public static final String FEEDBACK_RATING = "feedback.rating"; field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService"; field public static final int SOURCE_FROM_APP = 0; // 0x0 field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1 @@ -11860,7 +11864,7 @@ package android.telephony { } public class TelephonyManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback); method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String); method public int checkCarrierPrivilegesForPackage(String); @@ -13308,19 +13312,19 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isRcsVolteSingleRegistrationCapable() throws android.telephony.ims.ImsException; + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isRcsVolteSingleRegistrationCapable() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerRcsProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback) throws android.telephony.ims.ImsException; + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void registerRcsProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void triggerRcsReconfiguration(); + method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerRcsReconfiguration(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterRcsProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback); - field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE"; + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void unregisterRcsProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback); + field @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE"; field public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS"; field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.ims.extra.SUBSCRIPTION_ID"; field public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; // 0x43 @@ -13585,10 +13589,10 @@ package android.telephony.ims { } public class SipDelegateManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void createSipDelegate(@NonNull android.telephony.ims.DelegateRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.DelegateConnectionStateCallback, @NonNull android.telephony.ims.stub.DelegateConnectionMessageCallback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void destroySipDelegate(@NonNull android.telephony.ims.SipDelegateConnection, int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; - method public void triggerFullNetworkRegistration(@NonNull android.telephony.ims.SipDelegateConnection, @IntRange(from=100, to=699) int, @Nullable String); + method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void createSipDelegate(@NonNull android.telephony.ims.DelegateRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.DelegateConnectionStateCallback, @NonNull android.telephony.ims.stub.DelegateConnectionMessageCallback) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void destroySipDelegate(@NonNull android.telephony.ims.SipDelegateConnection, int); + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isSupported() throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerFullNetworkRegistration(@NonNull android.telephony.ims.SipDelegateConnection, @IntRange(from=100, to=699) int, @Nullable String); field public static final int DENIED_REASON_INVALID = 4; // 0x4 field public static final int DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE = 1; // 0x1 field public static final int DENIED_REASON_NOT_ALLOWED = 2; // 0x2 diff --git a/core/api/test-current.txt b/core/api/test-current.txt index ff96f92da2f5..e0e84537368f 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -300,6 +300,7 @@ package android.app { method public void clickNotification(@Nullable String, int, int, boolean); method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void collapsePanels(); method public void expandNotificationsPanel(); + method public void sendNotificationFeedback(@Nullable String, @Nullable android.os.Bundle); method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setExpansionDisabledForSimNetworkLock(boolean); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 992d054737b9..a73fe71cfe1a 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -156,6 +156,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -3811,6 +3812,22 @@ public class Activity extends ContextThemeWrapper return false; } + private static final class RequestFinishCallback extends IRequestFinishCallback.Stub { + private final WeakReference<Activity> mActivityRef; + + RequestFinishCallback(WeakReference<Activity> activityRef) { + mActivityRef = activityRef; + } + + @Override + public void requestFinish() { + Activity activity = mActivityRef.get(); + if (activity != null) { + activity.mHandler.post(activity::finishAfterTransition); + } + } + } + /** * Called when the activity has detected the user's press of the back * key. The default implementation simply finishes the current activity, @@ -3834,7 +3851,8 @@ public class Activity extends ContextThemeWrapper // Inform activity task manager that the activity received a back press while at the // root of the task. This call allows ActivityTaskManager to intercept or move the task // to the back. - ActivityClient.getInstance().onBackPressedOnTaskRoot(mToken); + ActivityClient.getInstance().onBackPressedOnTaskRoot(mToken, + new RequestFinishCallback(new WeakReference<>(this))); // Activity was launched when user tapped a link in the Autofill Save UI - Save UI must // be restored now. diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java index e3b5e9a32324..fbabfac706e1 100644 --- a/core/java/android/app/ActivityClient.java +++ b/core/java/android/app/ActivityClient.java @@ -480,9 +480,9 @@ public class ActivityClient { } } - void onBackPressedOnTaskRoot(IBinder token) { + void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) { try { - getActivityClientController().onBackPressedOnTaskRoot(token); + getActivityClientController().onBackPressedOnTaskRoot(token, callback); } catch (RemoteException e) { e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl index bb743b89e00f..573931ed228e 100644 --- a/core/java/android/app/IActivityClientController.aidl +++ b/core/java/android/app/IActivityClientController.aidl @@ -17,6 +17,7 @@ package android.app; import android.app.ActivityManager; +import android.app.IRequestFinishCallback; import android.app.PictureInPictureParams; import android.content.ComponentName; import android.content.Intent; @@ -141,7 +142,8 @@ interface IActivityClientController { * Reports that an Activity received a back key press when there were no additional activities * on the back stack. */ - oneway void onBackPressedOnTaskRoot(in IBinder token); + oneway void onBackPressedOnTaskRoot(in IBinder activityToken, + in IRequestFinishCallback callback); /** Reports that the splash screen view has attached to activity. */ oneway void splashScreenAttached(in IBinder token); diff --git a/core/java/android/app/ILocalWallpaperColorConsumer.aidl b/core/java/android/app/ILocalWallpaperColorConsumer.aidl new file mode 100644 index 000000000000..28b11ec04d96 --- /dev/null +++ b/core/java/android/app/ILocalWallpaperColorConsumer.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import android.app.WallpaperColors; +import android.graphics.RectF; + +/** + * @hide + */ +oneway interface ILocalWallpaperColorConsumer { + void onColorsChanged(in RectF area, in WallpaperColors colors); +}
\ No newline at end of file diff --git a/core/java/android/app/IRequestFinishCallback.aidl b/core/java/android/app/IRequestFinishCallback.aidl new file mode 100644 index 000000000000..22c20c840e99 --- /dev/null +++ b/core/java/android/app/IRequestFinishCallback.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +/** + * This callback allows ActivityTaskManager to ask the calling Activity + * to finish in response to a call to onBackPressedOnTaskRoot. + * + * {@hide} + */ +oneway interface IRequestFinishCallback { + void requestFinish(); +} diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl index 101917bc2e07..5402381b7207 100644 --- a/core/java/android/app/IWallpaperManager.aidl +++ b/core/java/android/app/IWallpaperManager.aidl @@ -17,9 +17,11 @@ package android.app; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.app.IWallpaperManagerCallback; +import android.app.ILocalWallpaperColorConsumer; import android.app.WallpaperInfo; import android.content.ComponentName; import android.app.WallpaperColors; @@ -162,6 +164,18 @@ interface IWallpaperManager { WallpaperColors getWallpaperColors(int which, int userId, int displayId); /** + * @hide + */ + void removeOnLocalColorsChangedListener( + in ILocalWallpaperColorConsumer callback, int which, int userId, int displayId); + + /** + * @hide + */ + void addOnLocalColorsChangedListener(in ILocalWallpaperColorConsumer callback, + in List<RectF> regions, int which, int userId, int displayId); + + /** * Register a callback to receive color updates from a display */ void registerWallpaperColorsCallback(IWallpaperManagerCallback cb, int userId, int displayId); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 77daf8ddf08f..899cdb5eb572 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3624,7 +3624,7 @@ public class Notification implements Parcelable private Bundle mUserExtras = new Bundle(); private Style mStyle; @UnsupportedAppUsage - private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS); + private ArrayList<Action> mActions = new ArrayList<>(MAX_ACTION_BUTTONS); private ArrayList<Person> mPersonList = new ArrayList<>(); private ContrastColorUtil mColorUtil; private boolean mIsLegacy; @@ -4878,6 +4878,16 @@ public class Notification implements Parcelable return this; } + private void bindPhishingAlertIcon(RemoteViews contentView, StandardTemplateParams p) { + // TODO(b/180334837): Get buy-in on this color, or make sure to give this the + // accent color, while still accommodating the colorized state. + contentView.setDrawableTint( + R.id.phishing_alert, + false /* targetBackground */, + getPrimaryTextColor(p), + PorterDuff.Mode.SRC_ATOP); + } + private Drawable getProfileBadgeDrawable() { if (mContext.getUserId() == UserHandle.USER_SYSTEM) { // This user can never be a badged profile, @@ -5279,6 +5289,7 @@ public class Notification implements Parcelable hasTextToLeft |= bindHeaderAppName(contentView, p, true /* force */); } bindHeaderChronometerAndTime(contentView, p, hasTextToLeft); + bindPhishingAlertIcon(contentView, p); bindProfileBadge(contentView, p); bindAlertedIcon(contentView, p); bindExpandButton(contentView, p); @@ -5474,15 +5485,18 @@ public class Notification implements Parcelable RemoteViews.MARGIN_BOTTOM, bottomMarginDimen); } - private static List<Notification.Action> filterOutContextualActions( - List<Notification.Action> actions) { - List<Notification.Action> nonContextualActions = new ArrayList<>(); - for (Notification.Action action : actions) { + /** + * Returns the actions that are not contextual. + */ + private @NonNull List<Notification.Action> getNonContextualActions() { + if (mActions == null) return Collections.emptyList(); + List<Notification.Action> contextualActions = new ArrayList<>(); + for (Notification.Action action : mActions) { if (!action.isContextual()) { - nonContextualActions.add(action); + contextualActions.add(action); } } - return nonContextualActions; + return contextualActions; } private RemoteViews applyStandardTemplateWithActions(int layoutId, @@ -5493,9 +5507,9 @@ public class Notification implements Parcelable boolean validRemoteInput = false; - // In the UI contextual actions appear separately from the standard actions, so we + // In the UI, contextual actions appear separately from the standard actions, so we // filter them out here. - List<Notification.Action> nonContextualActions = filterOutContextualActions(mActions); + List<Notification.Action> nonContextualActions = getNonContextualActions(); int N = nonContextualActions.size(); boolean emphazisedMode = mN.fullScreenIntent != null; @@ -6753,6 +6767,31 @@ public class Notification implements Parcelable } /** + * @return true if the notification has image + */ + public boolean hasImage() { + if (MessagingStyle.class.equals(getNotificationStyle()) && extras != null) { + final Parcelable[] messages = extras.getParcelableArray(EXTRA_MESSAGES); + if (!ArrayUtils.isEmpty(messages)) { + for (MessagingStyle.Message m : MessagingStyle.Message + .getMessagesFromBundleArray(messages)) { + if (m.getDataUri() != null + && m.getDataMimeType() != null + && m.getDataMimeType().startsWith("image/")) { + return true; + } + } + } + } else if (hasLargeIcon()) { + return true; + } else if (extras.containsKey(EXTRA_BACKGROUND_IMAGE_URI)) { + return true; + } + return false; + } + + + /** * @removed */ @SystemApi @@ -9241,7 +9280,7 @@ public class Notification implements Parcelable lastAction = answerAction; } // For consistency with the standard actions bar, contextual actions are ignored. - for (Action action : Builder.filterOutContextualActions(mBuilder.mActions)) { + for (Action action : mBuilder.getNonContextualActions()) { if (actions.size() >= MAX_ACTION_BUTTONS - 1) { break; } diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 7d2bc1a5f8e2..afcf63b0f1e2 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -27,6 +27,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Binder; import android.os.Build; +import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -286,6 +287,23 @@ public class StatusBarManager { } /** + * Simulate notification feedback for testing + * + * @hide + */ + @TestApi + public void sendNotificationFeedback(@Nullable String key, @Nullable Bundle feedback) { + try { + final IStatusBarService svc = getService(); + if (svc != null) { + svc.onNotificationFeedbackReceived(key, feedback); + } + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** * Expand the notifications panel. * * @hide diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index ac2f22357013..d7587bdce997 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -66,6 +66,7 @@ import android.os.RemoteException; import android.os.StrictMode; import android.os.SystemProperties; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.util.Pair; import android.view.Display; @@ -107,6 +108,8 @@ public class WallpaperManager { private static boolean DEBUG = false; private float mWallpaperXStep = -1; private float mWallpaperYStep = -1; + private static final @NonNull RectF LOCAL_COLOR_BOUNDS = + new RectF(0, 0, 1, 1); /** {@hide} */ private static final String PROP_WALLPAPER = "ro.config.wallpaper"; @@ -309,6 +312,8 @@ public class WallpaperManager { private int mCachedWallpaperUserId; private Bitmap mDefaultWallpaper; private Handler mMainLooperHandler; + private ArrayMap<LocalWallpaperColorConsumer, ILocalWallpaperColorConsumer> + mLocalColorCallbacks = new ArrayMap<>(); Globals(IWallpaperManager service, Looper looper) { mService = service; @@ -350,6 +355,40 @@ public class WallpaperManager { } } + private ILocalWallpaperColorConsumer wrap(LocalWallpaperColorConsumer callback) { + ILocalWallpaperColorConsumer callback2 = new ILocalWallpaperColorConsumer.Stub() { + @Override + public void onColorsChanged(RectF area, WallpaperColors colors) { + callback.onColorsChanged(area, colors); + } + }; + mLocalColorCallbacks.put(callback, callback2); + return callback2; + } + + public void addOnColorsChangedListener(@NonNull LocalWallpaperColorConsumer callback, + @NonNull List<RectF> regions, int which, int userId, int displayId) { + try { + mService.addOnLocalColorsChangedListener(wrap(callback) , regions, which, + userId, displayId); + } catch (RemoteException e) { + // Can't get colors, connection lost. + } + } + + public void removeOnColorsChangedListener( + @NonNull LocalWallpaperColorConsumer callback, int which, int userId, + int displayId) { + ILocalWallpaperColorConsumer callback2 = mLocalColorCallbacks.remove(callback); + if (callback2 == null) return; + try { + mService.removeOnLocalColorsChangedListener( + callback2, which, userId, displayId); + } catch (RemoteException e) { + // Can't get colors, connection lost. + } + } + /** * Stop listening to wallpaper color events. * @@ -1057,6 +1096,29 @@ public class WallpaperManager { } /** + * @hide + */ + public void addOnColorsChangedListener(@NonNull LocalWallpaperColorConsumer callback, + List<RectF> regions) throws IllegalArgumentException { + for (RectF region : regions) { + if (!LOCAL_COLOR_BOUNDS.contains(region)) { + throw new IllegalArgumentException("Regions must be within bounds " + + LOCAL_COLOR_BOUNDS); + } + } + sGlobals.addOnColorsChangedListener(callback, regions, FLAG_SYSTEM, + mContext.getUserId(), mContext.getDisplayId()); + } + + /** + * @hide + */ + public void removeOnColorsChangedListener(@NonNull LocalWallpaperColorConsumer callback) { + sGlobals.removeOnColorsChangedListener(callback, FLAG_SYSTEM, mContext.getUserId(), + mContext.getDisplayId()); + } + + /** * Version of {@link #getWallpaperFile(int)} that can access the wallpaper data * for a given user. The caller must hold the INTERACT_ACROSS_USERS_FULL * permission to access another user's wallpaper data. @@ -2202,4 +2264,18 @@ public class WallpaperManager { onColorsChanged(colors, which); } } + + /** + * Callback to update a consumer with a local color change + * @hide + */ + public interface LocalWallpaperColorConsumer { + + /** + * Gets called when a color of an area gets updated + * @param area + * @param colors + */ + void onColorsChanged(RectF area, WallpaperColors colors); + } } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 0093b6342da6..4284dc2117c5 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4583,6 +4583,14 @@ public abstract class Context { public static final String AUTOFILL_MANAGER_SERVICE = "autofill"; /** + * Official published name of the (internal) text to speech manager service. + * + * @hide + * @see #getSystemService(String) + */ + public static final String TEXT_TO_SPEECH_MANAGER_SERVICE = "texttospeech"; + + /** * Official published name of the content capture service. * * @hide @@ -4745,7 +4753,7 @@ public abstract class Context { /** * Use with {@link #getSystemService(String)} to retrieve an - * {@link android.app.scheduling.RebootReadinessManagerService} for communicating + * {@link android.scheduling.RebootReadinessManagerService} for communicating * with the reboot readiness detector. * * @see #getSystemService(String) diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 4abd8cd7d37b..d53d20a8b192 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4754,6 +4754,32 @@ public class Intent implements Parcelable, Cloneable { public static final String ACTION_PACKAGE_NEEDS_INTEGRITY_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION"; + /** + * Broadcast Action: Indicates that the device's reboot readiness has changed. + * + * <p>This broadcast will be sent with an extra that indicates whether or not the device is + * ready to reboot. + * <p> + * The receiver <em>must</em> have the {@link android.Manifest.permission#REBOOT} permission. + * <p class="note"> + * This is a protected intent that can only be sent by the system. + * + * @see #EXTRA_IS_READY_TO_REBOOT + * @hide + */ + @SystemApi + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_REBOOT_READY = "android.intent.action.REBOOT_READY"; + + /** + * A boolean extra used with {@link #ACTION_REBOOT_READY} which indicates if the + * device is ready to reboot. + * Will be {@code true} if ready to reboot, {@code false} otherwise. + * @hide + */ + @SystemApi + public static final String EXTRA_IS_READY_TO_REBOOT = "android.intent.extra.IS_READY_TO_REBOOT"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Standard intent categories (see addCategory()). diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index fdb00c690ffe..f9122b1f6c8b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4072,6 +4072,8 @@ public abstract class PackageManager { /** * Permission flag: This location permission is selected as the level of granularity of * location accuracy. + * Example: If this flag is set for ACCESS_FINE_LOCATION, FINE location is the selected location + * accuracy for location permissions. * * @hide */ diff --git a/core/java/android/hardware/OWNERS b/core/java/android/hardware/OWNERS index 3295042b0b35..2b4e4a106cec 100644 --- a/core/java/android/hardware/OWNERS +++ b/core/java/android/hardware/OWNERS @@ -3,3 +3,6 @@ per-file *Camera*=cychen@google.com,epeev@google.com,etalvala@google.com,shuzhen # Sensor Privacy per-file *SensorPrivacy* = file:platform/frameworks/native:/libs/sensorprivacy/OWNERS + +# Sensors framework +per-file *Sensor*,*Trigger* = file:platform/frameworks/native:/services/sensorservice/OWNERS diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 9d086cf203e2..fc795d8a0488 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -114,6 +114,21 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing */ public static final int SENSOR_ID_ANY = -1; + private static class RemoveTracker { + static final int REMOVE_SINGLE = 1; + static final int REMOVE_ALL = 2; + @IntDef({REMOVE_SINGLE, REMOVE_ALL}) + @interface RemoveRequest {} + + final @RemoveRequest int mRemoveRequest; + @Nullable final Fingerprint mSingleFingerprint; + + RemoveTracker(@RemoveRequest int request, @Nullable Fingerprint fingerprint) { + mRemoveRequest = request; + mSingleFingerprint = fingerprint; + } + } + private IFingerprintService mService; private Context mContext; private IBinder mToken = new Binder(); @@ -123,10 +138,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing private RemovalCallback mRemovalCallback; private GenerateChallengeCallback mGenerateChallengeCallback; private CryptoObject mCryptoObject; - private Fingerprint mRemovalFingerprint; + @Nullable private RemoveTracker mRemoveTracker; private Handler mHandler; - /** * Retrieves a list of properties for all fingerprint sensors on the device. * @hide @@ -736,7 +750,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing public void remove(Fingerprint fp, int userId, RemovalCallback callback) { if (mService != null) try { mRemovalCallback = callback; - mRemovalFingerprint = fp; + mRemoveTracker = new RemoveTracker(RemoveTracker.REMOVE_SINGLE, fp); mService.remove(mToken, fp.getBiometricId(), userId, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { @@ -753,6 +767,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing if (mService != null) { try { mRemovalCallback = callback; + mRemoveTracker = new RemoveTracker(RemoveTracker.REMOVE_ALL, null /* fp */); mService.removeAll(mToken, userId, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -1056,16 +1071,29 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing if (mRemovalCallback == null) { return; } - if (fingerprint == null) { - Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null"); + + if (mRemoveTracker == null) { + Slog.w(TAG, "Removal tracker is null"); return; } - int fingerId = fingerprint.getBiometricId(); - int reqFingerId = mRemovalFingerprint.getBiometricId(); - if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) { - Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId); - return; + if (mRemoveTracker.mRemoveRequest == RemoveTracker.REMOVE_SINGLE) { + if (fingerprint == null) { + Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null"); + return; + } + + if (mRemoveTracker.mSingleFingerprint == null) { + Slog.e(TAG, "Missing fingerprint"); + return; + } + + final int fingerId = fingerprint.getBiometricId(); + int reqFingerId = mRemoveTracker.mSingleFingerprint.getBiometricId(); + if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) { + Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId); + return; + } } mRemovalCallback.onRemovalSucceeded(fingerprint, remaining); @@ -1122,7 +1150,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing mAuthenticationCallback.onAuthenticationError(clientErrMsgId, getErrorString(mContext, errMsgId, vendorCode)); } else if (mRemovalCallback != null) { - mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId, + final Fingerprint fp = mRemoveTracker != null + ? mRemoveTracker.mSingleFingerprint : null; + mRemovalCallback.onRemovalError(fp, clientErrMsgId, getErrorString(mContext, errMsgId, vendorCode)); } } diff --git a/core/java/android/net/NetworkState.java b/core/java/android/net/NetworkState.java index e466d2e626be..813fde1c15f2 100644 --- a/core/java/android/net/NetworkState.java +++ b/core/java/android/net/NetworkState.java @@ -41,7 +41,6 @@ public class NetworkState implements Parcelable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public final Network network; public final String subscriberId; - public final String networkId; public final int legacyNetworkType; private NetworkState() { @@ -50,35 +49,33 @@ public class NetworkState implements Parcelable { networkCapabilities = null; network = null; subscriberId = null; - networkId = null; legacyNetworkType = 0; } public NetworkState(int legacyNetworkType, @NonNull LinkProperties linkProperties, @NonNull NetworkCapabilities networkCapabilities, @NonNull Network network, - @Nullable String subscriberId, @Nullable String networkId) { + @Nullable String subscriberId) { this(legacyNetworkType, new NetworkInfo(legacyNetworkType, 0, null, null), linkProperties, - networkCapabilities, network, subscriberId, networkId); + networkCapabilities, network, subscriberId); } // Constructor that used internally in ConnectivityService mainline module. public NetworkState(@NonNull NetworkInfo networkInfo, @NonNull LinkProperties linkProperties, @NonNull NetworkCapabilities networkCapabilities, @NonNull Network network, - String subscriberId, String networkId) { + @Nullable String subscriberId) { this(networkInfo.getType(), networkInfo, linkProperties, - networkCapabilities, network, subscriberId, networkId); + networkCapabilities, network, subscriberId); } public NetworkState(int legacyNetworkType, @NonNull NetworkInfo networkInfo, @NonNull LinkProperties linkProperties, @NonNull NetworkCapabilities networkCapabilities, @NonNull Network network, - String subscriberId, String networkId) { + @Nullable String subscriberId) { this.networkInfo = networkInfo; this.linkProperties = linkProperties; this.networkCapabilities = networkCapabilities; this.network = network; this.subscriberId = subscriberId; - this.networkId = networkId; this.legacyNetworkType = legacyNetworkType; // This object is an atomic view of a network, so the various components @@ -99,7 +96,6 @@ public class NetworkState implements Parcelable { networkCapabilities = in.readParcelable(null); network = in.readParcelable(null); subscriberId = in.readString(); - networkId = in.readString(); legacyNetworkType = in.readInt(); } @@ -115,7 +111,6 @@ public class NetworkState implements Parcelable { out.writeParcelable(networkCapabilities, flags); out.writeParcelable(network, flags); out.writeString(subscriberId); - out.writeString(networkId); out.writeInt(legacyNetworkType); } diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java index bf229e0b24df..c6efaace76d7 100644 --- a/core/java/android/os/BatteryConsumer.java +++ b/core/java/android/os/BatteryConsumer.java @@ -130,7 +130,7 @@ public abstract class BatteryConsumer { * Total power consumed by this consumer, in mAh. */ public double getConsumedPower() { - return mPowerComponents.getTotalPowerConsumed(); + return mPowerComponents.getTotalConsumedPower(); } /** diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 01a89017ab6c..cf9b534fc29f 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1671,7 +1671,7 @@ public abstract class BatteryStats implements Parcelable { public char batteryVoltage; // The charge of the battery in micro-Ampere-hours. - public int batteryChargeUAh; + public int batteryChargeUah; public double modemRailChargeMah; public double wifiRailChargeMah; @@ -1884,7 +1884,7 @@ public abstract class BatteryStats implements Parcelable { bat = (((int)batteryTemperature)&0xffff) | ((((int)batteryVoltage)<<16)&0xffff0000); dest.writeInt(bat); - dest.writeInt(batteryChargeUAh); + dest.writeInt(batteryChargeUah); dest.writeDouble(modemRailChargeMah); dest.writeDouble(wifiRailChargeMah); dest.writeInt(states); @@ -1916,7 +1916,7 @@ public abstract class BatteryStats implements Parcelable { int bat2 = src.readInt(); batteryTemperature = (short)(bat2&0xffff); batteryVoltage = (char)((bat2>>16)&0xffff); - batteryChargeUAh = src.readInt(); + batteryChargeUah = src.readInt(); modemRailChargeMah = src.readDouble(); wifiRailChargeMah = src.readDouble(); states = src.readInt(); @@ -1959,7 +1959,7 @@ public abstract class BatteryStats implements Parcelable { batteryPlugType = 0; batteryTemperature = 0; batteryVoltage = 0; - batteryChargeUAh = 0; + batteryChargeUah = 0; modemRailChargeMah = 0; wifiRailChargeMah = 0; states = 0; @@ -1991,7 +1991,7 @@ public abstract class BatteryStats implements Parcelable { batteryPlugType = o.batteryPlugType; batteryTemperature = o.batteryTemperature; batteryVoltage = o.batteryVoltage; - batteryChargeUAh = o.batteryChargeUAh; + batteryChargeUah = o.batteryChargeUah; modemRailChargeMah = o.modemRailChargeMah; wifiRailChargeMah = o.wifiRailChargeMah; states = o.states; @@ -2025,7 +2025,7 @@ public abstract class BatteryStats implements Parcelable { && batteryPlugType == o.batteryPlugType && batteryTemperature == o.batteryTemperature && batteryVoltage == o.batteryVoltage - && batteryChargeUAh == o.batteryChargeUAh + && batteryChargeUah == o.batteryChargeUah && modemRailChargeMah == o.modemRailChargeMah && wifiRailChargeMah == o.wifiRailChargeMah && states == o.states @@ -2859,6 +2859,11 @@ public abstract class BatteryStats implements Parcelable { public abstract boolean getIsOnBattery(); /** + * Returns the timestamp of when battery stats collection started, in microseconds. + */ + public abstract long getStatsStartRealtime(); + + /** * Returns a SparseArray containing the statistics for each uid. */ @UnsupportedAppUsage @@ -6520,7 +6525,7 @@ public abstract class BatteryStats implements Parcelable { item.append(checkin ? ",Bv=" : " volt="); item.append(oldVolt); } - final int chargeMAh = rec.batteryChargeUAh / 1000; + final int chargeMAh = rec.batteryChargeUah / 1000; if (oldChargeMAh != chargeMAh) { oldChargeMAh = chargeMAh; item.append(checkin ? ",Bcc=" : " charge="); diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 305815ff9e51..35a5a7c7c1d0 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -17,7 +17,7 @@ package android.os; import android.annotation.NonNull; -import android.annotation.SuppressLint; +import android.util.Range; import android.util.SparseArray; import java.util.ArrayList; @@ -31,35 +31,59 @@ import java.util.List; public final class BatteryUsageStats implements Parcelable { private final double mConsumedPower; private final int mDischargePercentage; + private final long mStatsStartRealtimeMs; + private final double mDischargedPowerLowerBound; + private final double mDischargedPowerUpperBound; private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers; private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers; private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers; private BatteryUsageStats(@NonNull Builder builder) { - mConsumedPower = builder.mConsumedPower; + mStatsStartRealtimeMs = builder.mStatsStartRealtimeMs; mDischargePercentage = builder.mDischargePercentage; + mDischargedPowerLowerBound = builder.mDischargedPowerLowerBoundMah; + mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah; - int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size(); + double totalPower = 0; + + final int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size(); mUidBatteryConsumers = new ArrayList<>(uidBatteryConsumerCount); for (int i = 0; i < uidBatteryConsumerCount; i++) { - UidBatteryConsumer.Builder uidBatteryConsumerBuilder = + final UidBatteryConsumer.Builder uidBatteryConsumerBuilder = builder.mUidBatteryConsumerBuilders.valueAt(i); if (!uidBatteryConsumerBuilder.isExcludedFromBatteryUsageStats()) { - mUidBatteryConsumers.add(uidBatteryConsumerBuilder.build()); + final UidBatteryConsumer consumer = uidBatteryConsumerBuilder.build(); + totalPower += consumer.getConsumedPower(); + mUidBatteryConsumers.add(consumer); } } - int systemBatteryConsumerCount = builder.mSystemBatteryConsumerBuilders.size(); + final int systemBatteryConsumerCount = builder.mSystemBatteryConsumerBuilders.size(); mSystemBatteryConsumers = new ArrayList<>(systemBatteryConsumerCount); for (int i = 0; i < systemBatteryConsumerCount; i++) { - mSystemBatteryConsumers.add(builder.mSystemBatteryConsumerBuilders.valueAt(i).build()); + final SystemBatteryConsumer consumer = + builder.mSystemBatteryConsumerBuilders.valueAt(i).build(); + totalPower += consumer.getConsumedPower(); + mSystemBatteryConsumers.add(consumer); } - int userBatteryConsumerCount = builder.mUserBatteryConsumerBuilders.size(); + final int userBatteryConsumerCount = builder.mUserBatteryConsumerBuilders.size(); mUserBatteryConsumers = new ArrayList<>(userBatteryConsumerCount); for (int i = 0; i < userBatteryConsumerCount; i++) { - mUserBatteryConsumers.add(builder.mUserBatteryConsumerBuilders.valueAt(i).build()); + final UserBatteryConsumer consumer = + builder.mUserBatteryConsumerBuilders.valueAt(i).build(); + totalPower += consumer.getConsumedPower(); + mUserBatteryConsumers.add(consumer); } + + mConsumedPower = totalPower; + } + + /** + * Timestamp of the latest battery stats reset, in milliseconds. + */ + public long getStatsStartRealtime() { + return mStatsStartRealtimeMs; } /** @@ -71,6 +95,14 @@ public final class BatteryUsageStats implements Parcelable { } /** + * Returns the discharged power since BatteryStats were last reset, in mAh as an estimated + * range. + */ + public Range<Double> getDischargedPowerRange() { + return Range.create(mDischargedPowerLowerBound, mDischargedPowerUpperBound); + } + + /** * Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully * charged), in mAh */ @@ -99,23 +131,29 @@ public final class BatteryUsageStats implements Parcelable { } private BatteryUsageStats(@NonNull Parcel source) { + mStatsStartRealtimeMs = source.readLong(); + mConsumedPower = source.readDouble(); + mDischargePercentage = source.readInt(); + mDischargedPowerLowerBound = source.readDouble(); + mDischargedPowerUpperBound = source.readDouble(); mUidBatteryConsumers = new ArrayList<>(); source.readParcelableList(mUidBatteryConsumers, getClass().getClassLoader()); mSystemBatteryConsumers = new ArrayList<>(); source.readParcelableList(mSystemBatteryConsumers, getClass().getClassLoader()); mUserBatteryConsumers = new ArrayList<>(); source.readParcelableList(mUserBatteryConsumers, getClass().getClassLoader()); - mConsumedPower = source.readDouble(); - mDischargePercentage = source.readInt(); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeLong(mStatsStartRealtimeMs); + dest.writeDouble(mConsumedPower); + dest.writeInt(mDischargePercentage); + dest.writeDouble(mDischargedPowerLowerBound); + dest.writeDouble(mDischargedPowerUpperBound); dest.writeParcelableList(mUidBatteryConsumers, flags); dest.writeParcelableList(mSystemBatteryConsumers, flags); dest.writeParcelableList(mUserBatteryConsumers, flags); - dest.writeDouble(mConsumedPower); - dest.writeInt(mDischargePercentage); } @NonNull @@ -135,8 +173,10 @@ public final class BatteryUsageStats implements Parcelable { public static final class Builder { private final int mCustomPowerComponentCount; private final int mCustomTimeComponentCount; - private double mConsumedPower; + private long mStatsStartRealtimeMs; private int mDischargePercentage; + private double mDischargedPowerLowerBoundMah; + private double mDischargedPowerUpperBoundMah; private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders = new SparseArray<>(); private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders = @@ -158,10 +198,17 @@ public final class BatteryUsageStats implements Parcelable { } /** + * Sets the timestamp of the latest battery stats reset, in milliseconds. + */ + public Builder setStatsStartRealtime(long statsStartRealtimeMs) { + mStatsStartRealtimeMs = statsStartRealtimeMs; + return this; + } + + /** * Sets the battery discharge amount since BatteryStats reset as percentage of the full * charge. */ - @SuppressLint("PercentageInt") // See b/174188159 @NonNull public Builder setDischargePercentage(int dischargePercentage) { mDischargePercentage = dischargePercentage; @@ -169,11 +216,13 @@ public final class BatteryUsageStats implements Parcelable { } /** - * Sets the battery discharge amount since BatteryStats reset, in mAh. + * Sets the estimated battery discharge range. */ @NonNull - public Builder setConsumedPower(double consumedPower) { - mConsumedPower = consumedPower; + public Builder setDischargedPowerRange(double dischargedPowerLowerBoundMah, + double dischargedPowerUpperBoundMah) { + mDischargedPowerLowerBoundMah = dischargedPowerLowerBoundMah; + mDischargedPowerUpperBoundMah = dischargedPowerUpperBoundMah; return this; } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 33deddae01b6..874add5cdbd8 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -24,7 +24,6 @@ import android.net.Network; import android.net.NetworkStats; import android.net.RouteInfo; import android.net.UidRange; -import android.os.INetworkActivityListener; /** * @hide @@ -294,25 +293,6 @@ interface INetworkManagementService @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) boolean isBandwidthControlEnabled(); - /** - * Sets idletimer for an interface. - * - * This either initializes a new idletimer or increases its - * reference-counting if an idletimer already exists for given - * {@code iface}. - * - * {@code type} is the type of the interface, such as TYPE_MOBILE. - * - * Every {@code addIdleTimer} should be paired with a - * {@link removeIdleTimer} to cleanup when the network disconnects. - */ - void addIdleTimer(String iface, int timeout, int type); - - /** - * Removes idletimer for an interface. - */ - void removeIdleTimer(String iface); - void setFirewallEnabled(boolean enabled); boolean isFirewallEnabled(); void setFirewallInterfaceRule(String iface, boolean allow); @@ -320,21 +300,6 @@ interface INetworkManagementService void setFirewallUidRules(int chain, in int[] uids, in int[] rules); void setFirewallChainEnabled(int chain, boolean enable); - /** - * Start listening for mobile activity state changes. - */ - void registerNetworkActivityListener(INetworkActivityListener listener); - - /** - * Stop listening for mobile activity state changes. - */ - void unregisterNetworkActivityListener(INetworkActivityListener listener); - - /** - * Check whether the mobile radio is currently active. - */ - boolean isNetworkActive(); - void addLegacyRouteForNetId(int netId, in RouteInfo routeInfo, int uid); /** diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java index ac2328504f74..d239b23b6ff6 100644 --- a/core/java/android/os/PowerComponents.java +++ b/core/java/android/os/PowerComponents.java @@ -29,38 +29,38 @@ class PowerComponents { public static final int CUSTOM_TIME_COMPONENT_OFFSET = BatteryConsumer.TIME_COMPONENT_COUNT - BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID; - private final double mTotalPowerConsumed; - private final double[] mPowerComponents; - private final long[] mTimeComponents; + private final double mTotalConsumedPowerMah; + private final double[] mPowerComponentsMah; + private final long[] mTimeComponentsMs; private final int mCustomPowerComponentCount; PowerComponents(@NonNull Builder builder) { mCustomPowerComponentCount = builder.mCustomPowerComponentCount; - mPowerComponents = builder.mPowerComponents; - mTimeComponents = builder.mTimeComponents; - mTotalPowerConsumed = builder.getTotalPower(); + mPowerComponentsMah = builder.mPowerComponentsMah; + mTimeComponentsMs = builder.mTimeComponentsMs; + mTotalConsumedPowerMah = builder.getTotalPower(); } PowerComponents(@NonNull Parcel source) { - mTotalPowerConsumed = source.readDouble(); + mTotalConsumedPowerMah = source.readDouble(); mCustomPowerComponentCount = source.readInt(); - mPowerComponents = source.createDoubleArray(); - mTimeComponents = source.createLongArray(); + mPowerComponentsMah = source.createDoubleArray(); + mTimeComponentsMs = source.createLongArray(); } /** Writes contents to Parcel */ void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeDouble(mTotalPowerConsumed); + dest.writeDouble(mTotalConsumedPowerMah); dest.writeInt(mCustomPowerComponentCount); - dest.writeDoubleArray(mPowerComponents); - dest.writeLongArray(mTimeComponents); + dest.writeDoubleArray(mPowerComponentsMah); + dest.writeLongArray(mTimeComponentsMs); } /** * Total power consumed by this consumer, in mAh. */ - public double getTotalPowerConsumed() { - return mTotalPowerConsumed; + public double getTotalConsumedPower() { + return mTotalConsumedPowerMah; } /** @@ -76,7 +76,7 @@ class PowerComponents { "Unsupported power component ID: " + componentId); } try { - return mPowerComponents[componentId]; + return mPowerComponentsMah[componentId]; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException("Unsupported power component ID: " + componentId); } @@ -92,7 +92,7 @@ class PowerComponents { if (componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID && componentId < BatteryConsumer.LAST_CUSTOM_POWER_COMPONENT_ID) { try { - return mPowerComponents[CUSTOM_POWER_COMPONENT_OFFSET + componentId]; + return mPowerComponentsMah[CUSTOM_POWER_COMPONENT_OFFSET + componentId]; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( "Unsupported custom power component ID: " + componentId); @@ -116,7 +116,7 @@ class PowerComponents { "Unsupported time component ID: " + componentId); } try { - return mTimeComponents[componentId]; + return mTimeComponentsMs[componentId]; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException("Unsupported power component ID: " + componentId); } @@ -134,7 +134,7 @@ class PowerComponents { "Unsupported custom time component ID: " + componentId); } try { - return mTimeComponents[CUSTOM_TIME_COMPONENT_OFFSET + componentId]; + return mTimeComponentsMs[CUSTOM_TIME_COMPONENT_OFFSET + componentId]; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( "Unsupported custom time component ID: " + componentId); @@ -145,16 +145,16 @@ class PowerComponents { * Builder for PowerComponents. */ static final class Builder { - private final double[] mPowerComponents; + private final double[] mPowerComponentsMah; private final int mCustomPowerComponentCount; - private final long[] mTimeComponents; + private final long[] mTimeComponentsMs; Builder(int customPowerComponentCount, int customTimeComponentCount) { mCustomPowerComponentCount = customPowerComponentCount; int powerComponentCount = BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount; - mPowerComponents = new double[powerComponentCount]; - mTimeComponents = + mPowerComponentsMah = new double[powerComponentCount]; + mTimeComponentsMs = new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount]; } @@ -173,7 +173,7 @@ class PowerComponents { "Unsupported power component ID: " + componentId); } try { - mPowerComponents[componentId] = componentPower; + mPowerComponentsMah[componentId] = componentPower; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( "Unsupported power component ID: " + componentId); @@ -192,7 +192,8 @@ class PowerComponents { if (componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID && componentId < BatteryConsumer.LAST_CUSTOM_POWER_COMPONENT_ID) { try { - mPowerComponents[CUSTOM_POWER_COMPONENT_OFFSET + componentId] = componentPower; + mPowerComponentsMah[CUSTOM_POWER_COMPONENT_OFFSET + componentId] = + componentPower; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( "Unsupported custom power component ID: " + componentId); @@ -219,7 +220,7 @@ class PowerComponents { "Unsupported time component ID: " + componentId); } try { - mTimeComponents[componentId] = componentUsageDurationMillis; + mTimeComponentsMs[componentId] = componentUsageDurationMillis; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( "Unsupported time component ID: " + componentId); @@ -241,7 +242,7 @@ class PowerComponents { "Unsupported custom time component ID: " + componentId); } try { - mTimeComponents[CUSTOM_TIME_COMPONENT_OFFSET + componentId] = + mTimeComponentsMs[CUSTOM_TIME_COMPONENT_OFFSET + componentId] = componentUsageDurationMillis; } catch (ArrayIndexOutOfBoundsException e) { throw new IllegalArgumentException( @@ -251,11 +252,11 @@ class PowerComponents { } public void addPowerAndDuration(Builder other) { - for (int i = 0; i < mPowerComponents.length; i++) { - mPowerComponents[i] += other.mPowerComponents[i]; + for (int i = 0; i < mPowerComponentsMah.length; i++) { + mPowerComponentsMah[i] += other.mPowerComponentsMah[i]; } - for (int i = 0; i < mTimeComponents.length; i++) { - mTimeComponents[i] += other.mTimeComponents[i]; + for (int i = 0; i < mTimeComponentsMs.length; i++) { + mTimeComponentsMs[i] += other.mTimeComponentsMs[i]; } } @@ -264,11 +265,11 @@ class PowerComponents { * by the time the {@code build()} method is called. */ public double getTotalPower() { - double totalPower = 0; - for (int i = mPowerComponents.length - 1; i >= 0; i--) { - totalPower += mPowerComponents[i]; + double totalPowerMah = 0; + for (int i = mPowerComponentsMah.length - 1; i >= 0; i--) { + totalPowerMah += mPowerComponentsMah[i]; } - return totalPower; + return totalPowerMah; } /** diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 3774fb595680..ff9b4f41ef3b 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1629,6 +1629,12 @@ public final class PowerManager { * <p> * Requires the {@link android.Manifest.permission#REBOOT} permission. * </p> + * <p> + * If the {@code reason} string contains ",quiescent", then the screen stays off during reboot + * and is not turned on again until the user triggers the device to wake up (for example, + * by pressing the power key). + * This behavior applies to Android TV devices launched on Android 11 (API level 30) or higher. + * </p> * * @param reason code to pass to the kernel (e.g., "recovery") to * request special boot modes, or null. diff --git a/core/java/android/os/SystemBatteryConsumer.java b/core/java/android/os/SystemBatteryConsumer.java index fc4aa93b97c7..a02f97f593f5 100644 --- a/core/java/android/os/SystemBatteryConsumer.java +++ b/core/java/android/os/SystemBatteryConsumer.java @@ -45,10 +45,10 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable DRAIN_TYPE_FLASHLIGHT, DRAIN_TYPE_IDLE, DRAIN_TYPE_MEMORY, - DRAIN_TYPE_OVERCOUNTED, + // Reserved: OVERCOUNTED, DRAIN_TYPE_PHONE, DRAIN_TYPE_SCREEN, - DRAIN_TYPE_UNACCOUNTED, + // Reserved: UNACCOUNTED, // Reserved: USER, DRAIN_TYPE_WIFI, }) @@ -63,10 +63,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable public static final int DRAIN_TYPE_FLASHLIGHT = 5; public static final int DRAIN_TYPE_IDLE = 6; public static final int DRAIN_TYPE_MEMORY = 7; - public static final int DRAIN_TYPE_OVERCOUNTED = 8; public static final int DRAIN_TYPE_PHONE = 9; public static final int DRAIN_TYPE_SCREEN = 10; - public static final int DRAIN_TYPE_UNACCOUNTED = 11; public static final int DRAIN_TYPE_WIFI = 13; @DrainType diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl index 2b7cb1db174a..b384b66bf680 100644 --- a/core/java/android/service/notification/INotificationListener.aidl +++ b/core/java/android/service/notification/INotificationListener.aidl @@ -20,6 +20,7 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.content.pm.ParceledListSlice; +import android.os.Bundle; import android.os.UserHandle; import android.service.notification.NotificationStats; import android.service.notification.IStatusBarNotificationHolder; @@ -58,4 +59,5 @@ oneway interface INotificationListener void onActionClicked(String key, in Notification.Action action, int source); void onNotificationClicked(String key); void onAllowedAdjustmentsChanged(); + void onNotificationFeedbackReceived(String key, in NotificationRankingUpdate update, in Bundle feedback); } diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index 1d49a7206023..4fd36e590d18 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -30,6 +30,7 @@ import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -90,6 +91,11 @@ public abstract class NotificationAssistantService extends NotificationListenerS = "android.service.notification.NotificationAssistantService"; /** + * Data type: int, the feedback rating score provided by user + */ + public static final String FEEDBACK_RATING = "feedback.rating"; + + /** * @hide */ protected Handler mHandler; @@ -272,6 +278,17 @@ public abstract class NotificationAssistantService extends NotificationListenerS } /** + * Implement this to know when user provides a feedback. + * @param key the notification key + * @param rankingMap The current ranking map that can be used to retrieve ranking information + * for active notifications. + * @param feedback the feedback detail + */ + public void onNotificationFeedbackReceived(@NonNull String key, @NonNull RankingMap rankingMap, + @NonNull Bundle feedback) { + } + + /** * Updates a notification. N.B. this won’t cause * an existing notification to alert, but might allow a future update to * this notification to alert. @@ -455,6 +472,18 @@ public abstract class NotificationAssistantService extends NotificationListenerS public void onAllowedAdjustmentsChanged() { mHandler.obtainMessage(MyHandler.MSG_ON_ALLOWED_ADJUSTMENTS_CHANGED).sendToTarget(); } + + @Override + public void onNotificationFeedbackReceived(String key, NotificationRankingUpdate update, + Bundle feedback) { + applyUpdateLocked(update); + SomeArgs args = SomeArgs.obtain(); + args.arg1 = key; + args.arg2 = getCurrentRanking(); + args.arg3 = feedback; + mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_FEEDBACK_RECEIVED, + args).sendToTarget(); + } } private void setAdjustmentIssuer(@Nullable Adjustment adjustment) { @@ -476,6 +505,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS public static final int MSG_ON_PANEL_HIDDEN = 10; public static final int MSG_ON_NOTIFICATION_VISIBILITY_CHANGED = 11; public static final int MSG_ON_NOTIFICATION_CLICKED = 12; + public static final int MSG_ON_NOTIFICATION_FEEDBACK_RECEIVED = 13; public MyHandler(Looper looper) { super(looper, null, false); @@ -589,6 +619,15 @@ public abstract class NotificationAssistantService extends NotificationListenerS onNotificationClicked(key); break; } + case MSG_ON_NOTIFICATION_FEEDBACK_RECEIVED: { + SomeArgs args = (SomeArgs) msg.obj; + String key = (String) args.arg1; + RankingMap ranking = (RankingMap) args.arg2; + Bundle feedback = (Bundle) args.arg3; + args.recycle(); + onNotificationFeedbackReceived(key, ranking, feedback); + break; + } } } } diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index f66f85b9e8cc..73e66d0212fa 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -43,6 +43,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -1543,6 +1544,14 @@ public abstract class NotificationListenerService extends Service { mHandler.obtainMessage(MyHandler.MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED, hideSilentStatusIcons).sendToTarget(); } + + @Override + public void onNotificationFeedbackReceived(String key, NotificationRankingUpdate update, + Bundle feedback) { + // no-op in the listener + } + + } /** @@ -1628,6 +1637,7 @@ public abstract class NotificationListenerService extends Service { private int mSuppressedVisualEffects; private @NotificationManager.Importance int mImportance; private CharSequence mImportanceExplanation; + private float mRankingScore; // System specified group key. private String mOverrideGroupKey; // Notification assistant channel override. @@ -1668,6 +1678,7 @@ public abstract class NotificationListenerService extends Service { out.writeInt(mSuppressedVisualEffects); out.writeInt(mImportance); out.writeCharSequence(mImportanceExplanation); + out.writeFloat(mRankingScore); out.writeString(mOverrideGroupKey); out.writeParcelable(mChannel, flags); out.writeStringList(mOverridePeople); @@ -1705,6 +1716,7 @@ public abstract class NotificationListenerService extends Service { mSuppressedVisualEffects = in.readInt(); mImportance = in.readInt(); mImportanceExplanation = in.readCharSequence(); // may be null + mRankingScore = in.readFloat(); mOverrideGroupKey = in.readString(); // may be null mChannel = in.readParcelable(cl); // may be null mOverridePeople = in.createStringArrayList(); @@ -1802,6 +1814,17 @@ public abstract class NotificationListenerService extends Service { } /** + * Returns the ranking score provided by the {@link NotificationAssistantService} to + * sort the notifications in the shade + * + * @return the ranking score of the notification, range from -1 to 1 + * @hide + */ + public float getRankingScore() { + return mRankingScore; + } + + /** * If the system has overridden the group key, then this will be non-null, and this * key should be used to bundle notifications. */ diff --git a/core/java/android/service/wallpaper/EngineWindowPage.java b/core/java/android/service/wallpaper/EngineWindowPage.java new file mode 100644 index 000000000000..5ed0ad6f2aeb --- /dev/null +++ b/core/java/android/service/wallpaper/EngineWindowPage.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.wallpaper; + +import android.app.WallpaperColors; +import android.graphics.Bitmap; +import android.graphics.RectF; +import android.util.ArrayMap; +import android.util.ArraySet; + +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; + +/** + * This class represents a page of a launcher page used by the wallpaper + * @hide + */ +public class EngineWindowPage { + private Bitmap mScreenShot; + private volatile long mLastUpdateTime = 0; + private Set<RectF> mCallbackAreas = new ArraySet<>(); + private Map<RectF, WallpaperColors> mRectFColors = new ArrayMap<>(); + + /** should be locked extrnally */ + public void addArea(RectF area) { + mCallbackAreas.add(area); + } + + /** should be locked extrnally */ + public void addWallpaperColors(RectF area, WallpaperColors colors) { + mCallbackAreas.add(area); + mRectFColors.put(area, colors); + } + + /** get screenshot bitmap */ + public Bitmap getBitmap() { + if (mScreenShot == null || mScreenShot.isRecycled()) return null; + return mScreenShot; + } + + /** remove callbacks for an area */ + public void removeArea(RectF area) { + mCallbackAreas.remove(area); + mRectFColors.remove(area); + } + + /** set the last time the screenshot was updated */ + public void setLastUpdateTime(long lastUpdateTime) { + mLastUpdateTime = lastUpdateTime; + } + + /** get last screenshot time */ + public long getLastUpdateTime() { + return mLastUpdateTime; + } + + /** get colors for an area */ + public WallpaperColors getColors(RectF rect) { + return mRectFColors.get(rect); + } + + /** set the new bitmap version */ + public void setBitmap(Bitmap screenShot) { + mScreenShot = screenShot; + } + + /** get areas of interest */ + public Set<RectF> getAreas() { + return mCallbackAreas; + } + + /** run operations on this page */ + public synchronized void execSync(Consumer<EngineWindowPage> run) { + run.accept(this); + } + + /** nullify the area color */ + public void removeColor(RectF colorArea) { + mRectFColors.remove(colorArea); + } +} diff --git a/core/java/android/service/wallpaper/IWallpaperConnection.aidl b/core/java/android/service/wallpaper/IWallpaperConnection.aidl index f334d9d3e874..f81ed3410d58 100644 --- a/core/java/android/service/wallpaper/IWallpaperConnection.aidl +++ b/core/java/android/service/wallpaper/IWallpaperConnection.aidl @@ -16,6 +16,7 @@ package android.service.wallpaper; +import android.graphics.RectF; import android.os.ParcelFileDescriptor; import android.service.wallpaper.IWallpaperEngine; import android.app.WallpaperColors; @@ -28,4 +29,5 @@ interface IWallpaperConnection { void engineShown(IWallpaperEngine engine); ParcelFileDescriptor setWallpaper(String name); void onWallpaperColorsChanged(in WallpaperColors colors, int displayId); + void onLocalWallpaperColorsChanged(in RectF area, in WallpaperColors colors, int displayId); } diff --git a/core/java/android/service/wallpaper/IWallpaperEngine.aidl b/core/java/android/service/wallpaper/IWallpaperEngine.aidl index 90392e65794a..fbb449d3875e 100644 --- a/core/java/android/service/wallpaper/IWallpaperEngine.aidl +++ b/core/java/android/service/wallpaper/IWallpaperEngine.aidl @@ -16,7 +16,10 @@ package android.service.wallpaper; +import android.app.ILocalWallpaperColorConsumer; +import android.app.WallpaperColors; import android.graphics.Rect; +import android.graphics.RectF; import android.view.MotionEvent; import android.os.Bundle; @@ -39,4 +42,6 @@ oneway interface IWallpaperEngine { void destroy(); void setZoomOut(float scale); void scalePreview(in Rect positionInWindow); + void removeLocalColorsAreas(in List<RectF> regions); + void addLocalColorsAreas(in List<RectF> regions); } diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 82e0b4a1aecc..920c6a727e9a 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -23,6 +23,7 @@ import static android.graphics.Matrix.MSKEW_Y; import static android.view.View.SYSTEM_UI_FLAG_VISIBLE; import android.annotation.FloatRange; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -42,6 +43,7 @@ import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; @@ -53,6 +55,8 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.SystemClock; +import android.os.Trace; +import android.util.ArraySet; import android.util.Log; import android.util.MergedConfiguration; import android.view.Display; @@ -66,6 +70,8 @@ import android.view.InputEventReceiver; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.MotionEvent; +import android.view.PixelCopy; +import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.View; @@ -83,6 +89,9 @@ import com.android.internal.view.BaseSurfaceHolder; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; @@ -116,6 +125,11 @@ public abstract class WallpaperService extends Service { static final String TAG = "WallpaperService"; static final boolean DEBUG = false; + static final float MIN_PAGE_ALLOWED_MARGIN = .05f; + private static final int MIN_BITMAP_SCREENSHOT_WIDTH = 64; + private static final long DEFAULT_UPDATE_SCREENSHOT_DURATION = 60 * 1000; //Once per minute + private static final @NonNull RectF LOCAL_COLOR_BOUNDS = + new RectF(0, 0, 1, 1); private static final int DO_ATTACH = 10; private static final int DO_DETACH = 20; @@ -134,6 +148,8 @@ public abstract class WallpaperService extends Service { private static final int MSG_REQUEST_WALLPAPER_COLORS = 10050; private static final int MSG_ZOOM = 10100; private static final int MSG_SCALE_PREVIEW = 10110; + private static final List<Float> PROHIBITED_STEPS = Arrays.asList(0f, Float.POSITIVE_INFINITY, + Float.NEGATIVE_INFINITY); private static final int NOTIFY_COLORS_RATE_LIMIT_MS = 1000; @@ -158,6 +174,14 @@ public abstract class WallpaperService extends Service { */ public class Engine { IWallpaperEngineWrapper mIWallpaperEngine; + final ArraySet<RectF> mLocalColorAreas = new ArraySet<>(4); + final ArraySet<RectF> mLocalColorsToAdd = new ArraySet<>(4); + + // 2D matrix [x][y] to represent a page of a portion of a window + EngineWindowPage[] mWindowPages = new EngineWindowPage[1]; + Bitmap mLastScreenshot; + int mLastWindowPage = -1; + float mLastPageOffset = 0; // Copies from mIWallpaperEngine. HandlerCaller mCaller; @@ -409,8 +433,8 @@ public abstract class WallpaperService extends Service { */ @VisibleForTesting public Engine(Supplier<Long> clockFunction, Handler handler) { - mClockFunction = clockFunction; - mHandler = handler; + mClockFunction = clockFunction; + mHandler = handler; } /** @@ -448,6 +472,19 @@ public abstract class WallpaperService extends Service { } /** + * Return whether the wallpaper is capable of extracting local colors in a rectangle area, + * Must implement without calling super: + * {@link #addLocalColorsAreas(List)} + * {@link #removeLocalColorsAreas(List)} + * When local colors change, call {@link #notifyLocalColorsChanged(List, List)} + * See {@link com.android.systemui.ImageWallpaper} for an example + * @hide + */ + public boolean supportsLocalColorExtraction() { + return false; + } + + /** * Returns true if this engine is running in preview mode -- that is, * it is being shown to the user before they select it as the actual * wallpaper. @@ -691,6 +728,8 @@ public abstract class WallpaperService extends Service { Log.w(TAG, "Can't notify system because wallpaper connection " + "was not established."); } + resetWindowPages(); + processLocalColors(mPendingXOffset, mPendingXOffsetStep); } catch (RemoteException e) { Log.w(TAG, "Can't notify system because wallpaper connection was lost.", e); } @@ -714,6 +753,28 @@ public abstract class WallpaperService extends Service { } /** + * Send the changed local color areas for the connection + * @param regions + * @param colors + * @hide + */ + public void notifyLocalColorsChanged(@NonNull List<RectF> regions, + @NonNull List<WallpaperColors> colors) + throws RuntimeException { + for (int i = 0; i < regions.size() && i < colors.size() && colors.get(i) != null; i++) { + try { + mConnection.onLocalWallpaperColorsChanged( + regions.get(i), + colors.get(i), + mDisplayContext.getDisplayId() + ); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + } + + /** * Sets internal engine state. Only for testing. * @param created {@code true} or {@code false}. * @hide @@ -1068,7 +1129,9 @@ public abstract class WallpaperService extends Service { mIsCreating = false; mSurfaceCreated = true; if (redrawNeeded) { + resetWindowPages(); mSession.finishDrawing(mWindow, null /* postDrawTransaction */); + processLocalColors(mPendingXOffset, mPendingXOffsetStep); } reposition(); mIWallpaperEngine.reportShown(); @@ -1209,6 +1272,7 @@ public abstract class WallpaperService extends Service { if (!mDestroyed) { mVisible = visible; reportVisibility(); + if (visible) processLocalColors(mPendingXOffset, mPendingXOffsetStep); } } @@ -1278,6 +1342,403 @@ public abstract class WallpaperService extends Service { } catch (RemoteException e) { } } + + // setup local color extraction data + processLocalColors(xOffset, xOffsetStep); + } + + private void processLocalColors(float xOffset, float xOffsetStep) { + // implemented by the wallpaper + if (supportsLocalColorExtraction()) return; + if (DEBUG) { + Log.d(TAG, "processLocalColors " + xOffset + " of step " + + xOffsetStep); + } + //below is the default implementation + if (xOffset % xOffsetStep > MIN_PAGE_ALLOWED_MARGIN) return; + int xPage; + int xPages; + if (!validStep(xOffsetStep)) { + if (DEBUG) { + Log.w(TAG, "invalid offset step " + xOffsetStep); + } + xOffset = 0; + xOffsetStep = 1; + xPage = 0; + xPages = 1; + } else { + xPages = Math.round(1 / xOffsetStep) + 1; + xOffsetStep = (float) 1 / (float) xPages; + float shrink = (float) (xPages - 1) / (float) xPages; + xOffset *= shrink; + xPage = Math.round(xOffset / xOffsetStep); + } + if (DEBUG) { + Log.d(TAG, "xPages " + xPages + " xPage " + xPage); + Log.d(TAG, "xOffsetStep " + xOffsetStep + " xOffset " + xOffset); + } + EngineWindowPage current; + synchronized (mLock) { + if (mWindowPages.length == 0 || (mWindowPages.length != xPages)) { + mWindowPages = new EngineWindowPage[xPages]; + initWindowPages(mWindowPages, xOffsetStep); + } + if (mLocalColorsToAdd.size() != 0) { + for (RectF colorArea : mLocalColorsToAdd) { + if (!isValid(colorArea)) continue; + mLocalColorAreas.add(colorArea); + int colorPage = getRectFPage(colorArea, xOffsetStep); + EngineWindowPage currentPage = mWindowPages[colorPage]; + if (currentPage == null) { + currentPage = new EngineWindowPage(); + currentPage.addArea(colorArea); + mWindowPages[colorPage] = currentPage; + } else { + currentPage.setLastUpdateTime(0); + currentPage.removeColor(colorArea); + } + } + mLocalColorsToAdd.clear(); + } + if (xPage >= mWindowPages.length) { + if (DEBUG) { + Log.e(TAG, "error xPage >= mWindowPages.length page: " + xPage); + Log.e(TAG, "error on page " + xPage + " out of " + xPages); + Log.e(TAG, + "error on xOffsetStep " + xOffsetStep + " xOffset " + xOffset); + } + xPage = mWindowPages.length - 1; + } + current = mWindowPages[xPage]; + if (current == null) { + if (DEBUG) Log.d(TAG, "making page " + xPage + " out of " + xPages); + if (DEBUG) { + Log.d(TAG, "xOffsetStep " + xOffsetStep + " xOffset " + xOffset); + } + current = new EngineWindowPage(); + mWindowPages[xPage] = current; + } + } + updatePage(current, xPage, xPages, xOffsetStep); + } + + private void initWindowPages(EngineWindowPage[] windowPages, float step) { + for (int i = 0; i < windowPages.length; i++) { + windowPages[i] = new EngineWindowPage(); + } + mLocalColorAreas.addAll(mLocalColorsToAdd); + mLocalColorsToAdd.clear(); + for (RectF area: mLocalColorAreas) { + if (!isValid(area)) { + mLocalColorAreas.remove(area); + continue; + } + int pageNum = getRectFPage(area, step); + windowPages[pageNum].addArea(area); + } + } + + void updatePage(EngineWindowPage currentPage, int pageIndx, int numPages, + float xOffsetStep) { + // to save creating a runnable, check twice + long current = System.nanoTime() / 1_000_000; + long lapsed = current - currentPage.getLastUpdateTime(); + if (lapsed < DEFAULT_UPDATE_SCREENSHOT_DURATION) { + return; + } + Surface surface = mSurfaceHolder.getSurface(); + boolean widthIsLarger = + mSurfaceControl.getWidth() > mSurfaceControl.getHeight(); + int smaller = widthIsLarger ? mSurfaceControl.getWidth() + : mSurfaceControl.getHeight(); + float ratio = (float) MIN_BITMAP_SCREENSHOT_WIDTH / (float) smaller; + int width = (int) (ratio * mSurfaceControl.getWidth()); + int height = (int) (ratio * mSurfaceControl.getHeight()); + if (width <= 0 || height <= 0) { + Log.e(TAG, "wrong width and height values of bitmap " + width + " " + height); + return; + } + Bitmap screenShot = Bitmap.createBitmap(width, height, + Bitmap.Config.ARGB_8888); + final Bitmap finalScreenShot = screenShot; + Trace.beginSection("WallpaperService#pixelCopy"); + PixelCopy.request(surface, screenShot, (res) -> { + Trace.endSection(); + if (DEBUG) Log.d(TAG, "result of pixel copy is " + res); + if (res != PixelCopy.SUCCESS) { + Bitmap lastBitmap = currentPage.getBitmap(); + currentPage.execSync((p) -> { + // assign the last bitmap taken for now + p.setBitmap(mLastScreenshot); + }); + Bitmap lastScreenshot = mLastScreenshot; + if (lastScreenshot != null && !lastScreenshot.isRecycled() + && !Objects.equals(lastBitmap, lastScreenshot)) { + updatePageColors(currentPage, pageIndx, numPages, xOffsetStep); + } + } else { + mLastScreenshot = finalScreenShot; + // going to hold this lock for a while + currentPage.execSync((p) -> { + p.setBitmap(finalScreenShot); + p.setLastUpdateTime(current); + }); + updatePageColors(currentPage, pageIndx, numPages, xOffsetStep); + } + }, mHandler); + + } + // locked by the passed page + private void updatePageColors(EngineWindowPage page, int pageIndx, int numPages, + float xOffsetStep) { + if (page.getBitmap() == null) return; + if (DEBUG) { + Log.d(TAG, "updatePageColorsLocked for page " + pageIndx + " with areas " + + page.getAreas().size() + " and bitmap size of " + + page.getBitmap().getWidth() + " x " + page.getBitmap().getHeight()); + } + for (RectF area: page.getAreas()) { + RectF subArea = generateSubRect(area, pageIndx, numPages); + Bitmap b = page.getBitmap(); + int x = Math.round(b.getWidth() * subArea.left); + int y = Math.round(b.getHeight() * subArea.top); + int width = Math.round(b.getWidth() * subArea.width()); + int height = Math.round(b.getHeight() * subArea.height()); + Bitmap target; + try { + target = Bitmap.createBitmap(page.getBitmap(), x, y, width, height); + } catch (Exception e) { + Log.e(TAG, "Error creating page local color bitmap", e); + continue; + } + WallpaperColors color = WallpaperColors.fromBitmap(target); + target.recycle(); + WallpaperColors currentColor = page.getColors(area); + + if (DEBUG) { + Log.d(TAG, "getting local bitmap area x " + x + " y " + y + + " width " + width + " height " + height + " for sub area " + subArea + + " and with page " + pageIndx + " of " + numPages); + + } + if (currentColor == null || !color.equals(currentColor)) { + page.addWallpaperColors(area, color); + if (DEBUG) { + Log.d(TAG, "onLocalWallpaperColorsChanged" + + " local color callback for area" + area + " for page " + pageIndx + + " of " + numPages); + } + try { + mConnection.onLocalWallpaperColorsChanged(area, color, + mDisplayContext.getDisplayId()); + } catch (RemoteException e) { + Log.e(TAG, "Error calling Connection.onLocalWallpaperColorsChanged", e); + } + } + } + } + + private RectF generateSubRect(RectF in, int pageInx, int numPages) { + float minLeft = (float) (pageInx) / (float) (numPages); + float maxRight = (float) (pageInx + 1) / (float) (numPages); + float left = in.left; + float right = in.right; + + // bound rect + if (left < minLeft) left = minLeft; + if (right > maxRight) right = maxRight; + + // scale up the sub area then trim + left = (left * (float) numPages) % 1f; + right = (right * (float) numPages) % 1f; + if (right == 0f) { + right = 1f; + } + + return new RectF(left, in.top, right, in.bottom); + } + + private void resetWindowPages() { + if (supportsLocalColorExtraction()) return; + mLastWindowPage = -1; + synchronized (mLock) { + for (int i = 0; i < mWindowPages.length; i++) { + EngineWindowPage page = mWindowPages[i]; + if (page != null) { + page.execSync((p) -> { + p.setLastUpdateTime(0L); + }); + } + } + } + } + + private int getRectFPage(RectF area, float step) { + if (!isValid(area)) return 0; + if (!validStep(step)) return 0; + int pages = Math.round(1 / step); + int page = Math.round(area.centerX() * pages); + if (page == pages) return pages - 1; + if (page == mWindowPages.length) page = mWindowPages.length - 1; + return page; + } + + /** + * Add local colors areas of interest + * @param regions list of areas + * @hide + */ + public void addLocalColorsAreas(@NonNull List<RectF> regions) { + if (supportsLocalColorExtraction()) return; + if (DEBUG) { + Log.d(TAG, "addLocalColorsAreas adding local color areas " + regions); + } + float step = mPendingXOffsetStep; + + List<WallpaperColors> colors = getLocalWallpaperColors(regions); + synchronized (mLock) { + if (!validStep(step)) { + step = 0; + } + for (int i = 0; i < regions.size(); i++) { + RectF area = regions.get(i); + if (!isValid(area)) continue; + int pageInx = getRectFPage(area, step); + // no page should be null + EngineWindowPage page = mWindowPages[pageInx]; + + if (page != null) { + mLocalColorAreas.add(area); + page.addArea(area); + WallpaperColors color = colors.get(i); + if (color != null && !color.equals(page.getColors(area))) { + page.execSync(p -> { + p.addWallpaperColors(area, color); + }); + } + } else { + mLocalColorsToAdd.add(area); + } + } + } + + for (int i = 0; i < colors.size() && colors.get(i) != null; i++) { + try { + mConnection.onLocalWallpaperColorsChanged(regions.get(i), colors.get(i), + mDisplayContext.getDisplayId()); + } catch (RemoteException e) { + Log.e(TAG, "Error calling Connection.onLocalWallpaperColorsChanged", e); + return; + } + } + } + + /** + * Remove local colors areas of interest if they exist + * @param regions list of areas + * @hide + */ + public void removeLocalColorsAreas(@NonNull List<RectF> regions) { + if (supportsLocalColorExtraction()) return; + synchronized (mLock) { + float step = mPendingXOffsetStep; + mLocalColorsToAdd.removeAll(regions); + mLocalColorAreas.removeAll(regions); + if (!validStep(step)) { + return; + } + for (int i = 0; i < regions.size(); i++) { + RectF area = regions.get(i); + if (!isValid(area)) continue; + int pageInx = getRectFPage(area, step); + // no page should be null + EngineWindowPage page = mWindowPages[pageInx]; + if (page != null) { + page.execSync(p -> { + p.removeArea(area); + }); + } + } + } + } + + private @NonNull List<WallpaperColors> getLocalWallpaperColors(@NonNull List<RectF> areas) { + ArrayList<WallpaperColors> colors = new ArrayList<>(areas.size()); + float step = mPendingXOffsetStep; + if (!validStep(step)) { + if (DEBUG) Log.d(TAG, "invalid step size " + step); + step = 1.0f; + } + for (int i = 0; i < areas.size(); i++) { + RectF currentArea = areas.get(i); + EngineWindowPage page; + RectF area; + int pageIndx; + synchronized (mLock) { + pageIndx = getRectFPage(currentArea, step); + if (mWindowPages.length == 0 || pageIndx < 0 + || pageIndx > mWindowPages.length || !isValid(currentArea)) { + colors.add(null); + continue; + } + area = generateSubRect(currentArea, pageIndx, mWindowPages.length); + page = mWindowPages[pageIndx]; + } + if (page == null) { + colors.add(null); + continue; + } + float finalStep = step; + int finalPageIndx = pageIndx; + Bitmap screenShot = page.getBitmap(); + if (screenShot == null || screenShot.isRecycled()) { + if (DEBUG) { + Log.d(TAG, "invalid bitmap " + screenShot + + " for page " + finalPageIndx); + } + page.setLastUpdateTime(0); + colors.add(null); + continue; + } + Bitmap b = screenShot; + Rect subImage = new Rect( + Math.round(area.left * b.getWidth() / finalStep), + Math.round(area.top * b.getHeight()), + Math.round(area.right * b.getWidth() / finalStep), + Math.round(area.bottom * b.getHeight()) + ); + subImage = fixRect(b, subImage); + if (DEBUG) { + Log.d(TAG, "getting subbitmap of " + subImage.toString() + + " for RectF " + area.toString() + + " screenshot width " + screenShot.getWidth() + " height " + + screenShot.getHeight()); + } + Bitmap colorImg = Bitmap.createBitmap(screenShot, + subImage.left, subImage.top, subImage.width(), subImage.height()); + if (DEBUG) { + Log.d(TAG, "created bitmap " + colorImg.getWidth() + ", " + + colorImg.getHeight()); + } + WallpaperColors color = WallpaperColors.fromBitmap(colorImg); + colors.add(color); + } + return colors; + } + + // fix the rect to be included within the bounds of the bitmap + private Rect fixRect(Bitmap b, Rect r) { + r.left = r.left >= r.right || r.left >= b.getWidth() || r.left > 0 + ? 0 + : r.left; + r.right = r.left >= r.right || r.right > b.getWidth() + ? b.getWidth() + : r.right; + return r; + } + + private boolean validStep(float step) { + return !PROHIBITED_STEPS.contains(step) && step > 0. && step <= 1.; } void doCommand(WallpaperCommand cmd) { @@ -1371,6 +1832,16 @@ public abstract class WallpaperService extends Service { }; } + private boolean isValid(RectF area) { + boolean valid = area.bottom > area.top && area.left < area.right + && LOCAL_COLOR_BOUNDS.contains(area); + return valid; + } + + private boolean inRectFRange(float number) { + return number >= 0f && number <= 1f; + } + class IWallpaperEngineWrapper extends IWallpaperEngine.Stub implements HandlerCaller.Callback { private final HandlerCaller mCaller; @@ -1477,6 +1948,14 @@ public abstract class WallpaperService extends Service { mCaller.sendMessage(msg); } + public void addLocalColorsAreas(List<RectF> regions) { + mEngine.addLocalColorsAreas(regions); + } + + public void removeLocalColorsAreas(List<RectF> regions) { + mEngine.removeLocalColorsAreas(regions); + } + public void destroy() { Message msg = mCaller.obtainMessage(DO_DETACH); mCaller.sendMessage(msg); @@ -1516,14 +1995,15 @@ public abstract class WallpaperService extends Service { } switch (message.what) { case DO_ATTACH: { + Engine engine = onCreateEngine(); + mEngine = engine; try { mConnection.attachEngine(this, mDisplayId); } catch (RemoteException e) { + engine.detach(); Log.w(TAG, "Wallpaper host disappeared", e); return; } - Engine engine = onCreateEngine(); - mEngine = engine; mActiveEngines.add(engine); engine.attach(this); return; diff --git a/core/java/android/speech/tts/ITextToSpeechManager.aidl b/core/java/android/speech/tts/ITextToSpeechManager.aidl new file mode 100644 index 000000000000..e6b63dff1553 --- /dev/null +++ b/core/java/android/speech/tts/ITextToSpeechManager.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.speech.tts; + +import android.speech.tts.ITextToSpeechSessionCallback; + +/** + * TextToSpeechManagerService interface. Allows opening {@link TextToSpeech} session with the + * specified provider proxied by the system service. + * + * @hide + */ +oneway interface ITextToSpeechManager { + void createSession(in String engine, in ITextToSpeechSessionCallback managerCallback); +} diff --git a/core/java/android/speech/tts/ITextToSpeechSession.aidl b/core/java/android/speech/tts/ITextToSpeechSession.aidl new file mode 100644 index 000000000000..b2afeb0d1ba8 --- /dev/null +++ b/core/java/android/speech/tts/ITextToSpeechSession.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.speech.tts; + +/** + * TextToSpeech session interface. Allows to control remote TTS service session once connected. + * + * @see ITextToSpeechManager + * @see ITextToSpeechSessionCallback + * + * {@hide} + */ +oneway interface ITextToSpeechSession { + + /** + * Disconnects the client from the TTS provider. + */ + void disconnect(); +}
\ No newline at end of file diff --git a/core/java/android/speech/tts/ITextToSpeechSessionCallback.aidl b/core/java/android/speech/tts/ITextToSpeechSessionCallback.aidl new file mode 100644 index 000000000000..545622a007f3 --- /dev/null +++ b/core/java/android/speech/tts/ITextToSpeechSessionCallback.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.speech.tts; +import android.speech.tts.ITextToSpeechSession; + +/** + * Callback interface for a session created by {@link ITextToSpeechManager} API. + * + * @hide + */ +oneway interface ITextToSpeechSessionCallback { + + void onConnected(in ITextToSpeechSession session, in IBinder serviceBinder); + + void onDisconnected(); + + void onError(in String errorInfo); +}
\ No newline at end of file diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java index 7a185382a631..78e5eabb69a8 100644 --- a/core/java/android/speech/tts/TextToSpeech.java +++ b/core/java/android/speech/tts/TextToSpeech.java @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.os.ServiceManager; import android.text.TextUtils; import android.util.Log; @@ -51,6 +52,7 @@ import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.Set; +import java.util.concurrent.Executor; /** * @@ -695,6 +697,8 @@ public class TextToSpeech { public static final String KEY_FEATURE_NETWORK_RETRIES_COUNT = "networkRetriesCount"; } + private static final boolean DEBUG = false; + private final Context mContext; @UnsupportedAppUsage private Connection mConnectingServiceConnection; @@ -716,6 +720,9 @@ public class TextToSpeech { private final Map<CharSequence, Uri> mUtterances; private final Bundle mParams = new Bundle(); private final TtsEngines mEnginesHelper; + private final boolean mIsSystem; + @Nullable private final Executor mInitExecutor; + @UnsupportedAppUsage private volatile String mCurrentEngine = null; @@ -758,8 +765,21 @@ public class TextToSpeech { */ public TextToSpeech(Context context, OnInitListener listener, String engine, String packageName, boolean useFallback) { + this(context, /* initExecutor= */ null, listener, engine, packageName, + useFallback, /* isSystem= */ true); + } + + /** + * Used internally to instantiate TextToSpeech objects. + * + * @hide + */ + private TextToSpeech(Context context, @Nullable Executor initExecutor, + OnInitListener initListener, String engine, String packageName, boolean useFallback, + boolean isSystem) { mContext = context; - mInitListener = listener; + mInitExecutor = initExecutor; + mInitListener = initListener; mRequestedEngine = engine; mUseFallback = useFallback; @@ -768,6 +788,9 @@ public class TextToSpeech { mUtteranceProgressListener = null; mEnginesHelper = new TtsEngines(mContext); + + mIsSystem = isSystem; + initTts(); } @@ -842,10 +865,14 @@ public class TextToSpeech { } private boolean connectToEngine(String engine) { - Connection connection = new Connection(); - Intent intent = new Intent(Engine.INTENT_ACTION_TTS_SERVICE); - intent.setPackage(engine); - boolean bound = mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE); + Connection connection; + if (mIsSystem) { + connection = new SystemConnection(); + } else { + connection = new DirectConnection(); + } + + boolean bound = connection.connect(engine); if (!bound) { Log.e(TAG, "Failed to bind to " + engine); return false; @@ -857,11 +884,19 @@ public class TextToSpeech { } private void dispatchOnInit(int result) { - synchronized (mStartLock) { - if (mInitListener != null) { - mInitListener.onInit(result); - mInitListener = null; + Runnable onInitCommand = () -> { + synchronized (mStartLock) { + if (mInitListener != null) { + mInitListener.onInit(result); + mInitListener = null; + } } + }; + + if (mInitExecutor != null) { + mInitExecutor.execute(onInitCommand); + } else { + onInitCommand.run(); } } @@ -878,7 +913,7 @@ public class TextToSpeech { // Special case, we are asked to shutdown connection that did finalize its connection. synchronized (mStartLock) { if (mConnectingServiceConnection != null) { - mContext.unbindService(mConnectingServiceConnection); + mConnectingServiceConnection.disconnect(); mConnectingServiceConnection = null; return; } @@ -2127,13 +2162,17 @@ public class TextToSpeech { return mEnginesHelper.getEngines(); } - private class Connection implements ServiceConnection { + private abstract class Connection implements ServiceConnection { private ITextToSpeechService mService; private SetupConnectionAsyncTask mOnSetupConnectionAsyncTask; private boolean mEstablished; + abstract boolean connect(String engine); + + abstract void disconnect(); + private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() { public void onStop(String utteranceId, boolean isStarted) @@ -2199,11 +2238,6 @@ public class TextToSpeech { }; private class SetupConnectionAsyncTask extends AsyncTask<Void, Void, Integer> { - private final ComponentName mName; - - public SetupConnectionAsyncTask(ComponentName name) { - mName = name; - } @Override protected Integer doInBackground(Void... params) { @@ -2227,7 +2261,7 @@ public class TextToSpeech { mParams.putString(Engine.KEY_PARAM_VOICE_NAME, defaultVoiceName); } - Log.i(TAG, "Set up connection to " + mName); + Log.i(TAG, "Setting up the connection to TTS engine..."); return SUCCESS; } catch (RemoteException re) { Log.e(TAG, "Error connecting to service, setCallback() failed"); @@ -2249,11 +2283,11 @@ public class TextToSpeech { } @Override - public void onServiceConnected(ComponentName name, IBinder service) { + public void onServiceConnected(ComponentName componentName, IBinder service) { synchronized(mStartLock) { mConnectingServiceConnection = null; - Log.i(TAG, "Connected to " + name); + Log.i(TAG, "Connected to TTS engine"); if (mOnSetupConnectionAsyncTask != null) { mOnSetupConnectionAsyncTask.cancel(false); @@ -2263,7 +2297,7 @@ public class TextToSpeech { mServiceConnection = Connection.this; mEstablished = false; - mOnSetupConnectionAsyncTask = new SetupConnectionAsyncTask(name); + mOnSetupConnectionAsyncTask = new SetupConnectionAsyncTask(); mOnSetupConnectionAsyncTask.execute(); } } @@ -2277,7 +2311,7 @@ public class TextToSpeech { * * @return true if we cancel mOnSetupConnectionAsyncTask in progress. */ - private boolean clearServiceConnection() { + protected boolean clearServiceConnection() { synchronized(mStartLock) { boolean result = false; if (mOnSetupConnectionAsyncTask != null) { @@ -2295,8 +2329,8 @@ public class TextToSpeech { } @Override - public void onServiceDisconnected(ComponentName name) { - Log.i(TAG, "Asked to disconnect from " + name); + public void onServiceDisconnected(ComponentName componentName) { + Log.i(TAG, "Disconnected from TTS engine"); if (clearServiceConnection()) { /* We need to protect against a rare case where engine * dies just after successful connection - and we process onServiceDisconnected @@ -2308,11 +2342,6 @@ public class TextToSpeech { } } - public void disconnect() { - mContext.unbindService(this); - clearServiceConnection(); - } - public boolean isEstablished() { return mService != null && mEstablished; } @@ -2342,6 +2371,91 @@ public class TextToSpeech { } } + // Currently all the clients are routed through the System connection. Direct connection + // is left for debugging, testing and benchmarking purposes. + // TODO(b/179599071): Remove direct connection once system one is fully tested. + private class DirectConnection extends Connection { + @Override + boolean connect(String engine) { + Intent intent = new Intent(Engine.INTENT_ACTION_TTS_SERVICE); + intent.setPackage(engine); + return mContext.bindService(intent, this, Context.BIND_AUTO_CREATE); + } + + @Override + void disconnect() { + mContext.unbindService(this); + clearServiceConnection(); + } + } + + private class SystemConnection extends Connection { + + @Nullable + private volatile ITextToSpeechSession mSession; + + @Override + boolean connect(String engine) { + IBinder binder = ServiceManager.getService(Context.TEXT_TO_SPEECH_MANAGER_SERVICE); + + ITextToSpeechManager manager = ITextToSpeechManager.Stub.asInterface(binder); + + if (manager == null) { + Log.e(TAG, "System service is not available!"); + return false; + } + + if (DEBUG) { + Log.d(TAG, "Connecting to engine: " + engine); + } + + try { + manager.createSession(engine, new ITextToSpeechSessionCallback.Stub() { + @Override + public void onConnected(ITextToSpeechSession session, IBinder serviceBinder) { + mSession = session; + onServiceConnected( + /* componentName= */ null, + serviceBinder); + } + + @Override + public void onDisconnected() { + onServiceDisconnected(/* componentName= */ null); + } + + @Override + public void onError(String errorInfo) { + Log.w(TAG, "System TTS connection error: " + errorInfo); + // The connection was not established successfully - handle as + // disconnection: clear the state and notify the user. + onServiceDisconnected(/* componentName= */ null); + } + }); + + return true; + } catch (RemoteException ex) { + Log.e(TAG, "Error communicating with the System Server: ", ex); + throw ex.rethrowFromSystemServer(); + } + } + + @Override + void disconnect() { + ITextToSpeechSession session = mSession; + + if (session != null) { + try { + session.disconnect(); + } catch (RemoteException ex) { + Log.w(TAG, "Error disconnecting session", ex); + } + + clearServiceConnection(); + } + } + } + private interface Action<R> { R run(ITextToSpeechService service) throws RemoteException; } diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java index 2f40bdbff05f..5f2bccc8b857 100644 --- a/core/java/android/view/InsetsSource.java +++ b/core/java/android/view/InsetsSource.java @@ -140,7 +140,11 @@ public class InsetsSource implements Parcelable { if (getType() == ITYPE_CAPTION_BAR) { return Insets.of(0, frame.height(), 0, 0); } - if (!getIntersection(frame, relativeFrame, mTmpFrame)) { + // Checks for whether there is shared edge with insets for 0-width/height window. + final boolean hasIntersection = relativeFrame.isEmpty() + ? getIntersection(frame, relativeFrame, mTmpFrame) + : mTmpFrame.setIntersect(frame, relativeFrame); + if (!hasIntersection) { return Insets.NONE; } diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index 52b7cffbc340..d67439cc9de2 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -3768,6 +3768,41 @@ public final class MotionEvent extends InputEvent implements Parcelable { return (getButtonState() & button) == button; } + /** + * Gets a rotation matrix that (when applied to a motionevent) will rotate that motion event + * such that the result coordinates end up in the same physical location on a display whose + * coordinates are rotated by `rotation`. + * + * For example, rotating 0,0 by 90 degrees will move a point from the physical top-left to + * the bottom-left of the 90-degree-rotated display. + * + * @hide + */ + public static Matrix createRotateMatrix( + @Surface.Rotation int rotation, int displayW, int displayH) { + if (rotation == Surface.ROTATION_0) { + return new Matrix(Matrix.IDENTITY_MATRIX); + } + // values is row-major + float[] values = null; + if (rotation == Surface.ROTATION_90) { + values = new float[]{0, 1, 0, + -1, 0, displayH, + 0, 0, 1}; + } else if (rotation == Surface.ROTATION_180) { + values = new float[]{-1, 0, displayW, + 0, -1, displayH, + 0, 0, 1}; + } else if (rotation == Surface.ROTATION_270) { + values = new float[]{0, -1, displayW, + 1, 0, 0, + 0, 0, 1}; + } + Matrix toOrient = new Matrix(); + toOrient.setValues(values); + return toOrient; + } + public static final @android.annotation.NonNull Parcelable.Creator<MotionEvent> CREATOR = new Parcelable.Creator<MotionEvent>() { public MotionEvent createFromParcel(Parcel in) { diff --git a/core/java/com/android/internal/graphics/palette/OWNERS b/core/java/com/android/internal/graphics/palette/OWNERS new file mode 100644 index 000000000000..731dca9b128f --- /dev/null +++ b/core/java/com/android/internal/graphics/palette/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 484670
+dupin@google.com
+jamesoleary@google.com
\ No newline at end of file diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index e599888c3bee..1f8ffe08a257 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -767,7 +767,7 @@ public class BatteryStatsImpl extends BatteryStats { // Last recorded battery energy capacity. // This is used for computing foregrund power per application. // See: PowerForUid below - private long mLastBatteryEnergyCapacityNWh = 0; + private long mLastBatteryEnergyCapacityNwh = 0; private static final class PowerForUid { public long energyNwh = 0; @@ -1089,12 +1089,12 @@ public class BatteryStatsImpl extends BatteryStats { private int mNumConnectivityChange; - private int mBatteryVolt = -1; - private int mBatteryCharge = -1; - private int mEstimatedBatteryCapacity = -1; + private int mBatteryVoltageMv = -1; + private int mBatteryChargeUah = -1; + private int mEstimatedBatteryCapacityMah = -1; - private int mMinLearnedBatteryCapacity = -1; - private int mMaxLearnedBatteryCapacity = -1; + private int mMinLearnedBatteryCapacityUah = -1; + private int mMaxLearnedBatteryCapacityUah = -1; private long mBatteryTimeToFullSeconds = -1; @@ -1175,17 +1175,17 @@ public class BatteryStatsImpl extends BatteryStats { @Override public int getEstimatedBatteryCapacity() { - return mEstimatedBatteryCapacity; + return mEstimatedBatteryCapacityMah; } @Override public int getMinLearnedBatteryCapacity() { - return mMinLearnedBatteryCapacity; + return mMinLearnedBatteryCapacityUah; } @Override public int getMaxLearnedBatteryCapacity() { - return mMaxLearnedBatteryCapacity; + return mMaxLearnedBatteryCapacityUah; } public BatteryStatsImpl() { @@ -3416,7 +3416,7 @@ public class BatteryStatsImpl extends BatteryStats { firstToken |= DELTA_EVENT_FLAG; } - final boolean batteryChargeChanged = cur.batteryChargeUAh != last.batteryChargeUAh; + final boolean batteryChargeChanged = cur.batteryChargeUah != last.batteryChargeUah; if (batteryChargeChanged) { firstToken |= DELTA_BATTERY_CHARGE_FLAG; } @@ -3505,8 +3505,8 @@ public class BatteryStatsImpl extends BatteryStats { mLastHistoryStepLevel = cur.batteryLevel; if (batteryChargeChanged) { - if (DEBUG) Slog.i(TAG, "WRITE DELTA: batteryChargeUAh=" + cur.batteryChargeUAh); - dest.writeInt(cur.batteryChargeUAh); + if (DEBUG) Slog.i(TAG, "WRITE DELTA: batteryChargeUah=" + cur.batteryChargeUah); + dest.writeInt(cur.batteryChargeUah); } dest.writeDouble(cur.modemRailChargeMah); dest.writeDouble(cur.wifiRailChargeMah); @@ -3756,7 +3756,7 @@ public class BatteryStatsImpl extends BatteryStats { } if ((firstToken&DELTA_BATTERY_CHARGE_FLAG) != 0) { - cur.batteryChargeUAh = src.readInt(); + cur.batteryChargeUah = src.readInt(); } cur.modemRailChargeMah = src.readDouble(); cur.wifiRailChargeMah = src.readDouble(); @@ -7222,6 +7222,10 @@ public class BatteryStatsImpl extends BatteryStats { return mOnBattery; } + @Override public long getStatsStartRealtime() { + return mRealtimeStartUs; + } + @UnsupportedAppUsage @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { return mUidStats; @@ -10745,11 +10749,6 @@ public class BatteryStatsImpl extends BatteryStats { long realtimeUs = mClocks.elapsedRealtime() * 1000; initTimes(uptimeUs, realtimeUs); mStartPlatformVersion = mEndPlatformVersion = Build.ID; - mDischargeStartLevel = 0; - mDischargeUnplugLevel = 0; - mDischargePlugLevel = -1; - mDischargeCurrentLevel = 0; - mCurrentBatteryLevel = 0; initDischarge(realtimeUs); clearHistoryLocked(); updateDailyDeadlineLocked(); @@ -10835,6 +10834,11 @@ public class BatteryStatsImpl extends BatteryStats { mDischargeLightDozeCounter = new LongSamplingCounter(mOnBatteryTimeBase); mDischargeDeepDozeCounter = new LongSamplingCounter(mOnBatteryTimeBase); mDischargeCounter = new LongSamplingCounter(mOnBatteryTimeBase); + mDischargeStartLevel = 0; + mDischargeUnplugLevel = 0; + mDischargePlugLevel = -1; + mDischargeCurrentLevel = 0; + mCurrentBatteryLevel = 0; } @UnsupportedAppUsage @@ -10873,9 +10877,9 @@ public class BatteryStatsImpl extends BatteryStats { firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i); } - if (mEstimatedBatteryCapacity == -1) { + if (mEstimatedBatteryCapacityMah == -1) { // Initialize the estimated battery capacity to a known preset one. - mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity(); + mEstimatedBatteryCapacityMah = (int) mPowerProfile.getBatteryCapacity(); } } @@ -11439,12 +11443,12 @@ public class BatteryStatsImpl extends BatteryStats { } if (mPowerProfile != null) { - mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity(); + mEstimatedBatteryCapacityMah = (int) mPowerProfile.getBatteryCapacity(); } else { - mEstimatedBatteryCapacity = -1; + mEstimatedBatteryCapacityMah = -1; } - mMinLearnedBatteryCapacity = -1; - mMaxLearnedBatteryCapacity = -1; + mMinLearnedBatteryCapacityUah = -1; + mMaxLearnedBatteryCapacityUah = -1; mInteractiveTimer.reset(false, elapsedRealtimeUs); mPowerSaveModeEnabledTimer.reset(false, elapsedRealtimeUs); mLastIdleTimeStartMs = elapsedRealtimeMillis; @@ -11563,7 +11567,9 @@ public class BatteryStatsImpl extends BatteryStats { initDischarge(elapsedRealtimeUs); clearHistoryLocked(); - mBatteryStatsHistory.resetAllFiles(); + if (mBatteryStatsHistory != null) { + mBatteryStatsHistory.resetAllFiles(); + } // Flush external data, gathering snapshots, but don't process it since it is pre-reset data mIgnoreNextExternalStats = true; @@ -13212,7 +13218,7 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") protected void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, - final boolean onBattery, final int oldStatus, final int level, final int chargeUAh) { + final boolean onBattery, final int oldStatus, final int level, final int chargeUah) { boolean doWrite = false; Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); m.arg1 = onBattery ? 1 : 0; @@ -13268,10 +13274,10 @@ public class BatteryStatsImpl extends BatteryStats { } doWrite = true; resetAllStatsLocked(mSecUptime, mSecRealtime); - if (chargeUAh > 0 && level > 0) { - mBatteryCharge = chargeUAh; + if (chargeUah > 0 && level > 0) { + mBatteryChargeUah = chargeUah; // Only use the reported coulomb charge value if it is supported and reported. - mEstimatedBatteryCapacity = (int) ((chargeUAh / 1000) / (level / 100.0)); + mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0)); } mDischargeStartLevel = level; reset = true; @@ -13386,16 +13392,16 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void setBatteryStateLocked(final int status, final int health, final int plugType, - final int level, /* not final */ int temp, final int volt, final int chargeUAh, - final int chargeFullUAh, final long chargeTimeToFullSeconds) { - setBatteryStateLocked(status, health, plugType, level, temp, volt, chargeUAh, - chargeFullUAh, chargeTimeToFullSeconds, + final int level, /* not final */ int temp, final int voltageMv, final int chargeUah, + final int chargeFullUah, final long chargeTimeToFullSeconds) { + setBatteryStateLocked(status, health, plugType, level, temp, voltageMv, chargeUah, + chargeFullUah, chargeTimeToFullSeconds, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); } public void setBatteryStateLocked(final int status, final int health, final int plugType, - final int level, /* not final */ int temp, final int volt, final int chargeUAh, - final int chargeFullUAh, final long chargeTimeToFullSeconds, + final int level, /* not final */ int temp, final int voltageMv, final int chargeUah, + final int chargeFullUah, final long chargeTimeToFullSeconds, final long elapsedRealtimeMs, final long uptimeMs, final long currentTimeMs) { // Temperature is encoded without the signed bit, so clamp any negative temperatures to 0. temp = Math.max(0, temp); @@ -13421,7 +13427,7 @@ public class BatteryStatsImpl extends BatteryStats { mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG; mHistoryCur.batteryStatus = (byte)status; mHistoryCur.batteryLevel = (byte)level; - mHistoryCur.batteryChargeUAh = chargeUAh; + mHistoryCur.batteryChargeUah = chargeUah; mMaxChargeStepLevel = mMinDischargeStepLevel = mLastChargeStepLevel = mLastDischargeStepLevel = level; mLastChargingStateLevel = level; @@ -13444,10 +13450,10 @@ public class BatteryStatsImpl extends BatteryStats { } if (ENABLE_FOREGROUND_STATS_COLLECTION) { - mBatteryVolt = volt; + mBatteryVoltageMv = voltageMv; if (onBattery) { - final long energyNwh = (volt * (long) chargeUAh); - final long energyDelta = mLastBatteryEnergyCapacityNWh - energyNwh; + final long energyNwh = (voltageMv * (long) chargeUah); + final long energyDelta = mLastBatteryEnergyCapacityNwh - energyNwh; for (int i = 0; i < mForegroundUids.size(); i++) { final int uid = mForegroundUids.get(i); if (uid == INVALID_UID) { @@ -13458,7 +13464,7 @@ public class BatteryStatsImpl extends BatteryStats { if (pfu.baseTimeMs <= 0) { pfu.baseTimeMs = currentTimeMs; } else { - // Check if mLastBatteryEnergyCapacityNWh > energyNwh, + // Check if mLastBatteryEnergyCapacityNwh > energyNwh, // to make sure we only count discharges if (energyDelta > 0) { pfu.energyNwh += energyDelta; @@ -13476,7 +13482,7 @@ public class BatteryStatsImpl extends BatteryStats { pfu.baseTimeMs = currentTimeMs; } } - mLastBatteryEnergyCapacityNWh = energyNwh; + mLastBatteryEnergyCapacityNwh = energyNwh; } else if (onBattery != mOnBattery) { // Transition to onBattery = false mUidToPower.values().forEach(v -> v.baseTimeMs = 0); @@ -13494,10 +13500,10 @@ public class BatteryStatsImpl extends BatteryStats { mHistoryCur.batteryHealth = (byte)health; mHistoryCur.batteryPlugType = (byte)plugType; mHistoryCur.batteryTemperature = (short)temp; - mHistoryCur.batteryVoltage = (char)volt; - if (chargeUAh < mHistoryCur.batteryChargeUAh) { + mHistoryCur.batteryVoltage = (char) voltageMv; + if (chargeUah < mHistoryCur.batteryChargeUah) { // Only record discharges - final long chargeDiff = mHistoryCur.batteryChargeUAh - chargeUAh; + final long chargeDiff = mHistoryCur.batteryChargeUah - chargeUah; mDischargeCounter.addCountLocked(chargeDiff); mDischargeScreenOffCounter.addCountLocked(chargeDiff); if (Display.isDozeState(mScreenState)) { @@ -13509,8 +13515,8 @@ public class BatteryStatsImpl extends BatteryStats { mDischargeDeepDozeCounter.addCountLocked(chargeDiff); } } - mHistoryCur.batteryChargeUAh = chargeUAh; - setOnBatteryLocked(elapsedRealtimeMs, uptimeMs, onBattery, oldStatus, level, chargeUAh); + mHistoryCur.batteryChargeUah = chargeUah; + setOnBatteryLocked(elapsedRealtimeMs, uptimeMs, onBattery, oldStatus, level, chargeUah); } else { boolean changed = false; if (mHistoryCur.batteryLevel != level) { @@ -13539,16 +13545,16 @@ public class BatteryStatsImpl extends BatteryStats { mHistoryCur.batteryTemperature = (short)temp; changed = true; } - if (volt > (mHistoryCur.batteryVoltage+20) - || volt < (mHistoryCur.batteryVoltage-20)) { - mHistoryCur.batteryVoltage = (char)volt; + if (voltageMv > (mHistoryCur.batteryVoltage + 20) + || voltageMv < (mHistoryCur.batteryVoltage - 20)) { + mHistoryCur.batteryVoltage = (char) voltageMv; changed = true; } - if (chargeUAh >= (mHistoryCur.batteryChargeUAh+10) - || chargeUAh <= (mHistoryCur.batteryChargeUAh-10)) { - if (chargeUAh < mHistoryCur.batteryChargeUAh) { + if (chargeUah >= (mHistoryCur.batteryChargeUah + 10) + || chargeUah <= (mHistoryCur.batteryChargeUah - 10)) { + if (chargeUah < mHistoryCur.batteryChargeUah) { // Only record discharges - final long chargeDiff = mHistoryCur.batteryChargeUAh - chargeUAh; + final long chargeDiff = mHistoryCur.batteryChargeUah - chargeUah; mDischargeCounter.addCountLocked(chargeDiff); mDischargeScreenOffCounter.addCountLocked(chargeDiff); if (Display.isDozeState(mScreenState)) { @@ -13560,7 +13566,7 @@ public class BatteryStatsImpl extends BatteryStats { mDischargeDeepDozeCounter.addCountLocked(chargeDiff); } } - mHistoryCur.batteryChargeUAh = chargeUAh; + mHistoryCur.batteryChargeUah = chargeUah; changed = true; } long modeBits = (((long)mInitStepMode) << STEP_LEVEL_INITIAL_MODE_SHIFT) @@ -13632,12 +13638,12 @@ public class BatteryStatsImpl extends BatteryStats { mRecordingHistory = DEBUG; } - if (mMinLearnedBatteryCapacity == -1) { - mMinLearnedBatteryCapacity = chargeFullUAh; + if (mMinLearnedBatteryCapacityUah == -1) { + mMinLearnedBatteryCapacityUah = chargeFullUah; } else { - mMinLearnedBatteryCapacity = Math.min(mMinLearnedBatteryCapacity, chargeFullUAh); + mMinLearnedBatteryCapacityUah = Math.min(mMinLearnedBatteryCapacityUah, chargeFullUah); } - mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); + mMaxLearnedBatteryCapacityUah = Math.max(mMaxLearnedBatteryCapacityUah, chargeFullUah); mBatteryTimeToFullSeconds = chargeTimeToFullSeconds; } @@ -14912,9 +14918,9 @@ public class BatteryStatsImpl extends BatteryStats { mDischargePlugLevel = in.readInt(); mDischargeCurrentLevel = in.readInt(); mCurrentBatteryLevel = in.readInt(); - mEstimatedBatteryCapacity = in.readInt(); - mMinLearnedBatteryCapacity = in.readInt(); - mMaxLearnedBatteryCapacity = in.readInt(); + mEstimatedBatteryCapacityMah = in.readInt(); + mMinLearnedBatteryCapacityUah = in.readInt(); + mMaxLearnedBatteryCapacityUah = in.readInt(); mLowDischargeAmountSinceCharge = in.readInt(); mHighDischargeAmountSinceCharge = in.readInt(); mDischargeAmountScreenOnSinceCharge = in.readInt(); @@ -15416,9 +15422,9 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(mDischargePlugLevel); out.writeInt(mDischargeCurrentLevel); out.writeInt(mCurrentBatteryLevel); - out.writeInt(mEstimatedBatteryCapacity); - out.writeInt(mMinLearnedBatteryCapacity); - out.writeInt(mMaxLearnedBatteryCapacity); + out.writeInt(mEstimatedBatteryCapacityMah); + out.writeInt(mMinLearnedBatteryCapacityUah); + out.writeInt(mMaxLearnedBatteryCapacityUah); out.writeInt(getLowDischargeAmountSinceCharge()); out.writeInt(getHighDischargeAmountSinceCharge()); out.writeInt(getDischargeAmountScreenOnSinceCharge()); @@ -15917,9 +15923,9 @@ public class BatteryStatsImpl extends BatteryStats { mRealtimeUs = in.readLong(); mRealtimeStartUs = in.readLong(); mOnBattery = in.readInt() != 0; - mEstimatedBatteryCapacity = in.readInt(); - mMinLearnedBatteryCapacity = in.readInt(); - mMaxLearnedBatteryCapacity = in.readInt(); + mEstimatedBatteryCapacityMah = in.readInt(); + mMinLearnedBatteryCapacityUah = in.readInt(); + mMaxLearnedBatteryCapacityUah = in.readInt(); mOnBatteryInternal = false; // we are no longer really running. mOnBatteryTimeBase.readFromParcel(in); mOnBatteryScreenOffTimeBase.readFromParcel(in); @@ -16156,9 +16162,9 @@ public class BatteryStatsImpl extends BatteryStats { out.writeLong(mRealtimeUs); out.writeLong(mRealtimeStartUs); out.writeInt(mOnBattery ? 1 : 0); - out.writeInt(mEstimatedBatteryCapacity); - out.writeInt(mMinLearnedBatteryCapacity); - out.writeInt(mMaxLearnedBatteryCapacity); + out.writeInt(mEstimatedBatteryCapacityMah); + out.writeInt(mMinLearnedBatteryCapacityUah); + out.writeInt(mMaxLearnedBatteryCapacityUah); mOnBatteryTimeBase.writeToParcel(out, uSecUptime, uSecRealtime); mOnBatteryScreenOffTimeBase.writeToParcel(out, uSecUptime, uSecRealtime); @@ -16414,8 +16420,8 @@ public class BatteryStatsImpl extends BatteryStats { public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) { if (ENABLE_FOREGROUND_STATS_COLLECTION) { - long actualCharge = -1; - long actualEnergy = -1; + long actualChargeUah = -1; + long actualEnergyNwh = -1; try { IBatteryPropertiesRegistrar registrar = IBatteryPropertiesRegistrar.Stub.asInterface( @@ -16424,27 +16430,27 @@ public class BatteryStatsImpl extends BatteryStats { BatteryProperty prop = new BatteryProperty(); if (registrar.getProperty( BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER, prop) == 0) { - actualCharge = prop.getLong(); + actualChargeUah = prop.getLong(); } prop = new BatteryProperty(); if (registrar.getProperty( BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER, prop) == 0) { - actualEnergy = prop.getLong(); + actualEnergyNwh = prop.getLong(); } } } catch (RemoteException e) { // Ignore. } - pw.printf("ActualCharge (uAh): %d\n", (int) actualCharge); - pw.printf("ActualEnergy (nWh): %d\n", actualEnergy); - pw.printf("mBatteryCharge (uAh): %d\n", mBatteryCharge); - pw.printf("mBatteryVolts (mV): %d\n", mBatteryVolt); - pw.printf("est energy (nWh): %d\n", mBatteryVolt * (long) mBatteryCharge); - pw.printf("mEstimatedBatteryCapacity (mAh): %d\n", mEstimatedBatteryCapacity); - pw.printf("mMinLearnedBatteryCapacity (uAh): %d\n", mMinLearnedBatteryCapacity); - pw.printf("mMaxLearnedBatteryCapacity (uAh): %d\n", mMaxLearnedBatteryCapacity); + pw.printf("ActualCharge (uAh): %d\n", (int) actualChargeUah); + pw.printf("ActualEnergy (nWh): %d\n", actualEnergyNwh); + pw.printf("mBatteryCharge (uAh): %d\n", mBatteryChargeUah); + pw.printf("mBatteryVolts (mV): %d\n", mBatteryVoltageMv); + pw.printf("est energy (nWh): %d\n", mBatteryVoltageMv * (long) mBatteryChargeUah); + pw.printf("mEstimatedBatteryCapacity (mAh): %d\n", mEstimatedBatteryCapacityMah); + pw.printf("mMinLearnedBatteryCapacity (uAh): %d\n", mMinLearnedBatteryCapacityUah); + pw.printf("mMaxLearnedBatteryCapacity (uAh): %d\n", mMaxLearnedBatteryCapacityUah); pw.printf("est. capacity: %f\n", - (float) actualCharge / (mEstimatedBatteryCapacity * 1000)); + (float) actualChargeUah / (mEstimatedBatteryCapacityMah * 1000)); pw.printf("mCurrentBatteryLevel: %d\n", mCurrentBatteryLevel); pw.println("Total Power per app:"); mUidToPower.entrySet().forEach(e -> diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 233ba1912dcd..db87a057175d 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -52,6 +52,7 @@ public class BatteryUsageStatsProvider { mPowerCalculators = new ArrayList<>(); // Power calculators are applied in the order of registration + mPowerCalculators.add(new DischargedPowerCalculator(mPowerProfile)); mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile)); mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile)); mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile)); @@ -106,21 +107,19 @@ public class BatteryUsageStatsProvider { ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size()); for (int i = 0; i < queries.size(); i++) { - results.add(getBatteryUsageStats(queries.get(i), batteryStatsHelper)); + results.add(getBatteryUsageStats(queries.get(i))); } return results; } - private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query, - BatteryStatsHelper batteryStatsHelper) { + private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) { // TODO(b/174186358): read extra power component number from configuration final int customPowerComponentCount = 0; final int customTimeComponentCount = 0; final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount) - .setDischargePercentage(batteryStatsHelper.getStats().getDischargeAmount(0)) - .setConsumedPower(batteryStatsHelper.getTotalPower()); + .setStatsStartRealtime(mStats.getStatsStartRealtime() / 1000); SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats(); for (int i = uidStats.size() - 1; i >= 0; i--) { diff --git a/core/java/com/android/internal/os/DischargedPowerCalculator.java b/core/java/com/android/internal/os/DischargedPowerCalculator.java new file mode 100644 index 000000000000..e94020cc4f18 --- /dev/null +++ b/core/java/com/android/internal/os/DischargedPowerCalculator.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +import android.os.BatteryStats; +import android.os.BatteryUsageStats; +import android.os.BatteryUsageStatsQuery; +import android.os.UserHandle; +import android.util.SparseArray; + +import java.util.List; + +/** + * Estimates the battery discharge amounts. + */ +public class DischargedPowerCalculator extends PowerCalculator { + private final double mBatteryCapacity; + + public DischargedPowerCalculator(PowerProfile powerProfile) { + mBatteryCapacity = powerProfile.getBatteryCapacity(); + } + + @Override + public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, + long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + builder.setDischargePercentage( + batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED)) + .setDischargedPowerRange( + batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100, + batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100); + } + + @Override + public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, + long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { + // Not implemented. The computation is done by BatteryStatsHelper + } +} diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index bb0fd7fb8c23..7edc6c855ec2 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -22,6 +22,7 @@ import android.graphics.Rect; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; import android.net.Uri; +import android.os.Bundle; import android.os.UserHandle; import android.service.notification.StatusBarNotification; @@ -82,6 +83,7 @@ interface IStatusBarService void hideCurrentInputMethodForBubbles(); void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName); void clearInlineReplyUriPermissions(String key); + void onNotificationFeedbackReceived(String key, in Bundle feedback); void onGlobalActionsShown(); void onGlobalActionsHidden(); diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index a2de0aff5dfa..143017cba57d 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -36,6 +36,7 @@ import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; +import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; @@ -59,6 +60,9 @@ public class PointerLocationView extends View implements InputDeviceListener, */ private static final String GESTURE_EXCLUSION_PROP = "debug.pointerlocation.showexclusion"; + private static final boolean ENABLE_PER_WINDOW_INPUT_ROTATION = + SystemProperties.getBoolean("persist.debug.per_window_input_rotation", false); + public static class PointerState { // Trace of previous points. private float[] mTraceX = new float[32]; @@ -352,6 +356,21 @@ public class PointerLocationView extends View implements InputDeviceListener, .toString(), 1 + itemW * 6, base, mTextPaint); } + int saveId = canvas.save(); + if (ENABLE_PER_WINDOW_INPUT_ROTATION) { + // Rotate negative (since we're rotating the drawing canvas vs the output). + canvas.rotate(-90.0f * mContext.getDisplay().getRotation()); + switch (mContext.getDisplay().getRotation()) { + case Surface.ROTATION_90: + canvas.translate(-canvas.getHeight(), 0); + break; + case Surface.ROTATION_180: + canvas.translate(-canvas.getWidth(), -canvas.getHeight()); + break; + case Surface.ROTATION_270: + canvas.translate(0, -canvas.getWidth()); + } + } // Pointer trace. for (int p = 0; p < NP; p++) { final PointerState ps = mPointers.get(p); @@ -399,7 +418,10 @@ public class PointerLocationView extends View implements InputDeviceListener, if (mCurDown && ps.mCurDown) { // Draw crosshairs. canvas.drawLine(0, ps.mCoords.y, getWidth(), ps.mCoords.y, mTargetPaint); - canvas.drawLine(ps.mCoords.x, 0, ps.mCoords.x, getHeight(), mTargetPaint); + // Extend crosshairs to cover screen regardless of rotation (ie. since the rotated + // canvas can "expose" content past 0 and up-to the largest screen dimension). + canvas.drawLine(ps.mCoords.x, -getHeight(), ps.mCoords.x, + Math.max(getHeight(), getWidth()), mTargetPaint); // Draw current point. int pressureLevel = (int)(ps.mCoords.pressure * 255); @@ -458,6 +480,7 @@ public class PointerLocationView extends View implements InputDeviceListener, } } } + canvas.restoreToCount(saveId); } private void logMotionEvent(String type, MotionEvent event) { diff --git a/core/jni/Android.bp b/core/jni/Android.bp index d72a0ec8641f..59db65543c91 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -209,7 +209,7 @@ cc_library_shared { ], shared_libs: [ - "android.hardware.memtrack-unstable-ndk_platform", + "android.hardware.memtrack-V1-ndk_platform", "audioclient-types-aidl-cpp", "audioflinger-aidl-cpp", "av-types-aidl-cpp", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index a4da22280bf1..a85996afa900 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -690,6 +690,9 @@ <!-- Made protected in S (was added in R) --> <protected-broadcast android:name="com.android.internal.intent.action.BUGREPORT_REQUESTED" /> + <!-- Added in S --> + <protected-broadcast android:name="android.intent.action.REBOOT_READY" /> + <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> diff --git a/core/res/res/layout/notification_template_conversation_header.xml b/core/res/res/layout/notification_template_conversation_header.xml index b018676e68f0..302a388cf1b2 100644 --- a/core/res/res/layout/notification_template_conversation_header.xml +++ b/core/res/res/layout/notification_template_conversation_header.xml @@ -101,8 +101,8 @@ <ImageView android:id="@+id/verification_icon" - android:layout_width="@dimen/notification_badge_size" - android:layout_height="@dimen/notification_badge_size" + android:layout_width="@dimen/notification_verification_icon_size" + android:layout_height="@dimen/notification_verification_icon_size" android:layout_gravity="center" android:layout_marginStart="4dp" android:contentDescription="@string/notification_alerted_content_description" @@ -140,6 +140,19 @@ /> <ImageView + android:id="@+id/phishing_alert" + android:layout_width="@dimen/notification_phishing_alert_size" + android:layout_height="@dimen/notification_phishing_alert_size" + android:layout_marginStart="4dp" + android:paddingTop="2dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_dialog_alert_material" + android:visibility="gone" + android:contentDescription="@string/notification_phishing_alert_content_description" + /> + + + <ImageView android:id="@+id/profile_badge" android:layout_width="@dimen/notification_badge_size" android:layout_height="@dimen/notification_badge_size" diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml index 88998f2167a8..62114630a328 100644 --- a/core/res/res/layout/notification_template_header.xml +++ b/core/res/res/layout/notification_template_header.xml @@ -33,6 +33,7 @@ android:layout_gravity="center_vertical|start" android:layout_marginStart="@dimen/notification_left_icon_start" android:background="@drawable/notification_large_icon_outline" + android:clipToOutline="true" android:importantForAccessibility="no" android:scaleType="centerCrop" android:visibility="gone" diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml index 41be36bc2b04..d79cb74a3d53 100644 --- a/core/res/res/layout/notification_template_material_base.xml +++ b/core/res/res/layout/notification_template_material_base.xml @@ -30,6 +30,7 @@ android:layout_gravity="center_vertical|start" android:layout_marginStart="@dimen/notification_left_icon_start" android:background="@drawable/notification_large_icon_outline" + android:clipToOutline="true" android:importantForAccessibility="no" android:scaleType="centerCrop" android:visibility="gone" @@ -54,6 +55,7 @@ android:layout_marginBottom="@dimen/notification_right_icon_headerless_margin" android:layout_marginEnd="@dimen/notification_header_expand_icon_size" android:background="@drawable/notification_large_icon_outline" + android:clipToOutline="true" android:importantForAccessibility="no" android:scaleType="centerCrop" /> diff --git a/core/res/res/layout/notification_template_material_big_picture.xml b/core/res/res/layout/notification_template_material_big_picture.xml index 25d396f94b2c..e1b7bc4d7bca 100644 --- a/core/res/res/layout/notification_template_material_big_picture.xml +++ b/core/res/res/layout/notification_template_material_big_picture.xml @@ -72,6 +72,7 @@ android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" android:background="@drawable/notification_big_picture_outline" + android:clipToOutline="true" android:scaleType="centerCrop" /> diff --git a/core/res/res/layout/notification_template_right_icon.xml b/core/res/res/layout/notification_template_right_icon.xml index d22d4c20dad2..f163ed5f955a 100644 --- a/core/res/res/layout/notification_template_right_icon.xml +++ b/core/res/res/layout/notification_template_right_icon.xml @@ -22,6 +22,7 @@ android:layout_marginEnd="@dimen/notification_header_expand_icon_size" android:layout_marginTop="@dimen/notification_right_icon_big_margin_top" android:background="@drawable/notification_large_icon_outline" + android:clipToOutline="true" android:importantForAccessibility="no" android:scaleType="centerCrop" /> diff --git a/core/res/res/layout/notification_top_line_views.xml b/core/res/res/layout/notification_top_line_views.xml index 7656dd50b2d4..88bcc4dc9e39 100644 --- a/core/res/res/layout/notification_top_line_views.xml +++ b/core/res/res/layout/notification_top_line_views.xml @@ -123,6 +123,18 @@ /> <ImageView + android:id="@+id/phishing_alert" + android:layout_width="@dimen/notification_phishing_alert_size" + android:layout_height="@dimen/notification_phishing_alert_size" + android:layout_marginStart="4dp" + android:baseline="10dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_dialog_alert_material" + android:visibility="gone" + android:contentDescription="@string/notification_phishing_alert_content_description" + /> + + <ImageView android:id="@+id/profile_badge" android:layout_width="@dimen/notification_badge_size" android:layout_height="@dimen/notification_badge_size" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 8aa297ec66e5..d7474d050399 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Laat die program toe om Moenie Steur Nie-opstelling te lees en skryf."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"begin kyk van toestemminggebruik"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Laat die houer toe om die toestemminggebruik vir \'n program te begin. Behoort nooit vir normale programme nodig te wees nie."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Stel wagwoordreëls"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Beheer die lengte en die karakters wat in skermslotwagwoorde en -PIN\'e toegelaat word."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor pogings om skerm te ontsluit"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 16c8404ce1bd..8283584758cc 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"መተግበሪያው የአትረብሽ ውቅረትን እንዲያነብብ እና እንዲጸፍ ይፈቅዳል።"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"የእይታ ፈቃድ መጠቀምን መጀመር"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ያዢው ለአንድ መተግበሪያ የፈቃድ አጠቃቀሙን እንዲያስጀምር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"የይለፍ ቃል ደንቦች አዘጋጅ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"በማያ ገጽ መቆለፊያ የይለፍ ቃሎች እና ፒኖች ውስጥ የሚፈቀዱ ቁምፊዎችን እና ርዝመታቸውን ተቆጣጠር።"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"የማሳያ-ክፈት ሙከራዎችን ክትትል ያድርጉባቸው"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a291a89b62f8..d0dd5fb52ecf 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -697,6 +697,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"للسماح للتطبيق بقراءة إعداد \"عدم الإزعاج\" وكتابتها."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"بدء استخدام إذن العرض"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"للسماح للمالك ببدء استخدام الإذن لأحد التطبيقات. ولن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"تعيين قواعد كلمة المرور"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"للتحكم في الطول والأحرف المسموح بها في كلمات المرور وأرقام التعريف الشخصي في قفل الشاشة."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"مراقبة محاولات فتح قفل الشاشة"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 3c052d74878b..f6fc09f8d5e7 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"চোৱাৰ অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰক"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ধাৰকক কোনো এপৰ বাবে অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰিবলৈ দিয়ে। সাধাৰণ এপ্সমূহৰ বাবে কেতিয়াও প্ৰয়োজন হ’ব নালাগে।"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"পাছৱর্ডৰ নিয়ম ছেট কৰক"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"স্ক্ৰীণ লক পাছৱৰ্ড আৰু পিনৰ দৈর্ঘ্য আৰু কি কি আখৰ ব্যৱহাৰ কৰিব পাৰে তাক নিয়ন্ত্ৰণ কৰক।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"স্ক্ৰীণ আনলক কৰা প্ৰয়াসবোৰ পৰ্যবেক্ষণ কৰিব পাৰে"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 70b57a99be1d..58d225d4d854 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Tətbiqə \"Narahat Etməyin\" konfiqurasiyasını oxumağa və yazmağa icazə verin."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Baxış icazəsinin istifadəsinə başlayın"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Sahibinə tətbiqin icazədən istifadəsinə başlamağa imkan verir. Adi tətbiqlər üçün heç vaxt tələb edilmir."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Parol qaydalarını təyin edin"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran kilidinin parolu və PINlərində icazə verilən uzunluq və simvollara nəzarət edin."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekranı kiliddən çıxarmaq üçün edilən cəhdlərə nəzarət edin"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index c96264ead6dd..1569bd13797c 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Dozvoljava aplikaciji da čita i upisuje konfiguraciju podešavanja Ne uznemiravaj."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"početak korišćenja dozvole za pregled"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da započne korišćenje dozvole za aplikaciju. Nikada ne bi trebalo da bude potrebna za uobičajene aplikacije."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Podešavanje pravila za lozinku"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadgledajte pokušaje otključavanja ekrana"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 06b7372665d0..f1f7e0cc2313 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дазваляе праграме чытаць і выконваць запіс у канфігурацыю рэжыму «Не турбаваць»."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"запусціць выкарыстанне дазволаў на прагляд"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дазваляе трымальніку запусціць выкарыстанне дазволаў праграмай. Не патрэбна для звычайных праграм."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Устанавіць правілы паролю"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Кіраваць даўжынёй і сімваламі, дазволенымі пры ўводзе пароляў і PIN-кодаў блакіроўкі экрана."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Сачыць за спробамі разблакіроўкі экрана"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 3a86bea53b9b..076df22cbe7b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Предоставя на приложението достъп за четене и запис до конфигурацията на „Не безпокойте“."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"стартиране на прегледа на използваните разрешения"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Разрешава на притежателя да стартира прегледа на използваните разрешения за дадено приложение. Нормалните приложения би трябвало никога да не се нуждаят от това."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Задаване на правила за паролата"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролира дължината и разрешените знаци за паролите и ПИН кодовете за заключване на екрана."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Наблюдаване на опитите за отключване на екрана"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 2cb7bf544bab..c7fb8bd21e33 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অ্যাপটিকে \'বিরক্ত করবে না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"দেখার অনুমতি কাজে লাগানো শুরু করুন"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"কোনও অ্যাপের কোনও নির্দিষ্ট অনুমতির ব্যবহার শুরু করার ক্ষেত্রে হোল্ডারকে সাহায্য করে। সাধারণ অ্যাপের জন্য এটির পরিবর্তন হওয়ার কথা নয়।"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"পাসওয়ার্ড নিয়মগুলি সেট করে"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"স্ক্রিন লক করার পাসওয়ার্ডগুলিতে অনুমতিপ্রাপ্ত অক্ষর এবং দৈর্ঘ্য নিয়ন্ত্রণ করে৷"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"স্ক্রিন আনলক করার প্রচেষ্টাগুলির উপরে নজর রাখুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index b738b0d907a5..393e70224b9c 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti korištenje odobrenja za pregled"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da pokrene korištenje odobrenja za aplikaciju. Ne bi trebalo biti potrebno za obične aplikacije."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavljanje pravila za lozinke"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Prati pokušaje otključavanja ekrana"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index ead0988d9b8d..56131e3e4386 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet que l\'aplicació llegeixi la configuració No molestis i hi escrigui."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"comença a utilitzar el permís de visualització"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet que un propietari comenci a utilitzar el permís amb una aplicació. No s\'hauria de necessitar mai per a les aplicacions normals."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir les normes de contrasenya"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Permet controlar la longitud i el nombre de caràcters permesos a les contrasenyes i als PIN del bloqueig de pantalla."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisar els intents de desbloqueig de la pantalla"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index a9975b5a4fd0..7f20d3f0511c 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikaci číst a zapisovat konfiguraci režimu Nerušit."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"zahájení zobrazení využití oprávnění"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje přístup zahájit využití oprávnění jiné aplikace. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastavit pravidla pro heslo"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ovládání délky a znaků povolených v heslech a kódech PIN zámku obrazovky."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Sledovat pokusy o odemknutí obrazovky"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 187e098b869f..d0effa6628e5 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -687,6 +687,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Giver appen tilladelse til at læse og redigere konfigurationen af Forstyr ikke."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start brugen at tilladelsesvisning"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Tillader, at brugeren kan bruge en tilladelse for en app. Dette bør aldrig være nødvendigt for almindelige apps."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Angiv regler for adgangskoder"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Tjek længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåg forsøg på oplåsning af skærm"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index f8e874dd3d61..70459411bf1d 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ermöglicht der App Lese- und Schreibzugriff auf die \"Bitte nicht stören\"-Konfiguration"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Mit der Verwendung der Anzeigeberechtigung beginnen"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ermöglicht dem Inhaber, die Berechtigungsnutzung für eine App zu beginnen. Sollte für normale Apps nie benötigt werden."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Passwortregeln festlegen"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Zulässige Länge und Zeichen für Passwörter für die Displaysperre festlegen"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Versuche zum Entsperren des Displays überwachen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 14d0271578c8..8d14b3bbe710 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"έναρξη χρήσης άδειας προβολής"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Επιτρέπει στον κάτοχο να ξεκινήσει τη χρήση της άδειας για μια εφαρμογή. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Ορισμός κανόνων κωδικού πρόσβασης"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Παρακολούθηση προσπαθειών ξεκλειδώματος οθόνης"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 6c850a6ded1b..51e4ef79ddba 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index dd37df765aa5..3e99738a8900 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 17dbd45f2395..464a44ba3df4 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index fb57bbcd5a2e..2b8cd8681a57 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 8fbeedeb8fea..9d073b9edf86 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Allows the app to sample sensor data at a rate greater than 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Set password rules"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Control the length and the characters allowed in screen lock passwords and PINs."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitor screen unlock attempts"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 3e995c6e6d34..333bdc804369 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de la función No interrumpir."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el propietario inicie el uso de permisos para una app. No debería requerirse para apps normales."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Acceder a los datos del sensor a una tasa de muestreo alta"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que la app tome una muestra de los datos del sensor a una tasa superior a 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecer reglas de contraseña"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlar la longitud y los caracteres permitidos en las contraseñas y los PIN para el bloqueo de pantalla."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisa los intentos para desbloquear la pantalla"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 8b1c3271e7f5..476193e3102f 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de No molestar."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de visualización"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el titular inicie el uso de permisos de una aplicación. Las aplicaciones normales no deberían necesitar nunca este permiso."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecimiento de reglas de contraseña"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla la longitud y los caracteres permitidos en los PIN y en las contraseñas de bloqueo de pantalla."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Supervisar los intentos de desbloqueo de pantalla"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 33f8e526828a..c32cf73bf2ca 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Võimaldab rakendusel lugeda ja kirjutada funktsiooni Mitte segada seadistusi."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"vaatamisloa kasutamise alustamine"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Võimaldab omanikul rakenduse puhul alustada loa kasutamist. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Parooli reeglite määramine"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Juhitakse ekraaniluku paroolide ja PIN-koodide pikkusi ning lubatud tähemärkide seadeid."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekraani avamiskatsete jälgimine"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 8328c86df751..86546e0baac0 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ez molestatzeko moduaren konfigurazioa irakurtzeko eta bertan idazteko baimena ematen die aplikazioei."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"hasi ikusteko baimena erabiltzen"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Aplikazioaren baimena erabiltzen hasteko baimena ematen die titularrei. Aplikazio normalek ez lukete beharko."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Ezarri pasahitzen arauak"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolatu pantaila blokeoaren pasahitzen eta PINen luzera eta onartutako karaktereak."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Gainbegiratu pantaila desblokeatzeko saiakerak"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 75081e5e5787..b1ec1f6e7483 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"به برنامه امکان میدهد پیکربندی «مزاحم نشوید» را بخواند و بنویسد."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"شروع مشاهده استفاده از مجوز"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"به دارنده اجازه شروع استفاده از مجوز را برای برنامه میدهد. هرگز برای برنامههای معمول نیاز نیست."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"تنظیم قوانین گذرواژه"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"کنترل طول و نوع نویسههایی که در گذرواژه و پین قفل صفحه مجاز است."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"پایش تلاشهای باز کردن قفل صفحه"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 42c220dfcf92..55c6d92f1136 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Sallii sovelluksen lukea ja muokata Älä häiritse -tilan asetuksia."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"aloita katseluoikeuksien käyttö"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Antaa luvanhaltijan käynnistää sovelluksen käyttöoikeuksien käytön. Ei tavallisten sovelluksien käyttöön."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Asentaa salasanasäännöt"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Hallinnoida ruudun lukituksen salasanoissa ja PIN-koodeissa sallittuja merkkejä ja niiden pituutta."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Tarkkailla näytön avaamisyrityksiä"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index b4a22f46e4fa..15351bcef7ba 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"démarrer l\'affichage de l\'usage des autorisations"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet au détenteur de démarrer l\'usage des autorisations pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accéder aux données des capteurs à un taux d’échantillonnage élevé"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permet à l’application d’échantillonner les données des capteurs à une fréquence supérieure à 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les NIP de verrouillage de l\'écran."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 8133f97dd0c1..8cb86143b5f5 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"activer l\'utilisation de l\'autorisation d\'affichage"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet à l\'application autorisée d\'activer l\'utilisation de l\'autorisation pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 526c74607fd4..f99d02c01996 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite á aplicación ler e escribir a configuración do modo Non molestar."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite ao propietario iniciar o uso de permisos dunha aplicación. As aplicacións normais non deberían precisalo nunca."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Establecer as normas de contrasinal"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla a lonxitude e os caracteres permitidos nos contrasinais e nos PIN de bloqueo da pantalla."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Controlar os intentos de desbloqueo da pantalla"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index e0e20af38496..84ee732e0d16 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"એપ્લિકેશનને ખલેલ પાડશો નહીં ગોઠવણી વાંચવા અને લખવાની મંજૂરી આપે છે."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"પરવાનગી વપરાશ જુઓને શરૂ કરો"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"કોઈ ઍપ માટે પરવાનગી વપરાશ શરૂ કરવાની ધારકને મંજૂરી આપે છે. સામાન્ય ઍપ માટે ક્યારેય જરૂર પડી ન શકે."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"પાસવર્ડ નિયમો સેટ કરો"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"સ્ક્રીન લૉક પાસવર્ડ અને પિનમાં મંજૂર લંબાઈ અને અક્ષરોને નિયંત્રિત કરો."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"સ્ક્રીનને અનલૉક કરવાના પ્રયત્નોનું નિયમન કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index df97a1259fd8..93408be6a5e3 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"देखने की अनुमतियां चालू करें"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"इस्तेमाल करने वाले को किसी ऐप्लिकेशन के लिए अनुमतियों का इस्तेमाल शुरू करने देता है. सामान्य ऐप्लिकेशन के लिए इसकी ज़रूरत कभी नहीं पड़ती."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करना"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड और पिन की लंबाई और उनमें स्वीकृत वर्णों को नियंत्रित करना."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक करने के की कोशिशों पर नज़र रखना"</string> @@ -1886,7 +1890,7 @@ <string name="call_notification_decline_action" msgid="3700345945214000726">"अस्वीकार करें"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"कॉल काटें"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"आने वाला (इनकमिंग) कॉल"</string> - <string name="call_notification_ongoing_text" msgid="3880832933933020875">"जारी कॉल"</string> + <string name="call_notification_ongoing_text" msgid="3880832933933020875">"पहले से जारी कॉल"</string> <string name="call_notification_screening_text" msgid="8396931408268940208">"इनकमिंग कॉल को स्क्रीन किया जा रहा है"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index fdadb5e170e4..7fa4fe32ede5 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne ometaj."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti upotrebu dopuštenja za pregled"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavi pravila zaporke"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Upravlja duljinom i znakovima koji su dopušteni u zaporkama i PIN-ovima zaključavanja zaslona."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadziri pokušaje otključavanja zaslona"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index dce975cf0080..d71c5620d44d 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Az alkalmazás olvashatja és szerkesztheti a „Ne zavarjanak” funkció beállításait."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"engedélyhasználat megtekintésének elindítása"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lehetővé teszi a felhasználó számára, hogy elindítsa az alkalmazás engedélyhasználatát. A normál alkalmazásoknak erre soha nincs szükségük."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Jelszavakkal kapcsolatos szabályok beállítása"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"A képernyőzár jelszavaiban és PIN kódjaiban engedélyezett karakterek és hosszúság vezérlése."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Képernyőzár-feloldási kísérletek figyelése"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index ca4e9b8be535..e5267d95a959 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Թույլ է տալիս հավելվածին փոփոխել «Չանհանգստացնել» գործառույթի կազմաձևումը:"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"թույլտվությունների մասին տվյալների հասանելիություն"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Հավելվածին հասանելի կդառնան թույլտվությունների մասին տվյալները։ Այս թույլտվությունն անհրաժեշտ չէ սովորական հավելվածներին։"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Սահմանել գաղտնաբառի կանոնները"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Կառավարել էկրանի ապակողպման գաղտնաբառերի և PIN կոդերի թույլատրելի երկարությունն ու գրանշանները:"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Վերահսկել էկրանի ապակողպման փորձերը"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index e68812db464f..636bb04c3473 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Mengizinkan aplikasi membaca dan menulis konfigurasi status Jangan Ganggu."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulai melihat penggunaan izin"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Memungkinkan pemegang memulai penggunaan izin untuk aplikasi. Tidak diperlukan untuk aplikasi normal."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Setel aturan sandi"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Mengontrol panjang dan karakter yang diizinkan dalam sandi dan PIN kunci layar."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Pantau upaya pembukaan kunci layar"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 2076363a19fd..b359e7d3a28e 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leyfir forriti að lesa og skrifa í grunnstillingu „Ónáðið ekki“."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"heimildanotkun upphafsyfirlits"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leyfir handhafa að byrja heimildanotkun fyrir forrit. Ætti aldrei að þurfa fyrir venjuleg forrit."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Setja reglur um aðgangsorð"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stjórna lengd og fjölda stafa í aðgangsorðum og PIN-númerum skjáláss."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Fylgjast með tilraunum til að taka skjáinn úr lás"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 34ee5dc4a664..d4c6ae0540c9 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"avvio dell\'uso dell\'autorizzazione di visualizzazione"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Consente al titolare di avviare l\'uso delle autorizzazioni per un\'app. Non dovrebbe essere mai necessaria per le normali applicazioni."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Impostare regole per le password"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlla la lunghezza e i caratteri ammessi nelle password e nei PIN del blocco schermo."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorare tentativi di sblocco dello schermo"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 9595da6f3871..33f43af259e8 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"התחלת צפייה בהרשאות השימוש"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"הגדר כללי סיסמה"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"מעקב אחר ניסיונות לביטול של נעילת המסך"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index dd3667edd022..2482c7e8a5e2 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"サイレント モード設定の読み取りと書き込みをアプリに許可します。"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"表示権限の使用の開始"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"アプリの権限使用の開始を所有者に許可します。通常のアプリでは不要です。"</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"高サンプリング レートでセンサーデータにアクセスする"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz を超えるレートでセンサーデータをサンプリングすることをアプリに許可します"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"パスワードルールの設定"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"画面ロックのパスワードとPINの長さと使用できる文字を制御します。"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"画面ロック解除試行の監視"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index b8454983ed2f..e45b18a6170b 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"საშუალებას აძლევს აპს, წაიკითხოს და დაწეროს კონფიგურაცია „არ შემაწუხოთ“."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ნახვის ნებართვის გამოყენების დაწყება"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"მფლობელს საშუალებას აძლევს, დაიწყოს აპის ნებართვის გამოყენება. ჩვეულებრივი აპებისთვის არასოდეს უნდა იყოს საჭირო."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"სენსორის მონაცემებზე წვდომა სემპლინგის მაღალი სიხშირით"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"საშუალებას აძლევს აპს, მიიღოს სენსორის მონაცემების ნიმუშები 200 ჰც-ზე მეტი სიხშირით"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"პაროლის წესების დაყენება"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"აკონტროლეთ ეკრანის ბლოკირების პაროლებისა და PIN-ების სიმბოლოების სიგრძე."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ეკრანის განბლოკვის მცდელობების მონიტორინგი"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 5cb4f755578f..08a2e6773c90 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"рұқсаттарды пайдалану туралы деректерді көру"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Құпия сөз ережелерін тағайындау"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран бекітпесінің құпия сөздерінің және PIN кодтарының ұзындығын және оларда рұқсат етілген таңбаларды басқару."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Экран құлпын ашу әркеттерін бақылау"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index d0093115924e..34e249e550ee 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"អនុញ្ញាតឲ្យកម្មវិធីអាន និងសរសេរការកំណត់រចនាសម្ព័ន្ធមុខងារ កុំរំខាន។"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ចាប់ផ្ដើមមើលការប្រើប្រាស់ការអនុញ្ញាត"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"អនុញ្ញាតឱ្យម្ចាស់ចាប់ផ្ដើមការប្រើប្រាស់ការអនុញ្ញាតសម្រាប់កម្មវិធី។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"កំណត់ក្បួនពាក្យសម្ងាត់"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"គ្រប់គ្រងប្រវែង និងតួអក្សរដែលអនុញ្ញាតឲ្យប្រើក្នុងពាក្យសម្ងាត់ និងលេខសម្ងាត់ចាក់សោអេក្រង់។"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"តាមដានការព្យាយាមដោះសោអេក្រង់"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 48684866ffdc..9a33f06b61fc 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ವೀಕ್ಷಣಾ ಅನುಮತಿಯ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ಆ್ಯಪ್ಗಾಗಿ ಅನುಮತಿ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"ಪಾಸ್ವರ್ಡ್ ನಿಮಯಗಳನ್ನು ಹೊಂದಿಸಿ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ಪರದೆ ಲಾಕ್ನಲ್ಲಿನ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಪಿನ್ಗಳ ಅನುಮತಿಸಲಾದ ಅಕ್ಷರಗಳ ಪ್ರಮಾಣವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ಪರದೆಯ ಅನ್ಲಾಕ್ ಪ್ರಯತ್ನಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 6149e4b048ef..a395c892dcfa 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"앱에서 방해 금지 모드 설정을 읽고 작성하도록 허용합니다."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"권한 사용 보기 시작"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"앱의 권한 사용을 시작하려면 보유자를 허용하세요. 일반 앱에는 필요하지 않습니다."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"비밀번호 규칙 설정"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"화면 잠금 비밀번호와 PIN에 허용되는 길이와 문자 수를 제어합니다."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"화면 잠금 해제 시도 모니터링"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index e2f539728f25..f8a800db2ba2 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -314,7 +314,7 @@ <string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"аудио жаздыруу"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Кыймыл-аракет"</string> - <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"кыймыл-аракетиңизге мүмкүнчүлүк алат"</string> + <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"кыймыл-аракеттериңизге көз салып турганга мүмкүнчүлүк алат"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"Камера"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"сүрөт жана видео тартууга"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Чалуулар тизмеси"</string> @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Колдонмого \"Тынчымды алба\" режиминин конфигурациясын окуу жана жазуу мүмкүнчүлүгүн берет."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"уруксаттын колдонулушун көрүп баштоо"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Колдонмонун пайдаланылышына уруксат берүүгө мүмкүнчүлүк берет. Кадимки колдонмолорго эч качан талап кылынбашы керек."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Сырсөз эрежелерин коюу"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Экран кулпусун ачуу аракеттерин көзөмөлдөө"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index c41c4111e87c..93f38890326f 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ອະນຸຍາດໃຫ້ແອັບອ່ານ ແລະຂຽນການກນຳດຄ່າ ບໍ່ລົບກວນ."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ເລີ່ມການໃຊ້ສິດອະນຸຍາດການເບິ່ງ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການໃຊ້ສິດອະນຸຍາດສຳລັບແອັບໃດໜຶ່ງໄດ້. ແອັບປົກກະຕິບໍ່ຄວນຕ້ອງໃຊ້."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີໃນອັດຕາຕົວຢ່າງສູງ"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ອະນຸຍາດໃຫ້ແອັບສຸ່ມຕົວຢ່າງຂໍ້ມູນເຊັນເຊີໃນອັດຕາທີ່ຫຼາຍກວ່າ 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"ຕັ້ງຄ່າກົດຂອງລະຫັດຜ່ານ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ຄວບຄຸມຄວາມຍາວ ແລະຕົວອັກສອນທີ່ອະນຸຍາດໃຫ້ຢູ່ໃນລະຫັດລັອກໜ້າຈໍ ແລະ PIN."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ຕິດຕາມການພະຍາຍາມປົດລັອກໜ້າຈໍ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index b9b2131341b4..9c1e09de02b6 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leidžiama programai skaityti ir rašyti „Do Not Disturb“ konfigūraciją."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pradėti peržiūrėti leidimo naudojimą"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leidžia savininkui pradėti naudoti programos leidimą. Įprastoms programoms to neturėtų prireikti."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Nustatyti slaptažodžio taisykles"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Valdykite, kokio ilgio ekrano užrakto slaptažodžius ir PIN kodus galima naudoti."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Stebėti bandymus atrakinti ekraną"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 803574fe85b8..d77cfd4c5bad 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ļauj lietotnei lasīt un rakstīt režīma “Netraucēt” konfigurāciju."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Datu skatīšana par izmantojamajām atļaujām"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ļauj atļaujas īpašniekam sākt lietotnes atļauju izmantošanu. Parastām lietotnēm tas nekad nav nepieciešams."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Paroles kārtulu iestatīšana"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index dd48273acca0..54ac67b0c3b6 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозволува апликацијата да чита и пишува конфигурација Не вознемирувај."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"започнете со користење на дозволата за приказ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозволува сопственикот да почне со користење на дозволата за апликација. Не треба да се користи за стандардни апликации."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Постави правила за лозинката"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролирај ги должината и знаците што се дозволени за лозинки и PIN-броеви за отклучување екран."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Следи ги обидите за отклучување на екранот"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c2576fe92fb6..1329fb096836 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\'ശല്യപ്പെടുത്തരുത്\' കോൺഫിഗറേഷൻ വായിക്കുന്നതിനും എഴുതുന്നതിനും ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"അനുമതി ഉപയോഗം കാണാൻ ആരംഭിക്കുക"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ഒരു ആപ്പിനുള്ള അനുമതി ഉപയോഗം ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"പാസ്വേഡ് നിയമങ്ങൾ സജ്ജീകരിക്കുക"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"സ്ക്രീൻ ലോക്ക് പാസ്വേഡുകളിലും PIN-കളിലും അനുവദിച്ചിരിക്കുന്ന ദൈർഘ്യവും പ്രതീകങ്ങളും നിയന്ത്രിക്കുക."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"സ്ക്രീൻ അൺലോക്ക് ശ്രമങ്ങൾ നിരീക്ഷിക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 786f722132fc..4b1dbb358adf 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Апп-д Бүү саад бол тохируулгыг уншиж, бичихийг зөвшөөрөх"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"зөвшөөрлийн ашиглалтыг харж эхлэх"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Эзэмшигчид аппын зөвшөөрлөө ашиглаж эхлэхийг зөвшөөрдөг. Энгийн аппуудад шаардлагагүй."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"түүврийн өндөр хувиар мэдрэгчийн өгөгдөлд хандах"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Аппад 200 Гц-ээс их хувиар мэдрэгчийн өгөгдлийг түүвэрлэх боломжийг олгодог"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Нууц үгний дүрмийг тохируулах"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Дэлгэц түгжих нууц үг болон ПИН кодны урт болон нийт тэмдэгтийн уртыг хянах."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Дэлгэцийн түгжээг тайлах оролдлогыг хянах"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index c1b8088a870e..ea222907eee8 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"व्यत्यय आणू नका कॉंफिगरेशन वाचण्यासाठी आणि लिहिण्यासाठी ॲपला अनुमती देते."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"व्ह्यू परवानगी वापर सुरू करा"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"धारकास अॅपसाठी परवानगी वापरणे सुरू करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यकता नसते."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करा"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांचे परीक्षण करा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 5e26682fd664..0a1205fe608b 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Membenarkan apl membaca dan menulis konfigurasi Jangan Ganggu."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulakan lihat penggunaan kebenaran"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Membenarkan pemegang memulakan penggunaan kebenaran untuk apl. Tidak sekali-kali diperlukan untuk apl biasa."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Tetapkan peraturan kata laluan"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Mengawal panjang dan aksara yang dibenarkan dalam kata laluan dan PIN kunci skrin."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Pantau percubaan buka kunci skrin"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index aff554916517..845c24f97ce2 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"မနှောင့်ယှက်ရန် ချိန်ညှိမှုကို အပ်ဖ်များ ဖတ်ခြင်း ပြင်ခြင်းပြုလုပ်နိုင်ရန် ခွင့်ပြုမည်။"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"အစမြင်ကွင်း ခွင့်ပြုချက် အသုံးပြုမှု"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"အက်ပ်တစ်ခုအတွက် ခွင့်ပြုချက်စတင်အသုံးပြုမှုကို ကိုင်ဆောင်သူအား ခွင့်ပြုသည်။ ပုံမှန်အက်ပ်များအတွက် ဘယ်သောအခါမျှ မလိုအပ်ပါ။"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ပါ"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 21ca11701f08..4e05659a0732 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lar appen lese og skrive konfigurasjon av Ikke forstyrr."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start visning av bruk av tillatelser"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lar innehaveren starte bruk av tillatelser for en app. Dette skal aldri være nødvendig for vanlige apper."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Angi passordregler"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrollerer tillatt lengde og tillatte tegn i passord og PIN-koder for opplåsing av skjermen."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåk forsøk på å låse opp skjermen"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 09b97652bb6c..f76011ae439c 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि एपलाई अनुमति दिनुहोस्।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै एपसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 6d1b8e77ed9b..01d4a70bd958 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Hiermee kan de app configuratie voor Niet storen lezen en schrijven."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rechtengebruik starten"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Hiermee kan de houder het rechtengebruik voor een app starten. Nooit vereist voor normale apps."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Wachtwoordregels instellen"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"De lengte en het aantal tekens beheren die zijn toegestaan in wachtwoorden en pincodes voor schermvergrendeling."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Pogingen voor schermontgrendeling bijhouden"</string> @@ -1858,7 +1862,7 @@ <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string> <string name="zen_mode_default_events_name" msgid="2280682960128512257">"Afspraken"</string> <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Slapen"</string> - <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> dempt sommige geluiden"</string> + <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> zet sommige geluiden uit"</string> <string name="system_error_wipe_data" msgid="5910572292172208493">"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string> <string name="system_error_manufacturer" msgid="703545241070116315">"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."</string> <string name="stk_cc_ussd_to_dial" msgid="3139884150741157610">"USSD-verzoek gewijzigd in normaal gesprek"</string> @@ -1932,7 +1936,7 @@ <string name="demo_starting_message" msgid="6577581216125805905">"Demo starten…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Apparaat resetten…"</string> <string name="suspended_widget_accessibility" msgid="6331451091851326101">"<xliff:g id="LABEL">%1$s</xliff:g> uitgeschakeld"</string> - <string name="conference_call" msgid="5731633152336490471">"Conferencecall"</string> + <string name="conference_call" msgid="5731633152336490471">"Telefonische vergadering"</string> <string name="tooltip_popup_title" msgid="7863719020269945722">"Knopinfo"</string> <string name="app_category_game" msgid="4534216074910244790">"Games"</string> <string name="app_category_audio" msgid="8296029904794676222">"Muziek en audio"</string> @@ -2008,7 +2012,7 @@ <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wil segmenten van <xliff:g id="APP_2">%2$s</xliff:g> weergeven"</string> <string name="screenshot_edit" msgid="7408934887203689207">"Bewerken"</string> <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Trillen bij gesprekken en meldingen"</string> - <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Gesprekken en meldingen zijn gedempt"</string> + <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Telefoon- en meldingsgeluid wordt uitgezet"</string> <string name="notification_channel_system_changes" msgid="2462010596920209678">"Systeemwijzigingen"</string> <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Niet storen"</string> <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nieuw: \'Niet storen\' verbergt meldingen"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index dc28d60ca05e..e14578758c49 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" କନଫିଗରେଶନ୍ ପଢ଼ିବା ତଥା ଲେଖିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦେଇଥାଏ।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ଅନୁମତି ବ୍ୟବହାର ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ଏକ ଆପ୍ ପାଇଁ ଅନୁମତିର ବ୍ୟବହାର ଆରମ୍ଭ କରିବାକୁ ଧାରକକୁ ଅନୁମତି ଦେଇଥାଏ। ସାଧାରଣ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ ଏହା ଆବଶ୍ୟକ ନୁହେଁ।"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"ପାସ୍ୱର୍ଡ ନିୟମାବଳୀ ସେଟ୍ କରନ୍ତୁ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ଲକ୍ ସ୍କ୍ରୀନ୍ ପାସ୍ୱର୍ଡ ଓ PINରେ ଅନୁମୋଦିତ ଦୀର୍ଘତା ଓ ବର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ସ୍କ୍ରୀନ୍-ଅନଲକ୍ କରିବା ଉଦ୍ୟମ ନୀରିକ୍ଷଣ କରନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 5c96f88b9bab..c51845b82563 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ਐਪ ਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ਧਾਰਕ ਨੂੰ ਕਿਸੇ ਹੋਰ ਐਪ ਲਈ ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"ਪਾਸਵਰਡ ਨਿਯਮ ਸੈੱਟ ਕਰੋ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਿੰਨ ਵਿੱਚ ਆਗਿਆ ਦਿੱਤੀ ਲੰਮਾਈ ਅਤੇ ਅੱਖਰਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ਸਕ੍ਰੀਨ ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 612a0e52957c..6f54b413af03 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Pozwala aplikacji na odczyt i zmianę konfiguracji trybu Nie przeszkadzać."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rozpocząć wyświetlanie użycia uprawnień"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umożliwia rozpoczęcie korzystania z uprawnienia dotyczącego danej aplikacji jego posiadaczowi. Zwykłe aplikacje nie powinny potrzebować tego uprawnienia."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Określ reguły hasła"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolowanie długości haseł blokady ekranu i kodów PIN oraz dozwolonych w nich znaków."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorowanie prób odblokowania ekranu"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index f54635bad3b0..bfab1f39a06e 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que o app receba amostras de dados do sensor em uma taxa maior que 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras para senha"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorar tentativas de desbloqueio de tela"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c57e0db40b9d..ee18a2f632b3 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite à app ler e alterar a configuração de Não incomodar"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar utilização da autorização de visualização"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o titular inicie a utilização de autorizações para uma app. Nunca deverá ser necessário para aplicações normais."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras de palavra-passe"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controlar o comprimento e os carateres permitidos nos PINs e nas palavras-passe do bloqueio de ecrã."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorizar tentativas de desbloqueio do ecrã"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index f54635bad3b0..bfab1f39a06e 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Permite que o app receba amostras de dados do sensor em uma taxa maior que 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Definir regras para senha"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitorar tentativas de desbloqueio de tela"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 9096b8c77493..9e6b3f9b9309 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite aplicației să citească și să scrie configurația Nu deranja."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"porniți folosirea permisiunii de vizualizare"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Să seteze reguli pentru parolă"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Să monitorizeze încercările de deblocare a ecranului"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index df2906f348b5..c2377099d409 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Открывает приложению доступ к настройкам режима \"Не беспокоить\" и позволяет изменять их."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Просмотр данных об используемых разрешениях"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Приложение получит доступ к данным об используемых разрешениях. Это разрешение не требуется обычным приложениям."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Настройка правил для паролей"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролировать длину и символы при вводе пароля и PIN-кода."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Отслеживание попыток разблокировать экран"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index b061248b5bfc..5a00e9265166 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"බාධා නොකරන්න වින්යාස කිරීම කියවීමට සහ ලිවීමට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"අවසර භාවිතය බැලීමට ආරම්භ කරන්න"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"තබා සිටින්නාට යෙදුමක් සඳහා අවසර භාවිතය ආරම්භ කිරීමට ඉඩ දෙයි. සාමාන්ය යෙදුම් සඳහා කිසි විටෙක අවශ්ය නොවිය යුතු ය."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ඉහළ නියැදි කිරීමේ වේගයකින් සංවේදක දත්ත වෙත පිවිසෙන්න"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz ට වඩා වැඩි වේගයකින් සංවේදක දත්ත නියැදි කිරීමට යෙදුමට ඉඩ දෙයි"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"මුරපද නීති සකස් කිරීම"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"තිර අගුලු මුරපද සහ PIN තුළ ඉඩ දෙන දිග සහ අනුලකුණු පාලනය කිරීම."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"තිරය අගුළු ඇරීමේ උත්සාහයන් නිරීක්ෂණය කරන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index dcf19f734514..de7a2a4f65ac 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikácii čítať a zapisovať konfiguráciu režimu bez vyrušení."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"spustenie používania povolenia na zobrazenie"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje držiteľovi spustiť používanie povolenia aplikáciou. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastaviť pravidlá pre heslo"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Nastavte dĺžku hesiel na odomknutie obrazovky aj kódov PIN a v nich používané znaky."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Sledovanie pokusov o odomknutie obrazovky"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 88bb116a9c77..3575131884d3 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Aplikaciji omogoča branje in pisanje konfiguracije načina »ne moti«."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"začetek uporabe dovoljenja za ogledovanje"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Imetniku omogoča začetek uporabe dovoljenj za aplikacijo. Nikoli ni potrebno za navadne aplikacije."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Nastavitev pravil za geslo"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Nadzor nad dolžino in znaki, ki so dovoljeni v geslih in kodah PIN za odklepanje zaslona."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadzor nad poskusi odklepanja zaslona"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index b5eaa7a752fd..8857e08002ad 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lejon aplikacionin të lexojë dhe shkruajë konfigurimin e \"Mos shqetëso\"."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"nis përdorimin e lejes për shikimin"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lejon që mbajtësi të nisë përdorimin e lejeve për një aplikacion. Nuk duhet të nevojitet asnjëherë për aplikacionet normale."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"qasu te të dhënat e sensorit me një shpejtësi më të lartë shembulli"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Lejon aplikacionin të mbledhë shembujt e të dhënave të sensorit me shpejtësi më të lartë se 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Cakto rregullat e fjalëkalimit"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrollo gjatësinë dhe karakteret e lejuara në fjalëkalimet dhe kodet PIN të kyçjes së ekranit."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Monitoro tentativat e shkyçjes së ekranit"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d50f659bbc31..4aca2009b567 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -688,6 +688,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозвољава апликацији да чита и уписује конфигурацију подешавања Не узнемиравај."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"почетак коришћења дозволе за преглед"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозвољава власнику да започне коришћење дозволе за апликацију. Никада не би требало да буде потребна за уобичајене апликације."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Подешавање правила за лозинку"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Надгледајте покушаје откључавања екрана"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 892272ab15a0..fb6d4ce3828c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ger appen läs- och skrivbehörighet till konfigurationen för Stör ej."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"börja visa behörighetsanvändningen"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Gör att innehavaren kan öppna behörighetsanvändning för en app. Ska inte behövas för vanliga appar."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Ange lösenordsregler"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Styr tillåten längd och tillåtna tecken i lösenord och pinkoder för skärmlåset."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Övervaka försök att låsa upp skärmen"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 093ebb17b8bd..93dc3b922d3f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Inaruhusu programu kusoma na kuandika usanidi wa kipengee cha Usinisumbue."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"anzisha kipengele cha kuona matumizi ya ruhusa"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Huruhusu kishikiliaji kuanzisha matumizi ya ruhusa ya programu. Haipaswi kuhitajika kwa ajili ya programu za kawaida."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"fikia data ya vitambuzi kwa kasi ya juu ya sampuli"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Huruhusu programu kujaribu sampuli ya data ya vitambuzi kwa kasi inayozidi Hz 200"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Kuweka kanuni za nenosiri"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Dhibiti urefu na maandishi yanayokubalika katika nenosiri la kufunga skrini na PIN."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Kuhesabu mara ambazo skrini inajaribu kufunguliwa"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index bc08a58b1906..e70ffecc33bb 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், ஆப்ஸை அனுமதிக்கிறது."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"அனுமதி உபயோகத்தை அணுகுதல்"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ஆப்ஸிற்கான அனுமதி உபயோகத்தை ஹோல்டருக்கு வழங்கும். இயல்பான ஆப்ஸிற்கு இது எப்போதுமே தேவைப்படாது."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"கடவுச்சொல் விதிகளை அமைக்கவும்"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"திரைப் பூட்டின் கடவுச்சொற்கள் மற்றும் பின்களில் அனுமதிக்கப்படும் நீளத்தையும் எழுத்துக்குறிகளையும் கட்டுப்படுத்தும்."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"திரையைத் திறப்பதற்கான முயற்சிகளைக் கண்காணி"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 1f783bef81f7..365e6d748710 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"యాప్నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"పాస్వర్డ్ నియమాలను సెట్ చేయండి"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"స్క్రీన్ లాక్ పాస్వర్డ్లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ అన్లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index f5ed8a1bae18..b41e892180cb 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"อนุญาตให้แอปอ่านและเขียนการกำหนดค่าโหมดห้ามรบกวน"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"เริ่มการใช้สิทธิ์การดู"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"อนุญาตให้เจ้าของเริ่มการใช้สิทธิ์ของแอป ไม่จำเป็นสำหรับแอปทั่วไป"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"ตั้งค่ากฎรหัสผ่าน"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ควบคุมความยาวและอักขระที่สามารถใช้ในรหัสผ่านของการล็อกหน้าจอและ PIN"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ตรวจสอบความพยายามในการปลดล็อกหน้าจอ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index d1b506cbef20..c617ccf67068 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Nagbibigay-daan sa app na basahin at isulat ang configuration ng Huwag Istorbohin."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"simulan ang paggamit sa pahintulot sa pagtingin"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Binibigyang-daan ang may hawak na simulan ang paggamit ng pahintulot para sa isang app. Hindi dapat kailanganin kailanman para sa mga normal na app."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"mag-access ng data ng sensor sa mataas na rate ng pag-sample"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Pinapahintulutan ang app na mag-sample ng data ng sensor sa rate na higit sa 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Magtakda ng mga panuntunan sa password"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolin ang haba at ang mga character na pinapayagan sa mga password at PIN sa screen lock."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Subaybayan ang mga pagsubok sa pag-unlock ng screen"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 23cf1bd37d04..5724bcf2cc39 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -685,6 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Uygulamaya, Rahatsız Etmeyin yapılandırmasını okuma ve yazma izni verir."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"izin kullanımı görüntülemeye başlama"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"İzin sahibinin bir uygulama için izin kullanımı başlatmasına olanak tanır. Normal uygulamalar için hiçbir zaman kullanılmamalıdır."</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"sensör verilerine daha yüksek örnekleme hızında eriş"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Uygulamanın, sensör verilerini 200 Hz\'den daha yüksek bir hızda örneklemesine olanak tanır"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Şifre kuralları ayarla"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran kilidini açma şifrelerinde ve PIN\'lerde izin verilen uzunluğu ve karakterleri denetleyin."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekran kilidini açma denemelerini izle"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 7f68ddd4a36b..ff1936f2a2f7 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -691,6 +691,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Додаток зможе переглядати та змінювати конфігурацію режиму \"Не турбувати\"."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"перегляньте дані про використання дозволів"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Власник зможе використовувати дозволи для цього додатка. Цей дозвіл не потрібен для звичайних додатків."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Устан. правила пароля"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Укажіть максимальну довжину та кількість символів для паролів розблокування екрана та PIN-кодів."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Відстежувати спроби розблокування екрана"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 7935744ce9ff..e1fb04cc0abe 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ایپ کو ڈسٹرب نہ کریں کنفیگریشن لکھنے اور پڑھنے کے قابل کرتا ہے۔"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"اجازت کی استعمال کا ملاحظہ شروع کریں"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"حامل کو ایپ کی اجازت کے استعمال کو شروع کرنے کی اجازت دیتا ہے۔ عام ایپس کے لیے کبھی بھی درکار نہیں ہونا چاہیے۔"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"پاس ورڈ کے اصول سیٹ کریں"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"اسکرین لاک پاس ورڈز اور PINs میں اجازت یافتہ لمبائی اور حروف کو کنٹرول کریں۔"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"اسکرین غیر مقفل کرنے کی کوششیں مانیٹر کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index bdba644b56d3..ddb5b1cc0710 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"“Bezovta qilinmasin” rejimi sozlamalarini ko‘rish va o‘zgartirish."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"foydalaniladigan ruxsatlar axborotini ochish"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ilova foydalanadigan ruxsatlar axborotini ishga tushirishga ruxsat beradi. Oddiy ilovalar uchun talab qilinmaydi."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Parol qoidalarini o‘rnatish"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Ekran qulfi paroli va PIN kodlari uchun qo‘yiladigan talablarni (belgilar soni va uzunligi) nazorat qiladi."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekranni qulfdan chiqarishga urinishlarni nazorat qilish"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 745550cc1757..13ffe3021c12 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Cho phép ứng dụng đọc và ghi cấu hình Không làm phiền."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"cấp quyền xem"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Cho phép chủ sở hữu cấp quyền cho một ứng dụng. Các ứng dụng thông thường sẽ không bao giờ cần quyền này."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Đặt quy tắc mật khẩu"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kiểm soát độ dài và ký tự được phép trong mật khẩu khóa màn hình và mã PIN."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Giám sát những lần thử mở khóa màn hình"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 56182394a466..13fa62aec28d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允许此应用读取和写入“勿扰”模式配置。"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"授权使用“查看权限”"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允许该应用开始查看应用的权限使用情况(普通应用绝不需要此权限)。"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"设置密码规则"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"控制锁屏密码和 PIN 码所允许的长度和字符。"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"监控屏幕解锁尝试次数"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 47651c799aa1..dd5eada00c37 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取和寫入「請勿騷擾」設定。"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"開始查看權限使用情況"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始查看應用程式的權限使用情況 (一般應用程式並不需要)。"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"設定密碼規則"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"控制螢幕鎖定密碼和 PIN 所允許的長度和字元。"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"監控螢幕解鎖嘗試次數"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 71292c3d9615..a2573440f9bb 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取及寫入「零打擾」設定。"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"啟動檢視權限用途"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始使用其他應用程式 (一般應用程式並不需要)。"</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"設定密碼規則"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"管理螢幕鎖定密碼和 PIN 碼支援的字元和長度上限。"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"監控螢幕解鎖嘗試次數"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 6202ba84dc3e..712e57823a38 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -685,6 +685,10 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ivumela izinhlelo zokusebenza ukufunda nokubhala ukulungiswa kokuthi Ungaphazamisi."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"qala ukusetshenziswa kokubuka imvume"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ivumela umphathi ukuthi aqale ukusetshenziswa kwemvume kohlelo lokusebenza. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string> + <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> + <skip /> + <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> + <skip /> <string name="policylab_limitPassword" msgid="4851829918814422199">"Misa imithetho yephasiwedi"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Lawula ubude nezinhlamvu ezivunyelwe kumaphasiwedi wokukhiya isikrini nama-PIN."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Qapha imizamo yokuvula isikrini sakho"</string> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 706641985e20..3c712edffa63 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -496,14 +496,20 @@ <!-- The padding on top of inbox style elements --> <dimen name="notification_inbox_item_top_padding">5dp</dimen> + <!-- Size of the verification icon for call notifications --> + <dimen name="notification_verification_icon_size">@dimen/notification_badge_size</dimen> + <!-- Size of the feedback indicator for notifications --> <dimen name="notification_feedback_size">20dp</dimen> + <!-- Size of the phishing alert for notifications --> + <dimen name="notification_phishing_alert_size">@dimen/notification_badge_size</dimen> + <!-- Size of the profile badge for notifications --> <dimen name="notification_badge_size">12dp</dimen> <!-- Size of the alerted icon for notifications --> - <dimen name="notification_alerted_size">12dp</dimen> + <dimen name="notification_alerted_size">@dimen/notification_badge_size</dimen> <!-- Keyguard dimensions --> <!-- TEMP --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9ebe23af2c59..3505dee134c0 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5002,6 +5002,9 @@ <string name="stk_cc_ss_to_ussd">SS request changed to USSD request</string> <string name="stk_cc_ss_to_ss">Changed to new SS request</string> + <!-- Content description of the phishing alert icon in the notification. [CHAR_LIMIT=NONE] --> + <string name="notification_phishing_alert_content_description">Phishing alert</string> + <!-- Content description of the work profile icon in the notification. --> <string name="notification_work_profile_content_description">Work profile</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fe33749031ab..b5af5240b843 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -233,6 +233,7 @@ <java-symbol type="id" name="pin_confirm_text" /> <java-symbol type="id" name="pin_error_message" /> <java-symbol type="id" name="timePickerLayout" /> + <java-symbol type="id" name="phishing_alert" /> <java-symbol type="id" name="profile_badge" /> <java-symbol type="id" name="alerted_icon" /> <java-symbol type="id" name="transitionPosition" /> diff --git a/core/tests/coretests/src/android/view/InsetsSourceTest.java b/core/tests/coretests/src/android/view/InsetsSourceTest.java index c61f33e15b18..2106b4bc5be9 100644 --- a/core/tests/coretests/src/android/view/InsetsSourceTest.java +++ b/core/tests/coretests/src/android/view/InsetsSourceTest.java @@ -169,6 +169,13 @@ public class InsetsSourceTest { } @Test + public void testCalculateInsetsForIme_noIntersection_horizontal() { + mImeSource.setFrame(new Rect(0, 0, 100, 500)); + Insets insets = mImeSource.calculateInsets(new Rect(100, 0, 500, 500), false); + assertEquals(Insets.NONE, insets); + } + + @Test public void testCalculateInsets_zeroWidthIntersection_horizontal_start() { mSource.setFrame(new Rect(0, 0, 100, 500)); Insets insets = mSource.calculateInsets(new Rect(0, 0, 500, 0), false); diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java index 786ae89ac2ae..b3450de80092 100644 --- a/core/tests/coretests/src/android/view/MotionEventTest.java +++ b/core/tests/coretests/src/android/view/MotionEventTest.java @@ -169,4 +169,24 @@ public class MotionEventTest { assertEquals(0x3 << 30, ID_SOURCE_MASK & event.getId()); } } + + @Test + public void testEventRotation() { + final MotionEvent event = MotionEvent.obtain(0 /* downTime */, 0 /* eventTime */, + ACTION_DOWN, 30 /* x */, 50 /* y */, 0 /* metaState */); + MotionEvent rot90 = MotionEvent.obtain(event); + rot90.transform(MotionEvent.createRotateMatrix(/* 90 deg */1, 1000, 600)); + assertEquals(50, (int) rot90.getX()); + assertEquals(570, (int) rot90.getY()); + + MotionEvent rot180 = MotionEvent.obtain(event); + rot180.transform(MotionEvent.createRotateMatrix(/* 180 deg */2, 1000, 600)); + assertEquals(970, (int) rot180.getX()); + assertEquals(550, (int) rot180.getY()); + + MotionEvent rot270 = MotionEvent.obtain(event); + rot270.transform(MotionEvent.createRotateMatrix(/* 270 deg */3, 1000, 600)); + assertEquals(950, (int) rot270.getX()); + assertEquals(30, (int) rot270.getY()); + } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java index 2e6e0de8d0c2..3d43220bcb59 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java @@ -46,6 +46,7 @@ import org.junit.runners.Suite; BstatsCpuTimesValidationTest.class, CameraPowerCalculatorTest.class, CpuPowerCalculatorTest.class, + DischargedPowerCalculatorTest.class, FlashlightPowerCalculatorTest.class, GnssPowerCalculatorTest.class, IdlePowerCalculatorTest.class, diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java index 5edd58fb3eb9..997ff8a50a30 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java @@ -136,16 +136,16 @@ public class BatteryUsageStatsRule implements TestRule { return mBatteryStats.getUidStatsLocked(uid); } - public void setTime(long realtimeUs, long uptimeUs) { - mMockClocks.realtime = realtimeUs; - mMockClocks.uptime = uptimeUs; + public void setTime(long realtimeMs, long uptimeMs) { + mMockClocks.realtime = realtimeMs; + mMockClocks.uptime = uptimeMs; } - void apply(PowerCalculator... calculators) { - apply(BatteryUsageStatsQuery.DEFAULT, calculators); + BatteryUsageStats apply(PowerCalculator... calculators) { + return apply(BatteryUsageStatsQuery.DEFAULT, calculators); } - void apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) { + BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) { BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0); SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats(); for (int i = 0; i < uidStats.size(); i++) { @@ -158,6 +158,7 @@ public class BatteryUsageStatsRule implements TestRule { } mBatteryUsageStats = builder.build(); + return mBatteryUsageStats; } public UidBatteryConsumer getUidBatteryConsumer(int uid) { diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java index 018a810772be..355ac6dbcc00 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java @@ -67,8 +67,8 @@ public class BatteryUsageStatsTest { final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(2000); final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(1, 1); - builder.setConsumedPower(100); builder.setDischargePercentage(20); + builder.setDischargedPowerRange(1000, 2000); final UidBatteryConsumer.Builder uidBatteryConsumerBuilder = builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid); @@ -100,6 +100,8 @@ public class BatteryUsageStatsTest { public void validateBatteryUsageStats(BatteryUsageStats batteryUsageStats) { assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(100); assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(20); + assertThat(batteryUsageStats.getDischargedPowerRange().getLower()).isEqualTo(1000); + assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()).isEqualTo(2000); final List<UidBatteryConsumer> uidBatteryConsumers = batteryUsageStats.getUidBatteryConsumers(); diff --git a/core/tests/coretests/src/com/android/internal/os/DischargedPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/DischargedPowerCalculatorTest.java new file mode 100644 index 000000000000..bec3d1644e81 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/DischargedPowerCalculatorTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + + +import static com.google.common.truth.Truth.assertThat; + +import android.os.BatteryManager; +import android.os.BatteryUsageStats; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class DischargedPowerCalculatorTest { + private static final double PRECISION = 0.00001; + + @Rule + public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() + .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); + + @Test + public void testDischargeTotals() { + final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + + mStatsRule.setTime(1000, 1000); + batteryStats.resetAllStatsCmdLocked(); + batteryStats.setNoAutoReset(true); + batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, + /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0, 1_000_000, + 1_000_000, 1_000_000); + batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, + /* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0, 2_000_000, + 2_000_000, 2_000_000); + + DischargedPowerCalculator calculator = + new DischargedPowerCalculator(mStatsRule.getPowerProfile()); + + final BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator); + + assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10); + assertThat(batteryUsageStats.getDischargedPowerRange().getLower()) + .isWithin(PRECISION).of(360.0); + assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()) + .isWithin(PRECISION).of(400.0); + } +} diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java new file mode 100644 index 000000000000..c81c8c54d88a --- /dev/null +++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.ServiceManager; +import android.os.ServiceSpecificException; +import android.security.usermanager.IKeystoreUserManager; +import android.system.keystore2.ResponseCode; +import android.util.Log; + +/** + * @hide This is the client side for IKeystoreUserManager AIDL. + * It shall only be used by the LockSettingsService. + */ +public class AndroidKeyStoreMaintenance { + private static final String TAG = "AndroidKeyStoreMaintenance"; + + public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR; + + private static IKeystoreUserManager getService() { + return IKeystoreUserManager.Stub.asInterface( + ServiceManager.checkService("android.security.usermanager")); + } + + /** + * Informs keystore2 about adding a user + * + * @param userId - Android user id of the user being added + * @return 0 if successful or a {@code ResponseCode} + * @hide + */ + public static int onUserAdded(@NonNull int userId) { + if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; + try { + getService().onUserAdded(userId); + return 0; + } catch (ServiceSpecificException e) { + Log.e(TAG, "onUserAdded failed", e); + return e.errorCode; + } catch (Exception e) { + Log.e(TAG, "Can not connect to keystore", e); + return SYSTEM_ERROR; + } + } + + /** + * Informs keystore2 about removing a usergit mer + * + * @param userId - Android user id of the user being removed + * @return 0 if successful or a {@code ResponseCode} + * @hide + */ + public static int onUserRemoved(int userId) { + if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; + try { + getService().onUserRemoved(userId); + return 0; + } catch (ServiceSpecificException e) { + Log.e(TAG, "onUserRemoved failed", e); + return e.errorCode; + } catch (Exception e) { + Log.e(TAG, "Can not connect to keystore", e); + return SYSTEM_ERROR; + } + } + + /** + * Informs keystore2 about changing user's password + * + * @param userId - Android user id of the user + * @param password - a secret derived from the synthetic password provided by the + * LockSettingService + * @return 0 if successful or a {@code ResponseCode} + * @hide + */ + public static int onUserPasswordChanged(int userId, @Nullable byte[] password) { + if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; + try { + getService().onUserPasswordChanged(userId, password); + return 0; + } catch (ServiceSpecificException e) { + Log.e(TAG, "onUserPasswordChanged failed", e); + return e.errorCode; + } catch (Exception e) { + Log.e(TAG, "Can not connect to keystore", e); + return SYSTEM_ERROR; + } + } +} diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java index 21d23b1b2575..50a90820117d 100644 --- a/keystore/java/android/security/Authorization.java +++ b/keystore/java/android/security/Authorization.java @@ -33,20 +33,12 @@ import android.util.Log; */ public class Authorization { private static final String TAG = "KeystoreAuthorization"; - private static IKeystoreAuthorization sIKeystoreAuthorization; public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR; - public Authorization() { - sIKeystoreAuthorization = null; - } - - private static synchronized IKeystoreAuthorization getService() { - if (sIKeystoreAuthorization == null) { - sIKeystoreAuthorization = IKeystoreAuthorization.Stub.asInterface( + private static IKeystoreAuthorization getService() { + return IKeystoreAuthorization.Stub.asInterface( ServiceManager.checkService("android.security.authorization")); - } - return sIKeystoreAuthorization; } /** @@ -55,12 +47,12 @@ public class Authorization { * @param authToken created by Android authenticators. * @return 0 if successful or {@code ResponseCode.SYSTEM_ERROR}. */ - public int addAuthToken(@NonNull HardwareAuthToken authToken) { + public static int addAuthToken(@NonNull HardwareAuthToken authToken) { if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; try { getService().addAuthToken(authToken); return 0; - } catch (RemoteException e) { + } catch (RemoteException | NullPointerException e) { Log.w(TAG, "Can not connect to keystore", e); return SYSTEM_ERROR; } catch (ServiceSpecificException e) { @@ -73,7 +65,7 @@ public class Authorization { * @param authToken * @return 0 if successful or a {@code ResponseCode}. */ - public int addAuthToken(@NonNull byte[] authToken) { + public static int addAuthToken(@NonNull byte[] authToken) { return addAuthToken(AuthTokenUtils.toHardwareAuthToken(authToken)); } @@ -86,7 +78,7 @@ public class Authorization { * * @return 0 if successful or a {@code ResponseCode}. */ - public int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId, + public static int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId, @Nullable byte[] syntheticPassword) { if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; try { @@ -96,7 +88,7 @@ public class Authorization { getService().onLockScreenEvent(LockScreenEvent.UNLOCK, userId, syntheticPassword); } return 0; - } catch (RemoteException e) { + } catch (RemoteException | NullPointerException e) { Log.w(TAG, "Can not connect to keystore", e); return SYSTEM_ERROR; } catch (ServiceSpecificException e) { diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index e19d88c182ff..198df40c7d7b 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -996,7 +996,7 @@ public class KeyStore { */ public int addAuthToken(byte[] authToken) { try { - new Authorization().addAuthToken(authToken); + Authorization.addAuthToken(authToken); return mBinder.addAuthToken(authToken); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); diff --git a/keystore/java/android/security/KeyStore2.java b/keystore/java/android/security/KeyStore2.java index f7477bf92c81..476e4d7b7b18 100644 --- a/keystore/java/android/security/KeyStore2.java +++ b/keystore/java/android/security/KeyStore2.java @@ -107,7 +107,6 @@ public class KeyStore2 { try { return request.execute(service); } catch (ServiceSpecificException e) { - Log.e(TAG, "KeyStore exception", e); throw getKeyStoreException(e.errorCode); } catch (RemoteException e) { if (firstTry) { diff --git a/libs/WindowManager/Shell/res/layout/one_handed_tutorial.xml b/libs/WindowManager/Shell/res/layout/one_handed_tutorial.xml index dc54caf0f14a..0190aad2d0ef 100644 --- a/libs/WindowManager/Shell/res/layout/one_handed_tutorial.xml +++ b/libs/WindowManager/Shell/res/layout/one_handed_tutorial.xml @@ -54,8 +54,8 @@ android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="0dp" - android:layout_marginStart="86dp" - android:layout_marginEnd="86dp" + android:layout_marginStart="46dp" + android:layout_marginEnd="46dp" android:gravity="center_horizontal" android:fontFamily="roboto-regular" android:text="@string/one_handed_tutorial_description" diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index ea634cfa907c..c3ae053d156d 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Borrel"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Bestuur"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Borrel is toegemaak."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tik om hierdie program te herbegin en maak volskerm oop."</string> + <string name="got_it" msgid="4428750913636945527">"Het dit"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index e4628d7b5278..c889039cffdb 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"አረፋ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ያቀናብሩ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"አረፋ ተሰናብቷል።"</string> + <string name="restart_button_description" msgid="5887656107651190519">"ይህን መተግበሪያ ዳግም ለማስነሳት መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string> + <string name="got_it" msgid="4428750913636945527">"ገባኝ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 7b5bda72ccd4..2c89b1d4eb56 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"فقاعة"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"إدارة"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"تم إغلاق الفقاعة."</string> + <string name="restart_button_description" msgid="5887656107651190519">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string> + <string name="got_it" msgid="4428750913636945527">"حسنًا"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 47294c438729..0a74ac6391ce 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"পৰিচালনা কৰক"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল অগ্ৰাহ্য কৰা হৈছে"</string> + <string name="restart_button_description" msgid="5887656107651190519">"এপ্টো ৰিষ্টাৰ্ট কৰিবলৈ আৰু পূৰ্ণ স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ টিপক।"</string> + <string name="got_it" msgid="4428750913636945527">"বুজি পালোঁ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 923ff79e0627..54483bfa730c 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Qabarcıq"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"İdarə edin"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Qabarcıqdan imtina edilib."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün toxunun."</string> + <string name="got_it" msgid="4428750913636945527">"Anladım"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index 02e609cd5c9b..5ed79c4901cd 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljajte"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string> + <string name="got_it" msgid="4428750913636945527">"Važi"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index ccea3180f64e..a9a62de6c8f9 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Усплывальнае апавяшчэнне"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Кіраваць"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Усплывальнае апавяшчэнне адхілена."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string> + <string name="got_it" msgid="4428750913636945527">"Зразумела"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index d29660b9c24d..80895dc0c032 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Балонче"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Управление"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отхвърлено."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string> + <string name="got_it" msgid="4428750913636945527">"Разбрах"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 84bcaf907d91..bdda799b001f 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ম্যানেজ করুন"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল বাতিল করা হয়েছে।"</string> + <string name="restart_button_description" msgid="5887656107651190519">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও \'ফুল-স্ক্রিন\' মোড ব্যবহার করুন।"</string> + <string name="got_it" msgid="4428750913636945527">"বুঝেছি"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 85e08d7ca555..759e9b8c415b 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljaj"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string> + <string name="got_it" msgid="4428750913636945527">"Razumijem"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index a80b7fbec09a..202ea2083b7e 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bombolla"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestiona"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"La bombolla s\'ha ignorat."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toca per reiniciar aquesta aplicació i passar a pantalla completa."</string> + <string name="got_it" msgid="4428750913636945527">"Entesos"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index e8257bc8ee92..08a4201b2fae 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bublina"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovat"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina byla zavřena."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string> + <string name="got_it" msgid="4428750913636945527">"Rozumím"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index 17f8286e8069..395f6e75cdbc 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Boble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen blev lukket."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tryk for at genstarte denne app, og gå til fuld skærm."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index f04796aca753..ab3461a1ebf5 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Verwalten"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble verworfen."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tippe, um die App im Vollbildmodus neu zu starten."</string> + <string name="got_it" msgid="4428750913636945527">"Ok"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index cc329e8f3274..75e4379284b8 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Συννεφάκι"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Διαχείριση"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Το συννεφάκι παραβλέφθηκε."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Πατήστε για επανεκκίνηση αυτής της εφαρμογής και ενεργοποίηση πλήρους οθόνης."</string> + <string name="got_it" msgid="4428750913636945527">"Το κατάλαβα"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index 90c71c0e11ea..0d7b60ffefc6 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml index 90c71c0e11ea..0d7b60ffefc6 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index 90c71c0e11ea..0d7b60ffefc6 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index 90c71c0e11ea..0d7b60ffefc6 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml index d8b5b40035f7..4bff89d68963 100644 --- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> + <string name="got_it" msgid="4428750913636945527">"Got it"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index 7244b1a1bcf5..90c4d51b995a 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Cuadro"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Se descartó el cuadro."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string> + <string name="got_it" msgid="4428750913636945527">"Entendido"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index 65e75bde573d..f3baad7a02e4 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Burbuja"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbuja cerrada."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string> + <string name="got_it" msgid="4428750913636945527">"Listo"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 0ccfcfee85d6..9222a91b044c 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Mull"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Halda"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Mullist loobuti."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string> + <string name="got_it" msgid="4428750913636945527">"Selge"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 6682ea80cf42..4a59b59df27b 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -25,8 +25,8 @@ <string name="pip_notification_message" msgid="8854051911700302620">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string> <string name="pip_play" msgid="3496151081459417097">"Erreproduzitu"</string> <string name="pip_pause" msgid="690688849510295232">"Pausatu"</string> - <string name="pip_skip_to_next" msgid="8403429188794867653">"Saltatu hurrengora"</string> - <string name="pip_skip_to_prev" msgid="7172158111196394092">"Saltatu aurrekora"</string> + <string name="pip_skip_to_next" msgid="8403429188794867653">"Joan hurrengora"</string> + <string name="pip_skip_to_prev" msgid="7172158111196394092">"Joan aurrekora"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Aldatu tamaina"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikazioak ez du onartzen pantaila zatitua"</string> @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Burbuila"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Kudeatu"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Baztertu da globoa."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Saka ezazu aplikazioa berrabiarazteko, eta ezarri pantaila osoko modua."</string> + <string name="got_it" msgid="4428750913636945527">"Ados"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index a41811d53357..fed3ea9b53f9 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"حباب"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"مدیریت"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"حبابک رد شد."</string> + <string name="restart_button_description" msgid="5887656107651190519">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string> + <string name="got_it" msgid="4428750913636945527">"متوجهام"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index fcdc70fc9cda..332dc9b14da2 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Kupla"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Ylläpidä"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Kupla ohitettu."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index ed822373e557..f51fc66b6b83 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bulle"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle ignorée."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Touchez pour redémarrer cette application et passer en plein écran."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index ad98b85d5d5d..8fa06e88cd50 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bulle"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle fermée."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 529825e68151..56188d4e92ba 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Burbulla"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Xestionar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ignorouse a burbulla."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string> + <string name="got_it" msgid="4428750913636945527">"Entendido"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index ee23e1e967ec..b76e91010dcc 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"બબલ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"મેનેજ કરો"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"બબલ છોડી દેવાયો."</string> + <string name="restart_button_description" msgid="5887656107651190519">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string> + <string name="got_it" msgid="4428750913636945527">"સમજાઈ ગયું"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index 34c1c85211f6..a9693865e2c4 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"प्रबंधित करें"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल खारिज किया गया."</string> + <string name="restart_button_description" msgid="5887656107651190519">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन पर देखने के लिए टैप करें."</string> + <string name="got_it" msgid="4428750913636945527">"ठीक है"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index 32b21aadbb2f..769d1d26aed2 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić odbačen."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste ponovo pokrenuli tu aplikaciju i prikazali je na cijelom zaslonu."</string> + <string name="got_it" msgid="4428750913636945527">"Shvaćam"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index 123b127bd5a3..05655f1bb607 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Buborék"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Kezelés"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Buborék elvetve."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string> + <string name="got_it" msgid="4428750913636945527">"Rendben"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index b047cf131aa8..5f7495e63613 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Պղպջակ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Կառավարել"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ամպիկը փակվեց։"</string> + <string name="restart_button_description" msgid="5887656107651190519">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string> + <string name="got_it" msgid="4428750913636945527">"Եղավ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index a75cdb4b2b85..2cf50c0644f1 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Balon"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Kelola"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon ditutup."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> + <string name="got_it" msgid="4428750913636945527">"Oke"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index 3b28148e3171..7a3b6a693e7a 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Blaðra"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Stjórna"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Blöðru lokað."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string> + <string name="got_it" msgid="4428750913636945527">"Ég skil"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 8a2b9dbd9ba8..b061d1f592c4 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Fumetto"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestisci"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Fumetto ignorato."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tocca per riavviare l\'app e passare alla modalità a schermo intero."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index 20114a7fa5f3..b75ee4507e94 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"בועה"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ניהול"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"הבועה נסגרה."</string> + <string name="restart_button_description" msgid="5887656107651190519">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string> + <string name="got_it" msgid="4428750913636945527">"הבנתי"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index fbb2951a06e1..ab693d2e5045 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"バブル"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ふきだしが非表示になっています。"</string> + <string name="restart_button_description" msgid="5887656107651190519">"タップしてこのアプリを再起動すると、全画面表示になります。"</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index f978481be23d..ef9a84f4ce2f 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ბუშტი"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"მართვა"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ბუშტი დაიხურა."</string> + <string name="restart_button_description" msgid="5887656107651190519">"შეეხეთ ამ აპის გადასატვირთად და გადადით სრულ ეკრანზე."</string> + <string name="got_it" msgid="4428750913636945527">"გასაგებია"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 2d27fafcc98b..13f3a4eed8c5 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Көпіршік"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Басқару"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Қалқымалы анықтама өшірілді."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string> + <string name="got_it" msgid="4428750913636945527">"Түсінікті"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index d503b7a5edca..134d3c2334f0 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ពពុះ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"គ្រប់គ្រង"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"បានច្រានចោលសារលេចឡើង។"</string> + <string name="restart_button_description" msgid="5887656107651190519">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string> + <string name="got_it" msgid="4428750913636945527">"យល់ហើយ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 3d61d84f4810..c8b3389a3a60 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ಬಬಲ್"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ನಿರ್ವಹಿಸಿ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ಬಬಲ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string> + <string name="restart_button_description" msgid="5887656107651190519">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <string name="got_it" msgid="4428750913636945527">"ಅರ್ಥವಾಯಿತು"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index ea7ad56bf9d2..b29612e337f2 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"버블"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"관리"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"대화창을 닫았습니다."</string> + <string name="restart_button_description" msgid="5887656107651190519">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string> + <string name="got_it" msgid="4428750913636945527">"확인"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index 611b2d60a8c1..530d40a79ca3 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Көбүк"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Башкаруу"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Калкып чыкма билдирме жабылды."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн таптап коюңуз."</string> + <string name="got_it" msgid="4428750913636945527">"Түшүндүм"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index a1c998c078de..5ccf164b3d67 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ຟອງ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ຈັດການ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ປິດ Bubble ໄສ້ແລ້ວ."</string> + <string name="restart_button_description" msgid="5887656107651190519">"ແຕະເພື່ອຣີສະຕາດແອັບນີ້ ແລະ ໃຊ້ແບບເຕັມຈໍ."</string> + <string name="got_it" msgid="4428750913636945527">"ເຂົ້າໃຈແລ້ວ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index b2ccd5709e21..1433312ded60 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Debesėlis"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Tvarkyti"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Debesėlio atsisakyta."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Palieskite, kad paleistumėte iš naujo šią programą ir įjungtumėte viso ekrano režimą."</string> + <string name="got_it" msgid="4428750913636945527">"Supratau"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index e6d0c7725bbf..fb297b8f2990 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Burbulis"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Pārvaldīt"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbulis ir noraidīts."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string> + <string name="got_it" msgid="4428750913636945527">"Labi"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 43f2881fd553..80b33293af34 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Балонче"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Управувајте"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отфрлено."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string> + <string name="got_it" msgid="4428750913636945527">"Сфатив"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index e675861166a3..5d47911137ec 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ബബ്ൾ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"മാനേജ് ചെയ്യുക"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ബബ്ൾ ഡിസ്മിസ് ചെയ്തു."</string> + <string name="restart_button_description" msgid="5887656107651190519">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്ത് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറാൻ ടാപ്പ് ചെയ്യുക."</string> + <string name="got_it" msgid="4428750913636945527">"മനസ്സിലായി"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index 044fd9fa7544..a5e7f957b829 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Бөмбөлөг"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Удирдах"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Бөмбөлгийг үл хэрэгссэн."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string> + <string name="got_it" msgid="4428750913636945527">"Ойлголоо"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index e838cf59331e..0450189c515d 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापित करा"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल डिसमिस केला."</string> + <string name="restart_button_description" msgid="5887656107651190519">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string> + <string name="got_it" msgid="4428750913636945527">"समजले"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 6664f38f3879..c0c1cbd6ed3c 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Gelembung"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Urus"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Gelembung diketepikan."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index 9681d14a6a88..0d78f89d9e54 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ပူဖောင်းဖောက်သံ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"စီမံရန်"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ပူဖောင်းကွက် ဖယ်လိုက်သည်။"</string> + <string name="restart_button_description" msgid="5887656107651190519">"ဤအက်ပ်ကို ပြန်စပြီး ဖန်သားပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string> + <string name="got_it" msgid="4428750913636945527">"ရပြီ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 986e890dfe3a..fab0c0cacef4 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Boble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen er avvist."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string> + <string name="got_it" msgid="4428750913636945527">"Greit"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 0369c6dd2831..882ac374fde9 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापन गर्नुहोस्"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल हटाइयो।"</string> + <string name="restart_button_description" msgid="5887656107651190519">"यो एप रिस्टार्ट गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> + <string name="got_it" msgid="4428750913636945527">"बुझेँ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 26c276e7e690..1527e8983079 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubbel"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Beheren"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubbel gesloten."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tik om deze app opnieuw te starten en te openen op het volledige scherm."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 27f16226a421..50d20076a26f 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ବବଲ୍"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ବବଲ୍ ଖାରଜ କରାଯାଇଛି।"</string> + <string name="restart_button_description" msgid="5887656107651190519">"ଏହି ଆପକୁ ରିଷ୍ଟାର୍ଟ କରି ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> + <string name="got_it" msgid="4428750913636945527">"ବୁଝିଗଲି"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 96688b952d66..dd3d26e56b4c 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"ਬੁਲਬੁਲਾ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।"</string> + <string name="restart_button_description" msgid="5887656107651190519">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string> + <string name="got_it" msgid="4428750913636945527">"ਸਮਝ ਲਿਆ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index 6b640b54f898..ca2bdcb270da 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Dymek"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Zarządzaj"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Zamknięto dymek"</string> + <string name="restart_button_description" msgid="5887656107651190519">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index 465d2d17a5e7..bdd0d4b8baec 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bolha"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string> + <string name="got_it" msgid="4428750913636945527">"Ok"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index df841bf3eda4..6661b0506c5e 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Balão"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerir"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão ignorado."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar esta app e ficar em ecrã inteiro."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index 465d2d17a5e7..bdd0d4b8baec 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bolha"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string> + <string name="got_it" msgid="4428750913636945527">"Ok"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 55a437668b22..9112543c8f60 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Balon"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionați"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balonul a fost respins."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index 8ae00d28f896..5120136e3c68 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Всплывающая подсказка"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Настроить"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Всплывающий чат закрыт."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string> + <string name="got_it" msgid="4428750913636945527">"ОК"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index 081926fd101b..e1d9a825a004 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"බුබුළු"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"කළමනා කරන්න"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"බුබුල ඉවත දමා ඇත."</string> + <string name="restart_button_description" msgid="5887656107651190519">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න."</string> + <string name="got_it" msgid="4428750913636945527">"තේරුණා"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index 24fded7ebb04..c88099b35c0d 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bublina"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovať"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina bola zavretá."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string> + <string name="got_it" msgid="4428750913636945527">"Dobre"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 3f425302a5ac..42d7be7a146d 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Mehurček"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblaček je bil opuščen."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Dotaknite se za vnovični zagon te aplikacije in preklop v celozaslonski način."</string> + <string name="got_it" msgid="4428750913636945527">"Razumem"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index ddae724e7569..1f373b53d0a4 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Flluskë"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Menaxho"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Flluska u hoq."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string> + <string name="got_it" msgid="4428750913636945527">"E kuptova"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index 74c9ac0867e3..2bbbbf9e0714 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Облачић"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Управљајте"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Облачић је одбачен."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string> + <string name="got_it" msgid="4428750913636945527">"Важи"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index 81328a836345..692b5ed8576f 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubbla"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Hantera"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubblan ignorerades."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Tryck för att starta om appen i helskärmsläge."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index 4559832b1d85..61c95ee183a0 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Kiputo"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Dhibiti"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Umeondoa kiputo."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Gusa ili uzime na uwashe programu hii, kisha nenda kwenye skrini nzima."</string> + <string name="got_it" msgid="4428750913636945527">"Nimeelewa"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 586ee94a1098..32a925a7994e 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"பபிள்"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"நிர்வகி"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"குமிழ் நிராகரிக்கப்பட்டது."</string> + <string name="restart_button_description" msgid="5887656107651190519">"தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்."</string> + <string name="got_it" msgid="4428750913636945527">"சரி"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 4e85b4371220..3db12e7d5661 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"బబుల్"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"మేనేజ్ చేయండి"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"బబుల్ విస్మరించబడింది."</string> + <string name="restart_button_description" msgid="5887656107651190519">"ఈ యాప్ను రీస్టార్ట్ చేయడానికి ట్యాప్ చేసి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string> + <string name="got_it" msgid="4428750913636945527">"అర్థమైంది"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 66c701812ce8..7df76e84cbb7 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"บับเบิล"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"จัดการ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ปิดบับเบิลแล้ว"</string> + <string name="restart_button_description" msgid="5887656107651190519">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string> + <string name="got_it" msgid="4428750913636945527">"รับทราบ"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index a76bf6f1350c..d6c2784f764f 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bubble"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Pamahalaan"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Na-dismiss na ang bubble."</string> + <string name="restart_button_description" msgid="5887656107651190519">"I-tap para i-restart ang app na ito at mag-full screen."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index b3276dad50e7..47d5966549ef 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Baloncuk"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Yönet"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon kapatıldı."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string> + <string name="got_it" msgid="4428750913636945527">"Anladım"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index 8e303cf45a39..c57f16f059df 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Спливаюче сповіщення"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Налаштувати"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Спливаюче сповіщення закрито."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string> + <string name="got_it" msgid="4428750913636945527">"Зрозуміло"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 4b0adc640ddd..97a22e77c069 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"بلبلہ"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"نظم کریں"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"بلبلہ برخاست کر دیا گیا۔"</string> + <string name="restart_button_description" msgid="5887656107651190519">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string> + <string name="got_it" msgid="4428750913636945527">"سمجھ آ گئی"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 74b135d44522..4e91e7624434 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Pufaklar"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Boshqarish"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulutcha yopildi."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Bu ilovani qaytadan ishga tushirish va butun ekranda ochish uchun bosing."</string> + <string name="got_it" msgid="4428750913636945527">"OK"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index ce372317b0b8..169e986f7721 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Bong bóng"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Quản lý"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Đã đóng bong bóng."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string> + <string name="got_it" msgid="4428750913636945527">"Tôi hiểu"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index 3143130fa4ce..1999703ddd2a 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"气泡"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已关闭对话泡。"</string> + <string name="restart_button_description" msgid="5887656107651190519">"点按即可重启此应用并进入全屏模式。"</string> + <string name="got_it" msgid="4428750913636945527">"知道了"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index 4f8bfe016f6f..f82d6d5e771b 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"氣泡"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"對話氣泡已關閉。"</string> + <string name="restart_button_description" msgid="5887656107651190519">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string> + <string name="got_it" msgid="4428750913636945527">"知道了"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index 6fb8ed963ba7..596e7c717aa2 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"泡泡"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已關閉泡泡。"</string> + <string name="restart_button_description" msgid="5887656107651190519">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string> + <string name="got_it" msgid="4428750913636945527">"我知道了"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index cab277647d26..3fed41f27c0a 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -69,4 +69,6 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Ibhamuza"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Phatha"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ibhamuza licashisiwe."</string> + <string name="restart_button_description" msgid="5887656107651190519">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string> + <string name="got_it" msgid="4428750913636945527">"Ngiyezwa"</string> </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java index 11c11f44a781..02bcf13ebb7e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java @@ -16,13 +16,11 @@ package com.android.wm.shell.onehanded; -import androidx.annotation.NonNull; +import android.content.res.Configuration; import com.android.wm.shell.common.annotations.ExternalThread; import com.android.wm.shell.onehanded.OneHandedGestureHandler.OneHandedGestureEventCallback; -import java.io.PrintWriter; - /** * Interface to engage one handed feature. */ @@ -69,4 +67,9 @@ public interface OneHanded { * 3 button navigation mode only */ void registerGestureCallback(OneHandedGestureEventCallback callback); + + /** + * Receive onConfigurationChanged() events + */ + void onConfigChanged(Configuration newConfig); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 5a3c38b09ec6..34b7d18661b0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -23,6 +23,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.om.IOverlayManager; import android.content.om.OverlayInfo; +import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.Point; import android.os.Handler; @@ -31,6 +32,7 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.provider.Settings; import android.util.Slog; +import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; @@ -154,7 +156,7 @@ public class OneHandedController { OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler, mainExecutor); OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler( - context, displayController, mainExecutor); + context, displayController, ViewConfiguration.get(context), mainExecutor); OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer = new OneHandedBackgroundPanelOrganizer(context, displayController, mainExecutor); OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer( @@ -222,8 +224,7 @@ public class OneHandedController { setupGesturalOverlay(); updateSettings(); - mAccessibilityManager = (AccessibilityManager) - context.getSystemService(Context.ACCESSIBILITY_SERVICE); + mAccessibilityManager = AccessibilityManager.getInstance(context); mAccessibilityManager.addAccessibilityStateChangeListener( mAccessibilityStateChangeListener); } @@ -345,7 +346,8 @@ public class OneHandedController { }; } - private void onEnabledSettingChanged() { + @VisibleForTesting + void onEnabledSettingChanged() { final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled( mContext.getContentResolver()); mOneHandedUiEventLogger.writeEvent(enabled @@ -360,7 +362,8 @@ public class OneHandedController { mContext.getContentResolver())); } - private void onTimeoutSettingChanged() { + @VisibleForTesting + void onTimeoutSettingChanged() { final int newTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout( mContext.getContentResolver()); int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId(); @@ -388,7 +391,8 @@ public class OneHandedController { } } - private void onTaskChangeExitSettingChanged() { + @VisibleForTesting + void onTaskChangeExitSettingChanged() { final boolean enabled = OneHandedSettingsUtil.getSettingsTapsAppToExit( mContext.getContentResolver()); mOneHandedUiEventLogger.writeEvent(enabled @@ -398,7 +402,8 @@ public class OneHandedController { setTaskChangeToExit(enabled); } - private void onSwipeToNotificationEnabledSettingChanged() { + @VisibleForTesting + void onSwipeToNotificationEnabledSettingChanged() { final boolean enabled = OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( mContext.getContentResolver()); @@ -432,17 +437,26 @@ public class OneHandedController { if (mDisplayAreaOrganizer.isInOneHanded()) { stopOneHanded(); } - // TODO Be aware to unregisterOrganizer() after animation finished - mDisplayAreaOrganizer.unregisterOrganizer(); - mBackgroundPanelOrganizer.unregisterOrganizer(); - if (mIsOneHandedEnabled) { + + mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled); + mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled); + + if (!mIsOneHandedEnabled) { + mDisplayAreaOrganizer.unregisterOrganizer(); + mBackgroundPanelOrganizer.unregisterOrganizer(); + // Do NOT register + unRegister DA in the same call + return; + } + + if (mDisplayAreaOrganizer.getDisplayAreaTokenMap().isEmpty()) { mDisplayAreaOrganizer.registerOrganizer( OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED); + } + + if (mBackgroundPanelOrganizer.getBackgroundSurface() == null) { mBackgroundPanelOrganizer.registerOrganizer( OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL); } - mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled); - mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled); } private void setupGesturalOverlay() { @@ -452,7 +466,6 @@ public class OneHandedController { OverlayInfo info = null; try { - // TODO(b/157958539) migrate new RRO config file after S+ mOverlayManager.setHighestPriority(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT); info = mOverlayManager.getOverlayInfo(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT); } catch (RemoteException e) { /* Do nothing */ } @@ -472,6 +485,16 @@ public class OneHandedController { } } + private void onConfigChanged(Configuration newConfig) { + if (mTutorialHandler != null) { + if (!mIsOneHandedEnabled + || newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + return; + } + mTutorialHandler.onConfigurationChanged(newConfig); + } + } + public void dump(@NonNull PrintWriter pw) { final String innerPrefix = " "; pw.println(TAG + "states: "); @@ -565,5 +588,12 @@ public class OneHandedController { OneHandedController.this.registerGestureCallback(callback); }); } + + @Override + public void onConfigChanged(Configuration newConfig) { + mMainExecutor.execute(() -> { + OneHandedController.this.onConfigChanged(newConfig); + }); + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java index 04d1264bdd9d..afc8a097dd05 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java @@ -66,8 +66,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer { private boolean mIsInOneHanded; private int mEnterExitAnimationDurationMs; - @VisibleForTesting - ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap(); + private ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap(); private DisplayController mDisplayController; private OneHandedAnimationController mAnimationController; private OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory @@ -298,6 +297,11 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer { return new Rect(0, 0, realSize.x, realSize.y); } + @VisibleForTesting + ArrayMap<WindowContainerToken, SurfaceControl> getDisplayAreaTokenMap() { + return mDisplayAreaTokenMap; + } + /** * Register transition callback */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedGestureHandler.java index 49b7e050c48b..91e649f98292 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedGestureHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedGestureHandler.java @@ -87,6 +87,7 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback, * @param displayController {@link DisplayController} */ public OneHandedGestureHandler(Context context, DisplayController displayController, + ViewConfiguration viewConfig, ShellExecutor mainExecutor) { mDisplayController = displayController; mMainExecutor = mainExecutor; @@ -95,7 +96,7 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback, com.android.internal.R.dimen.navigation_bar_gesture_larger_height); mDragDistThreshold = context.getResources().getDimensionPixelSize( R.dimen.gestures_onehanded_drag_threshold); - final float slop = ViewConfiguration.get(context).getScaledTouchSlop(); + final float slop = viewConfig.getScaledTouchSlop(); mSquaredSlop = slop * slop; updateIsEnabled(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java index 492130bebb30..3f72b80a7dce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java @@ -18,6 +18,7 @@ package com.android.wm.shell.onehanded; import android.content.ContentResolver; import android.content.Context; +import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; @@ -55,12 +56,14 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { private final AccessibilityManager mAccessibilityManager; private final String mPackageName; + private Context mContext; private View mTutorialView; private Point mDisplaySize = new Point(); private ContentResolver mContentResolver; private boolean mCanShowTutorial; private String mStartOneHandedDescription; private String mStopOneHandedDescription; + private boolean mIsOneHandedMode; private enum ONE_HANDED_TRIGGER_STATE { UNSET, ENTERING, EXITING @@ -92,19 +95,19 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mTriggerState = (startValue.top == 0) ? ONE_HANDED_TRIGGER_STATE.ENTERING : ONE_HANDED_TRIGGER_STATE.EXITING; if (mCanShowTutorial && mTriggerState == ONE_HANDED_TRIGGER_STATE.ENTERING) { - createTutorialTarget(); + attachTurtorialTarget(); } } } }; public OneHandedTutorialHandler(Context context, ShellExecutor mainExecutor) { + mContext = context; context.getDisplay().getRealSize(mDisplaySize); mPackageName = context.getPackageName(); mContentResolver = context.getContentResolver(); mWindowManager = context.getSystemService(WindowManager.class); - mAccessibilityManager = (AccessibilityManager) - context.getSystemService(Context.ACCESSIBILITY_SERVICE); + mAccessibilityManager = AccessibilityManager.getInstance(context); mStartOneHandedDescription = context.getResources().getString( R.string.accessibility_action_start_one_handed); @@ -113,6 +116,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mCanShowTutorial = (Settings.Secure.getInt(mContentResolver, Settings.Secure.ONE_HANDED_TUTORIAL_SHOW_COUNT, 0) >= MAX_TUTORIAL_SHOW_COUNT) ? false : true; + mIsOneHandedMode = false; final float offsetPercentageConfig = context.getResources().getFraction( R.fraction.config_one_handed_offset, 1, 1); final int sysPropPercentageConfig = SystemProperties.getInt( @@ -120,11 +124,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mTutorialAreaHeight = Math.round(mDisplaySize.y * (sysPropPercentageConfig / 100.0f)); mainExecutor.execute(() -> { - mTutorialView = LayoutInflater.from(context).inflate(R.layout.one_handed_tutorial, - null); - mTargetViewContainer = new FrameLayout(context); - mTargetViewContainer.setClipChildren(false); - mTargetViewContainer.addView(mTutorialView); + recreateTutorialView(mContext); }); } @@ -144,10 +144,20 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET; } + private void recreateTutorialView(Context context) { + mTutorialView = LayoutInflater.from(context).inflate(R.layout.one_handed_tutorial, + null); + mTargetViewContainer = new FrameLayout(context); + mTargetViewContainer.setClipChildren(false); + mTargetViewContainer.addView(mTutorialView); + mTargetViewContainer.setVisibility(mIsOneHandedMode ? View.VISIBLE : View.GONE); + } + private void updateFinished(int visible, float finalPosition) { if (!canShowTutorial()) { return; } + mIsOneHandedMode = (finalPosition == 0f) ? true : false; mTargetViewContainer.setVisibility(visible); mTargetViewContainer.setTranslationY(finalPosition); } @@ -176,7 +186,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { * Adds the tutorial target view to the WindowManager and update its layout, so it's ready * to be animated in. */ - private void createTutorialTarget() { + private void attachTurtorialTarget() { if (!mTargetViewContainer.isAttachedToWindow()) { try { mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams()); @@ -242,4 +252,17 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mTargetViewContainer.setTransitionGroup(true); mTargetViewContainer.setTranslationY(value - mTargetViewContainer.getHeight()); } + + /** + * onConfigurationChanged events for updating tutorial text. + * @param newConfig + */ + public void onConfigurationChanged(Configuration newConfig) { + if (!mCanShowTutorial) { + return; + } + removeTutorialFromWindowManager(); + recreateTutorialView(mContext.createConfigurationContext(newConfig)); + attachTurtorialTarget(); + } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedAnimationControllerTest.java index 8d5139b182f0..a8feb04f31d4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedAnimationControllerTest.java @@ -47,7 +47,6 @@ public class OneHandedAnimationControllerTest extends OneHandedTestCase { private static final int TEST_BOUNDS_HEIGHT = 1000; OneHandedAnimationController mOneHandedAnimationController; - OneHandedTutorialHandler mTutorialHandler; @Mock private SurfaceControl mMockLeash; @@ -60,8 +59,6 @@ public class OneHandedAnimationControllerTest extends OneHandedTestCase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - - mTutorialHandler = new OneHandedTutorialHandler(mContext, mMainExecutor); mOneHandedAnimationController = new OneHandedAnimationController(mContext); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizerTest.java index e9c4af12a0d6..b0f52cf656f8 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizerTest.java @@ -59,7 +59,7 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase { DisplayController mMockDisplayController; @Before - public void setUp() throws Exception { + public void setUp() { MockitoAnnotations.initMocks(this); mTestableLooper = TestableLooper.get(this); mToken = new WindowContainerToken(mMockRealToken); @@ -82,15 +82,6 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase { } @Test - public void testUnregisterOrganizer() { - mBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); - mTestableLooper.processAllMessages(); - mBackgroundPanelOrganizer.unregisterOrganizer(); - - assertThat(mBackgroundPanelOrganizer.getBackgroundSurface()).isNull(); - } - - @Test public void testShowBackgroundLayer() { mBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); mBackgroundPanelOrganizer.showBackgroundPanelLayer(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java index f141167178a1..d99502cb6c4e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java @@ -16,19 +16,24 @@ package com.android.wm.shell.onehanded; +import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.om.IOverlayManager; import android.os.Handler; -import android.provider.Settings; import android.testing.AndroidTestingRunner; +import android.util.ArrayMap; import android.view.Display; +import android.view.SurfaceControl; import androidx.test.filters.SmallTest; @@ -37,19 +42,17 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedControllerTest extends OneHandedTestCase { Display mDisplay; - OneHandedController mOneHandedController; - OneHandedTimeoutHandler mTimeoutHandler; + OneHandedController mSpiedOneHandedController; + OneHandedTimeoutHandler mSpiedTimeoutHandler; @Mock DisplayController mMockDisplayController; @@ -64,8 +67,6 @@ public class OneHandedControllerTest extends OneHandedTestCase { @Mock OneHandedGestureHandler mMockGestureHandler; @Mock - OneHandedTimeoutHandler mMockTimeoutHandler; - @Mock OneHandedUiEventLogger mMockUiEventLogger; @Mock IOverlayManager mMockOverlayManager; @@ -74,14 +75,28 @@ public class OneHandedControllerTest extends OneHandedTestCase { @Mock ShellExecutor mMockShellMainExecutor; @Mock + SurfaceControl mMockLeash; + @Mock Handler mMockShellMainHandler; + final boolean mDefaultEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled( + getTestContext().getContentResolver()); + final boolean mDefaultSwipeToNotificationEnabled = + OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( + getTestContext().getContentResolver()); + @Before - public void setUp() throws Exception { + public void setUp() { MockitoAnnotations.initMocks(this); mDisplay = mContext.getDisplay(); - mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMockShellMainExecutor)); - OneHandedController oneHandedController = new OneHandedController( + mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor)); + + when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay); + when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); + when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>()); + when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash); + + mSpiedOneHandedController = spy(new OneHandedController( mContext, mMockDisplayController, mMockBackgroundOrganizer, @@ -89,16 +104,13 @@ public class OneHandedControllerTest extends OneHandedTestCase { mMockTouchHandler, mMockTutorialHandler, mMockGestureHandler, - mTimeoutHandler, + mSpiedTimeoutHandler, mMockUiEventLogger, mMockOverlayManager, mMockTaskStackListener, mMockShellMainExecutor, - mMockShellMainHandler); - mOneHandedController = Mockito.spy(oneHandedController); - - when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay); - when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); + mMockShellMainHandler) + ); } @Test @@ -113,21 +125,36 @@ public class OneHandedControllerTest extends OneHandedTestCase { } @Test - public void testRegisterOrganizer() { - verify(mMockDisplayAreaOrganizer, atLeastOnce()).registerOrganizer(anyInt()); + public void testNoRegisterAndUnregisterInSameCall() { + if (mDefaultEnabled) { + verify(mMockDisplayAreaOrganizer, never()).unregisterOrganizer(); + } else { + verify(mMockDisplayAreaOrganizer, never()).registerOrganizer(FEATURE_ONE_HANDED); + } } @Test - public void testStartOneHanded() { - mOneHandedController.startOneHanded(); + public void testStartOneHandedShouldTriggerScheduleOffset() { + when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); + mSpiedOneHandedController.setOneHandedEnabled(true); + mSpiedOneHandedController.startOneHanded(); verify(mMockDisplayAreaOrganizer).scheduleOffset(anyInt(), anyInt()); } @Test + public void testStartOneHandedShouldNotTriggerScheduleOffset() { + mSpiedOneHandedController.setOneHandedEnabled(true); + when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true); + mSpiedOneHandedController.startOneHanded(); + + verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt()); + } + + @Test public void testStopOneHanded() { when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); - mOneHandedController.stopOneHanded(); + mSpiedOneHandedController.stopOneHanded(); verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt()); } @@ -141,71 +168,66 @@ public class OneHandedControllerTest extends OneHandedTestCase { @Test public void testRegisterTransitionCallback() { - OneHandedTransitionCallback callback = new OneHandedTransitionCallback() {}; - mOneHandedController.registerTransitionCallback(callback); + OneHandedTransitionCallback callback = new OneHandedTransitionCallback() { + }; + mSpiedOneHandedController.registerTransitionCallback(callback); verify(mMockDisplayAreaOrganizer).registerTransitionCallback(callback); } - @Test public void testStopOneHanded_shouldRemoveTimer() { - mOneHandedController.stopOneHanded(); + when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true); + mSpiedOneHandedController.stopOneHanded(); - verify(mTimeoutHandler).removeTimer(); + verify(mSpiedTimeoutHandler, atLeastOnce()).removeTimer(); } @Test - public void testUpdateIsEnabled() { - final boolean enabled = true; - mOneHandedController.setOneHandedEnabled(enabled); + public void testUpdateEnabled() { + mSpiedOneHandedController.setOneHandedEnabled(true); - verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(enabled); + verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled); + verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled( + mDefaultEnabled || mDefaultSwipeToNotificationEnabled); } @Test - public void testUpdateSwipeToNotificationIsEnabled() { - final boolean enabled = true; - mOneHandedController.setSwipeToNotificationEnabled(enabled); + public void testUpdateSwipeToNotificationEnabled() { + final boolean swipeToNotificationEnabled = true; + mSpiedOneHandedController.setSwipeToNotificationEnabled(swipeToNotificationEnabled); - verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(enabled); + verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled); + verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled( + mDefaultEnabled || swipeToNotificationEnabled); } - @Ignore("b/167943723, refactor it and fix it") @Test - public void tesSettingsObserver_updateTapAppToExit() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.TAPS_APP_TO_EXIT, 1); + public void testUpdateTapAppToExitUpdate() { + mSpiedOneHandedController.onTaskChangeExitSettingChanged(); - verify(mOneHandedController).setTaskChangeToExit(true); + verify(mMockTaskStackListener, atLeastOnce()).addListener(any()); } - @Ignore("b/167943723, refactor it and fix it") @Test - public void tesSettingsObserver_updateEnabled() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_ENABLED, 1); + public void tesSettingsObserverUpdateEnabled() { + mSpiedOneHandedController.onEnabledSettingChanged(); - verify(mOneHandedController).setOneHandedEnabled(true); + verify(mSpiedOneHandedController, atLeastOnce()).setOneHandedEnabled(mDefaultEnabled); } - @Ignore("b/167943723, refactor it and fix it") @Test - public void tesSettingsObserver_updateTimeout() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_TIMEOUT, - OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS); + public void testSettingsObserverUpdateTimeout() { + mSpiedOneHandedController.onTimeoutSettingChanged(); - verify(mMockTimeoutHandler).setTimeout( - OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS); + verify(mSpiedTimeoutHandler, atLeastOnce()).setTimeout(anyInt()); } - @Ignore("b/167943723, refactor it and fix it") @Test - public void tesSettingsObserver_updateSwipeToNotification() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1); + public void tesSettingsObserverUpdateSwipeToNotification() { + mSpiedOneHandedController.onSwipeToNotificationEnabledSettingChanged(); - verify(mOneHandedController).setSwipeToNotificationEnabled(true); + verify(mSpiedOneHandedController, atLeastOnce()).setSwipeToNotificationEnabled( + !mDefaultEnabled); } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java index 01162b5c0b83..7a826c1be4d3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,6 +38,7 @@ import android.testing.TestableLooper; import android.view.Display; import android.view.Surface; import android.view.SurfaceControl; +import android.window.DisplayAreaAppearedInfo; import android.window.DisplayAreaInfo; import android.window.IWindowContainerToken; import android.window.WindowContainerToken; @@ -53,15 +55,19 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; +import java.util.List; + @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase { + static final int DISPLAYAREA_INFO_COUNT = 3; static final int DISPLAY_WIDTH = 1000; static final int DISPLAY_HEIGHT = 1000; DisplayAreaInfo mDisplayAreaInfo; Display mDisplay; - OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer; + OneHandedDisplayAreaOrganizer mSpiedDisplayAreaOrganizer; OneHandedTutorialHandler mTutorialHandler; OneHandedAnimationController.OneHandedTransitionAnimator mFakeAnimator; WindowContainerToken mToken; @@ -86,6 +92,8 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase { @Mock ShellExecutor mMockShellMainExecutor; + List<DisplayAreaAppearedInfo> mDisplayAreaAppearedInfoList = new ArrayList<>(); + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -112,170 +120,195 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase { when(mMockLeash.getWidth()).thenReturn(DISPLAY_WIDTH); when(mMockLeash.getHeight()).thenReturn(DISPLAY_HEIGHT); - mDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext, + mSpiedDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext, mMockDisplayController, mMockAnimationController, mTutorialHandler, mMockBackgroundOrganizer, mMockShellMainExecutor)); + + for (int i = 0; i < DISPLAYAREA_INFO_COUNT; i++) { + mDisplayAreaAppearedInfoList.add(getDummyDisplayAreaInfo()); + } + doReturn(mDisplayAreaAppearedInfoList).when(mSpiedDisplayAreaOrganizer).registerOrganizer( + FEATURE_ONE_HANDED); + } + + private DisplayAreaAppearedInfo getDummyDisplayAreaInfo() { + return new DisplayAreaAppearedInfo(mDisplayAreaInfo, mMockLeash); + } + + @Test + public void testRegisterDisplayAreaOrganizer() { + assertThat(mSpiedDisplayAreaOrganizer.registerOrganizer(FEATURE_ONE_HANDED)).isNotNull(); } @Test public void testOnDisplayAreaAppeared() { - mDisplayAreaOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); + mDisplayAreaAppearedInfoList.forEach( + (info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaAppeared( + info.getDisplayAreaInfo(), + info.getLeash())); verify(mMockAnimationController, never()).getAnimator(any(), any(), any(), any()); } @Test public void testOnDisplayAreaVanished() { - mDisplayAreaOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); - mDisplayAreaOrganizer.onDisplayAreaVanished(mDisplayAreaInfo); + mDisplayAreaAppearedInfoList.forEach( + (info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaAppeared( + info.getDisplayAreaInfo(), + info.getLeash())); + + mDisplayAreaAppearedInfoList.forEach( + (info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaVanished( + info.getDisplayAreaInfo())); - assertThat(mDisplayAreaOrganizer.mDisplayAreaTokenMap).isEmpty(); + verify(mSpiedDisplayAreaOrganizer, times(DISPLAYAREA_INFO_COUNT)).onDisplayAreaVanished( + any()); } @Test public void testRotation_portrait_0_to_landscape_90() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 0 -> 90 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_90, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_90, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_0_to_seascape_270() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 0 -> 270 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_270, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_270, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_180_to_landscape_90() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 180 -> 90 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_90, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_90, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_180_to_seascape_270() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 180 -> 270 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_270, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_270, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_landscape_90_to_portrait_0() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 90 -> 0 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_0, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_0, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_landscape_90_to_portrait_180() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 90 -> 180 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_180, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_180, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_Seascape_270_to_portrait_0() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 270 -> 0 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_0, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_0, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_seascape_90_to_portrait_180() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 270 -> 180 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_180, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_180, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_0_to_portrait_0() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 0 -> 0 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_0, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_0, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_0_to_portrait_180() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 0 -> 180 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_180, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_180, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_180_to_portrait_180() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 180 -> 180 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_180, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_180, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_portrait_180_to_portrait_0() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 180 -> 0 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_0, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_0, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_landscape_90_to_landscape_90() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 90 -> 90 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_90, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_90, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_landscape_90_to_seascape_270() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 90 -> 270 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_270, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_270, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_seascape_270_to_seascape_270() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 270 -> 270 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_270, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_270, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } @Test public void testRotation_seascape_90_to_landscape_90() { when(mMockLeash.isValid()).thenReturn(false); // Rotate 270 -> 90 - mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_90, + mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_90, mMockWindowContainerTransaction); - verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); + verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedGestureHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedGestureHandlerTest.java index e5f2ff717e37..b275b701f87a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedGestureHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedGestureHandlerTest.java @@ -18,10 +18,8 @@ package com.android.wm.shell.onehanded; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; - import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; +import android.view.ViewConfiguration; import androidx.test.filters.SmallTest; @@ -29,7 +27,6 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -38,7 +35,6 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedGestureHandlerTest extends OneHandedTestCase { - OneHandedTutorialHandler mTutorialHandler; OneHandedGestureHandler mGestureHandler; @Mock DisplayController mMockDisplayController; @@ -46,11 +42,10 @@ public class OneHandedGestureHandlerTest extends OneHandedTestCase { ShellExecutor mMockShellMainExecutor; @Before - public void setUp() throws Exception { + public void setUp() { MockitoAnnotations.initMocks(this); - mTutorialHandler = new OneHandedTutorialHandler(mContext, mMockShellMainExecutor); mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController, - mMockShellMainExecutor); + ViewConfiguration.get(mTestContext), mMockShellMainExecutor); } @Test @@ -68,16 +63,6 @@ public class OneHandedGestureHandlerTest extends OneHandedTestCase { assertThat(mGestureHandler.mGestureEventCallback).isEqualTo(callback); } - @Ignore("b/167943723, refactor it and fix it") - @Test - public void testReceiveNewConfig_whenThreeButtonModeEnabled() { - mGestureHandler.onOneHandedEnabled(true); - mGestureHandler.onThreeButtonModeEnabled(true); - - assertThat(mGestureHandler.mInputMonitor).isNotNull(); - assertThat(mGestureHandler.mInputEventReceiver).isNotNull(); - } - @Test public void testOneHandedDisabled_shouldDisposeInputChannel() { mGestureHandler.onOneHandedEnabled(false); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedSettingsUtilTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedSettingsUtilTest.java index f8c9d535ba94..61643d86c8d9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedSettingsUtilTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedSettingsUtilTest.java @@ -28,7 +28,6 @@ import android.database.ContentObserver; import android.net.Uri; import android.provider.Settings; import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; import androidx.test.filters.SmallTest; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java index 73a95345e1c9..32a188d02cf0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java @@ -19,88 +19,47 @@ package com.android.wm.shell.onehanded; import static android.view.Display.DEFAULT_DISPLAY; import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE; -import static com.android.wm.shell.onehanded.OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS; import static org.junit.Assume.assumeTrue; import android.content.Context; import android.hardware.display.DisplayManager; import android.os.SystemProperties; -import android.provider.Settings; +import android.testing.TestableContext; import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.After; import org.junit.Before; +import org.junit.Rule; +import org.mockito.Answers; +import org.mockito.Mock; /** * Base class that does One Handed specific setup. */ public abstract class OneHandedTestCase { - static boolean sOrigEnabled; - static boolean sOrigTapsAppToExitEnabled; - static int sOrigTimeout; - static boolean sOrigSwipeToNotification; - + @Mock(answer = Answers.RETURNS_DEEP_STUBS) protected Context mContext; + @Rule + public TestableContext mTestContext = new TestableContext( + InstrumentationRegistry.getInstrumentation().getTargetContext(), null); + @Before - public void setupSettings() { + public void setUpContext() { assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)); - final Context testContext = - InstrumentationRegistry.getInstrumentation().getTargetContext(); - final DisplayManager dm = testContext.getSystemService(DisplayManager.class); - mContext = testContext.createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY)); - - InstrumentationRegistry - .getInstrumentation() - .getUiAutomation() - .adoptShellPermissionIdentity(); - - sOrigEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - getContext().getContentResolver()); - sOrigTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout( - getContext().getContentResolver()); - sOrigTapsAppToExitEnabled = OneHandedSettingsUtil.getSettingsTapsAppToExit( - getContext().getContentResolver()); - sOrigSwipeToNotification = OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( - getContext().getContentResolver()); - Settings.Secure.putInt(getContext().getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_ENABLED, 1); - Settings.Secure.putInt(getContext().getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS); - Settings.Secure.putInt(getContext().getContentResolver(), - Settings.Secure.TAPS_APP_TO_EXIT, 1); - Settings.Secure.putInt(getContext().getContentResolver(), - Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1); + final DisplayManager dm = getTestContext().getSystemService(DisplayManager.class); + mContext = getTestContext().createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY)); } - @After - public void restoreSettings() { - if (mContext == null) { - // Return early if one-handed mode is not supported - return; - } - - Settings.Secure.putInt(getContext().getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_ENABLED, sOrigEnabled ? 1 : 0); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ONE_HANDED_MODE_TIMEOUT, sOrigTimeout); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.TAPS_APP_TO_EXIT, sOrigTapsAppToExitEnabled ? 1 : 0); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, - sOrigSwipeToNotification ? 1 : 0); - - InstrumentationRegistry - .getInstrumentation() - .getUiAutomation() - .dropShellPermissionIdentity(); + /** return testable context */ + protected TestableContext getTestContext() { + return mTestContext; } + /** return display context */ protected Context getContext() { return mContext; } } - diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTimeoutHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTimeoutHandlerTest.java index bbe8891817d6..98f240a209a6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTimeoutHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTimeoutHandlerTest.java @@ -27,24 +27,18 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; -import android.os.Looper; import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.wm.shell.TestShellExecutor; -import com.android.wm.shell.common.ShellExecutor; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import java.util.ArrayList; - @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedTimeoutHandlerTest extends OneHandedTestCase { @@ -52,7 +46,7 @@ public class OneHandedTimeoutHandlerTest extends OneHandedTestCase { private TestShellExecutor mMainExecutor; @Before - public void setUp() throws Exception { + public void setUp() { MockitoAnnotations.initMocks(this); mMainExecutor = new TestShellExecutor(); mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMainExecutor)); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTouchHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTouchHandlerTest.java index d3b02caf8b65..8660e0e9f7f6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTouchHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTouchHandlerTest.java @@ -18,8 +18,9 @@ package com.android.wm.shell.onehanded; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; + import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; import androidx.test.filters.SmallTest; @@ -35,18 +36,20 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedTouchHandlerTest extends OneHandedTestCase { - private OneHandedTouchHandler mTouchHandler; - - @Mock - private OneHandedTimeoutHandler mTimeoutHandler; + boolean mIsEventCallback = false; + private OneHandedTouchHandler mTouchHandler; + private OneHandedTimeoutHandler mSpiedTimeoutHandler; + private OneHandedTouchHandler.OneHandedTouchEventCallback mTouchEventCallback = + () -> mIsEventCallback = true; @Mock - private ShellExecutor mMainExecutor; + private ShellExecutor mMockShellMainExecutor; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mTouchHandler = new OneHandedTouchHandler(mTimeoutHandler, mMainExecutor); + mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor)); + mTouchHandler = new OneHandedTouchHandler(mSpiedTimeoutHandler, mMockShellMainExecutor); } @Test @@ -55,7 +58,7 @@ public class OneHandedTouchHandlerTest extends OneHandedTestCase { }; mTouchHandler.registerTouchEventListener(callback); - assertThat(mTouchHandler.mTouchEventCallback).isEqualTo(callback); + assertThat(mIsEventCallback).isFalse(); } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java index c3e6bf376bda..024cf7ffc1f3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java @@ -17,10 +17,12 @@ package com.android.wm.shell.onehanded; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.om.IOverlayManager; import android.os.Handler; import android.testing.AndroidTestingRunner; +import android.util.ArrayMap; import androidx.test.filters.SmallTest; @@ -37,12 +39,15 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class OneHandedTutorialHandlerTest extends OneHandedTestCase { - @Mock - OneHandedTouchHandler mTouchHandler; - OneHandedTutorialHandler mTutorialHandler; - OneHandedGestureHandler mGestureHandler; OneHandedTimeoutHandler mTimeoutHandler; OneHandedController mOneHandedController; + + @Mock + OneHandedGestureHandler mMockGestureHandler; + @Mock + OneHandedTouchHandler mMockTouchHandler; + @Mock + OneHandedTutorialHandler mMockTutorialHandler; @Mock DisplayController mMockDisplayController; @Mock @@ -64,18 +69,17 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mTutorialHandler = new OneHandedTutorialHandler(mContext, mMockShellMainExecutor); mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor); - mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController, - mMockShellMainExecutor); + + when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>()); mOneHandedController = new OneHandedController( getContext(), mMockDisplayController, mMockBackgroundOrganizer, mMockDisplayAreaOrganizer, - mTouchHandler, - mTutorialHandler, - mGestureHandler, + mMockTouchHandler, + mMockTutorialHandler, + mMockGestureHandler, mTimeoutHandler, mMockUiEventLogger, mMockOverlayManager, @@ -86,6 +90,6 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { @Test public void testRegisterForDisplayAreaOrganizer() { - verify(mMockDisplayAreaOrganizer).registerTransitionCallback(mTutorialHandler); + verify(mMockDisplayAreaOrganizer).registerTransitionCallback(mMockTutorialHandler); } } diff --git a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java index d7c8291c6676..4ddae533bb80 100644 --- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java +++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java @@ -49,8 +49,6 @@ import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.INetworkActivityListener; -import android.os.INetworkManagementService; import android.os.Looper; import android.os.Message; import android.os.Messenger; @@ -835,7 +833,6 @@ public class ConnectivityManager { private final Context mContext; - private INetworkManagementService mNMService; private INetworkPolicyManager mNPManager; private final TetheringManager mTetheringManager; @@ -2211,17 +2208,6 @@ public class ConnectivityManager { void onNetworkActive(); } - private INetworkManagementService getNetworkManagementService() { - synchronized (this) { - if (mNMService != null) { - return mNMService; - } - IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); - mNMService = INetworkManagementService.Stub.asInterface(b); - return mNMService; - } - } - private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener> mNetworkActivityListeners = new ArrayMap<>(); @@ -2246,7 +2232,7 @@ public class ConnectivityManager { }; try { - getNetworkManagementService().registerNetworkActivityListener(rl); + mService.registerNetworkActivityListener(rl); mNetworkActivityListeners.put(l, rl); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -2263,7 +2249,7 @@ public class ConnectivityManager { INetworkActivityListener rl = mNetworkActivityListeners.get(l); Preconditions.checkArgument(rl != null, "Listener was not registered."); try { - getNetworkManagementService().unregisterNetworkActivityListener(rl); + mService.registerNetworkActivityListener(rl); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2279,7 +2265,7 @@ public class ConnectivityManager { */ public boolean isDefaultNetworkActive() { try { - return getNetworkManagementService().isNetworkActive(); + return mService.isDefaultNetworkActive(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl b/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl index 6391802f3330..160338d396af 100644 --- a/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl +++ b/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl @@ -21,6 +21,7 @@ import android.net.ConnectionInfo; import android.net.ConnectivityDiagnosticsManager; import android.net.IConnectivityDiagnosticsCallback; import android.net.IOnSetOemNetworkPreferenceListener; +import android.net.INetworkActivityListener; import android.net.IQosCallback; import android.net.ISocketKeepaliveCallback; import android.net.LinkProperties; @@ -36,7 +37,6 @@ import android.net.UidRange; import android.net.QosSocketInfo; import android.os.Bundle; import android.os.IBinder; -import android.os.INetworkActivityListener; import android.os.Messenger; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; diff --git a/core/java/android/os/INetworkActivityListener.aidl b/packages/Connectivity/framework/src/android/net/INetworkActivityListener.aidl index 24e6e55f1e57..79687dd3bf06 100644 --- a/core/java/android/os/INetworkActivityListener.aidl +++ b/packages/Connectivity/framework/src/android/net/INetworkActivityListener.aidl @@ -13,7 +13,7 @@ ** limitations under the License. */ -package android.os; +package android.net; /** * @hide diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index d411831eef3f..65e75cdba405 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -83,9 +83,9 @@ <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan."</string> <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan."</string> <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan."</string> - <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> - <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> - <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> + <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> + <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> + <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"Egin aurrera"</string> <string name="external_sources_settings" msgid="4046964413071713807">"Ezarpenak"</string> <string name="wear_app_channel" msgid="1960809674709107850">"Wear aplikazioak instalatzea/desinstalatzea"</string> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 719fc9219450..e69ca7664b53 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -50,8 +50,8 @@ <string name="search" msgid="5421724265322228497">"جستجو"</string> <string name="all_printers_label" msgid="3178848870161526399">"همه چاپگرها"</string> <string name="add_print_service_label" msgid="5356702546188981940">"افزودن سرویس"</string> - <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"کادر جستجو نمایان شد"</string> - <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"کادر جستجو پنهان شد"</string> + <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"چارگوش جستجو نمایان شد"</string> + <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"چارگوش جستجو پنهان شد"</string> <string name="print_add_printer" msgid="1088656468360653455">"افزودن چاپگر"</string> <string name="print_select_printer" msgid="7388760939873368698">"انتخاب چاپگر"</string> <string name="print_forget_printer" msgid="5035287497291910766">"فراموش کردن چاپگر"</string> diff --git a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java index 4d454941af7c..b0a9b95492a6 100644 --- a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java +++ b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java @@ -45,13 +45,22 @@ public class EmergencyNumberUtils { public static final Uri EMERGENCY_NUMBER_OVERRIDE_AUTHORITY = new Uri.Builder().scheme( ContentResolver.SCHEME_CONTENT) - .authority("com.android.emergency.numbers") + .authority("com.android.emergency.gesture") .build(); public static final String METHOD_NAME_GET_EMERGENCY_NUMBER_OVERRIDE = "GET_EMERGENCY_NUMBER_OVERRIDE"; public static final String METHOD_NAME_SET_EMERGENCY_NUMBER_OVERRIDE = "SET_EMERGENCY_NUMBER_OVERRIDE"; + public static final String METHOD_NAME_SET_EMERGENCY_GESTURE = "SET_EMERGENCY_GESTURE"; + public static final String METHOD_NAME_SET_EMERGENCY_SOUND = "SET_EMERGENCY_SOUND"; + public static final String METHOD_NAME_GET_EMERGENCY_GESTURE_ENABLED = "GET_EMERGENCY_GESTURE"; + public static final String METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED = + "GET_EMERGENCY_SOUND"; public static final String EMERGENCY_GESTURE_CALL_NUMBER = "emergency_gesture_call_number"; + public static final String EMERGENCY_SETTING_VALUE = "emergency_setting_value"; + public static final int EMERGENCY_SETTING_ON = 1; + public static final int EMERGENCY_SETTING_OFF = 0; + @VisibleForTesting static final String FALL_BACK_NUMBER = "112"; @@ -103,6 +112,51 @@ public class EmergencyNumberUtils { METHOD_NAME_SET_EMERGENCY_NUMBER_OVERRIDE, null /* args */, bundle); } + /** + * Enable/disable the emergency gesture setting + */ + public void setEmergencyGestureEnabled(boolean enabled) { + final Bundle bundle = new Bundle(); + bundle.putInt(EMERGENCY_SETTING_VALUE, + enabled ? EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF); + mContext.getContentResolver().call(EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, + METHOD_NAME_SET_EMERGENCY_GESTURE, null /* args */, bundle); + } + + /** + * Enable/disable the emergency gesture sound setting + */ + public void setEmergencySoundEnabled(boolean enabled) { + final Bundle bundle = new Bundle(); + bundle.putInt(EMERGENCY_SETTING_VALUE, + enabled ? EMERGENCY_SETTING_ON : EMERGENCY_SETTING_OFF); + mContext.getContentResolver().call(EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, + METHOD_NAME_SET_EMERGENCY_SOUND, null /* args */, bundle); + } + + /** + * Whether or not emergency gesture is enabled. + */ + public boolean getEmergencyGestureEnabled() { + final Bundle bundle = mContext.getContentResolver().call( + EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, + METHOD_NAME_GET_EMERGENCY_GESTURE_ENABLED, null /* args */, null /* bundle */); + return bundle == null ? true : bundle.getInt(EMERGENCY_SETTING_VALUE, EMERGENCY_SETTING_ON) + == EMERGENCY_SETTING_ON; + } + + /** + * Whether or not emergency gesture sound is enabled. + */ + public boolean getEmergencyGestureSoundEnabled() { + final Bundle bundle = mContext.getContentResolver().call( + EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, + METHOD_NAME_GET_EMERGENCY_GESTURE_SOUND_ENABLED, null /* args */, + null /* bundle */); + return bundle == null ? true : bundle.getInt(EMERGENCY_SETTING_VALUE, EMERGENCY_SETTING_OFF) + == EMERGENCY_SETTING_ON; + } + private String getEmergencyNumberOverride() { final Bundle bundle = mContext.getContentResolver().call( EMERGENCY_NUMBER_OVERRIDE_AUTHORITY, diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 577fb6611448..4b253c459b83 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Datasein vol."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet is ontkoppel."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Geen oproepe nie."</string> </resources> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index c554e2ed8a8e..4982f820ff37 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"የውሂብ አመልካች ሙሉ ነው።"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ኤተርኔት ተነቅሏል።"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ኢተርኔት።"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"መደወል የለም።"</string> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index b23cebd19e7a..5eaefd02483b 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -596,6 +596,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"إشارة البيانات كاملة."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"تم قطع اتصال Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"إيثرنت"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"لا يتم الاتصال."</string> </resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 2380b2fa21ac..571f7d00ef89 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ডেটা ছিগনেল পূৰা আছে।"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথাৰনেট।"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"কল কৰা নহয়"</string> </resources> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index f70bb84c55a4..36a13f50fe11 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Data siqnalı tamdır."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kəsilib."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Zəng yoxdur."</string> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 749f864f8aef..d7cc909fe15f 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Signal za podatke je najjači."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa eternetom je prekinuta."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez pozivanja."</string> </resources> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 6b2740d7d7d7..01201b34f6a8 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Поўны сігнал перадачы дадзеных."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet адлучаны."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Ніякіх выклікаў."</string> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 1a24b9e52b36..00f5e710b727 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Сигналът за данни е пълен."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Връзката с Ethernet е прекратена."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Без обаждания."</string> </resources> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 1c9f84f68962..43bb7581026c 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"পূর্ণ ডেটার সংকেত রয়েছে৷"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথারনেটের সংযোগ বিচ্ছিন্ন হয়েছে৷"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথারনেট।"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"কল করবেন না।"</string> </resources> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index f70142187a36..dacacfbb142d 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Signal za prijenos podataka pun."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa Ethernetom je prekinuta."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Nema pozivanja."</string> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 78ef10969b72..17482ed18963 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Senyal de dades: complet."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"S\'ha desconnectat l\'Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sense trucades."</string> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 8ca9800562a0..ddd5c523c8f9 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Plný signál datové sítě."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Síť ethernet je odpojena."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez volání."</string> </resources> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 5d55a12b4d6c..421ed742bd23 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Datasignal fuldt."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er ikke tilsluttet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Opkald er deaktiveret."</string> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 1fbb391741b5..7cb994cb06de 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Volle Datensignalstärke"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet nicht verbunden"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Keine Anrufe."</string> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 32bcf8792067..7a73ccdf2c63 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Πλήρες σήμα δεδομένων."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Το Ethernet αποσυνδέθηκε."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Χωρίς κλήσεις."</string> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 0f765764dbfd..5e5b39a1bd0a 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Señal de datos completa"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index abd209ccc717..8d791771bf05 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Señal de datos al máximo"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Conexión Ethernet desconectada."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 2e9f3b8948a2..18ee62371ef6 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Andmesignaal on tugev."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Etherneti-ühendus on katkestatud."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Helistamine pole võimalik."</string> </resources> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index ecb4f7573b66..71be593a055b 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Datu-seinale osoa."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bidezko konexioa eten da."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Deirik ez."</string> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 56ade54d9212..81a2cf888d1f 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"قدرت سیگنال داده کامل است."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"اترنت قطع شد."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"اترنت."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"تماس گرفته نشود."</string> </resources> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index e26ecb705c9f..0703c450a2ed 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Vahva kuuluvuus."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet on irrotettu."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Ei puheluita."</string> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index d61ebc099934..5b8c93880446 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Signal excellent"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Aucun appel."</string> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 64c06fae175d..b025357a4642 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Signal excellent"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Pas d\'appels."</string> </resources> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index cf63dd7176b2..d68595e98e04 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinal de datos: completo"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Desconectouse a Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sen chamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 427ce56296fe..e151ddb428d8 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ડેટા સિગ્નલ પૂર્ણ."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ઇથરનેટ."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"કોઈ કૉલિંગ નહીં."</string> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 159d2dbe7439..beab7bdcc08e 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"डेटा सिग्नल पूरा."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ईथरनेट डिस्कनेक्ट किया गया."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ईथरनेट."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"वॉइस कॉल की सुविधा उपलब्ध नहीं है."</string> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 5e33ef3d0689..8989cc9c69db 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Podatkovni signal pun."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Prekinuta je veza s ethernetom."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez poziva."</string> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 28975be7b6fb..7c5a1a004568 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Adatjel teljes."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet leválasztva."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Nem kezdeményezhet hanghívást."</string> </resources> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index a2075265b58c..6684d3507c77 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Տվյալների ազդանշանը լրիվ է:"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet-ը անջատված է:"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet։"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Զանգել հնարավոր չէ։"</string> </resources> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index c4d752d25cf3..075444cd04f8 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinyal data penuh."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet terputus."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Tidak ada panggilan."</string> </resources> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 56b0a81b7c81..b079f4d9b75e 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Fullur sendistyrkur gagnatengingar."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet aftengt."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Engin símtöl."</string> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index f045d273ce0d..bf525c535583 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Massimo segnale dati."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Connessione Ethernet annullata."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Chiamate non disponibili."</string> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index ba3a46786663..9055e77b08dd 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"אות הנתונים מלא."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"אתרנט מנותק."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"אתרנט."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"אין שיחות."</string> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 6f398b6840b0..7fa0df93e2ce 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"データ信号:フル"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"イーサネット接続を解除しました。"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"イーサネット。"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"通話なし。"</string> </resources> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 5bf1dd03f558..7dd1eee09f83 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"მონაცემთა გადაცემის საიმედო სიგნალი."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet კავშირი შეწყვეტილია."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ზარების გარეშე."</string> </resources> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index c7c38378db6e..59b1d63af04f 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Дерекқор сигналы толы."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажыратылған."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Қоңырау шалу мүмкін емес."</string> </resources> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 99a73e14daee..b01839d2280f 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"សញ្ញាទិន្នន័យពេញ។"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"បានផ្តាច់អ៊ីសឺរណិត។"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"អ៊ីសឺរណិត។"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"គ្មានការហៅទូរសព្ទទេ។"</string> </resources> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 54a42a8b0090..217c917f1d2b 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ಡೇಟಾ ಸಂಕೇತ ತುಂಬಿದೆ."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ಇಥರ್ನೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ಇಥರ್ನೆಟ್."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ಕರೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ."</string> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 9e9fea9e57ad..0b8c71d0d9cd 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"데이터 신호가 강합니다."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"이더넷에서 연결 해제되었습니다."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"이더넷에 연결되었습니다."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"통화 모드가 없습니다."</string> </resources> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 2aec5cb42199..cad00a38e89d 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Мобилдик интернеттин сигналы толук."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажырады."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Чалуу жок."</string> </resources> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index e199e1f7db83..5bd297e310f5 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ສັນຍານຂໍ້ມູນເຕັມ."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ອີເທີເນັດຕັດເຊື່ອມຕໍ່ແລ້ວ."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ອີເທີເນັດ."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ບໍ່ສາມາດໂທສຽງໄດ້."</string> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index a25c59f5eb26..8c7485f29af7 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Stiprus duomenų signalas."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Atsijungta nuo eterneto."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternetas."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Nekviečiama."</string> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index f360c906d95a..d8020c7c1d05 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Pilna piekļuve datu signālam."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Pārtraukts savienojums ar tīklu Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Tīkls Ethernet"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Zvanīšana nav pieejama."</string> </resources> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index a32d00b00928..e4c8425495b7 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Сигналот за податоци е исполнет."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Етернетот е исклучен."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Без повици."</string> </resources> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 902507df89c8..28422c930683 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ഡാറ്റ സിഗ്നൽ പൂർണ്ണമാണ്."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ഇതർനെറ്റ് വിച്ഛേദിച്ചു."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ഇതർനെറ്റ്."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"വോയ്സ് കോൾ ലഭ്യമല്ല."</string> </resources> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 83009b7c03a1..0d78ea9ac2e3 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Дата дохио дүүрэн."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet саллаа."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Этернэт."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Дуудлага байхгүй."</string> </resources> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 359f52565934..d27f7051d1f1 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"डेटा सिग्नल पूर्ण."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट डिस्कनेक्ट केले."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"कॉलिंग उपलब्ध नाही."</string> </resources> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index eba89daf02ed..c5a2c6276318 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Isyarat data penuh."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet diputuskan sambungan."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Tiada panggilan."</string> </resources> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index e982aa93d28e..ed34f7d3dd9e 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"အီသာနက်။"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ခေါ်ဆိုမှု မရှိပါ။"</string> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index abbb5e7c64ee..5366e7e13843 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Datasignal er fullt."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er frakoblet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Ingen ringing."</string> </resources> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index d7a32bf3a038..cde7b8033509 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"डेटा संकेत पूर्ण।"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट विच्छेद भयो।"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट।"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"कल गर्ने सुविधा उपलब्ध छैन।"</string> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 7e739bca9b94..bb1402a93227 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Gegevenssignaal is op volle sterkte."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetverbinding verbroken."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Geen gesprekken."</string> </resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 1e842b7f7ce0..90fc8bce9339 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ଡାଟା ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ଇଥରନେଟ୍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ଇଥରନେଟ୍।"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"କୌଣସି କଲିଂ ନାହିଁ।"</string> </resources> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index d035fc0b5c9c..4c20e196b1bb 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">" ਡਾਟਾ ਸਿਗਨਲ ਪੂਰਾ।"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ਈਥਰਨੈੱਟ।"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ਕਾਲਿੰਗ ਸੇਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 8a732cb7710b..6d037d8e0aaf 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Dane: pełna moc sygnału."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Rozłączono z siecią Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Brak połączenia."</string> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index a63b9b5660da..3feed99762ef 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinal de dados cheio."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index ab23059e013c..a886aa9d4cb4 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinal de dados completo."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desligada."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index a63b9b5660da..3feed99762ef 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinal de dados cheio."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 98edb32e2865..7fbe6225bc9c 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Semnal pentru date: complet."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet deconectat."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Apelarea nu este disponibilă."</string> </resources> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 972dc205fea5..1669df6136f0 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Надежный сигнал передачи данных."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Устройство отключено от Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Совершение вызовов невозможно."</string> </resources> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 0dee8e1c8af9..1fdd968c9b7e 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"දත්ත සංඥාව පිරී ඇත."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ඊතර්නෙට් විසන්ධි කරන ලදී."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ඊතර්නෙට්."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ඇමතුම් නැත."</string> </resources> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 7d49ca3b91cd..03b454ea6a14 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Plný signál dátovej siete."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Sieť ethernet je odpojená"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Žiadne volanie."</string> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 48e5dcc2284b..73b48187747c 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Podatkovni signal poln."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetna povezava je prekinjena."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Klicanje ni mogoče."</string> </resources> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 0bc905e688a1..a07bb2bc1cfd 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Sinjali i të dhënave është i plotë."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Lidhja e eternetit u shkëput."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Telefonatat nuk ofrohen"</string> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 6d19af89f47b..0faaf83e65c9 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -593,6 +593,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Сигнал за податке је најјачи."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Веза са етернетом је прекинута."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Без позивања."</string> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 944c423b35ac..87606d0f7ed5 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Datasignalen är full."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet har kopplats från."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Inga anrop."</string> </resources> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 442f54be37bb..d479b0b174b8 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Ishara ya data imejaa."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethaneti imeondolewa."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethaneti."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Huwezi kupiga wala kupokea simu."</string> </resources> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 561a122430e7..247889bb4e83 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"தரவு சிக்னல் முழுமையாக உள்ளது."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ஈத்தர்நெட் துண்டிக்கப்பட்டது."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ஈதர்நெட்."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"அழைப்பை மேற்கொள்ள முடியவில்லை."</string> </resources> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 18d7f281db62..b5d584f23d7e 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"డేటా సిగ్నల్ సంపూర్ణంగా ఉంది."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ఈథర్నెట్ డిస్కనెక్ట్ చేయబడింది."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ఈథర్నెట్."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"కాలింగ్ మోడ్ ఆఫ్లో ఉంది."</string> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index ceab26cabd9a..dc1514f2777b 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"สัญญาณข้อมูลเต็ม"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ยกเลิกการเชื่อมต่ออีเทอร์เน็ตแล้ว"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"อีเทอร์เน็ต"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"ไม่มีการโทร"</string> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 671fa149219f..7c4ceec08dd1 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Puno ang signal ng data."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Nadiskonekta ang Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Hindi makakatawag."</string> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 98d89f3e43d5..2b5dff15d101 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Veri sinyali tam."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kesildi."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Çağrı yok."</string> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 4e739acb53a7..6fff40dab7f2 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -594,6 +594,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Максимальний сигнал даних."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet відключено."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Виклики недоступні."</string> </resources> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index c7dee9513759..055d9b86e3e0 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"ڈیٹا سگنل بھرا ہوا ہے۔"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ایتھرنیٹ منقطع ہے۔"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ایتھرنیٹ۔"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"کوئی کالنگ نہیں ہے۔"</string> </resources> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 433096b64f08..d897ba697580 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Internet signali butun."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Qurilma Ethernet tarmog‘idan uzildi."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Chaqiruv imkonsiz."</string> </resources> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index a14462bf7efe..c6b7915b927d 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Tín hiệu dữ liệu đầy đủ."</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Đã ngắt kết nối Ethernet."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Không thể gọi điện."</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index f6bea916c3fa..05b27d14c4f9 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"数据信号满格。"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太网已断开连接。"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太网。"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"不启用通话。"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 3cf15a9f3995..13398d74588c 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"數據網絡訊號滿格。"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太網連接中斷。"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太網絡。"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"不啟用通話。"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 7cf02978efd8..fead5e50f7e4 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"數據網路訊號滿格。"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"未連上乙太網路。"</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"乙太網路。"</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"不顯示在螢幕上。"</string> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index d950d58b5bf7..79b8946f1e98 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -592,6 +592,5 @@ <string name="accessibility_data_signal_full" msgid="1808301899314382337">"Igcwele i-signal yedatha"</string> <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"I-Ethernet inqanyuliwe."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"I-Ethernet."</string> - <!-- no translation found for accessibility_no_calling (3540827068323895748) --> - <skip /> + <string name="accessibility_no_calling" msgid="3540827068323895748">"Akukho ukwenza ikholi"</string> </resources> diff --git a/packages/Shell/res/values-ky/strings.xml b/packages/Shell/res/values-ky/strings.xml index 3567ac276e63..d73ee2fdb4e9 100644 --- a/packages/Shell/res/values-ky/strings.xml +++ b/packages/Shell/res/values-ky/strings.xml @@ -25,7 +25,7 @@ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Мүчүлүштүктөр жөнүндө кабар жакында телефонго чыгат"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Мүчүлүштүк тууралуу кабарды жөнөтүү үчүн таптап коюңуз"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Мүчүлүштүк тууралуу билдирүүңүздү бөлүшүү үчүн таптап коюңуз"</string> - <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго серпиңиз же скриншот даяр болгуча күтүңүз"</string> + <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго сүрүңүз же скриншот даяр болгуча күтүңүз"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Мүчүлүштүктөр тууралуу билдирүүлөрдө тутумдун ар кандай таржымалдарынан алынган дайындар, ошондой эле купуя маалымат камтылышы мүмкүн (мисалы, жайгашкан жер сыяктуу). Мындай билдирүүлөрдү бир гана ишеничтүү адамдар жана колдонмолор менен бөлүшүңүз."</string> diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml index 0e576fbe2245..64c7422c27ed 100644 --- a/packages/SystemUI/res/layout/navigation_layout.xml +++ b/packages/SystemUI/res/layout/navigation_layout.xml @@ -30,7 +30,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" - android:clipToPadding="false"> + android:clipToPadding="false" + systemui:isVertical="false"> <LinearLayout android:id="@+id/ends_group" diff --git a/packages/SystemUI/res/layout/navigation_layout_vertical.xml b/packages/SystemUI/res/layout/navigation_layout_vertical.xml index 4b6770042632..42e93249e95f 100644 --- a/packages/SystemUI/res/layout/navigation_layout_vertical.xml +++ b/packages/SystemUI/res/layout/navigation_layout_vertical.xml @@ -30,7 +30,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" - android:clipToPadding="false"> + android:clipToPadding="false" + systemui:isVertical="true"> <com.android.systemui.navigationbar.buttons.ReverseLinearLayout android:id="@+id/ends_group" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 2dff06369ff2..68c7467b7bf2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Rollees skermskoot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Maak skermkiekie toe"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Boonste grens"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Onderste grens"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skermopnemer"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Verwerk tans skermopname"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Jou organisasie het \'n sertifikaatoutoriteit in jou werkprofiel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"\'n Sertifikaatoutoriteit is op hierdie toestel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Jou administrateur het netwerkloginskrywing aangeskakel, wat verkeer op jou toestel monitor."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Jou administrateur het netwerkloglêers aangeskakel wat verkeer in jou werkprofiel maar nie in jou persoonlike profiel monitor nie."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Jy is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Jy is gekoppel aan <xliff:g id="VPN_APP_0">%1$s</xliff:g> en <xliff:g id="VPN_APP_1">%2$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Jou werkprofiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 283cd5cb4f34..7618af8cfda4 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ቅጽበታዊ ገጽ ዕይታን ይሸብልሉ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገጽ ዕይታን አሰናብት"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"የላይኛው ወሰን"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"የታችኛው ወሰን"</string> <string name="screenrecord_name" msgid="2596401223859996572">"የማያ መቅጃ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገጽ ቀረጻን በማሰናዳት ላይ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገጽ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"የእርስዎ አስተዳዳሪ በስራ መገለጫዎ ውስጥ፣ ግን በግል መገለጫዎ ላይ ሳይሆን፣ ትራፊክን የሚቆጣጠር የአውታረ መረብ ምዝግብ ማስታወሻ አብርተዋል።"</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> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index a8faad661acc..67622c7eed7b 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"لقطة شاشة موصولة"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"إغلاق لقطة الشاشة"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"معاينة لقطة الشاشة"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"الحد العلوي"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"الحد السفلي"</string> <string name="screenrecord_name" msgid="2596401223859996572">"مسجّل الشاشة"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"جارٍ معالجة تسجيل الشاشة"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string> @@ -554,6 +556,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"شغَّل المشرف ميزة تسجيل بيانات الشبكة، والتي يتم من خلالها مراقبة حركة البيانات في ملفك الشخصي للعمل ولكن لا تتم مراقبتها في ملفك الشخصي."</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> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 9f7f79e3e8e8..b1b28ad130bd 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"স্ক্ৰীনশ্বট স্ক্ৰ’ল কৰক"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ওপৰৰ সীমাৰেখা"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"তলৰ সীমাৰেখা"</string> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্ৰীন ৰেকৰ্ডাৰ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রীন ৰেকৰ্ডিঙৰ প্ৰক্ৰিয়াকৰণ হৈ আছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীণ ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলত ট্ৰেফিক নিৰীক্ষণ কৰে কিন্তু আপোনাৰ ব্যক্তিগত প্ৰ’ফাইলত নকৰে।"</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> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index d35b81268ea5..fed444b9083f 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Sürüşdürülərək çəkilən skrinşot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Yuxarı hüdud"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Aşağı hüdud"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Yazıcısı"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran çəkilişi emal edilir"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Təşkilat iş profilində sertifikat səlahiyyəti quraşdırdı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Bu cihazda sertifikat səlahiyyəti quraşdırıldı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Admin cihazda şəbəkə ötürülməsinə nəzarət edən şəbəkə qeydlərini aktiv etdi."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Admininiz şəxsi profilinizdəki deyil, iş profilinizdəki trafikə nəzarət edən şəbəkə qeydiyyatını aktiv edib."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşulusunuz."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP_0">%1$s</xliff:g> və <xliff:g id="VPN_APP_1">%2$s</xliff:g> tətbiqlərinə qoşulusunuz."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"İş profili e-poçt, tətbiq və veb saytlar da daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur."</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 1f2d6d712e03..ded8fa591f0b 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pomerajte snimak ekrana"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Donja granica"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađujemo video snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string> @@ -545,6 +547,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizacija je na poslovnom profilu instalirala autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Na ovom uređaju je instaliran autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrator je uključio evidentiranje mreže, koje prati saobraćaj na uređaju."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrator je uključio evidentiranje mreže, koje prati saobraćaj na poslovnom profilu, ali ne i na ličnom profilu."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Povezani ste sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Povezani ste sa aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, koje mogu da nadgledaju aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Poslovni profil je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index bb40c1157530..18756f8c8083 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Здымак экрана з пракруткай"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Адхіліць здымак экрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граніца"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Ніжняя граніца"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запіс экрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Апрацоўваецца запіс экрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string> @@ -548,6 +550,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Ваш адміністратар уключыў вядзенне журнала сеткі, з дапамогай якога адсочваецца трафік у вашым працоўным профілі. Трафік вашага асабістага профілю застаецца недаступным."</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> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 468c57e00763..e1efd3bd3c50 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Екранна снимка с превъртане"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отхвърляне на екранната снимка"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Долна граница"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запис на екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Записът на екрана се обработва"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Администраторът ви е включил функцията за регистриране на мрежовата активност, която следи трафика в служебния ви потребителски профил, но не и в личния."</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> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index fa8db9f95d2b..12f53454c94e 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"স্ক্রিনশট স্ক্রল করুন"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্রিনশট বাতিল করুন"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্রিন রেকর্ডার"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"স্ক্রিন রেকর্ডিং প্রসেস হচ্ছে"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 277ab10091fc..746323386b1c 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pokretni snimak ekrana"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Donja granica"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađivanje snimka ekrana"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string> @@ -545,6 +547,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Vaša organizacija je instalirala CA certifikat na vašem radnom profilu. Vaš saobraćaj preko sigurne mreže može se pratiti."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"CA certifikat je instaliran na ovom uređaju. Vaš saobraćaj preko sigurne mreže može se pratiti."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Vaš administrator je uključio zapisivanje na mreži, čime se prati saobraćaj na vašem uređaju."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrator je uključio zapisivanje na mreži, čime se nadzire saobraćaj na vašem radnom profilu, ali ne i na ličnom profilu."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može pratiti vašu aktivnost na mreži, uključujući e-poštu i web lokacije."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Povezani ste s aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g> koje mogu pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web lokacije."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Vaš radni profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke i web lokacije."</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index dbcd0c2e705c..524bb6258774 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Captura de pantalla lliscant"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora la captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Marge superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Marge inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravació de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processant gravació de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"La teva organització ha instal·lat una autoritat de certificació al teu perfil de treball. És possible que el trànsit de xarxa segura se supervisi o es modifiqui."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"S\'ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit de xarxa segura se supervisi o es modifiqui."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"L\'administrador ha activat el registre de xarxa, que monitora el trànsit al teu perfil de treball, però no al personal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Estàs connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Estàs connectat a <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que poden supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"El teu perfil de treball està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 352c5d417d34..47a673dd4c42 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Posunout snímek obrazovky"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavřít snímek obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Horní hranice"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Dolní hranice"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Záznam obrazovky se zpracovává"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string> @@ -548,6 +550,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizace do vašeho pracovního profilu nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"V zařízení je nainstalována certifikační autorita. Zabezpečený síťový provoz může být sledován nebo upravován."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrátor zapnul protokolování sítě, které monitoruje síťový provoz v zařízení."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrátor zapnul protokolování sítě, které monitoruje síťový provoz ve vašem pracovním profilu (ale ne v osobním)."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Jste připojeni k aplikaci <xliff:g id="VPN_APP">%1$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Jste připojeni k aplikacím <xliff:g id="VPN_APP_0">%1$s</xliff:g> a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, které mohou sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Váš pracovní profil je připojen k aplikaci <xliff:g id="VPN_APP">%1$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 60b20bc67003..e12b91c13ec7 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Rul screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Luk screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Øverste kant"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Nederste kant"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skærmoptagelse"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skærmoptagelse"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Din organisation har installeret et nøglecenter på din arbejdsprofil. Din sikre netværkstrafik kan overvåges eller ændres."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Der er installeret et nøglecenter på denne enhed. Din sikre netværkstrafik kan overvåges eller ændres."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Din administrator har aktiveret netværksregistrering, som overvåger trafik på din enhed."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Din administrator har aktiveret netværkslogging, som overvåger trafik på din arbejdsprofil, men ikke på din personlige profil."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Du har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Du har forbindelse til <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Din arbejdsprofil har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 7c6cdfc82f9b..6a69ed204b0c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Screenshot scrollen"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot schließen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"Bildschirmaufzeichnung"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Bildschirmaufzeichnung…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string> @@ -542,6 +546,8 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Deine Organisation hat ein Zertifikat einer Zertifizierungsstelle in deinem Arbeitsprofil installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Auf dem Gerät ist das Zertifikat einer Zertifizierungsstelle installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Dein Administrator hat die Netzwerkprotokollierung aktiviert. Damit wird der Netzwerkverkehr auf deinem Gerät überwacht."</string> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Du bist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden. Die App kann deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Du bist mit <xliff:g id="VPN_APP_0">%1$s</xliff:g> und <xliff:g id="VPN_APP_1">%2$s</xliff:g> verbunden. Die Apps können deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Dein Arbeitsprofil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden, die deine Netzwerkaktivitäten wie E-Mails, Apps und Websites überwachen kann."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 1094050d1fee..5bed0e5b9ad3 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Στιγμιότυπο κύλισης"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Παράβλεψη στιγμιότυπου οθόνης"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Προεπισκόπηση στιγμιότυπου οθόνης"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ανώτατο όριο"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Κατώτατο όριο"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Εγγραφή οθόνης"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Επεξεργασία εγγραφής οθόνης"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας εγγραφής οθόνης"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Ο διαχειριστής σας έχει ενεργοποιήσει την καταγραφή δικτύου, η οποία παρακολουθεί την επισκεψιμότητα στο προφίλ εργασίας σας, αλλά όχι στο προσωπικό προφίλ σας."</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> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index e971a617e86b..137070fa0437 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Top boundary"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bottom boundary"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Your admin has turned on network logging, which monitors traffic on your device."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index a748ca1b0a01..5df29337493a 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Top boundary"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bottom boundary"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Your admin has turned on network logging, which monitors traffic on your device."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index e971a617e86b..137070fa0437 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Top boundary"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bottom boundary"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Your admin has turned on network logging, which monitors traffic on your device."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index e971a617e86b..137070fa0437 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Top boundary"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bottom boundary"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Your admin has turned on network logging, which monitors traffic on your device."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 02b9b9316a79..46c09f668383 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Top boundary"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bottom boundary"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Your organization installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Your admin has turned on network logging, which monitors traffic on your device."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c090254c43f0..e1ad516254c7 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Desplazar captura de pantalla"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Descartar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Límite superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Límite inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabadora de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Tu organización instaló una autoridad de certificación en tu perfil de trabajo. Es posible que se controle o modifique el tráfico de tu red segura."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Hay una autoridad de certificación instalada en este dispositivo. Es posible que se controle o modifique el tráfico de tu red segura."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Tu administrador activó el registro de red, que supervisa el tráfico en tu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"El administrador activó el registro de red, que supervisa el tráfico de tu perfil de trabajo, pero no el de tu perfil personal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Estás conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar la actividad de tu red, incluidos los correos electrónicos, las apps y los sitios web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Estás conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> y <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que pueden controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 9d4b539cb184..c4b8b24b8e06 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Hacer captura de pantalla continua"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Margen superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Margen inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando grabación de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Tu organización ha instalado una entidad de certificación en tu perfil de trabajo. Es posible que se supervise o se modifique tu tráfico de red seguro."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Se ha instalado una entidad de certificación en este dispositivo. Es posible que se supervise o se modifique tu tráfico de red seguro."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"El administrador ha activado el registro de la red para supervisar el tráfico en tu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Tu administrador ha activado el registro de la red, por lo que se monitorizará el tráfico de tu perfil de trabajo, aunque no el de tu perfil personal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Te has conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Te has conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> y <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que pueden supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 262012a8e665..5402b6185a76 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Ekraanipildi kerimine"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekraanipildist loobumine"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ülempiir"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Alampiir"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekraanisalvesti"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekraanisalvestuse töötlemine"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Teie organisatsioon installis teie tööprofiilile sertifikaadi volituse. Teie turvalist võrguliiklust võidakse jälgida ja muuta."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Sertifikaadi volitus on sellesse seadmesse installitud. Teie turvalist võrguliiklust võidakse jälgida ja muuta."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Teie administraator lülitas sisse võrgu logimise funktsiooni, mis jälgib teie seadmes liiklust."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Teie administraator on sisse lülitanud võrgu logimise funktsiooni, mis jälgib liiklust teie võrguprofiilil, kuid mitte teie isiklikul profiilil."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Teil on ühendus rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Teil on ühendus rakendustega <xliff:g id="VPN_APP_0">%1$s</xliff:g> ja <xliff:g id="VPN_APP_1">%2$s</xliff:g>, mis saavad jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Teie tööprofiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 4356cc0585a8..510e7f93402d 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pantaila-argazki etengabea"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Goiko ertza"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Beheko ertza"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Pantaila-grabagailua"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pantaila-grabaketa prozesatzen"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pantailaren grabaketa-saioaren jakinarazpen jarraitua"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Erakundeak ziurtagiri-emaile bat instalatu dizu laneko profilean. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Ziurtagiri-emaile bat dago instalatuta gailuan. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure laneko profileko trafikoa gainbegira dezake, baina ez zure profil pertsonalekoa."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> eta <xliff:g id="VPN_APP_1">%2$s</xliff:g> aplikazioetara konektatuta zaude, eta haiek sareko jarduerak gainbegira ditzakete, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora dago konektatuta laneko profila, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 8c7b83481fb8..72d7b50ac850 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"نماگرفت پیمایشی"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"رد کردن نماگرفت"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"پیشنمایش نماگرفت"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"مرز بالایی"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"مرز پایینی"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ضبطکننده صفحهنمایش"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"درحال پردازش ضبط صفحهنمایش"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحهنمایش"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"سرپرست شما گزارشگیری شبکه را که بر ترافیک نمایه کاریتان نظارت میکند، اما بر ترافیک نمایه شخصیتان نظارت نمیکند روشن کرده است."</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> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 5a994ee7843f..457d765f641d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Vieritä kuvakaappausta"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hylkää kuvakaappaus"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Yläraja"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Alaraja"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Näytön tallentaja"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Näytön tallennusta käsitellään"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string> @@ -441,7 +443,7 @@ <string name="notification_tap_again" msgid="4477318164947497249">"Avaa napauttamalla uudelleen"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"Avaa pyyhkäisemällä ylös"</string> <string name="keyguard_retry" msgid="886802522584053523">"Yritä uudelleen pyyhkäisemällä ylös"</string> - <string name="require_unlock_for_nfc" msgid="1305686454823018831">"Avaa lukitus käyttääksesi NFC:tä"</string> + <string name="require_unlock_for_nfc" msgid="1305686454823018831">"Avaa lukitus, jotta voit käyttää NFC:tä"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"Organisaatiosi omistaa tämän laitteen"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> omistaa tämän laitteen"</string> <string name="phone_hint" msgid="6682125338461375925">"Avaa puhelu pyyhkäisemällä."</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisaatiosi lisäsi työprofiiliin varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Laitteeseen on asennettu varmenteen myöntäjä. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen, joka valvoo laitteellasi tapahtuvaa liikennettä."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen. Sen avulla seurataan liikennettä työprofiilissasi mutta ei henkilökohtaisessa profiilissasi."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Olet yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Olet yhteydessä sovelluksiin <xliff:g id="VPN_APP_0">%1$s</xliff:g> ja <xliff:g id="VPN_APP_1">%2$s</xliff:g>, jotka voivat valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Työprofiilisi on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa toimintaasi verkossa, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 0882e48dedd5..3c4a91085fb3 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Faire défiler la capture d\'écran"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite supérieure"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inférieure"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Trait. de l\'enregist. d\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic dans votre profil professionnel, mais pas dans votre profil personnel."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Vous êtes connecté à <xliff:g id="VPN_APP_0">%1$s</xliff:g> et à <xliff:g id="VPN_APP_1">%2$s</xliff:g>, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux courriels, aux applications et aux sites Web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 45f5de76df08..629cbbabbba3 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Faire défiler la capture d\'écran"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite supérieure"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inférieure"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Enregistrement de l\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Votre administrateur a activé la journalisation du réseau, pour contrôler le trafic sur votre appareil."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic de votre profil professionnel, mais pas celui de votre profil personnel."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Vous êtes connecté à <xliff:g id="VPN_APP_0">%1$s</xliff:g> et à <xliff:g id="VPN_APP_1">%2$s</xliff:g>, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 20f5732e5559..9383fb6328ce 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Realizar unha captura de pantalla continua"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar a captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Bordo superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Bordo inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravadora da pantalla"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Procesando gravación pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación en curso sobre unha sesión de gravación de pantalla"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"A túa organización instalou unha autoridade de certificación no teu perfil de traballo. É posible que se controle ou se modifique o teu tráfico de rede segura."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Este dispositivo ten unha autoridade de certificación instalada. É posible que se controle ou se modifique o teu tráfico de rede segura."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"O administrador activou o rexistro na rede, que controla o tráfico do teu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"O administrador activou o rexistro na rede, que supervisa o tráfico do teu perfil de traballo, pero non o do perfil persoal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Estás conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Estás conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que poden controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"O teu perfil de traballo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index bac934488564..be62a2943491 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"સ્ક્રીનશૉટ પર સ્ક્રોલ કરો"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"સ્ક્રીનશૉટ છોડી દો"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"સ્ક્રીન રેકૉર્ડર"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"સ્ક્રીન રેકૉર્ડિંગ ચાલુ છે"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 0c1b3041b1cb..b487689c86c6 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"स्क्रीनशॉट को स्क्रोल करें"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"स्क्रीनशाॉट की ऊपर की सीमा"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"स्क्रीनशॉट की नीचे की सीमा"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रिकॉर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रिकॉर्डिंग को प्रोसेस किया जा रहा है"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string> @@ -443,7 +445,7 @@ <string name="notification_tap_again" msgid="4477318164947497249">"खोलने के लिए फिर से टैप करें"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"खोलने के लिए ऊपर स्वाइप करें"</string> <string name="keyguard_retry" msgid="886802522584053523">"फिर से कोशिश करने के लिए ऊपर की ओर स्वाइप करें"</string> - <string name="require_unlock_for_nfc" msgid="1305686454823018831">"एनएफ़सी इस्तेमाल करने के लिए, स्क्रीन को अनलॉक करें"</string> + <string name="require_unlock_for_nfc" msgid="1305686454823018831">"एनएफ़सी इस्तेमाल करने के लिए स्क्रीन को अनलॉक करें"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"इस डिवाइस का मालिकाना हक आपके संगठन के पास है"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"इस डिवाइस का मालिकाना हक <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> के पास है"</string> <string name="phone_hint" msgid="6682125338461375925">"फ़ोन के लिए आइकॉन से स्वाइप करें"</string> @@ -544,6 +546,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"आपके एडमिन ने नेटवर्क लॉगिंग की सुविधा चालू कर दी है, जिससे आपकी वर्क प्रोफ़ाइल पर आने वाले ट्रैफ़िक की निगरानी की जाती है. हालांकि, इससे आपकी निजी प्रोफ़ाइल की निगरानी नहीं की जाती."</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> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index a74d4dcc8a9a..8f3d7c03be75 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Pomicanje snimke zaslona"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacivanje snimke zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimke zaslona"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Gornja granica"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Donja granica"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač zaslona"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string> @@ -545,6 +547,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Vaša je organizacija instalirala izdavač certifikata na vašem radnom profilu. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Na ovom je uređaju instaliran izdavač certifikata. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrator je uključio mrežni zapisnik koji nadzire promet na vašem uređaju."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrator je uključio mrežni zapisnik koji prati promet na vašem poslovnom profilu, ali ne i na osobnom profilu."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Povezani ste s aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g> koje mogu nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Vaš je radni profil povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije."</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 990284bdbb07..4fda6679e2d9 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Görgethető képernyőkép"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Képernyőkép elvetése"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Felső határ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Alsó határ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Képernyőrögzítő"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Képernyőrögzítés feldolgozása"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Szervezete tanúsítványkibocsátót telepített a munkaprofilba. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Az eszközre tanúsítványkibocsátó van telepítve. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"A rendszergazda bekapcsolta az eszköz forgalmát figyelő hálózati naplózást."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"A rendszergazda bekapcsolta a hálózati naplózást, amely a munkaprofilban figyeli a forgalmat, a személyes profilban azonban nem."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Ön kapcsolódik a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Ön csatlakozik a(z) <xliff:g id="VPN_APP_0">%1$s</xliff:g> és a(z) <xliff:g id="VPN_APP_1">%2$s</xliff:g> alkalmazásokhoz, amelyek figyelhetik hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Munkaprofilja csatlakozik a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, az alkalmazásokat és a webhelyeket."</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index c719768fe21b..f0c1f21b505e 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Ոլորել սքրինշոթը"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Փակել սքրինշոթը"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Վերևի սահմանագիծ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Ներքևի սահմանագիծ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Էկրանի տեսագրիչ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Էկրանի տեսագրության մշակում"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր աշխատանքային պրոֆիլի թրաֆիկը (այլ ոչ անձնական պրոֆիլը)։"</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> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 8649c8fde985..71ff39c12c8d 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Men-scroll screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Menutup screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Batas atas"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Batas bawah"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perekam Layar"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses perekaman layar"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisasi Anda menginstal otoritas sertifikat di profil kerja. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Otoritas sertifikat diinstal di perangkat. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Admin telah mengaktifkan pencatatan jaringan, yang memantau traffic di perangkat."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Admin telah mengaktifkan logging jaringan, yang memantau traffic di profil kerja, tetapi tidak di profil pribadi."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Anda tersambung ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profil kerja Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index eebba455d27c..482338ad3090 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Flettiskjáskot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Loka skjámynd"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Efri mörk"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Neðri mörk"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjáupptaka"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Vinnur úr skjáupptöku"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Fyrirtækið þitt setti upp CA-vottorð á vinnusniðinu þínu. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"CA-vottorð er uppsett á þessu tæki. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Kerfisstjóri hefur kveikt á eftirliti netkerfa, sem fylgist með netumferð á tækinu þínu."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Stjórnandinn kveikti á eftirliti netkerfa sem fylgist með netumferð á vinnusniðinu þínu en ekki á eigin sniði."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Þú ert með tengingu við <xliff:g id="VPN_APP">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Þú ert með tengingu við <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, sem geta fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Vinnusniðið þitt er tengt <xliff:g id="VPN_APP">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index a40110e97c83..0896d0c5f9de 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Scorri screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superiore"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inferiore"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Registrazione dello schermo"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Elaboraz. registraz. schermo"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"La tua organizzazione ha installato un\'autorità di certificazione nel tuo profilo di lavoro. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Sul dispositivo è installata un\'autorità di certificazione. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico sul dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico nel profilo di lavoro, ma non nel profilo personale."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Sei connesso a <xliff:g id="VPN_APP">%1$s</xliff:g>, che consente di monitorare le attività di rete, inclusi siti web, email e app."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Sei connesso a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, che consentono di monitorare le attività di rete, inclusi siti web, email e app."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Il tuo profilo di lavoro è collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app."</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1c5603e7be6b..e304dbe66c7a 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"צילום מסך נגלל"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"סגירת צילום מסך"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"מקליט המסך"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"מתבצע עיבוד של הקלטת מסך"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string> @@ -445,7 +449,7 @@ <string name="notification_tap_again" msgid="4477318164947497249">"הקש שוב כדי לפתוח"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"צריך להחליק כדי לפתוח"</string> <string name="keyguard_retry" msgid="886802522584053523">"יש להחליק למעלה כדי לנסות שוב"</string> - <string name="require_unlock_for_nfc" msgid="1305686454823018831">"יש לבטל נעילה כדי להשתמש ב-NFC"</string> + <string name="require_unlock_for_nfc" msgid="1305686454823018831">"יש לבטל את הנעילה כדי להשתמש ב-NFC"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"המכשיר הזה שייך לארגון שלך"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"המכשיר הזה שייך לארגון <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="6682125338461375925">"החלק מהסמל כדי להפעיל את הטלפון"</string> @@ -548,6 +552,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index d12dfe27300b..05b1f7679e59 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"スクリーンショットをスクロールします"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"スクリーンショットを閉じます"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"上部境界"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"下部境界"</string> <string name="screenrecord_name" msgid="2596401223859996572">"スクリーン レコーダー"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"画面の録画を処理しています"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"管理者がネットワーク ログを有効にしているため、仕事用プロファイルのトラフィックは監視されています(個人用プロファイルは対象外)。"</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> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 1823d6740924..5404e67a927b 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ეკრანის ანაბეჭდში გადაადგილება"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ეკრანის ანაბეჭდის დახურვა"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ეკრანის ანაბეჭდის გადახედვა"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ზედა საზღვარი"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"ქვედა საზღვარი"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ეკრანის ჩამწერი"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ეკრანის ჩანაწერი მუშავდება"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"უწყვეტი შეტყობინება ეკრანის ჩაწერის სესიისთვის"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"თქვენმა ადმინისტრატორმა ქსელის ჟურნალირება ჩართო, რომელიც ახორციელებს თქვენი სამსახურის პროფილის, მაგრამ არა პირადი პროფილის, ტრაფიკის მონიტორინგს."</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> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index a77d48a91455..21c62018bef1 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Скриншотты айналдыру"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотты жабу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Жоғарғы шектік сызық"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Төменгі шектік сызық"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Экран жазғыш"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экран жазғыш бейнесін өңдеу"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Әкімші жеке профильдегі емес, жұмыс профиліндегі трафикті қадағалау үшін желі журналын жүргізуді қосып қойған."</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> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 0020d1c5383d..567bfa87c316 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"មុខងារថតរូបថតអេក្រង់រំកិល"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ច្រានចោលរូបថតអេក្រង់"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើលរូបថតអេក្រង់សាកល្បង"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"បន្ទាត់បែងចែកខាងលើ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"បន្ទាត់បែងចែកខាងក្រោម"</string> <string name="screenrecord_name" msgid="2596401223859996572">"មុខងារថតអេក្រង់"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"កំពុងដំណើរការការថតអេក្រង់"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹងដែលកំពុងដំណើរការសម្រាប់រយៈពេលប្រើការថតសកម្មភាពអេក្រង់"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"អ្នកគ្រប់គ្រងរបស់អ្នកបានបើកការធ្វើកំណត់ហេតុបណ្តាញ ដែលតាមដានចរាចរណ៍នៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក ប៉ុន្តែមិនតាមដាននៅក្នុងកម្រងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកឡើយ។"</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> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f799504221e2..e0ea3c223819 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್ಶಾಟ್ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ಮೇಲಿನ ಗಡಿರೇಖೆ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"ಕೆಳಗಿನ ಗಡಿರೇಖೆ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡರ್"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಆಗುತ್ತಿದೆ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಅಧಿಸೂಚನೆ"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನೆಟ್ವರ್ಕ್ ಲಾಗಿಂಗ್ ಆನ್ ಮಾಡಿದ್ದಾರೆ, ಅದು ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ನಲ್ಲಿ ಇರುವ ಟ್ರಾಫಿಕ್ ಮೇಲೆ ನಿಗಾ ಇರಿಸುತ್ತದೆ ಆದರೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ಇರುವ ಟ್ರಾಫಿಕ್ ಮೇಲೆ ಅಲ್ಲ."</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> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e7b99747b361..64e4a69d1db3 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"스크롤 스크린샷"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"스크린샷 닫기"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"상단 경계"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"하단 경계"</string> <string name="screenrecord_name" msgid="2596401223859996572">"화면 녹화"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"화면 녹화 처리 중"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"관리자가 직장 프로필에서 발생하는 트래픽을 모니터링하는 네트워크 로깅을 사용 설정했습니다. 하지만 개인 프로필은 모니터링되지 않습니다."</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> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 568ced733951..ecbcd55ad962 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Скриншотту сыдырып кароо"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотту четке кагуу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Жогорку чеги"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Баскычтын чеги"</string> <string name="screenrecord_name" msgid="2596401223859996572">"экрандан видео жаздырып алуу"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Экрандан жаздырылып алынган видео иштетилүүдө"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> @@ -443,7 +445,7 @@ <string name="notification_tap_again" msgid="4477318164947497249">"Ачуу үчүн кайра таптап коюңуз"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"Ачуу үчүн өйдө сүрүңүз"</string> <string name="keyguard_retry" msgid="886802522584053523">"Кайталоо үчүн экранды өйдө сүрүңүз"</string> - <string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC технологиясын колдонуу үчүн кулпуcун ачыңыз"</string> + <string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC колдонуу үчүн түзмөктүн кулпусун ачыңыз"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"Бул түзмөк уюмуңузга таандык"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"Бул түзмөк төмөнкүгө таандык: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="6682125338461375925">"Сүрөтчөнү сүрүп телефонго өтүңүз"</string> @@ -544,6 +546,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Администраторуңуз жумуш профилиндеги трафикти көзөмөлдөгөн тармакка кирүүнү күйгүздү. Буга жеке профилиңиз кирбейт."</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> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index f4eb2057f0f3..98a75c28ca8a 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ເລື່ອນຮູບໜ້າຈໍ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ປິດຮູບໜ້າຈໍ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ຕົວຢ່າງຮູບໜ້າຈໍ"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ຂອບເຂດທາງເທິງ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"ຂອບເຂດທາງລຸ່ມ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ໂປຣແກຣມບັນທຶກໜ້າຈໍ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ກຳລັງປະມວນຜົນການບັນທຶກໜ້າຈໍ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ການແຈ້ງເຕືອນສຳລັບເຊດຊັນການບັນທຶກໜ້າຈໍໃດໜຶ່ງ"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"ຜູ້ເບິ່ງແຍງຂອງທ່ານໄດ້ເປີດໃຊ້ການບັນທຶກເຄືອຂ່າຍໄວ້, ເຊິ່ງຈະຕິດຕາມທຣາບຟິກໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ ແຕ່ຈະບໍ່ຕິດຕາມໃນໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານ."</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> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index b4a5b88c5b56..f4a2a0d6cc75 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Viso puslapio ekrano kopija"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Praleisti ekrano kopiją"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Viršutinė riba"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Apatinė riba"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrano vaizdo įrašytuvas"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Apdorojam. ekrano vaizdo įraš."</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string> @@ -548,6 +550,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Jūsų organizacija įdiegė darbo profilyje sertifikato įgaliojimą. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Šiame įrenginyje įdiegtas sertifikato įgaliojimas. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų įrenginyje."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų darbo, bet ne asmeniniame profilyje."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Esate prisijungę prie programos „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Esate prisijungę prie programų „<xliff:g id="VPN_APP_0">%1$s</xliff:g>“ ir „<xliff:g id="VPN_APP_1">%2$s</xliff:g>“, kurios gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Darbo profilis susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index a449bf241103..caca22cc5aba 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Ritināt ekrānuzņēmumu"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Nerādīt ekrānuzņēmumu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Augšējā robeža"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Apakšējā robeža"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrāna ierakstītājs"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekrāna ieraksta apstrāde"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string> @@ -545,6 +547,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Jūsu organizācija instalēja sertifikātu jūsu darba profilā. Jūsu drošā tīkla datplūsma var tikt uzraudzīta."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Šajā ierīcē ir instalēts sertifikāts. Drošā tīkla datplūsma var tikt uzraudzīta."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrators ieslēdza tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu ierīcē."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrators ir ieslēdzis tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu darba profilā, bet ne personīgajā profilā."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Ir izveidots savienojums ar lietotnēm <xliff:g id="VPN_APP_0">%1$s</xliff:g> un <xliff:g id="VPN_APP_1">%2$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Jūsu darba profilam ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes."</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 30e8be1abfa1..b3b4a4531d9e 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Континуирана слика од екранот"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отфрлете ја сликата од екранот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горна граница"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Долна граница"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач на екран"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Се обработува снимка од екран"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Вашиот администратор вклучил мрежна евиденција, што подразбира следење на сообраќајот во работниот, но не и во личниот профил."</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> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 46c77856fa12..420de5bbcb79 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"സ്ക്രീൻഷോട്ട് സ്ക്രോൾ ചെയ്യുക"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"സ്ക്രീൻഷോട്ട് പ്രിവ്യു"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"സ്ക്രീൻ റെക്കോർഡർ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"സ്ക്രീൻ റെക്കോർഡിംഗ് പ്രോസസുചെയ്യുന്നു"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0270e9f09972..63547d59b931 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Бүхэлд нь багтаасан дэлгэцийн агшин"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Дэлгэцийн агшныг хаах"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Дээд талын хязгаар"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Доод талын хязгаар"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Дэлгэцийн үйлдэл бичигч"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Дэлгэц бичлэг боловсруулж байна"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Таны админ ажлын профайлын тань ачааллыг хянадаг сүлжээний логийг асаасан бөгөөд энэ нь хувийн профайлын ачааллыг хянахгүй."</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> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 56e687f7bc08..de0e7becde88 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"स्क्रीनशॉटवर स्क्रोल करा"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रेकॉर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रेकॉर्डिंग प्रोसेस सुरू"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index f50ca8bba6e8..319dbde2be5f 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Penatalan tangkapan skrin"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ketepikan tangkapan skrin"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Sempadan atas"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Sempadan bawah"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perakam Skrin"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses rakaman skrin"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisasi anda memasang sijil kuasa dalam profil kerja anda. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Sijil kuasa dipasang pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik pada peranti anda."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik dalam profil kerja anda tetapi bukan dalam profil peribadi anda."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Anda dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Anda dihubungkan ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profil kerja anda dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 12a9022ac375..15ddf599d788 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ဖန်သားပြင်ဓာတ်ပုံကို လှိမ့်ရန်"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ဖန်သားပြင်ဓာတ်ပုံကို ပယ်သည်"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ထိပ်ပိုင်းအနားသတ်"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"အောက်ခြေအနားသတ်"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ဖန်သားပြင် ရိုက်ကူးမှု"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ဖန်သားပြင်ရိုက်ကူးနေသည်"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"သင်၏စီမံခန့်ခွဲသူက ကွန်ရက်မှတ်တမ်းတင်ခြင်းကို ဖွင့်လိုက်သည်။ ၎င်းသည် သင့်အလုပ်ပရိုဖိုင်ရှိ ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်သော်လည်း ကိုယ်ပိုင်ပရိုဖိုင်တွင် မစောင့်ကြည့်ပါ။"</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> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index a4755b8a4f14..1c2fa8a68b11 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Rull skjermdumpen"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Avvis skjermdumpen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Øvre grense"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Nedre grense"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjermopptaker"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandler skjermopptaket"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisasjonen din installerte en sertifiseringsinstans i jobbprofilen din. Den sikre nettverkstrafikken din kan overvåkes eller endres."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"En sertifiseringsinstans er installert på denne enheten. Den sikre nettverkstrafikken din kan overvåkes eller endres."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratoren din har slått på loggføring av nettverk, som overvåker trafikken på enheten din."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratoren din har slått på loggføring av nettverk, som overvåker trafikken i jobbprofilen din, men ikke i den personlige profilen din."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Du er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Du er koblet til <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Jobbprofilen din er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-poster, apper og nettsteder."</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 761f40392e04..3ab0136f4d77 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"स्क्रिनसट स्क्रोल गर्नुहोस्"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 83ce30d111c7..dcadbf58330f 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Screenshot scrollen"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot sluiten"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Voorbeeld van screenshot"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Bovengrens"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Ondergrens"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Schermopname"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Schermopname verwerken"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Je organisatie heeft een certificeringsinstantie geïnstalleerd in je werkprofiel. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Er is een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Je beheerder heeft netwerkregistratie ingeschakeld, waarmee het verkeer op je apparaat wordt bijgehouden."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Je beheerder heeft logboekregistratie voor het netwerk aangezet. Hiermee wordt verkeer in je werkprofiel bijgehouden, maar niet in je persoonlijke profiel."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Je bent verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Je bent verbonden met <xliff:g id="VPN_APP_0">%1$s</xliff:g> en <xliff:g id="VPN_APP_1">%2$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Je werkprofiel is verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index ec927da9bcd0..955c08a35922 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ସ୍କ୍ରିନସଟ୍ ସ୍କ୍ରୋଲ୍ କରନ୍ତୁ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ଶୀର୍ଷ ସୀମାରେଖା"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"ନିମ୍ନ ସୀମାରେଖା"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ସ୍କ୍ରିନ୍ ରେକର୍ଡର୍"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ସ୍କ୍ରିନ ରେକର୍ଡିଂର ପ୍ରକ୍ରିୟାକରଣ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"ଆପଣଙ୍କ ଆଡମିନ୍ ନେଟୱାର୍କ ଲଗିଂ ଚାଲୁ କରିଛନ୍ତି, ଯାହା ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲରେ ଟ୍ରାଫିକ୍ ନିରୀକ୍ଷଣ କରେ କିନ୍ତୁ ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲରେ ନୁହେଁ।"</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> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index c87b9af27124..47f56bd7a09d 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰੋ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਜਾਰੀ ਹੈ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 802c11ec9daf..59c9f52c4dc2 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Przewiń zrzut ekranu"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zamknij zrzut ekranu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Przetwarzam nagrywanie ekranu"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> @@ -445,7 +449,7 @@ <string name="notification_tap_again" msgid="4477318164947497249">"Kliknij ponownie, by otworzyć"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"Przesuń w górę, by otworzyć"</string> <string name="keyguard_retry" msgid="886802522584053523">"Przesuń w górę, by spróbować ponownie"</string> - <string name="require_unlock_for_nfc" msgid="1305686454823018831">"Odblokuj, by użyć NFC"</string> + <string name="require_unlock_for_nfc" msgid="1305686454823018831">"Odblokuj, by użyć komunikacji NFC"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"To urządzenie należy do Twojej organizacji"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"Właściciel tego urządzenia: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="6682125338461375925">"Aby włączyć telefon, przesuń palcem od ikony"</string> @@ -548,6 +552,8 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Twoja organizacja zainstalowała urząd certyfikacji w Twoim profilu służbowym. Zabezpieczony ruch w sieci może być monitorowany i zmieniany."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Urząd certyfikacji zainstalowany na tym urządzeniu. Twój zabezpieczony ruch w sieci może być monitorowany i zmieniany."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu."</string> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Łączysz się z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Łączysz się z aplikacjami <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, które mogą monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Twój profil służbowy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 226a6b4e3919..fca802d4d49f 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Captura de tela da página inteira"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu perfil de trabalho, mas não no perfil pessoal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Você está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Você está conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Seu perfil de trabalho está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 70b18ad51524..9b4d45b615fc 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Deslocar captura de ecrã"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar captura de ecrã"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pré-visualização da captura de ecrã"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de ecrã"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"A processar a gravação de ecrã"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação persistente de uma sessão de gravação de ecrã"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"A sua entidade instalou uma autoridade de certificação no seu perfil de trabalho. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Está instalada uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"O gestor ativou os registos de rede, que monitorizam o tráfego no seu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"O seu administrador ativou os registos de rede, que monitorizam o tráfego no seu perfil de trabalho, mas não no seu perfil pessoal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 226a6b4e3919..fca802d4d49f 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Captura de tela da página inteira"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Limite superior"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Limite inferior"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu perfil de trabalho, mas não no perfil pessoal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Você está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Você está conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Seu perfil de trabalho está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index ee66f816982d..3a069210bf5b 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Derulați captura de ecran"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Închideți captura de ecran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Marginea superioară"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Marginea inferioară"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder pentru ecran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Se procesează înregistrarea"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string> @@ -545,6 +547,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizația dvs. a instalat un certificat CA în profilul dvs. de serviciu. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Pe acest dispozitiv este instalat un certificat CA. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratorul a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul în profilul dvs. de serviciu, dar nu și în profilul personal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"V-ați conectat la aplicația <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"V-ați conectat la <xliff:g id="VPN_APP_0">%1$s</xliff:g> și la <xliff:g id="VPN_APP_1">%2$s</xliff:g>, care vă pot monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profilul dvs. de serviciu este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d34702086ed8..a81401a60de9 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Прокрутить скриншот"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрыть скриншот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхняя граница"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Нижняя граница"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запись видео с экрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обработка записи с экрана…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string> @@ -548,6 +550,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Администратор включил ведение сетевого журнала, чтобы отслеживать трафик в вашем рабочем профиле (информация из личного профиля не собирается)."</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> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index bd511e6f92c9..f62eae05e1c0 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"තිර රුව අනුචලනය කරන්න"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"තිර රුව ඉවත ලන්න"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ඉහළම මායිම"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"පහළම මායිම"</string> <string name="screenrecord_name" msgid="2596401223859996572">"තිර රෙකෝඩරය"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"තිර පටිගත කිරීම සකසමින්"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"ඔබගේ පරිපාලක ඔබගේ පුද්ගලික පැතිකඩෙහි නොව කාර්යාල පැතිකඩෙහි තදබදය නිරීක්ෂණය කරන, ජාල පිරීම ක්රියාත්මක කර ඇත."</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> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 1e35446e068f..927b2ac97a20 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Posúvať snímku obrazovky"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavrieť snímku obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Horná hranica"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Dolná hranica"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Spracúva sa záznam obrazovky"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> @@ -548,6 +550,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizácia nainštalovala pre váš pracovný profil certifikačnú autoritu. Zabezpečená sieťová premávka môže byť sledovaná či upravená."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"V tomto zariadení je nainštalovaná certifikačná autorita. Zabezpečená sieťová premávka môže byť sledovaná či upravená."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Správca aktivoval zapisovanie do denníka siete, ktoré sleduje premávku na vašom zariadení."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Správca aktivoval zapisovanie do denníka siete, ktoré sleduje premávku vo vašom pracovnom profile, ale nie osobnom."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Pripojili ste sa k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Pripojili ste sa k aplikáciám <xliff:g id="VPN_APP_0">%1$s</xliff:g> a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ktoré môžu sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Váš pracovný profil je pripojený k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane správ, aplikácií a webových stránok."</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 2192f930d4ee..881ba91d013e 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Drseče pomikanje po posnetku zaslona"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Opusti posnetek zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Predogled posnetka zaslona"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Zgornji rob"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Spodnji rob"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snemalnik zaslona"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obdelava videoposnetka zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Nenehno obveščanje o seji snemanja zaslona"</string> @@ -548,6 +550,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Vaša organizacija je v vaš delovni profil namestila overitelja potrdil. Varni omrežni promet se lahko nadzira ali spreminja."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"V tej napravi je nameščen overitelj potrdil. Varni omrežni promet se lahko nadzira ali spreminja."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Skrbnik je vklopil beleženje omrežnega prometa, ki nadzira promet v napravi."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Skrbnik je vklopil beleženje omrežnega prometa, ki nadzoruje samo promet v delovnem profilu, tistega v osebnem profilu pa ne."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Povezani ste z aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Povezani ste z aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> in <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ki lahko nadzirata omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Delovni profil je povezan z aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 67a2d8b010f1..29d16617571d 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Lëviz në pamjen e ekranit"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Kufiri i sipërm"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Kufiri i poshtëm"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Regjistrimi i ekranit po përpunohet"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organizata jote instaloi një autoritet certifikate në profilin tënd të punës. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Në këtë pajisje është instaluar një autoritet certifikate. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratori ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në pajisjen tënde."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratori yt ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në profilin tënd të punës, por jo në profilin tënd personal."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Je lidhur me aplikacionin <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Je lidhur me aplikacionet <xliff:g id="VPN_APP_0">%1$s</xliff:g> dhe <xliff:g id="VPN_APP_1">%2$s</xliff:g>, të cilat mund të monitorojnë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profili yt i punës është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d28e3cc5d887..c021bfa8502c 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Померајте снимак екрана"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Одбаците снимак екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Горња граница"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Доња граница"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обрађујемо видео снимка екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string> @@ -545,6 +547,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Администратор је укључио евидентирање мреже, које прати саобраћај на пословном профилу, али не и на личном профилу."</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> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 1c878c1b0d32..e38d7cd0a7c3 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Rullande skärmbild"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Stäng skärmbild"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmbild"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Övre gräns"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Nedre gräns"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skärminspelare"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Behandlar skärminspelning"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Organisationen har installerat en certifikatutfärdare i jobbprofilen. Din säkra nätverkstrafik kan övervakas och ändras."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"En certifikatutfärdare är installerad på enheten. Din säkra nätverkstrafik kan övervakas och ändras."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administratören har aktiverat nätverksloggning som övervakar trafik på enheten."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administratören har aktiverat nätverksloggning som övervakar trafik i jobbprofilen men inte den privata profilen."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Du är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Du är ansluten till <xliff:g id="VPN_APP_0">%1$s</xliff:g> och <xliff:g id="VPN_APP_1">%2$s</xliff:g> som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 9582a7ab59ce..a775d1426d97 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Fanya picha ya skrini iwe ndefu"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ondoa picha ya skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Mpaka wa sehemu ya juu"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Mpaka wa sehemu ya chini"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Kinasa Skrini"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Inachakata rekodi ya skrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Shirika lako limesakinisha mamlaka ya cheti katika wasifu wako wa kazini. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Mamlaka ya cheti imesakinishwa kwenye kifaa hiki. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni, ambayo hufuatilia shughuli kwenye kifaa chako."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni ambayo hufuatilia shughuli kwenye wasifu wako wa kazini ila si kwenye wasifu wako wa binafsi."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Umeunganishwa kwenye <xliff:g id="VPN_APP_0">%1$s</xliff:g> na <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ambazo zinaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Wasifu wako wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 0769fafbab74..335a529bb05b 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"ஸ்கிரீன்ஷாட்டைப் பெரிதாக்கும்"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ஸ்கிரீன்ஷாட்டை நிராகரிக்கும்"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"மேற்புற எல்லை"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"கீழ்ப்புற எல்லை"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ஸ்க்ரீன் ரெக்கார்டிங் செயலாக்கப்படுகிறது"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"உங்கள் நிர்வாகி \'நெட்வொர்க் பதிவெடுத்தலை\' இயக்கியுள்ளார், இது உங்கள் பணிக் கணக்கில் டிராஃபிக்கைக் கண்காணிக்கும். ஆனால் தனிப்பட்ட கணக்கில் கண்காணிக்காது."</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> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 81d59dd4cde4..8013d6ef94d0 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"స్క్రీన్షాట్కు స్క్రోల్ చేయండి"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్షాట్ను విస్మరించు"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్షాట్ ప్రివ్యూ"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"స్క్రీన్ రికార్డర్"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"స్క్రీన్ రికార్డింగ్ అవుతోంది"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string> @@ -542,6 +546,8 @@ <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> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <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> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index da8234661455..c55b7f074221 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"เลื่อนจับภาพหน้าจอ"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ปิดภาพหน้าจอ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"ขอบเขตด้านบน"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"ขอบเขตด้านล่าง"</string> <string name="screenrecord_name" msgid="2596401223859996572">"โปรแกรมบันทึกหน้าจอ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"กำลังประมวลผลการอัดหน้าจอ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"ผู้ดูแลระบบได้เปิดการบันทึกเครือข่าย ซึ่งจะตรวจสอบการรับส่งข้อมูลในโปรไฟล์งาน แต่ไม่ตรวจสอบในโปรไฟล์ส่วนตัวของคุณ"</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> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 25eb5af34168..33bd6593e08c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"I-scroll ang screenshot"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"I-dismiss ang screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Pinakamataas na limitasyon"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Pinakamababang limitasyon"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder ng Screen"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pinoproseso screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Nag-install ang iyong organisasyon ng awtoridad sa certificate sa iyong profile sa trabaho. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"May naka-install sa device na ito na isang awtoridad sa certificate. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko sa device mo."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko sa profile mo sa trabaho pero hindi sa iyong personal na profile."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Nakakonekta ka sa <xliff:g id="VPN_APP">%1$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Nakakonekta ka sa <xliff:g id="VPN_APP_0">%1$s</xliff:g> at <xliff:g id="VPN_APP_1">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang iyong profile sa trabaho, na maaaring sumubaybay sa aktibidad sa iyong network, kasama ang mga email, app, at website."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index e30276c9e450..4bacfb9aaee9 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Kayan ekran görüntüsü"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran görüntüsünü kapat"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Üst sınır"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Alt sınır"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Kaydedicisi"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran kaydı işleniyor"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Kuruluşunuz iş profilinize bir sertifika yetkilisi yükledi. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Bu cihazda bir sertifika yetkilisi yüklü. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Yöneticiniz,cihazınızdaki trafiği izleyen ağ günlük kaydını açtı."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Yöneticiniz, iş profilinizdeki trafiği izleyen ancak kişisel profilinizdeki trafiği izlemeyen ağ günlük kaydını açtı."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"E-postalarınız, uygulamalarınız ve web siteleriniz de dahil olmak üzere ağ etkinliğinizi takip edebilen <xliff:g id="VPN_APP">%1$s</xliff:g> ağına bağlısınız."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"E-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="VPN_APP_0">%1$s</xliff:g> ve <xliff:g id="VPN_APP_1">%2$s</xliff:g> uygulamalarına bağlısınız."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"İş profiliniz, e-postalar, uygulamalar ve web siteleri dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı."</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 5a01dc875be1..4a0746cdd140 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Прокрутити знімок екрана"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрити знімок екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Верхня межа"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Нижня межа"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Відеозапис екрана"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обробка записування екрана"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string> @@ -548,6 +550,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"Ваш адміністратор увімкнув реєстрацію в журналі мережі, щоб відстежувати трафік вашого робочого профілю (не особистого)."</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_1">%2$s</xliff:g> та <xliff:g id="VPN_APP_0">%1$s</xliff:g>, які можуть відстежувати вашу активність у мережі, як-от відкривання електронних листів, додатків і веб-сайтів."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Ваш робочий профіль під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index f81d4ca4958c..f2e0273440a5 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"اسکرین شاٹ پر اسکرول کریں"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"اسکرین شاٹ برخاست کریں"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"اسکرین شاٹ کا پیش منظر"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"اوپر کا احاطہ"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"نیچے کا احاطہ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"سکرین ریکارڈر"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"سکرین ریکارڈنگ پروسیس ہورہی ہے"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"آپ کے منتظم نے نیٹ ورک لاگنگ آن کر دی ہے، جو آپ کے ذاتی پروفائل پر نہیں بلکہ دفتری پروفائل پر ٹریفک کو مانیٹر کرتی ہے۔"</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> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index d129baecdce5..fab65b116bda 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -93,6 +93,10 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Skrinshotni aylantirish"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Skrinshotni yopish"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string> + <!-- no translation found for screenshot_top_boundary (1500569103321300856) --> + <skip /> + <!-- no translation found for screenshot_bottom_boundary (5657242629526407311) --> + <skip /> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrandan yozib olish"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran yozib olinmoqda"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> @@ -542,6 +546,8 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Tashkilotingiz ishchi profilingizga CA sertifikatini o‘rnatdi. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Qurilmada CA sertifikati o‘rnatilgan. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrator qurilmangizdagi trafikni nazorat qiluvchi tarmoq jurnalini yoqdi."</string> + <!-- no translation found for monitoring_description_managed_profile_network_logging (6932303843097006037) --> + <skip /> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"<xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> va <xliff:g id="VPN_APP_1">%2$s</xliff:g> ilovalari ishga tushirilgan. Ular tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Ishchi profilingizda tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin bo‘lgan <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7d9c0289e288..366f755638a5 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Cuộn để phóng to ảnh chụp màn hình"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Đóng ảnh chụp màn hình"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Ranh giới trên"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Ranh giới dưới"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Trình ghi màn hình"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Đang xử lý video ghi màn hình"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Tổ chức của bạn đã cài đặt một tổ chức phát hành chứng chỉ trong hồ cơ công việc của bạn. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Một tổ chức phát hành chứng chỉ được cài đặt trên thiết bị này. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Quản trị viên của bạn đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trên thiết bị của bạn."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Quản trị viên của bạn đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trong hồ sơ công việc chứ không giám sát lưu lượng truy cập trong hồ sơ cá nhân của bạn."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Bạn đang kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Bạn đang kết nối với <xliff:g id="VPN_APP_0">%1$s</xliff:g> và <xliff:g id="VPN_APP_1">%2$s</xliff:g>. Các ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Hồ sơ công việc của bạn được kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>, ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web."</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 6a6e8b82a906..c25ad27df294 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"滚动抓取长截图"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"关闭屏幕截图"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"顶部边界"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"底部边界"</string> <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制器"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在处理屏幕录制视频"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"您的管理员已开启网络日志功能,该功能会监控您的工作资料的流量,而不会监控个人资料的流量。"</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> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index d458e6b9eb6c..aa7b47aace89 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"整頁截圖"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"上方邊界"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"下方邊界"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕畫面錄影工具"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"正在處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"您的管理員已開啟網絡記錄功能,可監控您工作設定檔 (而非個人設定檔) 的流量。"</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> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 45ade587cbb1..ca8db2eae5d6 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"以捲動畫面的方式拍攝長截圖"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"頂端邊界"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"底部邊界"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕錄影器"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> @@ -542,6 +544,7 @@ <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_managed_profile_network_logging" msgid="6932303843097006037">"你的管理員已啟用網路記錄功能,可監控你的工作資料夾流量,但不會監控個人資料夾的流量。"</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> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index a0feee6d51d5..371702fb7494 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -93,6 +93,8 @@ <string name="screenshot_scroll_description" msgid="7855773867093272175">"Isithombe seskrini sokuskrola"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cashisa isithombe-skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string> + <string name="screenshot_top_boundary" msgid="1500569103321300856">"Umngcele ophezulu"</string> + <string name="screenshot_bottom_boundary" msgid="5657242629526407311">"Umngcele ophansi"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Irekhoda yesikrini"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Icubungula okokuqopha iskrini"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string> @@ -542,6 +544,7 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Inhlangano yakho ifake ukugunyaza kwesitifiketi kuphrofayela yakho yomsebenzi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashwa noma ilungiswe."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Ukugunyaza kwesitifiketi kufakwe kule divayisi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashelwa noma ilungiswe."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Umlawuli wakho uvule ukungena kwedivayisi yakho, okuqapha ithrafikhi kudivayisi yakho."</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Umlawuli wakho uvule ukungena kwenethiwekhi, okuhlola ithrafikhi kudivayisi yakho yephrofayela yomsebenzi kodwa hhayi kuphrofayela yakho yomuntu siqu."</string> <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Uxhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Uxhumeke ku-<xliff:g id="VPN_APP_0">%1$s</xliff:g> naku-<xliff:g id="VPN_APP_1">%2$s</xliff:g>, okungaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Iphrofayela yakho yomsebenzi ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index a1191aeacdde..6e458681bbab 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -143,6 +143,8 @@ <attr name="handleColor" format="color" /> <attr name="scrimColor" format="color" /> + <attr name="isVertical" format="boolean" /> + <!-- Used display CarrierText in Keyguard or QS Footer --> <declare-styleable name="CarrierText"> <attr name="allCaps" format="boolean" /> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java index ffde84128549..259cca8c01e2 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputChannelCompat.java @@ -16,13 +16,12 @@ package com.android.systemui.shared.system; -import android.os.Bundle; +import android.graphics.Matrix; import android.os.Looper; import android.view.BatchedInputEventReceiver; import android.view.Choreographer; import android.view.InputChannel; import android.view.InputEvent; -import android.view.InputEventSender; import android.view.MotionEvent; /** @@ -53,6 +52,12 @@ public class InputChannelCompat { return target.addBatch(src); } + /** @see MotionEvent#createRotateMatrix */ + public static Matrix createRotationMatrix( + /*@Surface.Rotation*/ int rotation, int displayW, int displayH) { + return MotionEvent.createRotateMatrix(rotation, displayW, displayH); + } + /** * @see BatchedInputEventReceiver */ diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 71ec33e16e0e..a9b4c492e10c 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -16,7 +16,10 @@ package com.android.systemui; +import android.app.WallpaperColors; +import android.graphics.Bitmap; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Handler; import android.os.HandlerThread; import android.os.SystemClock; @@ -26,13 +29,16 @@ import android.util.Log; import android.util.Size; import android.view.SurfaceHolder; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.glwallpaper.EglHelper; -import com.android.systemui.glwallpaper.GLWallpaperRenderer; import com.android.systemui.glwallpaper.ImageWallpaperRenderer; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; import javax.inject.Inject; @@ -45,8 +51,13 @@ public class ImageWallpaper extends WallpaperService { // We delayed destroy render context that subsequent render requests have chance to cancel it. // This is to avoid destroying then recreating render context in a very short time. private static final int DELAY_FINISH_RENDERING = 1000; + private static final @android.annotation.NonNull RectF LOCAL_COLOR_BOUNDS = + new RectF(0, 0, 1, 1); private static final boolean DEBUG = false; + private ArrayList<RectF> mLocalColorsToAdd = new ArrayList<>(); private HandlerThread mWorker; + // scaled down version + private Bitmap mMiniBitmap; @Inject public ImageWallpaper() { @@ -70,6 +81,7 @@ public class ImageWallpaper extends WallpaperService { super.onDestroy(); mWorker.quitSafely(); mWorker = null; + mMiniBitmap = null; } class GLEngine extends Engine { @@ -80,7 +92,7 @@ public class ImageWallpaper extends WallpaperService { @VisibleForTesting static final int MIN_SURFACE_HEIGHT = 64; - private GLWallpaperRenderer mRenderer; + private ImageWallpaperRenderer mRenderer; private EglHelper mEglHelper; private final Runnable mFinishRenderingTask = this::finishRendering; private boolean mNeedRedraw; @@ -101,6 +113,10 @@ public class ImageWallpaper extends WallpaperService { setFixedSizeAllowed(true); setOffsetNotificationsEnabled(false); updateSurfaceSize(); + mMiniBitmap = null; + if (mWorker != null && mWorker.getThreadHandler() != null) { + mWorker.getThreadHandler().post(this::updateMiniBitmap); + } } EglHelper getEglHelperInstance() { @@ -111,6 +127,20 @@ public class ImageWallpaper extends WallpaperService { return new ImageWallpaperRenderer(getDisplayContext()); } + private void updateMiniBitmap() { + mRenderer.useBitmap(b -> { + int size = Math.min(b.getWidth(), b.getHeight()); + float scale = 1.0f; + if (size > MIN_SURFACE_WIDTH) { + scale = (float) MIN_SURFACE_WIDTH / (float) size; + } + mMiniBitmap = Bitmap.createScaledBitmap(b, Math.round(scale * b.getWidth()), + Math.round(scale * b.getHeight()), false); + computeAndNotifyLocalColors(mLocalColorsToAdd, mMiniBitmap); + mLocalColorsToAdd.clear(); + }); + } + private void updateSurfaceSize() { SurfaceHolder holder = getSurfaceHolder(); Size frameSize = mRenderer.reportSurfaceSize(); @@ -126,6 +156,7 @@ public class ImageWallpaper extends WallpaperService { @Override public void onDestroy() { + mMiniBitmap = null; mWorker.getThreadHandler().post(() -> { mRenderer.finish(); mRenderer = null; @@ -135,6 +166,59 @@ public class ImageWallpaper extends WallpaperService { } @Override + public boolean supportsLocalColorExtraction() { + return true; + } + + @Override + public void addLocalColorsAreas(@NonNull List<RectF> regions) { + mWorker.getThreadHandler().post(() -> { + Bitmap bitmap = mMiniBitmap; + if (bitmap == null) { + mLocalColorsToAdd.addAll(regions); + } else { + computeAndNotifyLocalColors(regions, bitmap); + } + }); + } + + private void computeAndNotifyLocalColors(@NonNull List<RectF> regions, Bitmap b) { + List<WallpaperColors> colors = getLocalWallpaperColors(regions, b); + try { + notifyLocalColorsChanged(regions, colors); + } catch (RuntimeException e) { + Log.e(TAG, e.getMessage(), e); + } + } + + @Override + public void removeLocalColorsAreas(@NonNull List<RectF> regions) { + // No-OP + } + + private List<WallpaperColors> getLocalWallpaperColors(@NonNull List<RectF> areas, + Bitmap b) { + List<WallpaperColors> colors = new ArrayList<>(areas.size()); + for (int i = 0; i < areas.size(); i++) { + RectF area = areas.get(i); + if (area == null || !LOCAL_COLOR_BOUNDS.contains(area)) { + colors.add(null); + continue; + } + Rect subImage = new Rect( + Math.round(area.left * b.getWidth()), + Math.round(area.top * b.getHeight()), + Math.round(area.right * b.getWidth()), + Math.round(area.bottom * b.getHeight())); + Bitmap colorImg = Bitmap.createBitmap(b, + subImage.left, subImage.top, subImage.width(), subImage.height()); + WallpaperColors color = WallpaperColors.fromBitmap(colorImg); + colors.add(color); + } + return colors; + } + + @Override public void onSurfaceCreated(SurfaceHolder holder) { if (mWorker == null) return; mWorker.getThreadHandler().post(() -> { diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java index 1a0356c4446d..01a353ce8f1f 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -58,6 +58,14 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer { mWallpaper = new ImageGLWallpaper(mProgram); } + /** + * @hide + * @return + */ + public void useBitmap(Consumer<Bitmap> c) { + mTexture.use(c); + } + @Override public boolean isWcgContent() { return mTexture.isWcgContent(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 1660deabdd72..553623702aed 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -1124,7 +1124,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } // If an incoming call is ringing, HOME is totally disabled. // (The user is already on the InCallUI at this point, - // and his ONLY options are to answer or reject the call.) + // and their ONLY options are to answer or reject the call.) switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mHomeBlockedThisTouch = false; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index c07404c2e34d..8e75bec72c15 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -76,6 +76,7 @@ import com.android.systemui.navigationbar.buttons.ContextualButton; import com.android.systemui.navigationbar.buttons.ContextualButtonGroup; import com.android.systemui.navigationbar.buttons.DeadZone; import com.android.systemui.navigationbar.buttons.KeyButtonDrawable; +import com.android.systemui.navigationbar.buttons.NearestTouchFrame; import com.android.systemui.navigationbar.buttons.RotationContextButton; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.navigationbar.gestural.FloatingRotationButton; @@ -97,6 +98,8 @@ import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.pip.Pip; import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; public class NavigationBarView extends FrameLayout implements @@ -129,6 +132,7 @@ public class NavigationBarView extends FrameLayout implements private final Region mTmpRegion = new Region(); private final int[] mTmpPosition = new int[2]; private Rect mTmpBounds = new Rect(); + private Map<View, Rect> mButtonFullTouchableRegions = new HashMap<>(); private KeyButtonDrawable mBackIcon; private KeyButtonDrawable mHomeDefaultIcon; @@ -973,9 +977,18 @@ public class NavigationBarView extends FrameLayout implements getButtonLocations(true /* includeFloatingRotationButton */, true /* inScreen */)); } + private void updateButtonTouchRegionCache() { + FrameLayout navBarLayout = mIsVertical + ? mNavigationInflaterView.mVertical + : mNavigationInflaterView.mHorizontal; + mButtonFullTouchableRegions = ((NearestTouchFrame) navBarLayout + .findViewById(R.id.nav_buttons)).getFullTouchableChildRegions(); + } + private Region getButtonLocations(boolean includeFloatingRotationButton, boolean inScreenSpace) { mTmpRegion.setEmpty(); + updateButtonTouchRegionCache(); updateButtonLocation(getBackButton(), inScreenSpace); updateButtonLocation(getHomeButton(), inScreenSpace); updateButtonLocation(getRecentsButton(), inScreenSpace); @@ -999,6 +1012,12 @@ public class NavigationBarView extends FrameLayout implements if (view == null || !button.isVisible()) { return; } + // If the button is tappable from perspective of NearestTouchFrame, then we'll + // include the regions where the tap is valid instead of just the button layout location + if (mButtonFullTouchableRegions.containsKey(view)) { + mTmpRegion.op(mButtonFullTouchableRegions.get(view), Op.UNION); + return; + } updateButtonLocation(view, inScreenSpace); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java index 88c8fea085fb..b1c85b5c530e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java @@ -18,8 +18,9 @@ package com.android.systemui.navigationbar.buttons; import android.content.Context; import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Pair; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -27,8 +28,13 @@ import android.widget.FrameLayout; import androidx.annotation.VisibleForTesting; +import com.android.systemui.R; + import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Redirects touches that aren't handled by any child view to the nearest @@ -36,11 +42,32 @@ import java.util.Comparator; */ public class NearestTouchFrame extends FrameLayout { - private final ArrayList<View> mClickableChildren = new ArrayList<>(); + private final List<View> mClickableChildren = new ArrayList<>(); + private final List<View> mAttachedChildren = new ArrayList<>(); private final boolean mIsActive; private final int[] mTmpInt = new int[2]; private final int[] mOffset = new int[2]; + private boolean mIsVertical; private View mTouchingChild; + private final Map<View, Rect> mTouchableRegions = new HashMap<>(); + /** + * Used to sort all child views either by their left position or their top position, + * depending on if this layout is used horizontally or vertically, respectively + */ + private final Comparator<View> mChildRegionComparator = + (view1, view2) -> { + int leftTopIndex = 0; + if (mIsVertical) { + // Compare view bound's "top" values + leftTopIndex = 1; + } + view1.getLocationInWindow(mTmpInt); + int startingCoordView1 = mTmpInt[leftTopIndex] - mOffset[leftTopIndex]; + view2.getLocationInWindow(mTmpInt); + int startingCoordView2 = mTmpInt[leftTopIndex] - mOffset[leftTopIndex]; + + return startingCoordView1 - startingCoordView2; + }; public NearestTouchFrame(Context context, AttributeSet attrs) { this(context, attrs, context.getResources().getConfiguration()); @@ -50,13 +77,20 @@ public class NearestTouchFrame extends FrameLayout { NearestTouchFrame(Context context, AttributeSet attrs, Configuration c) { super(context, attrs); mIsActive = c.smallestScreenWidthDp < 600; + int[] attrsArray = new int[] {R.attr.isVertical}; + TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray); + mIsVertical = ta.getBoolean(0, false); + ta.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mClickableChildren.clear(); + mAttachedChildren.clear(); + mTouchableRegions.clear(); addClickableChildren(this); + cacheClosestChildLocations(); } @Override @@ -65,6 +99,85 @@ public class NearestTouchFrame extends FrameLayout { getLocationInWindow(mOffset); } + /** + * Populates {@link #mTouchableRegions} with the regions where each clickable child is the + * closest for a given point on this layout. + */ + private void cacheClosestChildLocations() { + if (getWidth() == 0 || getHeight() == 0) { + return; + } + + // Sort by either top or left depending on mIsVertical, then take out all children + // that are not attached to window + mClickableChildren.sort(mChildRegionComparator); + mClickableChildren.stream() + .filter(View::isAttachedToWindow) + .forEachOrdered(mAttachedChildren::add); + + // Cache bounds of children + // Mark coordinates where the actual child layout resides in this frame's window + for (int i = 0; i < mAttachedChildren.size(); i++) { + View child = mAttachedChildren.get(i); + if (!child.isAttachedToWindow()) { + continue; + } + Rect childRegion = getChildsBounds(child); + + // We compute closest child from this child to the previous one + if (i == 0) { + // First child, nothing to the left/top of it + if (mIsVertical) { + childRegion.top = 0; + } else { + childRegion.left = 0; + } + mTouchableRegions.put(child, childRegion); + continue; + } + + View previousChild = mAttachedChildren.get(i - 1); + Rect previousChildBounds = mTouchableRegions.get(previousChild); + int midPoint; + if (mIsVertical) { + int distance = childRegion.top - previousChildBounds.bottom; + midPoint = distance / 2; + childRegion.top -= midPoint; + previousChildBounds.bottom += midPoint - ((distance % 2) == 0 ? 1 : 0); + } else { + int distance = childRegion.left - previousChildBounds.right; + midPoint = distance / 2; + childRegion.left -= midPoint; + previousChildBounds.right += midPoint - ((distance % 2) == 0 ? 1 : 0); + } + + if (i == mClickableChildren.size() - 1) { + // Last child, nothing to right/bottom of it + if (mIsVertical) { + childRegion.bottom = getHeight(); + } else { + childRegion.right = getWidth(); + } + } + + mTouchableRegions.put(child, childRegion); + } + } + + @VisibleForTesting + void setIsVertical(boolean isVertical) { + mIsVertical = isVertical; + } + + private Rect getChildsBounds(View child) { + child.getLocationInWindow(mTmpInt); + int left = mTmpInt[0] - mOffset[0]; + int top = mTmpInt[1] - mOffset[1]; + int right = left + child.getWidth(); + int bottom = top + child.getHeight(); + return new Rect(left, top, right, bottom); + } + private void addClickableChildren(ViewGroup group) { final int N = group.getChildCount(); for (int i = 0; i < N; i++) { @@ -77,47 +190,45 @@ public class NearestTouchFrame extends FrameLayout { } } + /** + * @return A Map where the key is the view object of the button and the value + * is the Rect where that button will receive a touch event if pressed. This Rect will + * usually be larger than the layout bounds for the button. + * The Rect is in screen coordinates. + */ + public Map<View, Rect> getFullTouchableChildRegions() { + Map<View, Rect> fullTouchRegions = new HashMap<>(mTouchableRegions.size()); + getLocationOnScreen(mTmpInt); + for (Map.Entry<View, Rect> entry : mTouchableRegions.entrySet()) { + View child = entry.getKey(); + Rect screenRegion = new Rect(entry.getValue()); + screenRegion.offset(mTmpInt[0], mTmpInt[1]); + fullTouchRegions.put(child, screenRegion); + } + return fullTouchRegions; + } + @Override public boolean onTouchEvent(MotionEvent event) { if (mIsActive) { + int x = (int) event.getX(); + int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN) { - mTouchingChild = findNearestChild(event); + mTouchingChild = mClickableChildren + .stream() + .filter(View::isAttachedToWindow) + .filter(view -> mTouchableRegions.get(view).contains(x, y)) + .findFirst() + .orElse(null); + } if (mTouchingChild != null) { - event.offsetLocation(mTouchingChild.getWidth() / 2 - event.getX(), - mTouchingChild.getHeight() / 2 - event.getY()); + event.offsetLocation(mTouchingChild.getWidth() / 2 - x, + mTouchingChild.getHeight() / 2 - y); return mTouchingChild.getVisibility() == VISIBLE && mTouchingChild.dispatchTouchEvent(event); } } return super.onTouchEvent(event); } - - private View findNearestChild(MotionEvent event) { - if (mClickableChildren.isEmpty()) { - return null; - } - return mClickableChildren - .stream() - .filter(View::isAttachedToWindow) - .map(v -> new Pair<>(distance(v, event), v)) - .min(Comparator.comparingInt(f -> f.first)) - .map(data -> data.second) - .orElse(null); - } - - private int distance(View v, MotionEvent event) { - v.getLocationInWindow(mTmpInt); - int left = mTmpInt[0] - mOffset[0]; - int top = mTmpInt[1] - mOffset[1]; - int right = left + v.getWidth(); - int bottom = top + v.getHeight(); - - int x = Math.min(Math.abs(left - (int) event.getX()), - Math.abs((int) event.getX() - right)); - int y = Math.min(Math.abs(top - (int) event.getY()), - Math.abs((int) event.getY() - bottom)); - - return Math.max(x, y); - } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index d7a3537a4a5f..292cc7a7deaa 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -38,6 +38,7 @@ import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.Choreographer; +import android.view.Display; import android.view.ISystemGestureExclusionListener; import android.view.InputDevice; import android.view.InputEvent; @@ -96,6 +97,9 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa static final boolean DEBUG_MISSING_GESTURE = true; static final String DEBUG_MISSING_GESTURE_TAG = "NoBackGesture"; + private static final boolean ENABLE_PER_WINDOW_INPUT_ROTATION = + SystemProperties.getBoolean("persist.debug.per_window_input_rotation", false); + private ISystemGestureExclusionListener mGestureExclusionListener = new ISystemGestureExclusionListener.Stub() { @Override @@ -505,9 +509,19 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa } private void onInputEvent(InputEvent ev) { - if (ev instanceof MotionEvent) { - onMotionEvent((MotionEvent) ev); + if (!(ev instanceof MotionEvent)) return; + MotionEvent event = (MotionEvent) ev; + if (ENABLE_PER_WINDOW_INPUT_ROTATION) { + final Display display = mContext.getDisplay(); + int rotation = display.getRotation(); + if (rotation != Surface.ROTATION_0) { + Point sz = new Point(); + display.getRealSize(sz); + event = MotionEvent.obtain(event); + event.transform(MotionEvent.createRotateMatrix(rotation, sz.x, sz.y)); + } } + onMotionEvent(event); } private void updateMLModelState() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index 0abff77c4e39..946d041bdd93 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -248,15 +248,13 @@ public class InternetTile extends QSTileImpl<SignalState> { + "isTransient = " + isTransient + "," + "statusLabel = " + statusLabel); } - // When airplane mode is enabled, we need to refresh the Internet Tile even if the WiFi - // is not the default network. + mWifiInfo.mEnabled = enabled; if (qsIcon == null) { return; } mWifiInfo.mConnected = qsIcon.visible; mWifiInfo.mWifiSignalIconId = qsIcon.icon; mWifiInfo.mWifiSignalContentDescription = qsIcon.contentDescription; - mWifiInfo.mEnabled = enabled; mWifiInfo.mSsid = description; mWifiInfo.mActivityIn = activityIn; mWifiInfo.mActivityOut = activityOut; @@ -465,14 +463,13 @@ public class InternetTile extends QSTileImpl<SignalState> { } minimalContentDescription.append( mContext.getString(R.string.quick_settings_internet_label)).append(","); - if (state.value) { - if (wifiConnected) { - minimalStateDescription.append(cb.mWifiSignalContentDescription); - minimalContentDescription.append(removeDoubleQuotes(cb.mSsid)); - } else if (!TextUtils.isEmpty(state.secondaryLabel)) { - minimalContentDescription.append(",").append(state.secondaryLabel); - } + if (state.value && wifiConnected) { + minimalStateDescription.append(cb.mWifiSignalContentDescription); + minimalContentDescription.append(removeDoubleQuotes(cb.mSsid)); + } else if (!TextUtils.isEmpty(state.secondaryLabel)) { + minimalContentDescription.append(",").append(state.secondaryLabel); } + state.stateDescription = minimalStateDescription.toString(); state.contentDescription = minimalContentDescription.toString(); state.dualLabelContentDescription = r.getString( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java index edcf6d4eddb3..4b4e51383b7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java @@ -109,10 +109,10 @@ public class AssistantFeedbackController { && newImportance < NotificationManager.IMPORTANCE_DEFAULT) { return STATUS_SILENCED; } else if (oldImportance < newImportance - || ranking.getRankingAdjustment() == ranking.RANKING_PROMOTED) { + || ranking.getRankingAdjustment() == Ranking.RANKING_PROMOTED) { return STATUS_PROMOTED; } else if (oldImportance > newImportance - || ranking.getRankingAdjustment() == ranking.RANKING_DEMOTED) { + || ranking.getRankingAdjustment() == Ranking.RANKING_DEMOTED) { return STATUS_DEMOTED; } else { return STATUS_UNCHANGED; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 845d321416ee..1251b58171da 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -104,7 +104,7 @@ import com.android.systemui.statusbar.notification.stack.SwipeableView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; -import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; import com.android.systemui.wmshell.BubblesManager; import java.io.FileDescriptor; @@ -3196,8 +3196,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView /** * Returns the Smart Suggestions backing the smart suggestion buttons in the notification. */ - public SmartRepliesAndActions getExistingSmartRepliesAndActions() { - return mPrivateLayout.getCurrentSmartRepliesAndActions(); + public InflatedSmartReplyState getExistingSmartReplyState() { + return mPrivateLayout.getCurrentSmartReplyState(); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java index 35f35615e1c1..14683eca5080 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java @@ -16,8 +16,14 @@ package com.android.systemui.statusbar.notification.row; +import static android.service.notification.NotificationAssistantService.FEEDBACK_RATING; + +import static com.android.systemui.statusbar.notification.AssistantFeedbackController.STATUS_ALERTED; +import static com.android.systemui.statusbar.notification.AssistantFeedbackController.STATUS_DEMOTED; +import static com.android.systemui.statusbar.notification.AssistantFeedbackController.STATUS_PROMOTED; +import static com.android.systemui.statusbar.notification.AssistantFeedbackController.STATUS_SILENCED; + import android.annotation.SuppressLint; -import android.app.Notification; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -36,20 +42,17 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.statusbar.IStatusBarService; -import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.statusbar.notification.AssistantFeedbackController; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.logging.NotificationLogger; public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsContent { private static final String TAG = "FeedbackInfo"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final String FEEDBACK_KEY = "feedback_key"; private NotificationGuts mGutsContainer; private NotificationListenerService.Ranking mRanking; @@ -146,15 +149,15 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC sb.append(String.format( "[DEBUG]: oldImportance=%d, newImportance=%d, ranking=%d\n\n", mRanking.getChannel().getImportance(), mRanking.getImportance(), - mRanking.getRankingAdjustment())); + mRanking.getRankingScore())); } - if (status == mFeedbackController.STATUS_ALERTED) { + if (status == STATUS_ALERTED) { sb.append(mContext.getText(R.string.feedback_alerted)); - } else if (status == mFeedbackController.STATUS_SILENCED) { + } else if (status == STATUS_SILENCED) { sb.append(mContext.getText(R.string.feedback_silenced)); - } else if (status == mFeedbackController.STATUS_PROMOTED) { + } else if (status == STATUS_PROMOTED) { sb.append(mContext.getText(R.string.feedback_promoted)); - } else if (status == mFeedbackController.STATUS_DEMOTED) { + } else if (status == STATUS_DEMOTED) { sb.append(mContext.getText(R.string.feedback_demoted)); } sb.append(" "); @@ -182,7 +185,8 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC private void handleFeedback(boolean positive) { Bundle feedback = new Bundle(); - feedback.putBoolean(FEEDBACK_KEY, positive); + feedback.putInt(FEEDBACK_RATING, positive ? 1 : -1); + sendFeedbackToAssistant(feedback); } @@ -191,19 +195,8 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC return; } - //TODO(b/154257994): remove this when feedback apis are in place - final int count = mNotificationEntryManager.getActiveNotificationsCount(); - final int rank = mEntry.getRanking().getRank(); - NotificationVisibility.NotificationLocation location = - NotificationLogger.getNotificationLocation(mEntry); - final NotificationVisibility nv = NotificationVisibility.obtain( - mEntry.getKey(), rank, count, true, location); - Notification.Action action = new Notification.Action.Builder(null, null, - null) - .addExtras(feedback) - .build(); try { - mStatusBarService.onNotificationActionClick(mRanking.getKey(), -1, action, nv, true); + mStatusBarService.onNotificationFeedbackReceived(mRanking.getKey(), feedback); } catch (RemoteException e) { if (DEBUG) { Log.e(TAG, "Failed to send feedback to assistant", e); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index d31c30721c58..fdd8f347c248 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -48,9 +48,9 @@ import com.android.systemui.statusbar.notification.MediaNotificationProcessor; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.phone.StatusBar; -import com.android.systemui.statusbar.policy.InflatedSmartReplies; -import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; -import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflater; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; +import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; +import com.android.systemui.statusbar.policy.SmartReplyStateInflater; import com.android.systemui.util.Assert; import java.util.HashMap; @@ -74,7 +74,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder private final NotifRemoteViewCache mRemoteViewCache; private final ConversationNotificationProcessor mConversationProcessor; private final Executor mBgExecutor; - private final SmartRepliesAndActionsInflater mSmartRepliesAndActionsInflater; + private final SmartReplyStateInflater mSmartReplyStateInflater; @Inject NotificationContentInflater( @@ -83,13 +83,13 @@ public class NotificationContentInflater implements NotificationRowContentBinder ConversationNotificationProcessor conversationProcessor, MediaFeatureFlag mediaFeatureFlag, @Background Executor bgExecutor, - SmartRepliesAndActionsInflater smartRepliesInflater) { + SmartReplyStateInflater smartRepliesInflater) { mRemoteViewCache = remoteViewCache; mRemoteInputManager = remoteInputManager; mConversationProcessor = conversationProcessor; mIsMediaInQS = mediaFeatureFlag.getEnabled(); mBgExecutor = bgExecutor; - mSmartRepliesAndActionsInflater = smartRepliesInflater; + mSmartReplyStateInflater = smartRepliesInflater; } @Override @@ -133,7 +133,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder callback, mRemoteInputManager.getRemoteViewsOnClickHandler(), mIsMediaInQS, - mSmartRepliesAndActionsInflater); + mSmartReplyStateInflater); if (mInflateSynchronously) { task.onPostExecute(task.doInBackground()); } else { @@ -150,7 +150,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder @InflationFlag int reInflateFlags, Notification.Builder builder, Context packageContext, - SmartRepliesAndActionsInflater smartRepliesInflater) { + SmartReplyStateInflater smartRepliesInflater) { InflationProgress result = createRemoteViews(reInflateFlags, builder, bindParams.isLowPriority, @@ -160,7 +160,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder result = inflateSmartReplyViews(result, reInflateFlags, entry, row.getContext(), packageContext, - row.getExistingSmartRepliesAndActions(), + row.getExistingSmartReplyState(), smartRepliesInflater); apply( @@ -268,15 +268,26 @@ public class NotificationContentInflater implements NotificationRowContentBinder NotificationEntry entry, Context context, Context packageContext, - SmartRepliesAndActions previousSmartRepliesAndActions, - SmartRepliesAndActionsInflater inflater) { - if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 && result.newExpandedView != null) { - result.expandedInflatedSmartReplies = inflater.inflateSmartReplies( - context, packageContext, entry, previousSmartRepliesAndActions); - } - if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 && result.newHeadsUpView != null) { - result.headsUpInflatedSmartReplies = inflater.inflateSmartReplies( - context, packageContext, entry, previousSmartRepliesAndActions); + InflatedSmartReplyState previousSmartReplyState, + SmartReplyStateInflater inflater) { + boolean inflateContracted = (reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0 + && result.newContentView != null; + boolean inflateExpanded = (reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 + && result.newExpandedView != null; + boolean inflateHeadsUp = (reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 + && result.newHeadsUpView != null; + if (inflateContracted || inflateExpanded || inflateHeadsUp) { + result.inflatedSmartReplyState = inflater.inflateSmartReplyState(entry); + } + if (inflateExpanded) { + result.expandedInflatedSmartReplies = inflater.inflateSmartReplyViewHolder( + context, packageContext, entry, previousSmartReplyState, + result.inflatedSmartReplyState); + } + if (inflateHeadsUp) { + result.headsUpInflatedSmartReplies = inflater.inflateSmartReplyViewHolder( + context, packageContext, entry, previousSmartReplyState, + result.inflatedSmartReplyState); } return result; } @@ -566,6 +577,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder NotificationContentView privateLayout = row.getPrivateLayout(); NotificationContentView publicLayout = row.getPublicLayout(); if (runningInflations.isEmpty()) { + boolean setRepliesAndActions = true; if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) { if (result.inflatedContentView != null) { // New view case @@ -578,6 +590,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder remoteViewCache.putCachedView(entry, FLAG_CONTENT_VIEW_CONTRACTED, result.newContentView); } + setRepliesAndActions = true; } if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0) { @@ -599,6 +612,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder privateLayout.setExpandedInflatedSmartReplies(null); } row.setExpandable(result.newExpandedView != null); + setRepliesAndActions = true; } if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0) { @@ -619,6 +633,10 @@ public class NotificationContentInflater implements NotificationRowContentBinder } else { privateLayout.setHeadsUpInflatedSmartReplies(null); } + setRepliesAndActions = true; + } + if (setRepliesAndActions) { + privateLayout.setInflatedSmartReplyState(result.inflatedSmartReplyState); } if ((reInflateFlags & FLAG_CONTENT_VIEW_PUBLIC) != 0) { @@ -709,7 +727,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder private CancellationSignal mCancellationSignal; private final ConversationNotificationProcessor mConversationProcessor; private final boolean mIsMediaInQS; - private final SmartRepliesAndActionsInflater mSmartRepliesInflater; + private final SmartReplyStateInflater mSmartRepliesInflater; private AsyncInflationTask( Executor bgExecutor, @@ -725,7 +743,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder InflationCallback callback, RemoteViews.InteractionHandler remoteViewClickHandler, boolean isMediaFlagEnabled, - SmartRepliesAndActionsInflater smartRepliesInflater) { + SmartReplyStateInflater smartRepliesInflater) { mEntry = entry; mRow = row; mBgExecutor = bgExecutor; @@ -776,15 +794,14 @@ public class NotificationContentInflater implements NotificationRowContentBinder InflationProgress inflationProgress = createRemoteViews(mReInflateFlags, recoveredBuilder, mIsLowPriority, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, packageContext); - SmartRepliesAndActions repliesAndActions = - mRow.getExistingSmartRepliesAndActions(); + InflatedSmartReplyState previousSmartReplyState = mRow.getExistingSmartReplyState(); return inflateSmartReplyViews( inflationProgress, mReInflateFlags, mEntry, mContext, packageContext, - repliesAndActions, + previousSmartReplyState, mSmartRepliesInflater); } catch (Exception e) { mError = e; @@ -879,8 +896,9 @@ public class NotificationContentInflater implements NotificationRowContentBinder private CharSequence headsUpStatusBarText; private CharSequence headsUpStatusBarTextPublic; - private InflatedSmartReplies expandedInflatedSmartReplies; - private InflatedSmartReplies headsUpInflatedSmartReplies; + private InflatedSmartReplyState inflatedSmartReplyState; + private InflatedSmartReplyViewHolder expandedInflatedSmartReplies; + private InflatedSmartReplyViewHolder headsUpInflatedSmartReplies; } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index d2774df330da..f427ba958b8f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -58,16 +58,18 @@ import com.android.systemui.statusbar.notification.collection.render.GroupMember import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier; import com.android.systemui.statusbar.notification.row.wrapper.NotificationCustomViewWrapper; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; -import com.android.systemui.statusbar.policy.InflatedSmartReplies; -import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; +import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; import com.android.systemui.statusbar.policy.RemoteInputView; -import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflaterKt; import com.android.systemui.statusbar.policy.SmartReplyConstants; +import com.android.systemui.statusbar.policy.SmartReplyStateInflaterKt; import com.android.systemui.statusbar.policy.SmartReplyView; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * A frame layout containing the actual payload of the notification, including the contracted, @@ -106,9 +108,9 @@ public class NotificationContentView extends FrameLayout { private SmartReplyView mExpandedSmartReplyView; private SmartReplyView mHeadsUpSmartReplyView; private SmartReplyController mSmartReplyController; - private InflatedSmartReplies mExpandedInflatedSmartReplies; - private InflatedSmartReplies mHeadsUpInflatedSmartReplies; - private SmartRepliesAndActions mCurrentSmartRepliesAndActions; + private InflatedSmartReplyViewHolder mExpandedInflatedSmartReplies; + private InflatedSmartReplyViewHolder mHeadsUpInflatedSmartReplies; + private InflatedSmartReplyState mCurrentSmartReplyState; private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; @@ -1189,29 +1191,19 @@ public class NotificationContentView extends FrameLayout { applyRemoteInput(entry, hasFreeformRemoteInput(entry)); - if (mExpandedInflatedSmartReplies == null && mHeadsUpInflatedSmartReplies == null) { + if (mCurrentSmartReplyState == null) { if (DEBUG) { - Log.d(TAG, "Both expanded, and heads-up InflatedSmartReplies are null, " - + "don't add smart replies."); + Log.d(TAG, "InflatedSmartReplies are null, don't add smart replies."); } return; } - // The inflated smart-reply objects for the expanded view and the heads-up view both contain - // the same SmartRepliesAndActions to avoid discrepancies between the two views. We here - // reuse that object for our local SmartRepliesAndActions to avoid discrepancies between - // this class and the InflatedSmartReplies classes. - mCurrentSmartRepliesAndActions = mExpandedInflatedSmartReplies != null - ? mExpandedInflatedSmartReplies.getSmartRepliesAndActions() - : mHeadsUpInflatedSmartReplies.getSmartRepliesAndActions(); if (DEBUG) { Log.d(TAG, String.format("Adding suggestions for %s, %d actions, and %d replies.", entry.getSbn().getKey(), - mCurrentSmartRepliesAndActions.smartActions == null ? 0 : - mCurrentSmartRepliesAndActions.smartActions.actions.size(), - mCurrentSmartRepliesAndActions.smartReplies == null ? 0 : - mCurrentSmartRepliesAndActions.smartReplies.choices.size())); + mCurrentSmartReplyState.getSmartActionsList().size(), + mCurrentSmartReplyState.getSmartRepliesList().size())); } - applySmartReplyView(mCurrentSmartRepliesAndActions, entry); + applySmartReplyView(mCurrentSmartReplyState, entry); } private void applyRemoteInput(NotificationEntry entry, boolean hasFreeformRemoteInput) { @@ -1415,41 +1407,74 @@ public class NotificationContentView extends FrameLayout { } private void applySmartReplyView( - SmartRepliesAndActions smartRepliesAndActions, + InflatedSmartReplyState state, NotificationEntry entry) { + if (mContractedChild != null) { + applyExternalSmartReplyState(mContractedChild, state); + } if (mExpandedChild != null) { - mExpandedSmartReplyView = applySmartReplyView(mExpandedChild, smartRepliesAndActions, + applyExternalSmartReplyState(mExpandedChild, state); + mExpandedSmartReplyView = applySmartReplyView(mExpandedChild, state, entry, mExpandedInflatedSmartReplies); if (mExpandedSmartReplyView != null) { - if (smartRepliesAndActions.smartReplies != null - || smartRepliesAndActions.smartActions != null) { - int numSmartReplies = smartRepliesAndActions.smartReplies == null - ? 0 : smartRepliesAndActions.smartReplies.choices.size(); - int numSmartActions = smartRepliesAndActions.smartActions == null - ? 0 : smartRepliesAndActions.smartActions.actions.size(); - boolean fromAssistant = smartRepliesAndActions.smartReplies == null - ? smartRepliesAndActions.smartActions.fromAssistant - : smartRepliesAndActions.smartReplies.fromAssistant; - boolean editBeforeSending = smartRepliesAndActions.smartReplies != null + SmartReplyView.SmartReplies smartReplies = state.getSmartReplies(); + SmartReplyView.SmartActions smartActions = state.getSmartActions(); + if (smartReplies != null || smartActions != null) { + int numSmartReplies = smartReplies == null ? 0 : smartReplies.choices.size(); + int numSmartActions = smartActions == null ? 0 : smartActions.actions.size(); + boolean fromAssistant = smartReplies == null + ? smartActions.fromAssistant + : smartReplies.fromAssistant; + boolean editBeforeSending = smartReplies != null && mSmartReplyConstants.getEffectiveEditChoicesBeforeSending( - smartRepliesAndActions.smartReplies.remoteInput - .getEditChoicesBeforeSending()); + smartReplies.remoteInput.getEditChoicesBeforeSending()); mSmartReplyController.smartSuggestionsAdded(entry, numSmartReplies, numSmartActions, fromAssistant, editBeforeSending); } } } - if (mHeadsUpChild != null && mSmartReplyConstants.getShowInHeadsUp()) { - mHeadsUpSmartReplyView = applySmartReplyView(mHeadsUpChild, smartRepliesAndActions, - entry, mHeadsUpInflatedSmartReplies); + if (mHeadsUpChild != null) { + applyExternalSmartReplyState(mHeadsUpChild, state); + if (mSmartReplyConstants.getShowInHeadsUp()) { + mHeadsUpSmartReplyView = applySmartReplyView(mHeadsUpChild, state, + entry, mHeadsUpInflatedSmartReplies); + } + } + } + + private void applyExternalSmartReplyState(View view, InflatedSmartReplyState state) { + boolean hasPhishingAlert = state != null && state.getHasPhishingAction(); + View phishingAlertIcon = view.findViewById(com.android.internal.R.id.phishing_alert); + if (phishingAlertIcon != null) { + if (DEBUG) { + Log.d(TAG, "Setting 'phishing_alert' view visible=" + hasPhishingAlert + "."); + } + phishingAlertIcon.setVisibility(hasPhishingAlert ? View.VISIBLE : View.GONE); + } + List<Integer> suppressedActionIndices = state != null + ? state.getSuppressedActionIndices() + : Collections.emptyList(); + ViewGroup actionsList = view.findViewById(com.android.internal.R.id.actions); + if (actionsList != null) { + if (DEBUG && !suppressedActionIndices.isEmpty()) { + Log.d(TAG, "Suppressing actions with indices: " + suppressedActionIndices); + } + for (int i = 0; i < actionsList.getChildCount(); i++) { + View actionBtn = actionsList.getChildAt(i); + Object actionIndex = + actionBtn.getTag(com.android.internal.R.id.notification_action_index_tag); + boolean suppressAction = actionIndex instanceof Integer + && suppressedActionIndices.contains(actionIndex); + actionBtn.setVisibility(suppressAction ? View.GONE : View.VISIBLE); + } } } @Nullable private SmartReplyView applySmartReplyView(View view, - SmartRepliesAndActions smartRepliesAndActions, - NotificationEntry entry, InflatedSmartReplies inflatedSmartReplyView) { + InflatedSmartReplyState smartReplyState, + NotificationEntry entry, InflatedSmartReplyViewHolder inflatedSmartReplyViewHolder) { View smartReplyContainerCandidate = view.findViewById( com.android.internal.R.id.smart_reply_container); if (!(smartReplyContainerCandidate instanceof LinearLayout)) { @@ -1457,8 +1482,7 @@ public class NotificationContentView extends FrameLayout { } LinearLayout smartReplyContainer = (LinearLayout) smartReplyContainerCandidate; - if (!SmartRepliesAndActionsInflaterKt - .shouldShowSmartReplyView(entry, smartRepliesAndActions)) { + if (!SmartReplyStateInflaterKt.shouldShowSmartReplyView(entry, smartReplyState)) { smartReplyContainer.setVisibility(View.GONE); return null; } @@ -1471,15 +1495,15 @@ public class NotificationContentView extends FrameLayout { smartReplyContainer.removeAllViews(); } if (smartReplyContainer.getChildCount() == 0 - && inflatedSmartReplyView != null - && inflatedSmartReplyView.getSmartReplyView() != null) { - smartReplyView = inflatedSmartReplyView.getSmartReplyView(); + && inflatedSmartReplyViewHolder != null + && inflatedSmartReplyViewHolder.getSmartReplyView() != null) { + smartReplyView = inflatedSmartReplyViewHolder.getSmartReplyView(); smartReplyContainer.addView(smartReplyView); } if (smartReplyView != null) { smartReplyView.resetSmartSuggestions(smartReplyContainer); smartReplyView.addPreInflatedButtons( - inflatedSmartReplyView.getSmartSuggestionButtons()); + inflatedSmartReplyViewHolder.getSmartSuggestionButtons()); // Ensure the colors of the smart suggestion buttons are up-to-date. smartReplyView.setBackgroundTintColor(entry.getRow().getCurrentBackgroundTint()); smartReplyContainer.setVisibility(View.VISIBLE); @@ -1495,7 +1519,7 @@ public class NotificationContentView extends FrameLayout { * {@link SmartReplyView} related to the expanded notification state is cleared. */ public void setExpandedInflatedSmartReplies( - @Nullable InflatedSmartReplies inflatedSmartReplies) { + @Nullable InflatedSmartReplyViewHolder inflatedSmartReplies) { mExpandedInflatedSmartReplies = inflatedSmartReplies; if (inflatedSmartReplies == null) { mExpandedSmartReplyView = null; @@ -1510,7 +1534,7 @@ public class NotificationContentView extends FrameLayout { * {@link SmartReplyView} related to the heads-up notification state is cleared. */ public void setHeadsUpInflatedSmartReplies( - @Nullable InflatedSmartReplies inflatedSmartReplies) { + @Nullable InflatedSmartReplyViewHolder inflatedSmartReplies) { mHeadsUpInflatedSmartReplies = inflatedSmartReplies; if (inflatedSmartReplies == null) { mHeadsUpSmartReplyView = null; @@ -1518,10 +1542,21 @@ public class NotificationContentView extends FrameLayout { } /** + * Set pre-inflated replies and actions for the notification. + * This can be relevant to any state of the notification, even contracted, because smart actions + * may cause a phishing alert to be made visible. + * @param smartReplyState the pre-inflated list of replies and actions + */ + public void setInflatedSmartReplyState( + @NonNull InflatedSmartReplyState smartReplyState) { + mCurrentSmartReplyState = smartReplyState; + } + + /** * Returns the smart replies and actions currently shown in the notification. */ - @Nullable public SmartRepliesAndActions getCurrentSmartRepliesAndActions() { - return mCurrentSmartRepliesAndActions; + @Nullable public InflatedSmartReplyState getCurrentSmartReplyState() { + return mCurrentSmartReplyState; } public void closeRemoteInput() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java index 1d36ad3f13d5..7248bcef621c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java @@ -40,8 +40,6 @@ public class NotificationBigPictureTemplateViewWrapper extends NotificationTempl public void onContentUpdated(ExpandableNotificationRow row) { super.onContentUpdated(row); updateImageTag(row.getEntry().getSbn()); - // Round the corners of the big picture content - mView.findViewById(com.android.internal.R.id.big_picture).setClipToOutline(true); } private void updateImageTag(StatusBarNotification notification) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 34bc5370e8f1..eb79e3c8a69a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -67,8 +67,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { private ImageView mWorkProfileImage; private View mAudiblyAlertedIcon; private View mFeedbackIcon; - private View mLeftIcon; - private View mRightIcon; private boolean mIsLowPriority; private boolean mTransformLowPriorityTitle; @@ -113,8 +111,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button); mAltExpandTarget = mView.findViewById(com.android.internal.R.id.alternate_expand_target); mIconContainer = mView.findViewById(com.android.internal.R.id.conversation_icon_container); - mLeftIcon = mView.findViewById(com.android.internal.R.id.left_icon); - mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon); mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge); mNotificationHeader = mView.findViewById(com.android.internal.R.id.notification_header); mNotificationTopLine = mView.findViewById(com.android.internal.R.id.notification_top_line); @@ -160,12 +156,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { updateCropToPaddingForImageViews(); Notification notification = row.getEntry().getSbn().getNotification(); mIcon.setTag(ImageTransformState.ICON_TAG, notification.getSmallIcon()); - if (mLeftIcon != null) { - mLeftIcon.setClipToOutline(true); - } - if (mRightIcon != null) { - mRightIcon.setClipToOutline(true); - } // We need to reset all views that are no longer transforming in case a view was previously // transformed, but now we decided to transform its container instead. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 7bc1bb39642b..dacd9417b22a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -40,7 +40,7 @@ import java.util.Objects; public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback, SecurityController.SecurityControllerCallback, Tunable { private static final String TAG = "StatusBarSignalPolicy"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.INFO); + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final String mSlotAirplane; private final String mSlotMobile; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 5ff897029543..528c0cbae0dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -56,6 +56,7 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa private final String[] mHistory = new String[HISTORY_SIZE]; // Where to copy the next state into. private int mHistoryIndex; + private String mLastCallback; public CallbackHandler() { super(Looper.getMainLooper()); @@ -182,14 +183,20 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setConnectivityStatus(boolean noDefaultNetwork, boolean noValidatedNetwork, boolean noNetworksAvailable) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") + String currentCallback = new StringBuilder() .append("setConnectivityStatus: ") .append("noDefaultNetwork=").append(noDefaultNetwork).append(",") .append("noValidatedNetwork=").append(noValidatedNetwork).append(",") .append("noNetworksAvailable=").append(noNetworksAvailable) .toString(); - recordLastCallback(log); + if (!currentCallback.equals(mLastCallback)) { + mLastCallback = currentCallback; + String log = new StringBuilder() + .append(SSDF.format(System.currentTimeMillis())).append(",") + .append(currentCallback).append(",") + .toString(); + recordLastCallback(log); + } post(() -> { for (SignalCallback signalCluster : mSignalCallbacks) { signalCluster.setConnectivityStatus( @@ -200,13 +207,19 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setCallIndicator(IconState statusIcon, int subId) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") + String currentCallback = new StringBuilder() .append("setCallIndicator: ") .append("statusIcon=").append(statusIcon).append(",") .append("subId=").append(subId) .toString(); - recordLastCallback(log); + if (!currentCallback.equals(mLastCallback)) { + mLastCallback = currentCallback; + String log = new StringBuilder() + .append(SSDF.format(System.currentTimeMillis())).append(",") + .append(currentCallback).append(",") + .toString(); + recordLastCallback(log); + } post(() -> { for (SignalCallback signalCluster : mSignalCallbacks) { signalCluster.setCallIndicator(statusIcon, subId); @@ -216,12 +229,18 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setSubs(List<SubscriptionInfo> subs) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") + String currentCallback = new StringBuilder() .append("setSubs: ") .append("subs=").append(subs == null ? "" : subs.toString()) .toString(); - recordLastCallback(log); + if (!currentCallback.equals(mLastCallback)) { + mLastCallback = currentCallback; + String log = new StringBuilder() + .append(SSDF.format(System.currentTimeMillis())).append(",") + .append(currentCallback).append(",") + .toString(); + recordLastCallback(log); + } obtainMessage(MSG_SUBS_CHANGED, subs).sendToTarget(); } @@ -253,12 +272,18 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setIsAirplaneMode(IconState icon) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") + String currentCallback = new StringBuilder() .append("setIsAirplaneMode: ") .append("icon=").append(icon) .toString(); - recordLastCallback(log); + if (!currentCallback.equals(mLastCallback)) { + mLastCallback = currentCallback; + String log = new StringBuilder() + .append(SSDF.format(System.currentTimeMillis())).append(",") + .append(currentCallback).append(",") + .toString(); + recordLastCallback(log); + } obtainMessage(MSG_AIRPLANE_MODE_CHANGED, icon).sendToTarget();; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java deleted file mode 100644 index cbc8405cc057..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java +++ /dev/null @@ -1,79 +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.systemui.statusbar.policy; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.app.Notification; -import android.widget.Button; - -import java.util.Collections; -import java.util.List; - -/** - * Holder for inflated smart replies and actions. These objects should be inflated on a background - * thread, to later be accessed and modified on the (performance critical) UI thread. - */ -public class InflatedSmartReplies { - @Nullable private final SmartReplyView mSmartReplyView; - @Nullable private final List<Button> mSmartSuggestionButtons; - @NonNull private final SmartRepliesAndActions mSmartRepliesAndActions; - - public InflatedSmartReplies( - @Nullable SmartReplyView smartReplyView, - @Nullable List<Button> smartSuggestionButtons, - @NonNull SmartRepliesAndActions smartRepliesAndActions) { - mSmartReplyView = smartReplyView; - mSmartSuggestionButtons = smartSuggestionButtons; - mSmartRepliesAndActions = smartRepliesAndActions; - } - - @Nullable public SmartReplyView getSmartReplyView() { - return mSmartReplyView; - } - - @Nullable public List<Button> getSmartSuggestionButtons() { - return mSmartSuggestionButtons; - } - - @NonNull public SmartRepliesAndActions getSmartRepliesAndActions() { - return mSmartRepliesAndActions; - } - - /** - * A storage for smart replies and smart action. - */ - public static class SmartRepliesAndActions { - @Nullable public final SmartReplyView.SmartReplies smartReplies; - @Nullable public final SmartReplyView.SmartActions smartActions; - - SmartRepliesAndActions( - @Nullable SmartReplyView.SmartReplies smartReplies, - @Nullable SmartReplyView.SmartActions smartActions) { - this.smartReplies = smartReplies; - this.smartActions = smartActions; - } - - @NonNull public List<CharSequence> getSmartReplies() { - return smartReplies == null ? Collections.emptyList() : smartReplies.choices; - } - - @NonNull public List<Notification.Action> getSmartActions() { - return smartActions == null ? Collections.emptyList() : smartActions.actions; - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyState.kt new file mode 100644 index 000000000000..1f8b84ff1ec5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyState.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.policy + +import android.app.Notification +import com.android.systemui.statusbar.policy.SmartReplyView.SmartActions +import com.android.systemui.statusbar.policy.SmartReplyView.SmartReplies + +/** + * A storage for smart replies, smart actions, and related state + */ +class InflatedSmartReplyState internal constructor( + val smartReplies: SmartReplies?, + val smartActions: SmartActions?, + val suppressedActions: SuppressedActions?, + val hasPhishingAction: Boolean +) { + val smartRepliesList: List<CharSequence> + get() = smartReplies?.choices ?: emptyList() + val smartActionsList: List<Notification.Action> + get() = smartActions?.actions ?: emptyList() + val suppressedActionIndices: List<Int> + get() = suppressedActions?.suppressedActionIndices ?: emptyList() + + /** + * Data class for standard actions suppressed by the smart actions. + */ + class SuppressedActions(val suppressedActionIndices: List<Int>) +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt new file mode 100644 index 000000000000..4f69cd6a1367 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt @@ -0,0 +1,27 @@ +/* + * 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.systemui.statusbar.policy + +import android.widget.Button + +/** + * Holder for inflated smart replies and actions. These objects should be inflated on a background + * thread, to later be accessed and modified on the (performance critical) UI thread. + */ +class InflatedSmartReplyViewHolder( + val smartReplyView: SmartReplyView?, + val smartSuggestionButtons: List<Button>? +)
\ No newline at end of file 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 8e833c05b447..320b00af0fc5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -561,6 +561,11 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene super.onVisibilityChanged(changedView, visibility); if (changedView == this && mOnVisibilityChangedListener != null) { mOnVisibilityChangedListener.accept(visibility == VISIBLE); + // Hide soft-keyboard when the input view became invisible + // (i.e. The notification shade collapsed by pressing the home key) + if (visibility != VISIBLE && !mEditText.isVisibleToUser()) { + mEditText.hideIme(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt index ea803253ea0f..0bf2d503e5a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyStateInflater.kt @@ -44,7 +44,7 @@ import com.android.systemui.statusbar.SmartReplyController import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logging.NotificationLogger import com.android.systemui.statusbar.phone.KeyguardDismissUtil -import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions +import com.android.systemui.statusbar.policy.InflatedSmartReplyState.SuppressedActions import com.android.systemui.statusbar.policy.SmartReplyView.SmartActions import com.android.systemui.statusbar.policy.SmartReplyView.SmartButtonType import com.android.systemui.statusbar.policy.SmartReplyView.SmartReplies @@ -53,10 +53,10 @@ import javax.inject.Inject /** Returns whether we should show the smart reply view and its smart suggestions. */ fun shouldShowSmartReplyView( entry: NotificationEntry, - smartRepliesAndActions: SmartRepliesAndActions + smartReplyState: InflatedSmartReplyState ): Boolean { - if (smartRepliesAndActions.smartReplies == null - && smartRepliesAndActions.smartActions == null) { + if (smartReplyState.smartReplies == null && + smartReplyState.smartActions == null) { // There are no smart replies and no smart actions. return false } @@ -71,58 +71,65 @@ fun shouldShowSmartReplyView( .getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false) } -/** Determines if two [SmartRepliesAndActions] are visually similar. */ +/** Determines if two [InflatedSmartReplyState] are visually similar. */ fun areSuggestionsSimilar( - left: SmartRepliesAndActions?, - right: SmartRepliesAndActions? + left: InflatedSmartReplyState?, + right: InflatedSmartReplyState? ): Boolean = when { left === right -> true left == null || right == null -> false - left.getSmartReplies() != right.getSmartReplies() -> false - else -> !NotificationUiAdjustment.areDifferent(left.getSmartActions(), right.getSmartActions()) + left.hasPhishingAction != right.hasPhishingAction -> false + left.smartRepliesList != right.smartRepliesList -> false + left.suppressedActionIndices != right.suppressedActionIndices -> false + else -> !NotificationUiAdjustment.areDifferent(left.smartActionsList, right.smartActionsList) } -interface SmartRepliesAndActionsInflater { - fun inflateSmartReplies( +interface SmartReplyStateInflater { + fun inflateSmartReplyState(entry: NotificationEntry): InflatedSmartReplyState + + fun inflateSmartReplyViewHolder( sysuiContext: Context, notifPackageContext: Context, entry: NotificationEntry, - existingRepliesAndAction: SmartRepliesAndActions? - ): InflatedSmartReplies + existingSmartReplyState: InflatedSmartReplyState?, + newSmartReplyState: InflatedSmartReplyState + ): InflatedSmartReplyViewHolder } -/*internal*/ class SmartRepliesAndActionsInflaterImpl @Inject constructor( +/*internal*/ class SmartReplyStateInflaterImpl @Inject constructor( private val constants: SmartReplyConstants, private val activityManagerWrapper: ActivityManagerWrapper, private val packageManagerWrapper: PackageManagerWrapper, private val devicePolicyManagerWrapper: DevicePolicyManagerWrapper, private val smartRepliesInflater: SmartReplyInflater, private val smartActionsInflater: SmartActionInflater -) : SmartRepliesAndActionsInflater { +) : SmartReplyStateInflater { + + override fun inflateSmartReplyState(entry: NotificationEntry): InflatedSmartReplyState = + chooseSmartRepliesAndActions(entry) - override fun inflateSmartReplies( + override fun inflateSmartReplyViewHolder( sysuiContext: Context, notifPackageContext: Context, entry: NotificationEntry, - existingRepliesAndAction: SmartRepliesAndActions? - ): InflatedSmartReplies { - val newRepliesAndActions = chooseSmartRepliesAndActions(entry) - if (!shouldShowSmartReplyView(entry, newRepliesAndActions)) { - return InflatedSmartReplies( + existingSmartReplyState: InflatedSmartReplyState?, + newSmartReplyState: InflatedSmartReplyState + ): InflatedSmartReplyViewHolder { + if (!shouldShowSmartReplyView(entry, newSmartReplyState)) { + return InflatedSmartReplyViewHolder( null /* smartReplyView */, - null /* smartSuggestionButtons */, - newRepliesAndActions) + null /* smartSuggestionButtons */) } // Only block clicks if the smart buttons are different from the previous set - to avoid // scenarios where a user incorrectly cannot click smart buttons because the // notification is updated. val delayOnClickListener = - !areSuggestionsSimilar(existingRepliesAndAction, newRepliesAndActions) + !areSuggestionsSimilar(existingSmartReplyState, newSmartReplyState) val smartReplyView = SmartReplyView.inflate(sysuiContext, constants) - val smartReplies = newRepliesAndActions.smartReplies + val smartReplies = newSmartReplyState.smartReplies smartReplyView.setSmartRepliesGeneratedByAssistant(smartReplies?.fromAssistant ?: false) val smartReplyButtons = smartReplies?.let { smartReplies.choices.asSequence().mapIndexed { index, choice -> @@ -136,7 +143,7 @@ interface SmartRepliesAndActionsInflater { } } ?: emptySequence() - val smartActionButtons = newRepliesAndActions.smartActions?.let { smartActions -> + val smartActionButtons = newSmartReplyState.smartActions?.let { smartActions -> val themedPackageContext = ContextThemeWrapper(notifPackageContext, sysuiContext.theme) smartActions.actions.asSequence() @@ -153,10 +160,9 @@ interface SmartRepliesAndActionsInflater { } } ?: emptySequence() - return InflatedSmartReplies( + return InflatedSmartReplyViewHolder( smartReplyView, - (smartReplyButtons + smartActionButtons).toList(), - newRepliesAndActions) + (smartReplyButtons + smartActionButtons).toList()) } /** @@ -165,23 +171,23 @@ interface SmartRepliesAndActionsInflater { * replies or actions generated by the NotificationAssistantService (NAS), and if the app * provides any smart actions we also don't show any NAS-generated replies or actions. */ - fun chooseSmartRepliesAndActions(entry: NotificationEntry): SmartRepliesAndActions { + fun chooseSmartRepliesAndActions(entry: NotificationEntry): InflatedSmartReplyState { val notification = entry.sbn.notification val remoteInputActionPair = notification.findRemoteInputActionPair(false /* freeform */) val freeformRemoteInputActionPair = notification.findRemoteInputActionPair(true /* freeform */) if (!constants.isEnabled) { if (DEBUG) { - Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for " - + entry.sbn.key) + Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for " + + entry.sbn.key) } - return SmartRepliesAndActions(null, null) + return InflatedSmartReplyState(null, null, null, false) } // Only use smart replies from the app if they target P or above. We have this check because // the smart reply API has been used for other things (Wearables) in the past. The API to // add smart actions is new in Q so it doesn't require a target-sdk check. - val enableAppGeneratedSmartReplies = (!constants.requiresTargetingP() - || entry.targetSdk >= Build.VERSION_CODES.P) + val enableAppGeneratedSmartReplies = (!constants.requiresTargetingP() || + entry.targetSdk >= Build.VERSION_CODES.P) val appGeneratedSmartActions = notification.contextualActions var smartReplies: SmartReplies? = when { @@ -207,18 +213,18 @@ interface SmartRepliesAndActionsInflater { if (smartReplies == null && smartActions == null) { val entryReplies = entry.smartReplies val entryActions = entry.smartActions - if (entryReplies.isNotEmpty() - && freeformRemoteInputActionPair != null - && freeformRemoteInputActionPair.second.allowGeneratedReplies - && freeformRemoteInputActionPair.second.actionIntent != null) { + if (entryReplies.isNotEmpty() && + freeformRemoteInputActionPair != null && + freeformRemoteInputActionPair.second.allowGeneratedReplies && + freeformRemoteInputActionPair.second.actionIntent != null) { smartReplies = SmartReplies( entryReplies, freeformRemoteInputActionPair.first, freeformRemoteInputActionPair.second.actionIntent, true /* fromAssistant */) } - if (entryActions.isNotEmpty() - && notification.allowSystemGeneratedContextualActions) { + if (entryActions.isNotEmpty() && + notification.allowSystemGeneratedContextualActions) { val systemGeneratedActions: List<Notification.Action> = when { activityManagerWrapper.isLockTaskKioskModeActive -> // Filter actions if we're in kiosk-mode - we don't care about screen @@ -229,7 +235,21 @@ interface SmartRepliesAndActionsInflater { smartActions = SmartActions(systemGeneratedActions, true /* fromAssistant */) } } - return SmartRepliesAndActions(smartReplies, smartActions) + val hasPhishingAction = smartActions?.actions?.any { + it.isContextual && it.semanticAction == + Notification.Action.SEMANTIC_ACTION_CONVERSATION_IS_PHISHING + } ?: false + var suppressedActions: SuppressedActions? = null + if (hasPhishingAction) { + // If there is a phishing action, calculate the indices of the actions with RemoteInput + // as those need to be hidden from the view. + val suppressedActionIndices = notification.actions.mapIndexedNotNull { index, action -> + if (action.remoteInputs?.isNotEmpty() == true) index else null + } + suppressedActions = SuppressedActions(suppressedActionIndices) + } + return InflatedSmartReplyState(smartReplies, smartActions, suppressedActions, + hasPhishingAction) } /** @@ -311,8 +331,8 @@ interface SmartActionInflater { actionIndex: Int, action: Notification.Action ) = - if (smartActions.fromAssistant - && SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY == action.semanticAction) { + if (smartActions.fromAssistant && + SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY == action.semanticAction) { entry.row.doSmartActionClick(entry.row.x.toInt() / 2, entry.row.y.toInt() / 2, SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY) smartReplyController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java index 34c78813d11a..ad4fa64ac905 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -794,8 +794,8 @@ public class SmartReplyView extends ViewGroup { public final List<CharSequence> choices; public final boolean fromAssistant; - public SmartReplies(List<CharSequence> choices, RemoteInput remoteInput, - PendingIntent pendingIntent, boolean fromAssistant) { + public SmartReplies(@NonNull List<CharSequence> choices, @NonNull RemoteInput remoteInput, + @NonNull PendingIntent pendingIntent, boolean fromAssistant) { this.choices = choices; this.remoteInput = remoteInput; this.pendingIntent = pendingIntent; @@ -812,7 +812,7 @@ public class SmartReplyView extends ViewGroup { public final List<Notification.Action> actions; public final boolean fromAssistant; - public SmartActions(List<Notification.Action> actions, boolean fromAssistant) { + public SmartActions(@NonNull List<Notification.Action> actions, boolean fromAssistant) { this.actions = actions; this.fromAssistant = fromAssistant; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/SmartRepliesInflationModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/SmartRepliesInflationModule.kt index 803d26ec3286..ce4a9270925b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/SmartRepliesInflationModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/SmartRepliesInflationModule.kt @@ -17,10 +17,10 @@ package com.android.systemui.statusbar.policy.dagger import com.android.systemui.statusbar.policy.SmartActionInflater import com.android.systemui.statusbar.policy.SmartActionInflaterImpl -import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflater -import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflaterImpl import com.android.systemui.statusbar.policy.SmartReplyInflater import com.android.systemui.statusbar.policy.SmartReplyInflaterImpl +import com.android.systemui.statusbar.policy.SmartReplyStateInflater +import com.android.systemui.statusbar.policy.SmartReplyStateInflaterImpl import dagger.Binds import dagger.Module @@ -29,6 +29,6 @@ interface SmartRepliesInflationModule { @Binds fun bindSmartActionsInflater(impl: SmartActionInflaterImpl): SmartActionInflater @Binds fun bindSmartReplyInflater(impl: SmartReplyInflaterImpl): SmartReplyInflater @Binds fun bindsInflatedSmartRepliesProvider( - impl: SmartRepliesAndActionsInflaterImpl - ): SmartRepliesAndActionsInflater + impl: SmartReplyStateInflaterImpl + ): SmartReplyStateInflater }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 8505703b9e25..21fffbedc96b 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -315,6 +315,13 @@ public final class WMShell extends SystemUI } } }); + + mConfigurationController.addCallback(new ConfigurationController.ConfigurationListener() { + @Override + public void onConfigChanged(Configuration newConfig) { + oneHanded.onConfigChanged(newConfig); + } + }); } @VisibleForTesting diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 6e2398c033ba..eb95d1653e84 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -56,6 +56,7 @@ import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintManager; import android.media.AudioManager; +import android.nfc.NfcAdapter; import android.os.Bundle; import android.os.Handler; import android.os.IRemoteCallback; @@ -851,6 +852,17 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false); } + @Test + public void testRequireUnlockForNfc_Broadcast() { + KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class); + mKeyguardUpdateMonitor.registerCallback(callback); + Intent intent = new Intent(NfcAdapter.ACTION_REQUIRE_UNLOCK_FOR_NFC); + mKeyguardUpdateMonitor.mBroadcastAllReceiver.onReceive(getContext(), intent); + mTestableLooper.processAllMessages(); + + verify(callback, atLeastOnce()).onRequireUnlockForNfc(); + } + private void setKeyguardBouncerVisibility(boolean isVisible) { mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(isVisible); mTestableLooper.processAllMessages(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java index 0320103ceaa8..5c179d4e46b6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java @@ -16,6 +16,7 @@ package com.android.systemui.navigationbar.buttons; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; @@ -25,6 +26,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.res.Configuration; +import android.graphics.Rect; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.MotionEvent; @@ -39,6 +41,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Map; + @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest @@ -51,6 +55,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { Configuration c = new Configuration(mContext.getResources().getConfiguration()); c.smallestScreenWidthDp = 500; mNearestTouchFrame = new NearestTouchFrame(mContext, null, c); + mNearestTouchFrame.layout(0, 0, 100, 100); } @Test @@ -146,7 +151,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { public void testVerticalSelection_Top() { View top = mockViewAt(0, 0, 10, 10); View bottom = mockViewAt(0, 20, 10, 10); - + mNearestTouchFrame.setIsVertical(true); mNearestTouchFrame.addView(top); mNearestTouchFrame.addView(bottom); mNearestTouchFrame.onMeasure(0, 0); @@ -162,7 +167,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { public void testVerticalSelection_Bottom() { View top = mockViewAt(0, 0, 10, 10); View bottom = mockViewAt(0, 20, 10, 10); - + mNearestTouchFrame.setIsVertical(true); mNearestTouchFrame.addView(top); mNearestTouchFrame.addView(bottom); mNearestTouchFrame.onMeasure(0, 0); @@ -187,6 +192,60 @@ public class NearestTouchFrameTest extends SysuiTestCase { ev.recycle(); } + @Test + public void testViewMiddleChildNotAttachedCrash() { + View view1 = mockViewAt(0, 20, 10, 10); + View view2 = mockViewAt(11, 20, 10, 10); + View view3 = mockViewAt(21, 20, 10, 10); + when(view2.isAttachedToWindow()).thenReturn(false); + mNearestTouchFrame.addView(view1); + mNearestTouchFrame.addView(view2); + mNearestTouchFrame.addView(view3); + mNearestTouchFrame.onMeasure(0, 0); + + MotionEvent ev = MotionEvent.obtain(0, 0, 0, 5 /* x */, 18 /* y */, 0); + mNearestTouchFrame.onTouchEvent(ev); + verify(view2, never()).onTouchEvent(eq(ev)); + ev.recycle(); + } + + @Test + public void testCachedRegionsSplit_horizontal() { + View left = mockViewAt(0, 0, 5, 20); + View right = mockViewAt(15, 0, 5, 20); + mNearestTouchFrame.layout(0, 0, 20, 20); + + mNearestTouchFrame.addView(left); + mNearestTouchFrame.addView(right); + mNearestTouchFrame.onMeasure(0, 0); + + Map<View, Rect> childRegions = mNearestTouchFrame.getFullTouchableChildRegions(); + assertEquals(2, childRegions.size()); + Rect leftRegion = childRegions.get(left); + Rect rightRegion = childRegions.get(right); + assertEquals(new Rect(0, 0, 9, 20), leftRegion); + assertEquals(new Rect(10, 0, 20, 20), rightRegion); + } + + @Test + public void testCachedRegionsSplit_vertical() { + View top = mockViewAt(0, 0, 20, 5); + View bottom = mockViewAt(0, 15, 20, 5); + mNearestTouchFrame.layout(0, 0, 20, 20); + mNearestTouchFrame.setIsVertical(true); + + mNearestTouchFrame.addView(top); + mNearestTouchFrame.addView(bottom); + mNearestTouchFrame.onMeasure(0, 0); + + Map<View, Rect> childRegions = mNearestTouchFrame.getFullTouchableChildRegions(); + assertEquals(2, childRegions.size()); + Rect topRegion = childRegions.get(top); + Rect bottomRegion = childRegions.get(bottom); + assertEquals(new Rect(0, 0, 20, 9), topRegion); + assertEquals(new Rect(0, 10, 20, 20), bottomRegion); + } + private View mockViewAt(int x, int y, int width, int height) { View v = spy(new View(mContext)); doAnswer(invocation -> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 0cae67427e3b..ce14bca081ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -609,6 +609,16 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { assertThat(mTextView.getText()).isEqualTo(percentage); } + @Test + public void onRequireUnlockForNfc_showsRequireUnlockForNfcIndication() { + createController(); + String message = mContext.getString(R.string.require_unlock_for_nfc); + mController.getKeyguardCallback().onRequireUnlockForNfc(); + mController.setVisible(true); + + assertThat(mTextView.getText()).isEqualTo(message); + } + private void sendUpdateDisclosureBroadcast() { mBroadcastReceiver.onReceive(mContext, new Intent()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java index 4cc228209ef2..8375e7cceb28 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java @@ -58,8 +58,9 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.BindParams; import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationCallback; import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.InflationFlag; -import com.android.systemui.statusbar.policy.InflatedSmartReplies; -import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflater; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; +import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; +import com.android.systemui.statusbar.policy.SmartReplyStateInflater; import com.android.systemui.tests.R; import org.junit.Assert; @@ -87,11 +88,24 @@ public class NotificationContentInflaterTest extends SysuiTestCase { @Mock private NotifRemoteViewCache mCache; @Mock private ConversationNotificationProcessor mConversationNotificationProcessor; - @Mock private InflatedSmartReplies mInflatedSmartReplies; + @Mock private InflatedSmartReplyState mInflatedSmartReplyState; + @Mock private InflatedSmartReplyViewHolder mInflatedSmartReplies; + + private final SmartReplyStateInflater mSmartReplyStateInflater = + new SmartReplyStateInflater() { + @Override + public InflatedSmartReplyViewHolder inflateSmartReplyViewHolder( + Context sysuiContext, Context notifPackageContext, NotificationEntry entry, + InflatedSmartReplyState existingSmartReplyState, + InflatedSmartReplyState newSmartReplyState) { + return mInflatedSmartReplies; + } - private final SmartRepliesAndActionsInflater mSmartRepliesAndActionsInflater = - (sysuiContext, notifPackageContext, entry, existingRepliesAndAction) -> - mInflatedSmartReplies; + @Override + public InflatedSmartReplyState inflateSmartReplyState(NotificationEntry entry) { + return mInflatedSmartReplyState; + } + }; @Before public void setUp() throws Exception { @@ -114,7 +128,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { mConversationNotificationProcessor, mock(MediaFeatureFlag.class), mock(Executor.class), - mSmartRepliesAndActionsInflater); + mSmartReplyStateInflater); } @Test @@ -130,7 +144,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { FLAG_CONTENT_VIEW_ALL, builder, mContext, - mSmartRepliesAndActionsInflater); + mSmartReplyStateInflater); verify(builder).createHeadsUpContentView(true); } @@ -147,7 +161,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { FLAG_CONTENT_VIEW_ALL, builder, mContext, - mSmartRepliesAndActionsInflater); + mSmartReplyStateInflater); verify(builder).createContentView(true); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java index ababebdd807c..97313bafb8a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Notification; +import android.content.Context; import android.content.pm.LauncherApps; import android.os.Handler; import android.service.notification.NotificationListenerService; @@ -80,7 +81,9 @@ import com.android.systemui.statusbar.notification.row.dagger.NotificationRowCom import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.HeadsUpManager; -import com.android.systemui.statusbar.policy.InflatedSmartReplies; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; +import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; +import com.android.systemui.statusbar.policy.SmartReplyStateInflater; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.leak.LeakDetector; import com.android.systemui.util.time.FakeSystemClock; @@ -140,7 +143,8 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase { @Mock private ActivatableNotificationViewController mActivatableNotificationViewController; @Mock private NotificationRowComponent.Builder mNotificationRowComponentBuilder; @Mock private PeopleNotificationIdentifier mPeopleNotificationIdentifier; - @Mock private InflatedSmartReplies mInflatedSmartReplies; + @Mock private InflatedSmartReplyState mInflatedSmartReplyState; + @Mock private InflatedSmartReplyViewHolder mInflatedSmartReplies; private StatusBarNotification mSbn; private NotificationListenerService.RankingMap mRankingMap; @@ -206,8 +210,21 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase { mock(ConversationNotificationProcessor.class), mock(MediaFeatureFlag.class), mBgExecutor, - (sysuiContext, notifPackageContext, entry, existingRepliesAndAction) -> - mInflatedSmartReplies); + new SmartReplyStateInflater() { + @Override + public InflatedSmartReplyState inflateSmartReplyState(NotificationEntry entry) { + return mInflatedSmartReplyState; + } + + @Override + public InflatedSmartReplyViewHolder inflateSmartReplyViewHolder( + Context sysuiContext, Context notifPackageContext, + NotificationEntry entry, + InflatedSmartReplyState existingSmartReplyState, + InflatedSmartReplyState newSmartReplyState) { + return mInflatedSmartReplies; + } + }); mRowContentBindStage = new RowContentBindStage( binder, mock(NotifInflationErrorManager.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index 64a7bee3c8dc..f3813fcaf6fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -66,7 +66,9 @@ import com.android.systemui.statusbar.notification.row.NotificationRowContentBin import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.policy.InflatedSmartReplies; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState; +import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; +import com.android.systemui.statusbar.policy.SmartReplyStateInflater; import com.android.systemui.tests.R; import com.android.systemui.wmshell.BubblesManager; import com.android.systemui.wmshell.BubblesTestActivity; @@ -139,8 +141,7 @@ public class NotificationTestHelper { mock(ConversationNotificationProcessor.class), mock(MediaFeatureFlag.class), mock(Executor.class), - (sysuiContext, notifPackageContext, entry, existingRepliesAndAction) -> - mock(InflatedSmartReplies.class)); + new MockSmartReplyInflater()); contentBinder.setInflateSynchronously(true); mBindStage = new RowContentBindStage(contentBinder, mock(NotifInflationErrorManager.class), @@ -464,4 +465,19 @@ public class NotificationTestHelper { .setDesiredHeight(314) .build(); } + + private static class MockSmartReplyInflater implements SmartReplyStateInflater { + @Override + public InflatedSmartReplyState inflateSmartReplyState(NotificationEntry entry) { + return mock(InflatedSmartReplyState.class); + } + + @Override + public InflatedSmartReplyViewHolder inflateSmartReplyViewHolder(Context sysuiContext, + Context notifPackageContext, NotificationEntry entry, + InflatedSmartReplyState existingSmartReplyState, + InflatedSmartReplyState newSmartReplyState) { + return mock(InflatedSmartReplyViewHolder.class); + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java index 32675c92d3f9..5e2fa98178f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java @@ -45,7 +45,7 @@ import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.statusbar.NotificationEntryHelper; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; -import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; +import com.android.systemui.statusbar.policy.InflatedSmartReplyState.SuppressedActions; import com.android.systemui.statusbar.policy.SmartReplyView.SmartActions; import com.android.systemui.statusbar.policy.SmartReplyView.SmartReplies; @@ -74,13 +74,12 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { @Mock private ActivityManagerWrapper mActivityManagerWrapper; @Mock private PackageManagerWrapper mPackageManagerWrapper; @Mock private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper; - @Mock private SmartRepliesAndActions mSmartRepliesAndActions; @Mock private SmartReplyInflater mSmartReplyInflater; @Mock private SmartActionInflater mSmartActionInflater; private Icon mActionIcon; private NotificationEntry mEntry; - private SmartRepliesAndActionsInflaterImpl mSmartRepliesInflater; + private SmartReplyStateInflaterImpl mSmartReplyStateInflater; @Before @UiThreadTest @@ -101,7 +100,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { when(mActivityManagerWrapper.isLockTaskKioskModeActive()).thenReturn(false); - mSmartRepliesInflater = new SmartRepliesAndActionsInflaterImpl( + mSmartReplyStateInflater = new SmartReplyStateInflaterImpl( mSmartReplyConstants, mActivityManagerWrapper, mPackageManagerWrapper, @@ -118,11 +117,13 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { setupAppGeneratedSuggestions(smartReplies, smartActions); when(mSmartReplyConstants.isEnabled()).thenReturn(false); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -134,11 +135,13 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { when(mSmartReplyConstants.isEnabled()).thenReturn(false); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -146,12 +149,15 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; setupAppGeneratedReplies(smartReplies); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(Arrays.asList(smartReplies)); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions).isNull(); + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(smartReplies).inOrder(); + assertThat(smartReplyState.getSmartReplies().fromAssistant).isFalse(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -161,13 +167,17 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { createActions("Test Action 1", "Test Action 2"); setupAppGeneratedSuggestions(smartReplies, smartActions); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); - - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(Arrays.asList(smartReplies)); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions.actions).isEqualTo(smartActions); - assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); + + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(smartReplies).inOrder(); + assertThat(smartReplyState.getSmartReplies().fromAssistant).isFalse(); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactlyElementsIn(smartActions).inOrder(); + assertThat(smartReplyState.getSmartActions().fromAssistant).isFalse(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -180,12 +190,15 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartReplies(createReplies("Sys Smart Reply 1", "Sys Smart Reply 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(mEntry.getSmartReplies()); - assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue(); - assertThat(repliesAndActions.smartActions).isNull(); + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(mEntry.getSmartReplies()).inOrder(); + assertThat(smartReplyState.getSmartReplies().fromAssistant).isTrue(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -197,11 +210,13 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { NotificationEntryHelper.modifyRanking(mEntry) .setSmartReplies(createReplies("Sys Smart Reply 1", "Sys Smart Reply 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -214,13 +229,50 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(createActions("Sys Smart Action 1", "Sys Smart Action 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); + + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactlyElementsIn(mEntry.getSmartActions()).inOrder(); + assertThat(smartReplyState.getSmartActions().fromAssistant).isTrue(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); + } + + @Test + public void chooseSmartRepliesAndActions_sysGeneratedPhishingSmartAction() { + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // actions. + setupAppGeneratedReplies(null /* smartReplies */); + + mNotification.actions = new Notification.Action[]{ + createAction("Details"), + createActionBuilder("Reply").addRemoteInput( + new RemoteInput.Builder("key").build()).build() + }; + + modifyRanking(mEntry) + .setSmartActions( + createAction("Sys Smart Action 1"), + createActionBuilder("Sys Smart Action 2") + .setContextual(true) + .setSemanticAction(Notification.Action + .SEMANTIC_ACTION_CONVERSATION_IS_PHISHING) + .build()) + .build(); - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions.actions) - .isEqualTo(mEntry.getSmartActions()); - assertThat(repliesAndActions.smartActions.fromAssistant).isTrue(); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); + + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactlyElementsIn(mEntry.getSmartActions()).inOrder(); + assertThat(smartReplyState.getSmartActions().fromAssistant).isTrue(); + assertThat(smartReplyState.getSuppressedActions()).isNotNull(); + assertThat(smartReplyState.getSuppressedActions().getSuppressedActionIndices()) + .containsExactly(1); + assertThat(smartReplyState.getHasPhishingAction()).isTrue(); } @Test @@ -237,14 +289,17 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(createActions("Sys Smart Action 1", "Sys Smart Action 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); - - assertThat(repliesAndActions.smartReplies.choices) - .isEqualTo(Arrays.asList(appGenSmartReplies)); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions.actions).isEqualTo(appGenSmartActions); - assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); + + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(Arrays.asList(appGenSmartReplies)).inOrder(); + assertThat(smartReplyState.getSmartReplies().fromAssistant).isFalse(); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactlyElementsIn(appGenSmartActions).inOrder(); + assertThat(smartReplyState.getSmartActions().fromAssistant).isFalse(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -259,11 +314,13 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(createActions("Sys Smart Action 1", "Sys Smart Action 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartActions).isNull(); - assertThat(repliesAndActions.smartReplies).isNull(); + assertThat(smartReplyState.getSmartActions()).isNull(); + assertThat(smartReplyState.getSmartReplies()).isNull(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -281,13 +338,15 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(createActions("Sys Smart Action 1", "Sys Smart Action 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - assertThat(repliesAndActions.smartReplies.choices).isEqualTo( - mEntry.getSmartReplies()); + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(mEntry.getSmartReplies()).inOrder(); // Since no apps are whitelisted no actions should be shown. - assertThat(repliesAndActions.smartActions.actions).isEmpty(); + assertThat(smartReplyState.getSmartActions().actions).isEmpty(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -317,13 +376,14 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(actions) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); // Only the action for the whitelisted package should be allowed. - assertThat(repliesAndActions.smartActions.actions.size()).isEqualTo(1); - assertThat(repliesAndActions.smartActions.actions.get(0)).isEqualTo( - mEntry.getSmartActions().get(0)); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactly(mEntry.getSmartActions().get(0)); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -340,14 +400,16 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { .setSmartActions(createActions("Sys Smart Action 1", "Sys Smart Action 2")) .build(); - SmartRepliesAndActions repliesAndActions = - mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry); + InflatedSmartReplyState smartReplyState = + mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); // We don't restrict replies or actions in screen pinning mode. - assertThat(repliesAndActions.smartReplies.choices).isEqualTo( - mEntry.getSmartReplies()); - assertThat(repliesAndActions.smartActions.actions).isEqualTo( - mEntry.getSmartActions()); + assertThat(smartReplyState.getSmartReplies().choices) + .containsExactlyElementsIn(mEntry.getSmartReplies()).inOrder(); + assertThat(smartReplyState.getSmartActions().actions) + .containsExactlyElementsIn(mEntry.getSmartActions()).inOrder(); + assertThat(smartReplyState.getSuppressedActions()).isNull(); + assertThat(smartReplyState.getHasPhishingAction()).isFalse(); } @Test @@ -360,17 +422,24 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { List<Notification.Action> rightActions = Arrays.asList( createAction("firstAction"), createAction("secondAction")); + List<Integer> leftSuppressed = Arrays.asList(1, 2); + List<Integer> rightSuppressed = Arrays.asList(1, 2); + boolean leftPhishing = true; + boolean rightPhishing = true; - SmartRepliesAndActions leftRepliesAndActions = new SmartRepliesAndActions( + InflatedSmartReplyState leftRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(leftReplies, null, null, false /* fromAssistant */), - new SmartActions(leftActions, false /* fromAssistant */)); - SmartRepliesAndActions rightRepliesAndActions = new SmartRepliesAndActions( + new SmartActions(leftActions, false /* fromAssistant */), + new SuppressedActions(leftSuppressed), + leftPhishing); + InflatedSmartReplyState rightRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(rightReplies, null, null, false /* fromAssistant */), - new SmartActions(rightActions, false /* fromAssistant */)); + new SmartActions(rightActions, false /* fromAssistant */), + new SuppressedActions(rightSuppressed), + rightPhishing); - assertThat( - SmartRepliesAndActionsInflaterKt - .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) + assertThat(SmartReplyStateInflaterKt + .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) .isTrue(); } @@ -384,16 +453,25 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { List<Notification.Action> rightActions = Arrays.asList( createAction("firstAction"), createAction("secondAction")); + List<Integer> leftSuppressed = Arrays.asList(1, 2); + List<Integer> rightSuppressed = Arrays.asList(1, 2); + boolean leftPhishing = true; + boolean rightPhishing = true; - SmartRepliesAndActions leftRepliesAndActions = new SmartRepliesAndActions( + InflatedSmartReplyState leftRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(leftReplies, null, null, false /* fromAssistant */), - new SmartActions(leftActions, false /* fromAssistant */)); - SmartRepliesAndActions rightRepliesAndActions = new SmartRepliesAndActions( + new SmartActions(leftActions, false /* fromAssistant */), + new SuppressedActions(leftSuppressed), + leftPhishing); + InflatedSmartReplyState rightRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(rightReplies, null, null, false /* fromAssistant */), - new SmartActions(rightActions, false /* fromAssistant */)); + new SmartActions(rightActions, false /* fromAssistant */), + new SuppressedActions(rightSuppressed), + rightPhishing); - assertThat(SmartRepliesAndActionsInflaterKt.areSuggestionsSimilar( - leftRepliesAndActions, rightRepliesAndActions)).isFalse(); + assertThat(SmartReplyStateInflaterKt + .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) + .isFalse(); } @Test @@ -406,16 +484,87 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { List<Notification.Action> rightActions = Arrays.asList( createAction("firstAction"), createAction("not secondAction")); + List<Integer> leftSuppressed = Arrays.asList(1, 2); + List<Integer> rightSuppressed = Arrays.asList(1, 2); + boolean leftPhishing = true; + boolean rightPhishing = true; + + InflatedSmartReplyState leftRepliesAndActions = new InflatedSmartReplyState( + new SmartReplies(leftReplies, null, null, false /* fromAssistant */), + new SmartActions(leftActions, false /* fromAssistant */), + new SuppressedActions(leftSuppressed), + leftPhishing); + InflatedSmartReplyState rightRepliesAndActions = new InflatedSmartReplyState( + new SmartReplies(rightReplies, null, null, false /* fromAssistant */), + new SmartActions(rightActions, false /* fromAssistant */), + new SuppressedActions(rightSuppressed), + rightPhishing); + + assertThat(SmartReplyStateInflaterKt + .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) + .isFalse(); + } + + @Test + public void areSuggestionsSimilar_falseForDifferentSuppressedActions() { + List<CharSequence> leftReplies = createReplies("first reply", "second reply"); + List<CharSequence> rightReplies = createReplies("first reply", "second reply"); + List<Notification.Action> leftActions = Arrays.asList( + createAction("firstAction"), + createAction("secondAction")); + List<Notification.Action> rightActions = Arrays.asList( + createAction("firstAction"), + createAction("secondAction")); + List<Integer> leftSuppressed = Arrays.asList(1, 2); + List<Integer> rightSuppressed = Arrays.asList(1, 3); + boolean leftPhishing = true; + boolean rightPhishing = true; + + InflatedSmartReplyState leftRepliesAndActions = new InflatedSmartReplyState( + new SmartReplies(leftReplies, null, null, false /* fromAssistant */), + new SmartActions(leftActions, false /* fromAssistant */), + new SuppressedActions(leftSuppressed), + leftPhishing); + InflatedSmartReplyState rightRepliesAndActions = new InflatedSmartReplyState( + new SmartReplies(rightReplies, null, null, false /* fromAssistant */), + new SmartActions(rightActions, false /* fromAssistant */), + new SuppressedActions(rightSuppressed), + rightPhishing); + + assertThat(SmartReplyStateInflaterKt + .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) + .isFalse(); + } + + @Test + public void areSuggestionsSimilar_falseForDifferentPhishing() { + List<CharSequence> leftReplies = createReplies("first reply", "second reply"); + List<CharSequence> rightReplies = createReplies("first reply", "second reply"); + List<Notification.Action> leftActions = Arrays.asList( + createAction("firstAction"), + createAction("secondAction")); + List<Notification.Action> rightActions = Arrays.asList( + createAction("firstAction"), + createAction("secondAction")); + List<Integer> leftSuppressed = Arrays.asList(1, 2); + List<Integer> rightSuppressed = Arrays.asList(1, 2); + boolean leftPhishing = true; + boolean rightPhishing = false; - SmartRepliesAndActions leftRepliesAndActions = new SmartRepliesAndActions( + InflatedSmartReplyState leftRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(leftReplies, null, null, false /* fromAssistant */), - new SmartActions(leftActions, false /* fromAssistant */)); - SmartRepliesAndActions rightRepliesAndActions = new SmartRepliesAndActions( + new SmartActions(leftActions, false /* fromAssistant */), + new SuppressedActions(leftSuppressed), + leftPhishing); + InflatedSmartReplyState rightRepliesAndActions = new InflatedSmartReplyState( new SmartReplies(rightReplies, null, null, false /* fromAssistant */), - new SmartActions(rightActions, false /* fromAssistant */)); + new SmartActions(rightActions, false /* fromAssistant */), + new SuppressedActions(rightSuppressed), + rightPhishing); - assertThat(SmartRepliesAndActionsInflaterKt.areSuggestionsSimilar( - leftRepliesAndActions, rightRepliesAndActions)).isFalse(); + assertThat(SmartReplyStateInflaterKt + .areSuggestionsSimilar(leftRepliesAndActions, rightRepliesAndActions)) + .isFalse(); } private void setupAppGeneratedReplies(CharSequence[] smartReplies) { diff --git a/services/Android.bp b/services/Android.bp index 8aae8e684bc5..19375c959939 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -33,6 +33,7 @@ filegroup { ":services.startop.iorap-sources", ":services.systemcaptions-sources", ":services.translation-sources", + ":services.texttospeech-sources", ":services.usage-sources", ":services.usb-sources", ":services.voiceinteraction-sources", @@ -91,6 +92,7 @@ java_library { "services.startop", "services.systemcaptions", "services.translation", + "services.texttospeech", "services.usage", "services.usb", "services.voiceinteraction", diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 5077cc622934..9d86f4eaa520 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -90,6 +90,7 @@ import android.net.IConnectivityDiagnosticsCallback; import android.net.IConnectivityManager; import android.net.IDnsResolver; import android.net.INetd; +import android.net.INetworkActivityListener; import android.net.INetworkManagementEventObserver; import android.net.INetworkMonitor; import android.net.INetworkMonitorCallbacks; @@ -147,13 +148,13 @@ import android.net.netlink.InetDiagMessage; import android.net.shared.PrivateDnsConfig; import android.net.util.MultinetworkPolicyTracker; import android.net.util.NetdService; +import android.os.BatteryStatsManager; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; -import android.os.INetworkActivityListener; import android.os.INetworkManagementService; import android.os.Looper; import android.os.Message; @@ -163,6 +164,7 @@ import android.os.Parcelable; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Process; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.os.SystemClock; @@ -172,6 +174,7 @@ import android.os.UserManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.LocalLog; import android.util.Log; @@ -559,6 +562,11 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_SET_OEM_NETWORK_PREFERENCE = 48; /** + * Used to indicate the system default network becomes active. + */ + private static final int EVENT_REPORT_NETWORK_ACTIVITY = 49; + + /** * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification * should be shown. */ @@ -1192,7 +1200,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mUserAllContext.registerReceiver(mIntentReceiver, intentFilter, null /* broadcastPermission */, mHandler); - mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNMS); + mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNMS, mNetd); mSettingsObserver = new SettingsObserver(mContext, mHandler); registerSettingsCallbacks(); @@ -2404,7 +2412,7 @@ public class ConnectivityService extends IConnectivityManager.Stub */ @Override public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) { - // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here + mNetworkActivityTracker.registerNetworkActivityListener(l); } /** @@ -2412,7 +2420,7 @@ public class ConnectivityService extends IConnectivityManager.Stub */ @Override public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) { - // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here + mNetworkActivityTracker.unregisterNetworkActivityListener(l); } /** @@ -2420,8 +2428,7 @@ public class ConnectivityService extends IConnectivityManager.Stub */ @Override public boolean isDefaultNetworkActive() { - // TODO: Replace isNetworkActive() in NMS. - return false; + return mNetworkActivityTracker.isDefaultNetworkActive(); } /** @@ -2686,6 +2693,12 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.increaseIndent(); mPermissionMonitor.dump(pw); pw.decreaseIndent(); + + pw.println(); + pw.println("Legacy network activity:"); + pw.increaseIndent(); + mNetworkActivityTracker.dump(pw); + pw.decreaseIndent(); } private void dumpNetworks(IndentingPrintWriter pw) { @@ -4452,6 +4465,9 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e); } break; + case EVENT_REPORT_NETWORK_ACTIVITY: + mNetworkActivityTracker.handleReportNetworkActivity(); + break; } } } @@ -8639,13 +8655,35 @@ public class ConnectivityService extends IConnectivityManager.Stub * changes. */ private static final class LegacyNetworkActivityTracker { + private static final int NO_UID = -1; private final Context mContext; + private final INetd mNetd; private final INetworkManagementService mNMS; + private final RemoteCallbackList<INetworkActivityListener> mNetworkActivityListeners = + new RemoteCallbackList<>(); + // Indicate the current system default network activity is active or not. + @GuardedBy("mActiveIdleTimers") + private boolean mNetworkActive; + @GuardedBy("mActiveIdleTimers") + private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap(); + private final Handler mHandler; + + private class IdleTimerParams { + public final int timeout; + public final int transportType; + + IdleTimerParams(int timeout, int transport) { + this.timeout = timeout; + this.transportType = transport; + } + } - LegacyNetworkActivityTracker(@NonNull Context context, - @NonNull INetworkManagementService nms) { + LegacyNetworkActivityTracker(@NonNull Context context, @NonNull Handler handler, + @NonNull INetworkManagementService nms, @NonNull INetd netd) { mContext = context; mNMS = nms; + mNetd = netd; + mHandler = handler; try { mNMS.registerObserver(mDataActivityObserver); } catch (RemoteException e) { @@ -8661,9 +8699,50 @@ public class ConnectivityService extends IConnectivityManager.Stub long tsNanos, int uid) { sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active, tsNanos); + synchronized (mActiveIdleTimers) { + mNetworkActive = active; + // If there are no idle timers, it means that system is not monitoring + // activity, so the system default network for those default network + // unspecified apps is always considered active. + // + // TODO: If the mActiveIdleTimers is empty, netd will actually not send + // any network activity change event. Whenever this event is received, + // the mActiveIdleTimers should be always not empty. The legacy behavior + // is no-op. Remove to refer to mNetworkActive only. + if (mNetworkActive || mActiveIdleTimers.isEmpty()) { + mHandler.sendMessage( + mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY)); + } + } } }; + // The network activity should only be updated from ConnectivityService handler thread + // when mActiveIdleTimers lock is held. + @GuardedBy("mActiveIdleTimers") + private void reportNetworkActive() { + final int length = mNetworkActivityListeners.beginBroadcast(); + if (DDBG) log("reportNetworkActive, notify " + length + " listeners"); + try { + for (int i = 0; i < length; i++) { + try { + mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive(); + } catch (RemoteException | RuntimeException e) { + loge("Fail to send network activie to listener " + e); + } + } + } finally { + mNetworkActivityListeners.finishBroadcast(); + } + } + + @GuardedBy("mActiveIdleTimers") + public void handleReportNetworkActivity() { + synchronized (mActiveIdleTimers) { + reportNetworkActive(); + } + } + // This is deprecated and only to support legacy use cases. private int transportTypeToLegacyType(int type) { switch (type) { @@ -8728,10 +8807,17 @@ public class ConnectivityService extends IConnectivityManager.Stub return; // do not track any other networks } + updateRadioPowerState(true /* isActive */, type); + if (timeout > 0 && iface != null) { try { - // TODO: Access INetd directly instead of NMS - mNMS.addIdleTimer(iface, timeout, type); + synchronized (mActiveIdleTimers) { + // Networks start up. + mNetworkActive = true; + mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type)); + mNetd.idletimerAddInterface(iface, timeout, Integer.toString(type)); + reportNetworkActive(); + } } catch (Exception e) { // You shall not crash! loge("Exception in setupDataActivityTracking " + e); @@ -8746,16 +8832,28 @@ public class ConnectivityService extends IConnectivityManager.Stub final String iface = networkAgent.linkProperties.getInterfaceName(); final NetworkCapabilities caps = networkAgent.networkCapabilities; - if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) - || caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) { - try { - // the call fails silently if no idle timer setup for this interface - // TODO: Access INetd directly instead of NMS - mNMS.removeIdleTimer(iface); - } catch (Exception e) { - // You shall not crash! - loge("Exception in removeDataActivityTracking " + e); + if (iface == null) return; + + final int type; + if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + type = NetworkCapabilities.TRANSPORT_CELLULAR; + } else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + type = NetworkCapabilities.TRANSPORT_WIFI; + } else { + return; // do not track any other networks + } + + try { + updateRadioPowerState(false /* isActive */, type); + synchronized (mActiveIdleTimers) { + final IdleTimerParams params = mActiveIdleTimers.remove(iface); + // The call fails silently if no idle timer setup for this interface + mNetd.idletimerRemoveInterface(iface, params.timeout, + Integer.toString(params.transportType)); } + } catch (Exception e) { + // You shall not crash! + loge("Exception in removeDataActivityTracking " + e); } } @@ -8771,6 +8869,53 @@ public class ConnectivityService extends IConnectivityManager.Stub removeDataActivityTracking(oldNetwork); } } + + private void updateRadioPowerState(boolean isActive, int transportType) { + final BatteryStatsManager bs = mContext.getSystemService(BatteryStatsManager.class); + switch (transportType) { + case NetworkCapabilities.TRANSPORT_CELLULAR: + bs.reportMobileRadioPowerState(isActive, NO_UID); + break; + case NetworkCapabilities.TRANSPORT_WIFI: + bs.reportWifiRadioPowerState(isActive, NO_UID); + break; + default: + logw("Untracked transport type:" + transportType); + } + } + + public boolean isDefaultNetworkActive() { + synchronized (mActiveIdleTimers) { + // If there are no idle timers, it means that system is not monitoring activity, + // so the default network is always considered active. + // + // TODO : Distinguish between the cases where mActiveIdleTimers is empty because + // tracking is disabled (negative idle timer value configured), or no active default + // network. In the latter case, this reports active but it should report inactive. + return mNetworkActive || mActiveIdleTimers.isEmpty(); + } + } + + public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) { + mNetworkActivityListeners.register(l); + } + + public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) { + mNetworkActivityListeners.unregister(l); + } + + public void dump(IndentingPrintWriter pw) { + synchronized (mActiveIdleTimers) { + pw.print("mNetworkActive="); pw.println(mNetworkActive); + pw.println("Idle timers:"); + for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) { + pw.print(" "); pw.print(ent.getKey()); pw.println(":"); + final IdleTimerParams params = ent.getValue(); + pw.print(" timeout="); pw.print(params.timeout); + pw.print(" type="); pw.println(params.transportType); + } + } + } } /** @@ -8888,7 +9033,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updateDefaultNetworksForOemNetworkPreference( @NonNull final Set<NetworkRequestInfo> nris) { - handleRemoveNetworkRequests(mDefaultNetworkRequests); + // Pass in a defensive copy as this collection will be updated on remove. + handleRemoveNetworkRequests(new ArraySet<>(mDefaultNetworkRequests)); addPerAppDefaultNetworkRequests(nris); } diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index d30a6405e95d..44054088d937 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -69,7 +69,6 @@ import android.os.BatteryStats; import android.os.Binder; import android.os.Handler; import android.os.IBinder; -import android.os.INetworkActivityListener; import android.os.INetworkManagementService; import android.os.Process; import android.os.RemoteCallbackList; @@ -80,7 +79,6 @@ import android.os.StrictMode; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; -import android.telephony.DataConnectionRealTimeInfo; import android.text.TextUtils; import android.util.Log; import android.util.Slog; @@ -229,32 +227,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @GuardedBy("mQuotaLock") private volatile boolean mDataSaverMode; - private final Object mIdleTimerLock = new Object(); - /** Set of interfaces with active idle timers. */ - private static class IdleTimerParams { - public final int timeout; - public final int type; - public int networkCount; - - IdleTimerParams(int timeout, int type) { - this.timeout = timeout; - this.type = type; - this.networkCount = 1; - } - } - private HashMap<String, IdleTimerParams> mActiveIdleTimers = Maps.newHashMap(); - private volatile boolean mFirewallEnabled; private volatile boolean mStrictEnabled; - private boolean mMobileActivityFromRadio = false; - private int mLastPowerStateFromRadio = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW; - private int mLastPowerStateFromWifi = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW; - - private final RemoteCallbackList<INetworkActivityListener> mNetworkActivityListeners = - new RemoteCallbackList<>(); - private boolean mNetworkActive; - /** * Constructs a new NetworkManagementService instance * @@ -397,55 +372,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub { */ private void notifyInterfaceClassActivity(int type, boolean isActive, long tsNanos, int uid) { - final boolean isMobile = ConnectivityManager.isNetworkTypeMobile(type); - int powerState = isActive - ? DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH - : DataConnectionRealTimeInfo.DC_POWER_STATE_LOW; - if (isMobile) { - if (mLastPowerStateFromRadio != powerState) { - mLastPowerStateFromRadio = powerState; - try { - // TODO: The interface changes that comes from netd are handled by BSS itself. - // There are still events caused by setting or removing idle timer, so keep - // reporting from here until setting idler timer moved to CS. - getBatteryStats().noteMobileRadioPowerState(powerState, tsNanos, uid); - } catch (RemoteException e) { - } - } - } - - if (ConnectivityManager.isNetworkTypeWifi(type)) { - if (mLastPowerStateFromWifi != powerState) { - mLastPowerStateFromWifi = powerState; - try { - // TODO: The interface changes that comes from netd are handled by BSS itself. - // There are still events caused by setting or removing idle timer, so keep - // reporting from here until setting idler timer moved to CS. - getBatteryStats().noteWifiRadioPowerState(powerState, tsNanos, uid); - } catch (RemoteException e) { - } - } - } - - final boolean active = isActive; invokeForAllObservers(o -> o.interfaceClassDataActivityChanged( - type, active, tsNanos, uid)); - - boolean report = false; - synchronized (mIdleTimerLock) { - if (mActiveIdleTimers.isEmpty()) { - // If there are no idle timers, we are not monitoring activity, so we - // are always considered active. - isActive = true; - } - if (mNetworkActive != isActive) { - mNetworkActive = isActive; - report = isActive; - } - } - if (report) { - reportNetworkActive(); - } + type, isActive, tsNanos, uid)); } @Override @@ -1122,60 +1050,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } @Override - public void addIdleTimer(String iface, int timeout, final int type) { - NetworkStack.checkNetworkStackPermission(mContext); - - if (DBG) Slog.d(TAG, "Adding idletimer"); - - synchronized (mIdleTimerLock) { - IdleTimerParams params = mActiveIdleTimers.get(iface); - if (params != null) { - // the interface already has idletimer, update network count - params.networkCount++; - return; - } - - try { - mNetdService.idletimerAddInterface(iface, timeout, Integer.toString(type)); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type)); - - // Networks start up. - if (ConnectivityManager.isNetworkTypeMobile(type)) { - mNetworkActive = false; - } - mDaemonHandler.post(() -> notifyInterfaceClassActivity(type, true, - SystemClock.elapsedRealtimeNanos(), -1)); - } - } - - @Override - public void removeIdleTimer(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); - - if (DBG) Slog.d(TAG, "Removing idletimer"); - - synchronized (mIdleTimerLock) { - final IdleTimerParams params = mActiveIdleTimers.get(iface); - if (params == null || --(params.networkCount) > 0) { - return; - } - - try { - mNetdService.idletimerRemoveInterface(iface, - params.timeout, Integer.toString(params.type)); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - mActiveIdleTimers.remove(iface); - mDaemonHandler.post(() -> notifyInterfaceClassActivity(params.type, false, - SystemClock.elapsedRealtimeNanos(), -1)); - } - } - - @Override public void setInterfaceQuota(String iface, long quotaBytes) { NetworkStack.checkNetworkStackPermission(mContext); @@ -1813,44 +1687,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } @Override - public void registerNetworkActivityListener(INetworkActivityListener listener) { - mNetworkActivityListeners.register(listener); - } - - @Override - public void unregisterNetworkActivityListener(INetworkActivityListener listener) { - mNetworkActivityListeners.unregister(listener); - } - - @Override - public boolean isNetworkActive() { - synchronized (mNetworkActivityListeners) { - return mNetworkActive || mActiveIdleTimers.isEmpty(); - } - } - - private void reportNetworkActive() { - final int length = mNetworkActivityListeners.beginBroadcast(); - try { - for (int i = 0; i < length; i++) { - try { - mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive(); - } catch (RemoteException | RuntimeException e) { - } - } - } finally { - mNetworkActivityListeners.finishBroadcast(); - } - } - - @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; - pw.print("mMobileActivityFromRadio="); pw.print(mMobileActivityFromRadio); - pw.print(" mLastPowerStateFromRadio="); pw.println(mLastPowerStateFromRadio); - pw.print("mNetworkActive="); pw.println(mNetworkActive); - synchronized (mQuotaLock) { pw.print("Active quota ifaces: "); pw.println(mActiveQuotas.toString()); pw.print("Active alert ifaces: "); pw.println(mActiveAlerts.toString()); @@ -1882,17 +1721,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { mUidFirewallRestrictedRules); } - synchronized (mIdleTimerLock) { - pw.println("Idle timers:"); - for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) { - pw.print(" "); pw.print(ent.getKey()); pw.println(":"); - IdleTimerParams params = ent.getValue(); - pw.print(" timeout="); pw.print(params.timeout); - pw.print(" type="); pw.print(params.type); - pw.print(" networkCount="); pw.println(params.networkCount); - } - } - pw.print("Firewall enabled: "); pw.println(mFirewallEnabled); pw.print("Netd service status: " ); if (mNetdService == null) { diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index 67f6ec9f9a41..f5c2aacaebb0 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -259,10 +259,7 @@ public class PackageWatchdog { mIsPackagesReady = true; mHealthCheckController.setCallbacks(packageName -> onHealthCheckPassed(packageName), packages -> onSupportedPackages(packages), - () -> { - syncRequestsAsync(); - mSyncRequired = true; - }); + this::onSyncRequestNotified); setPropertyChangedListenerLocked(); updateConfigs(); registerConnectivityModuleHealthListener(); @@ -537,6 +534,7 @@ public class PackageWatchdog { synchronized (mLock) { mIsHealthCheckEnabled = enabled; mHealthCheckController.setEnabled(enabled); + mSyncRequired = true; // Prune to update internal state whenever health check is enabled/disabled syncState("health check state " + (enabled ? "enabled" : "disabled")); } @@ -788,6 +786,13 @@ public class PackageWatchdog { } } + private void onSyncRequestNotified() { + synchronized (mLock) { + mSyncRequired = true; + syncRequestsAsync(); + } + } + @GuardedBy("mLock") private Set<String> getPackagesPendingHealthChecksLocked() { Set<String> packages = new ArraySet<>(); diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 8b6fabd7faff..34ff77494f94 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -825,7 +825,8 @@ public final class BroadcastQueue { r.resultExtras, r.ordered, r.initialSticky, r.userId); // parallel broadcasts are fire-and-forget, not bookended by a call to // finishReceiverLocked(), so we manage their activity-start token here - if (r.allowBackgroundActivityStarts && !r.ordered) { + if (filter.receiverList.app != null + && r.allowBackgroundActivityStarts && !r.ordered) { postActivityStartTokenRemoval(filter.receiverList.app, r); } } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 6f625a745ef6..29ee8b6c675d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -178,6 +178,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BooleanSupplier; import java.util.stream.Collectors; @@ -330,7 +331,8 @@ public class AudioService extends IAudioService.Stub private SettingsObserver mSettingsObserver; - private int mMode = AudioSystem.MODE_NORMAL; + private AtomicInteger mMode = new AtomicInteger(AudioSystem.MODE_NORMAL); + // protects mRingerMode private final Object mSettingsLock = new Object(); @@ -2996,7 +2998,7 @@ public class AudioService extends IAudioService.Stub } /*package*/ int getHearingAidStreamType() { - return getHearingAidStreamType(getMode()); + return getHearingAidStreamType(mMode.get()); } private int getHearingAidStreamType(int mode) { @@ -3136,7 +3138,8 @@ public class AudioService extends IAudioService.Stub private void dumpAudioMode(PrintWriter pw) { pw.println("\nAudio mode: "); - pw.println("- Current mode = " + AudioSystem.modeToString(getMode())); + pw.println("- Requested mode = " + AudioSystem.modeToString(getMode())); + pw.println("- Actual mode = " + AudioSystem.modeToString(mMode.get())); pw.println("- Mode owner: "); SetModeDeathHandler hdlr = getAudioModeOwnerHandler(); if (hdlr != null) { @@ -4477,10 +4480,10 @@ public class AudioService extends IAudioService.Stub pid = currentModeHandler.getPid(); } if (DEBUG_MODE) { - Log.v(TAG, "onUpdateAudioMode() mode: " + mode + ", mMode: " + mMode - + " requestedMode: " + requestedMode); + Log.v(TAG, "onUpdateAudioMode() new mode: " + mode + ", current mode: " + + mMode.get() + " requested mode: " + requestedMode); } - if (mode != mMode) { + if (mode != mMode.get()) { final long identity = Binder.clearCallingIdentity(); int status = mAudioSystem.setPhoneState(mode, uid); Binder.restoreCallingIdentity(identity); @@ -4488,8 +4491,7 @@ public class AudioService extends IAudioService.Stub if (DEBUG_MODE) { Log.v(TAG, "onUpdateAudioMode: mode successfully set to " + mode); } - int previousMode = mMode; - mMode = mode; + int previousMode = mMode.getAndSet(mode); // Note: newModeOwnerPid is always 0 when actualMode is MODE_NORMAL mModeLogger.log(new PhoneStateEvent(requesterPackage, requesterPid, requestedMode, pid, mode)); @@ -5413,8 +5415,10 @@ public class AudioService extends IAudioService.Stub IsInCall = telecomManager.isInCall(); Binder.restoreCallingIdentity(ident); - return (IsInCall || getMode() == AudioManager.MODE_IN_COMMUNICATION || - getMode() == AudioManager.MODE_IN_CALL); + int mode = mMode.get(); + return (IsInCall + || mode == AudioManager.MODE_IN_COMMUNICATION + || mode == AudioManager.MODE_IN_CALL); } /** diff --git a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java index 16f82af93856..8197edc97a05 100644 --- a/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/RemovalClient.java @@ -96,4 +96,9 @@ public abstract class RemovalClient<S extends BiometricAuthenticator.Identifier, public int getProtoEnum() { return BiometricsProto.CM_REMOVE; } + + @Override + public boolean interruptsPrecedingClients() { + return true; + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java index ff65c931dd78..afa5bd22e081 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java @@ -22,6 +22,7 @@ import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.face.ISession; import android.hardware.biometrics.face.ISessionCallback; import android.hardware.biometrics.face.SensorProps; +import android.hardware.biometrics.face.SessionState; import android.hardware.common.NativeHandle; import android.hardware.keymaster.HardwareAuthToken; import android.os.RemoteException; @@ -131,6 +132,15 @@ public class TestHal extends IFace.Stub { Slog.w(TAG, "resetLockout, cookie: " + cookie); cb.onLockoutCleared(); } + + @Override + public void close(int cookie) throws RemoteException { + cb.onStateChanged(cookie, SessionState.CLOSED); + } }; } + + @Override + public void reset() { + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java index 8ed24b6f9d48..9db2fcfd1b5b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java @@ -22,6 +22,7 @@ import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.ISession; import android.hardware.biometrics.fingerprint.ISessionCallback; import android.hardware.biometrics.fingerprint.SensorProps; +import android.hardware.biometrics.fingerprint.SessionState; import android.hardware.keymaster.HardwareAuthToken; import android.os.RemoteException; import android.util.Slog; @@ -119,6 +120,11 @@ public class TestHal extends IFingerprint.Stub { } @Override + public void close(int cookie) throws RemoteException { + cb.onStateChanged(cookie, SessionState.CLOSED); + } + + @Override public void onPointerDown(int pointerId, int x, int y, float minor, float major) { Slog.w(TAG, "onPointerDown"); } @@ -134,4 +140,9 @@ public class TestHal extends IFingerprint.Stub { } }; } + + @Override + public void reset() { + } } + diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index c05e25367d03..4cf527415d7e 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -899,7 +899,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { ? networkAgentConfig.subscriberId : null; return new NetworkState(new NetworkInfo(networkInfo), new LinkProperties(linkProperties), - new NetworkCapabilities(networkCapabilities), network, subscriberId, null); + new NetworkCapabilities(networkCapabilities), network, subscriberId); } } diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java index c4c0f688bd67..bd577f35f0a5 100644 --- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java @@ -371,6 +371,9 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem int durationMs) { Slog.i(mTag, "setTemporaryService(" + userId + ") to " + componentName + " for " + durationMs + "ms"); + if (mServiceNameResolver == null) { + return; + } enforceCallingPermissionForManagement(); Objects.requireNonNull(componentName); @@ -404,6 +407,9 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem enforceCallingPermissionForManagement(); synchronized (mLock) { + if (mServiceNameResolver == null) { + return false; + } final boolean changed = mServiceNameResolver.setDefaultServiceEnabled(userId, enabled); if (!changed) { if (verbose) { @@ -434,6 +440,10 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem public final boolean isDefaultServiceEnabled(@UserIdInt int userId) { enforceCallingPermissionForManagement(); + if (mServiceNameResolver == null) { + return false; + } + synchronized (mLock) { return mServiceNameResolver.isDefaultServiceEnabled(userId); } @@ -958,6 +968,10 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem public void onPackageModified(String packageName) { if (verbose) Slog.v(mTag, "onPackageModified(): " + packageName); + if (mServiceNameResolver == null) { + return; + } + final int userId = getChangingUserId(); final String serviceName = mServiceNameResolver.getDefaultServiceName(userId); if (serviceName == null) { diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 4e974112a5c3..c5be20e39864 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -37,6 +37,7 @@ import android.content.res.Resources.NotFoundException; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.database.ContentObserver; +import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayViewport; import android.hardware.input.IInputDevicesChangedListener; @@ -69,6 +70,7 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ShellCallback; +import android.os.SystemProperties; import android.os.UserHandle; import android.os.VibrationEffect; import android.provider.DeviceConfig; @@ -168,6 +170,9 @@ public class InputManagerService extends IInputManager.Stub /** TODO(b/169067926): Remove this. */ private static final boolean UNTRUSTED_TOUCHES_TOAST = false; + public static final boolean ENABLE_PER_WINDOW_INPUT_ROTATION = + SystemProperties.getBoolean("persist.debug.per_window_input_rotation", false); + // Pointer to native input manager service object. private final long mPtr; @@ -518,8 +523,51 @@ public class InputManagerService extends IInputManager.Stub nativeReloadDeviceAliases(mPtr); } + /** Rotates CCW by `delta` 90-degree increments. */ + private static void rotateBounds(Rect inOutBounds, int parentW, int parentH, int delta) { + int rdelta = ((delta % 4) + 4) % 4; + int origLeft = inOutBounds.left; + switch (rdelta) { + case 0: + return; + case 1: + inOutBounds.left = inOutBounds.top; + inOutBounds.top = parentW - inOutBounds.right; + inOutBounds.right = inOutBounds.bottom; + inOutBounds.bottom = parentW - origLeft; + return; + case 2: + inOutBounds.left = parentW - inOutBounds.right; + inOutBounds.right = parentW - origLeft; + return; + case 3: + inOutBounds.left = parentH - inOutBounds.bottom; + inOutBounds.bottom = inOutBounds.right; + inOutBounds.right = parentH - inOutBounds.top; + inOutBounds.top = origLeft; + return; + } + } + private void setDisplayViewportsInternal(List<DisplayViewport> viewports) { - nativeSetDisplayViewports(mPtr, viewports.toArray(new DisplayViewport[0])); + final DisplayViewport[] vArray = new DisplayViewport[viewports.size()]; + if (ENABLE_PER_WINDOW_INPUT_ROTATION) { + // Remove all viewport operations. They will be built-into the window transforms. + for (int i = viewports.size() - 1; i >= 0; --i) { + final DisplayViewport v = vArray[i] = viewports.get(i).makeCopy(); + // deviceWidth/Height are apparently in "rotated" space, so flip them if needed. + int dw = (v.orientation % 2) == 0 ? v.deviceWidth : v.deviceHeight; + int dh = (v.orientation % 2) == 0 ? v.deviceHeight : v.deviceWidth; + v.logicalFrame.set(0, 0, dw, dh); + v.physicalFrame.set(0, 0, dw, dh); + v.orientation = 0; + } + } else { + for (int i = viewports.size() - 1; i >= 0; --i) { + vArray[i] = viewports.get(i); + } + } + nativeSetDisplayViewports(mPtr, vArray); } /** diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java index 0737db7b8358..1b8f0ded2e79 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java @@ -124,9 +124,6 @@ public class ContextHubService extends IContextHubService.Stub { // True if WiFi is available for the Context Hub private boolean mIsWifiAvailable = false; - // True if audio is disabled for the ContextHub - private boolean mIsAudioDisabled = false; - // Lock object for sendWifiSettingUpdate() private final Object mSendWifiSettingUpdateLock = new Object(); @@ -1084,10 +1081,8 @@ public class ContextHubService extends IContextHubService.Stub { SensorPrivacyManager manager = SensorPrivacyManager.getInstance(mContext); boolean disabled = manager.isIndividualSensorPrivacyEnabled( SensorPrivacyManager.INDIVIDUAL_SENSOR_MICROPHONE); - if (mIsAudioDisabled != disabled) { - mIsAudioDisabled = disabled; - mContextHubWrapper.onMicrophoneDisableSettingChanged(disabled); - } + Log.d(TAG, "Mic Disabled Setting: " + disabled); + mContextHubWrapper.onMicrophoneDisableSettingChanged(disabled); } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 8da2d67d6691..2dd54482e2d8 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -88,6 +88,7 @@ import android.os.storage.StorageManager; import android.provider.Settings; import android.provider.Settings.Secure; import android.provider.Settings.SettingNotFoundException; +import android.security.AndroidKeyStoreMaintenance; import android.security.Authorization; import android.security.KeyStore; import android.security.keystore.AndroidKeyStoreProvider; @@ -224,7 +225,6 @@ public class LockSettingsService extends ILockSettings.Stub { private final SyntheticPasswordManager mSpManager; private final KeyStore mKeyStore; - private final RecoverableKeyStoreManager mRecoverableKeyStoreManager; private ManagedProfilePasswordCache mManagedProfilePasswordCache; @@ -795,6 +795,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) { // Notify keystore that a new user was added. final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); + AndroidKeyStoreMaintenance.onUserAdded(userHandle); final KeyStore ks = KeyStore.getInstance(); final UserInfo parentInfo = mUserManager.getProfileParent(userHandle); final int parentHandle = parentInfo != null ? parentInfo.id : -1; @@ -1266,6 +1267,7 @@ public class LockSettingsService extends ILockSettings.Stub { } private void setKeystorePassword(byte[] password, int userHandle) { + AndroidKeyStoreMaintenance.onUserPasswordChanged(userHandle, password); final KeyStore ks = KeyStore.getInstance(); // TODO(b/120484642): Update keystore to accept byte[] passwords String passwordString = password == null ? null : new String(password); @@ -1274,7 +1276,7 @@ public class LockSettingsService extends ILockSettings.Stub { private void unlockKeystore(byte[] password, int userHandle) { if (DEBUG) Slog.v(TAG, "Unlock keystore for user: " + userHandle); - new Authorization().onLockScreenEvent(false, userHandle, password); + Authorization.onLockScreenEvent(false, userHandle, password); // TODO(b/120484642): Update keystore to accept byte[] passwords String passwordString = password == null ? null : new String(password); final KeyStore ks = KeyStore.getInstance(); @@ -2292,6 +2294,7 @@ public class LockSettingsService extends ILockSettings.Stub { mSpManager.removeUser(userId); mStrongAuth.removeUser(userId); + AndroidKeyStoreMaintenance.onUserRemoved(userId); final KeyStore ks = KeyStore.getInstance(); ks.onUserRemoved(userId); mManagedProfilePasswordCache.removePassword(userId); diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java index 6d420a95e26c..35e6489debcf 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java @@ -18,7 +18,6 @@ package com.android.server.locksettings; import android.security.keystore.KeyProperties; import android.security.keystore.KeyProtection; -import android.security.keystore2.AndroidKeyStoreProvider; import android.util.Slog; import java.io.ByteArrayOutputStream; @@ -141,19 +140,8 @@ public class SyntheticPasswordCrypto { } } - /** - * TODO This function redirects keystore access to the legacy keystore during a transitional - * phase during which not all calling code has been adjusted to use Keystore 2.0. - * This can be reverted to a constant of "AndroidKeyStore" when b/171305684 is complete. - * The specific bug for this component is b/171305115. - */ static String androidKeystoreProviderName() { - if (AndroidKeyStoreProvider.isInstalled()) { - return "AndroidKeyStoreLegacy"; - } else { - return "AndroidKeystore"; - } - + return "AndroidKeyStore"; } public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) { diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java index 1051423ea17f..160d2daab6a2 100644 --- a/services/core/java/com/android/server/notification/NotificationDelegate.java +++ b/services/core/java/com/android/server/notification/NotificationDelegate.java @@ -18,6 +18,7 @@ package com.android.server.notification; import android.app.Notification; import android.net.Uri; +import android.os.Bundle; import android.os.UserHandle; import android.service.notification.NotificationStats; @@ -88,5 +89,13 @@ public interface NotificationDelegate { void onNotificationSmartReplySent(String key, int clickedIndex, CharSequence reply, int notificationLocation, boolean modifiedBeforeSending); + /** + * Notifies a user feedback is provided. + * + * @param key the notification key + * @param feedback the feedback detail + */ + void onNotificationFeedbackReceived(String key, Bundle feedback); + void prepareForPossibleShutdown(); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 917be29243ad..8b4c6392fec0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -172,7 +172,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; -import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutServiceInternal; @@ -215,7 +214,6 @@ import android.provider.DeviceConfig; import android.provider.Settings; import android.service.notification.Adjustment; import android.service.notification.Condition; -import android.service.notification.ConditionProviderService; import android.service.notification.ConversationChannelWrapper; import android.service.notification.IConditionProvider; import android.service.notification.INotificationListener; @@ -383,7 +381,8 @@ public class NotificationManagerService extends SystemService { Adjustment.KEY_TEXT_REPLIES, Adjustment.KEY_NOT_CONVERSATION, Adjustment.KEY_IMPORTANCE, - Adjustment.KEY_RANKING_SCORE}; + Adjustment.KEY_RANKING_SCORE + }; static final String[] NON_BLOCKABLE_DEFAULT_ROLES = new String[] { RoleManager.ROLE_DIALER, @@ -432,8 +431,6 @@ public class NotificationManagerService extends SystemService { private static final String SCHEME_TIMEOUT = "timeout"; private static final String EXTRA_KEY = "key"; - private static final String FEEDBACK_KEY = "feedback_key"; - private static final int NOTIFICATION_INSTANCE_ID_MAX = (1 << 13); /** @@ -1020,30 +1017,26 @@ public class NotificationManagerService extends SystemService { return; } final long now = System.currentTimeMillis(); - //TODO(b/154257994): remove this when feedback apis are in place - boolean isFeedback = action.getExtras().containsKey(FEEDBACK_KEY); - if (!isFeedback) { - MetricsLogger.action(r.getLogMaker(now) - .setCategory(MetricsEvent.NOTIFICATION_ITEM_ACTION) - .setType(MetricsEvent.TYPE_ACTION) - .setSubtype(actionIndex) - .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank) - .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_COUNT, nv.count) - .addTaggedData(MetricsEvent.NOTIFICATION_ACTION_IS_SMART, - action.isContextual() ? 1 : 0) - .addTaggedData( - MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED, - generatedByAssistant ? 1 : 0) - .addTaggedData(MetricsEvent.NOTIFICATION_LOCATION, - nv.location.toMetricsEventEnum())); - mNotificationRecordLogger.log( - NotificationRecordLogger.NotificationEvent.fromAction(actionIndex, - generatedByAssistant, action.isContextual()), r); - EventLogTags.writeNotificationActionClicked(key, actionIndex, - r.getLifespanMs(now), r.getFreshnessMs(now), r.getExposureMs(now), - nv.rank, nv.count); - nv.recycle(); - } + MetricsLogger.action(r.getLogMaker(now) + .setCategory(MetricsEvent.NOTIFICATION_ITEM_ACTION) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(actionIndex) + .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank) + .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_COUNT, nv.count) + .addTaggedData(MetricsEvent.NOTIFICATION_ACTION_IS_SMART, + action.isContextual() ? 1 : 0) + .addTaggedData( + MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED, + generatedByAssistant ? 1 : 0) + .addTaggedData(MetricsEvent.NOTIFICATION_LOCATION, + nv.location.toMetricsEventEnum())); + mNotificationRecordLogger.log( + NotificationRecordLogger.NotificationEvent.fromAction(actionIndex, + generatedByAssistant, action.isContextual()), r); + EventLogTags.writeNotificationActionClicked(key, actionIndex, + r.getLifespanMs(now), r.getFreshnessMs(now), r.getExposureMs(now), + nv.rank, nv.count); + nv.recycle(); reportUserInteraction(r); mAssistants.notifyAssistantActionClicked(r, action, generatedByAssistant); } @@ -1386,6 +1379,20 @@ public class NotificationManagerService extends SystemService { } } } + + @Override + public void onNotificationFeedbackReceived(String key, Bundle feedback) { + exitIdle(); + synchronized (mNotificationLock) { + NotificationRecord r = mNotificationsByKey.get(key); + if (r == null) { + if (DBG) Slog.w(TAG, "No notification with key: " + key); + return; + } + mAssistants.notifyAssistantFeedbackReceived(r, feedback); + } + } + }; @VisibleForTesting @@ -9505,6 +9512,26 @@ public class NotificationManagerService extends SystemService { }); } + @GuardedBy("mNotificationLock") + void notifyAssistantFeedbackReceived(final NotificationRecord r, Bundle feedback) { + final StatusBarNotification sbn = r.getSbn(); + + for (final ManagedServiceInfo info : NotificationAssistants.this.getServices()) { + boolean sbnVisible = isVisibleToListener( + sbn, r.getNotificationType(), info) + && info.isSameUser(r.getUserId()); + if (sbnVisible) { + final INotificationListener assistant = (INotificationListener) info.service; + try { + final NotificationRankingUpdate update = makeRankingUpdateLocked(info); + assistant.onNotificationFeedbackReceived(sbn.getKey(), update, feedback); + } catch (RemoteException ex) { + Slog.e(TAG, "unable to notify assistant (feedback): " + assistant, ex); + } + } + } + } + /** * Notifies the assistant something about the specified notification, only assistant * that is visible to the notification will be notified. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e6789d4ba8ac..14d15ac49227 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -389,6 +389,7 @@ import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationService; +import com.android.server.pm.verify.domain.DomainVerificationUtils; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2; @@ -2587,6 +2588,7 @@ public class PackageManagerService extends IPackageManager.Stub CrossProfileDomainInfo xpDomainInfo, int userId, boolean debug) { final ArrayList<ResolveInfo> result = new ArrayList<>(); final ArrayList<ResolveInfo> matchAllList = new ArrayList<>(); + final ArrayList<ResolveInfo> undefinedList = new ArrayList<>(); final int count = candidates.size(); // First, try to use approved apps. @@ -2595,32 +2597,47 @@ public class PackageManagerService extends IPackageManager.Stub // Add to the special match all list (Browser use case) if (info.handleAllWebDataURI) { matchAllList.add(info); + } else { + undefinedList.add(info); } } - Pair<List<ResolveInfo>, Integer> infosAndLevel = mDomainVerificationManager - .filterToApprovedApp(intent, candidates, userId, mSettings::getPackageLPr); - List<ResolveInfo> approvedInfos = infosAndLevel.first; - Integer highestApproval = infosAndLevel.second; - // We'll want to include browser possibilities in a few cases boolean includeBrowser = false; - // If no apps are approved for the domain, resolve only to browsers - if (approvedInfos.isEmpty()) { - // If the other profile has a result, include that and delegate to ResolveActivity + if (!DomainVerificationUtils.isDomainVerificationIntent(intent)) { + result.addAll(undefinedList); + // Maybe add one for the other profile. if (xpDomainInfo != null && xpDomainInfo.highestApprovalLevel > DomainVerificationManagerInternal.APPROVAL_LEVEL_NONE) { result.add(xpDomainInfo.resolveInfo); - } else { - includeBrowser = true; } + includeBrowser = true; } else { - result.addAll(approvedInfos); + Pair<List<ResolveInfo>, Integer> infosAndLevel = mDomainVerificationManager + .filterToApprovedApp(intent, undefinedList, userId, + mSettings::getPackageLPr); + List<ResolveInfo> approvedInfos = infosAndLevel.first; + Integer highestApproval = infosAndLevel.second; + + // If no apps are approved for the domain, resolve only to browsers + if (approvedInfos.isEmpty()) { + // If the other profile has a result, include that and delegate to + // ResolveActivity + if (xpDomainInfo != null && xpDomainInfo.highestApprovalLevel + > DomainVerificationManagerInternal.APPROVAL_LEVEL_NONE) { + result.add(xpDomainInfo.resolveInfo); + } else { + includeBrowser = true; + } + } else { + result.addAll(approvedInfos); - // If the other profile has an app that's of equal or higher approval, add it - if (xpDomainInfo != null && xpDomainInfo.highestApprovalLevel >= highestApproval) { - result.add(xpDomainInfo.resolveInfo); + // If the other profile has an app that's of equal or higher approval, add it + if (xpDomainInfo != null + && xpDomainInfo.highestApprovalLevel >= highestApproval) { + result.add(xpDomainInfo.resolveInfo); + } } } diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java index 474f822d6a73..475d3a87b427 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationUtils.java @@ -28,7 +28,7 @@ import com.android.server.compat.PlatformCompat; import com.android.server.pm.PackageManagerService; import com.android.server.pm.parsing.pkg.AndroidPackage; -final class DomainVerificationUtils { +public final class DomainVerificationUtils { /** * Consolidates package exception messages. A generic unavailable message is included since the @@ -40,7 +40,7 @@ final class DomainVerificationUtils { throw new NameNotFoundException("Package " + packageName + " unavailable"); } - static boolean isDomainVerificationIntent(Intent intent) { + public static boolean isDomainVerificationIntent(Intent intent) { return intent.isWebIntent() && intent.hasCategory(Intent.CATEGORY_BROWSABLE) && intent.hasCategory(Intent.CATEGORY_DEFAULT); diff --git a/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java b/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java index 0974537e2584..3f203026a219 100644 --- a/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java +++ b/services/core/java/com/android/server/speech/RemoteSpeechRecognitionService.java @@ -286,7 +286,7 @@ final class RemoteSpeechRecognitionService extends ServiceConnector.Impl<IRecogn } private void resetStateLocked() { - if (mRecordingInProgress && mPackageName != null && mFeatureId != null) { + if (mRecordingInProgress && mPackageName != null) { finishProxyOp(mPackageName, mFeatureId); } 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 15c72b34dbc0..342dbfa3f59d 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -2134,7 +2134,9 @@ public class StatsPullAtomService extends SystemService { metrics.kernelStackKb, metrics.totalIonKb, metrics.unaccountedKb, - metrics.gpuTotalUsageKb)); + metrics.gpuTotalUsageKb, + metrics.gpuPrivateAllocationsKb, + metrics.dmaBufTotalExportedKb)); return StatsManager.PULL_SUCCESS; } diff --git a/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java b/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java index 1e80c4fe89fb..628c1d61ce9a 100644 --- a/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java +++ b/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java @@ -28,6 +28,8 @@ final class SystemMemoryUtil { static Metrics getMetrics() { int totalIonKb = (int) Debug.getIonHeapsSizeKb(); int gpuTotalUsageKb = (int) Debug.getGpuTotalUsageKb(); + int gpuDmaBufUsageKb = (int) Debug.getGpuDmaBufUsageKb(); + int dmaBufTotalExportedKb = (int) Debug.getDmabufTotalExportedKb(); long[] mInfos = new long[Debug.MEMINFO_COUNT]; Debug.getMemInfo(mInfos); @@ -49,14 +51,36 @@ final class SystemMemoryUtil { + mInfos[Debug.MEMINFO_SLAB_UNRECLAIMABLE] + kReclaimableKb + mInfos[Debug.MEMINFO_VM_ALLOC_USED] - + mInfos[Debug.MEMINFO_PAGE_TABLES] - + Math.max(totalIonKb, 0); + + mInfos[Debug.MEMINFO_PAGE_TABLES]; if (!Debug.isVmapStack()) { // See b/146088882 accountedKb += mInfos[Debug.MEMINFO_KERNEL_STACK]; } + int gpuPrivateAllocationsKb = -1; + if (gpuTotalUsageKb >= 0 && gpuDmaBufUsageKb >= 0) { + gpuPrivateAllocationsKb = gpuTotalUsageKb - gpuDmaBufUsageKb; + } + // If we can distinguish gpu private allocs it means the dmabuf metrics + // are supported already. + if (dmaBufTotalExportedKb >= 0 && gpuPrivateAllocationsKb >= 0) { + // If we can calculate the overlap between dma memory and gpu + // drivers we can do more accurate tracking. But this is only + // available on 5.4+ kernels. + accountedKb += dmaBufTotalExportedKb + gpuPrivateAllocationsKb; + } else { + // If we cannot distinguish, accept that we will double count the + // dma buffers also used by the gpu driver. + accountedKb += Math.max(0, gpuTotalUsageKb); + if (dmaBufTotalExportedKb >= 0) { + accountedKb += dmaBufTotalExportedKb; + } else if (totalIonKb >= 0) { + // ION is a subset of total exported dmabuf memory. + accountedKb += totalIonKb; + } + } + Metrics result = new Metrics(); result.unreclaimableSlabKb = (int) mInfos[Debug.MEMINFO_SLAB_UNRECLAIMABLE]; result.vmallocUsedKb = (int) mInfos[Debug.MEMINFO_VM_ALLOC_USED]; @@ -64,6 +88,8 @@ final class SystemMemoryUtil { result.kernelStackKb = (int) mInfos[Debug.MEMINFO_KERNEL_STACK]; result.totalIonKb = totalIonKb; result.gpuTotalUsageKb = gpuTotalUsageKb; + result.gpuPrivateAllocationsKb = gpuPrivateAllocationsKb; + result.dmaBufTotalExportedKb = dmaBufTotalExportedKb; result.unaccountedKb = (int) (mInfos[Debug.MEMINFO_TOTAL] - accountedKb); return result; } @@ -75,6 +101,8 @@ final class SystemMemoryUtil { public int kernelStackKb; public int totalIonKb; public int gpuTotalUsageKb; + public int gpuPrivateAllocationsKb; + public int dmaBufTotalExportedKb; public int unaccountedKb; } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index d664651a68dc..a390df9edae1 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -1501,6 +1501,18 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override + public void onNotificationFeedbackReceived(String key, Bundle feedback) { + enforceStatusBarService(); + final long identity = Binder.clearCallingIdentity(); + try { + mNotificationDelegate.onNotificationFeedbackReceived(key, feedback); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + + @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver) { (new StatusBarShellCommand(this, mContext)).exec( diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index da3e48ad2c0d..4fbc79507b95 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -703,7 +703,7 @@ public class TrustManagerService extends SystemService { if (changed) { dispatchDeviceLocked(userId, locked); - mAuthorizationService.onLockScreenEvent(locked, userId, null); + Authorization.onLockScreenEvent(locked, userId, null); KeyStore.getInstance().onUserLockedStateChanged(userId, locked); // Also update the user's profiles who have unified challenge, since they // share the same unlocked state (see {@link #isDeviceLocked(int)}) @@ -1261,7 +1261,7 @@ public class TrustManagerService extends SystemService { mDeviceLockedForUser.put(userId, locked); } - mAuthorizationService.onLockScreenEvent(locked, userId, null); + Authorization.onLockScreenEvent(locked, userId, null); KeyStore.getInstance().onUserLockedStateChanged(userId, locked); if (locked) { diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 5697564ce93f..370d921de2af 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -31,6 +31,7 @@ import android.annotation.NonNull; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.ILocalWallpaperColorConsumer; import android.app.IWallpaperManager; import android.app.IWallpaperManagerCallback; import android.app.PendingIntent; @@ -59,6 +60,7 @@ import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.RectF; import android.hardware.display.DisplayManager; import android.os.Binder; import android.os.Bundle; @@ -85,7 +87,10 @@ import android.service.wallpaper.IWallpaperService; import android.service.wallpaper.WallpaperService; import android.system.ErrnoException; import android.system.Os; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.EventLog; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -105,7 +110,6 @@ import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemService; -import com.android.server.SystemService.TargetUser; import com.android.server.pm.UserManagerInternal; import com.android.server.utils.TimingsTraceAndSlog; import com.android.server.wm.WindowManagerInternal; @@ -136,6 +140,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub private static final String TAG = "WallpaperManagerService"; private static final boolean DEBUG = false; private static final boolean DEBUG_LIVE = true; + private static final @NonNull RectF LOCAL_COLOR_BOUNDS = + new RectF(0, 0, 1, 1); public static class Lifecycle extends SystemService { private IWallpaperManagerService mService; @@ -866,6 +872,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub private final SparseBooleanArray mUserRestorecon = new SparseBooleanArray(); private int mCurrentUserId = UserHandle.USER_NULL; private boolean mInAmbientMode; + private ArrayMap<IBinder, ArraySet<RectF>> mLocalColorCallbackAreas = + new ArrayMap<>(); + private ArrayMap<RectF, RemoteCallbackList<ILocalWallpaperColorConsumer>> + mLocalColorAreaCallbacks = new ArrayMap<>(); + private ArrayMap<Integer, ArraySet<RectF>> mLocalColorDisplayIdAreas = new ArrayMap<>(); + private ArrayMap<IBinder, Integer> mLocalColorCallbackDisplayId = new ArrayMap<>(); static class WallpaperData { @@ -1276,6 +1288,32 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } @Override + public void onLocalWallpaperColorsChanged(RectF area, WallpaperColors colors, + int displayId) { + forEachDisplayConnector(displayConnector -> { + if (displayConnector.mDisplayId == displayId) { + RemoteCallbackList<ILocalWallpaperColorConsumer> callbacks; + ArrayMap<IBinder, Integer> callbackDisplayIds; + synchronized (mLock) { + callbacks = mLocalColorAreaCallbacks.get(area); + callbackDisplayIds = new ArrayMap<>(mLocalColorCallbackDisplayId); + } + if (callbacks == null) return; + callbacks.broadcast(c -> { + try { + int targetDisplayId = + callbackDisplayIds.get(c.asBinder()); + if (targetDisplayId == displayId) c.onColorsChanged(area, colors); + } catch (RemoteException e) { + e.printStackTrace(); + } + }); + } + }); + } + + + @Override public void onServiceDisconnected(ComponentName name) { synchronized (mLock) { Slog.w(TAG, "Wallpaper service gone: " + name); @@ -1437,6 +1475,15 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } catch (RemoteException e) { Slog.w(TAG, "Failed to request wallpaper colors", e); } + + ArraySet<RectF> areas = mLocalColorDisplayIdAreas.get(displayId); + if (areas != null && areas.size() != 0) { + try { + connector.mEngine.addLocalColorsAreas(new ArrayList<>(areas)); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to register local colors areas", e); + } + } } } @@ -2340,6 +2387,115 @@ public class WallpaperManagerService extends IWallpaperManager.Stub return true; } + private IWallpaperEngine getEngine(int which, int userId, int displayId) { + WallpaperData wallpaperData = findWallpaperAtDisplay(userId, displayId); + if (wallpaperData == null) return null; + IWallpaperEngine engine = null; + synchronized (mLock) { + for (int i = 0; i < wallpaperData.connection.mDisplayConnector.size(); i++) { + int id = wallpaperData.connection.mDisplayConnector.get(i).mDisplayId; + int currentWhich = wallpaperData.connection.mDisplayConnector.get(i).mDisplayId; + if (id != displayId && currentWhich != which) continue; + engine = wallpaperData.connection.mDisplayConnector.get(i).mEngine; + break; + } + } + return engine; + } + + @Override + public void addOnLocalColorsChangedListener(@NonNull ILocalWallpaperColorConsumer callback, + @NonNull List<RectF> regions, int which, int userId, int displayId) + throws RemoteException { + if (which != FLAG_LOCK && which != FLAG_SYSTEM) { + throw new IllegalArgumentException("which should be either FLAG_LOCK or FLAG_SYSTEM"); + } + IWallpaperEngine engine = getEngine(which, userId, displayId); + if (engine == null) return; + ArrayList<RectF> validAreas = new ArrayList<>(regions.size()); + synchronized (mLock) { + ArraySet<RectF> areas = mLocalColorCallbackAreas.get(callback); + if (areas == null) areas = new ArraySet<>(regions.size()); + areas.addAll(regions); + mLocalColorCallbackAreas.put(callback.asBinder(), areas); + } + for (int i = 0; i < regions.size(); i++) { + if (!LOCAL_COLOR_BOUNDS.contains(regions.get(i))) { + continue; + } + RemoteCallbackList callbacks; + synchronized (mLock) { + callbacks = mLocalColorAreaCallbacks.get( + regions.get(i)); + if (callbacks == null) { + callbacks = new RemoteCallbackList(); + mLocalColorAreaCallbacks.put(regions.get(i), callbacks); + } + mLocalColorCallbackDisplayId.put(callback.asBinder(), displayId); + ArraySet<RectF> displayAreas = mLocalColorDisplayIdAreas.get(displayId); + if (displayAreas == null) { + displayAreas = new ArraySet<>(1); + mLocalColorDisplayIdAreas.put(displayId, displayAreas); + } + displayAreas.add(regions.get(i)); + } + validAreas.add(regions.get(i)); + callbacks.register(callback); + } + engine.addLocalColorsAreas(validAreas); + } + + @Override + public void removeOnLocalColorsChangedListener( + @NonNull ILocalWallpaperColorConsumer callback, int which, int userId, + int displayId) throws RemoteException { + if (which != FLAG_LOCK && which != FLAG_SYSTEM) { + throw new IllegalArgumentException("which should be either FLAG_LOCK or FLAG_SYSTEM"); + } + final UserHandle callingUser = Binder.getCallingUserHandle(); + if (callingUser.getIdentifier() != userId) { + throw new SecurityException("calling user id does not match"); + } + final long identity = Binder.clearCallingIdentity(); + ArrayList<RectF> removeAreas = new ArrayList<>(); + ArrayList<Pair<RemoteCallbackList, ILocalWallpaperColorConsumer>> + callbacksToRemove = new ArrayList<>(); + try { + synchronized (mLock) { + ArraySet<RectF> areas = mLocalColorCallbackAreas.remove(callback.asBinder()); + mLocalColorCallbackDisplayId.remove(callback.asBinder()); + if (areas == null) areas = new ArraySet<>(); + for (RectF area : areas) { + RemoteCallbackList callbacks = mLocalColorAreaCallbacks.get(area); + if (callbacks == null) continue; + callbacksToRemove.add(new Pair<>(callbacks, callback)); + if (callbacks.getRegisteredCallbackCount() == 0) { + mLocalColorAreaCallbacks.remove(area); + removeAreas.add(area); + } + ArraySet<RectF> displayAreas = mLocalColorDisplayIdAreas.get(displayId); + if (displayAreas != null) { + displayAreas.remove(area); + } + } + } + for (int i = 0; i < callbacksToRemove.size(); i++) { + Pair<RemoteCallbackList, ILocalWallpaperColorConsumer> + pair = callbacksToRemove.get(i); + pair.first.unregister(pair.second); + } + } catch (Exception e) { + // ignore any exception + } finally { + Binder.restoreCallingIdentity(identity); + } + + if (removeAreas.size() == 0) return; + IWallpaperEngine engine = getEngine(which, userId, displayId); + if (engine == null) return; + engine.removeLocalColorsAreas(removeAreas); + } + @Override public WallpaperColors getWallpaperColors(int which, int userId, int displayId) throws RemoteException { diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index c63a0f093dea..904bbe83e020 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -43,6 +43,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.IActivityClientController; +import android.app.IRequestFinishCallback; import android.app.PictureInPictureParams; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.EnterPipRequestedItem; @@ -50,6 +51,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.ParceledListSlice; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.os.Binder; import android.os.Bundle; @@ -1124,24 +1127,78 @@ class ActivityClientController extends IActivityClientController.Stub { } @Override - public void onBackPressedOnTaskRoot(IBinder token) { + public void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) { final long origId = Binder.clearCallingIdentity(); try { + final Intent baseActivityIntent; + final boolean launchedFromHome; + synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token); - if (r == null) { - return; - } + if (r == null) return; + if (mService.mWindowOrganizerController.mTaskOrganizerController .handleInterceptBackPressedOnTaskRoot(r.getRootTask())) { // This task is handled by a task organizer that has requested the back pressed // callback. - } else { - moveActivityTaskToBack(token, false /* nonRoot */); + return; } + + final Intent baseIntent = r.getTask().getBaseIntent(); + final boolean activityIsBaseActivity = baseIntent != null + && r.mActivityComponent.equals(baseIntent.getComponent()); + baseActivityIntent = activityIsBaseActivity ? r.intent : null; + launchedFromHome = r.launchedFromHomeProcess; + } + + // If the activity is one of the main entry points for the application, then we should + // refrain from finishing the activity and instead move it to the back to keep it in + // memory. The requirements for this are: + // 1. The current activity is the base activity for the task. + // 2. a. If the activity was launched by the home process, we trust that its intent + // was resolved, so we check if the it is a main intent for the application. + // b. Otherwise, we query Package Manager to verify whether the activity is a + // launcher activity for the application. + if (baseActivityIntent != null + && ((launchedFromHome && ActivityRecord.isMainIntent(baseActivityIntent)) + || isLauncherActivity(baseActivityIntent.getComponent()))) { + moveActivityTaskToBack(token, false /* nonRoot */); + return; + } + + // The default option for handling the back button is to finish the Activity. + try { + callback.requestFinish(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to invoke request finish callback", e); } } finally { Binder.restoreCallingIdentity(origId); } } + + /** + * Queries PackageManager to see if the given activity is one of the main entry point for the + * application. This should not be called with the WM lock held. + */ + @SuppressWarnings("unchecked") + private boolean isLauncherActivity(@NonNull ComponentName activity) { + final Intent queryIntent = new Intent(Intent.ACTION_MAIN); + queryIntent.addCategory(Intent.CATEGORY_LAUNCHER); + queryIntent.setPackage(activity.getPackageName()); + try { + final ParceledListSlice<ResolveInfo> resolved = + mService.getPackageManager().queryIntentActivities( + queryIntent, null, 0, mContext.getUserId()); + if (resolved == null) return false; + for (final ResolveInfo ri : resolved.getList()) { + if (ri.getComponentInfo().getComponentName().equals(activity)) { + return true; + } + } + } catch (RemoteException e) { + Slog.e(TAG, "Failed to query intent activities", e); + } + return false; + } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 9bf6df41a93b..8c3722dbbe76 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -436,6 +436,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final int launchedFromUid; // always the uid who started the activity. final String launchedFromPackage; // always the package who started the activity. final @Nullable String launchedFromFeatureId; // always the feature in launchedFromPackage + final boolean launchedFromHomeProcess; // as per original caller final Intent intent; // the original intent that generated us final String shortComponentName; // the short component name of the intent final String resolvedType; // as per original caller; @@ -1667,6 +1668,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A launchedFromUid = _launchedFromUid; launchedFromPackage = _launchedFromPackage; launchedFromFeatureId = _launchedFromFeature; + launchedFromHomeProcess = _caller != null && _caller.isHomeProcess(); shortComponentName = _intent.getComponent().flattenToShortString(); resolvedType = _resolvedType; componentSpecified = _componentSpecified; diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 37fda4ce217a..60ca725b118e 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1989,6 +1989,13 @@ class ActivityStarter { return START_SUCCESS; } + // The reusedActivity could be finishing, for example of starting an activity with + // FLAG_ACTIVITY_CLEAR_TOP flag. In that case, use the top running activity in the + // task instead. + targetTaskTop = targetTaskTop.finishing + ? targetTask.getTopNonFinishingActivity() + : targetTaskTop; + // At this point we are certain we want the task moved to the front. If we need to dismiss // any other always-on-top root tasks, now is the time to do it. if (targetTaskTop.canTurnScreenOn() && mService.mInternal.isDreaming()) { @@ -2005,11 +2012,8 @@ class ActivityStarter { // We didn't do anything... but it was needed (a.k.a., client don't use that intent!) // And for paranoia, make sure we have correctly resumed the top activity. resumeTargetRootTaskIfNeeded(); - // The reusedActivity could be finishing, for example of starting an activity with - // FLAG_ACTIVITY_CLEAR_TOP flag. In that case, return the top running activity in the - // task instead. - mLastStartActivityRecord = - targetTaskTop.finishing ? targetTask.getTopNonFinishingActivity() : targetTaskTop; + + mLastStartActivityRecord = targetTaskTop; return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 86968ed6d175..13e43a37eed2 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1002,7 +1002,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final InputChannel inputChannel = mWmService.mInputManager.monitorInput( "PointerEventDispatcher" + mDisplayId, mDisplayId); - mPointerEventDispatcher = new PointerEventDispatcher(inputChannel); + mPointerEventDispatcher = new PointerEventDispatcher(inputChannel, this); // Tap Listeners are supported for: // 1. All physical displays (multi-display). diff --git a/services/core/java/com/android/server/wm/PointerEventDispatcher.java b/services/core/java/com/android/server/wm/PointerEventDispatcher.java index 6b8144c69079..08de9b052ced 100644 --- a/services/core/java/com/android/server/wm/PointerEventDispatcher.java +++ b/services/core/java/com/android/server/wm/PointerEventDispatcher.java @@ -16,11 +16,14 @@ package com.android.server.wm; +import static com.android.server.input.InputManagerService.ENABLE_PER_WINDOW_INPUT_ROTATION; + import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; import android.view.InputEventReceiver; import android.view.MotionEvent; +import android.view.Surface; import android.view.WindowManagerPolicyConstants.PointerEventListener; import com.android.server.UiThread; @@ -31,8 +34,11 @@ public class PointerEventDispatcher extends InputEventReceiver { private final ArrayList<PointerEventListener> mListeners = new ArrayList<>(); private PointerEventListener[] mListenersArray = new PointerEventListener[0]; - public PointerEventDispatcher(InputChannel inputChannel) { + private final DisplayContent mDisplayContent; + + public PointerEventDispatcher(InputChannel inputChannel, DisplayContent dc) { super(inputChannel, UiThread.getHandler().getLooper()); + mDisplayContent = dc; } @Override @@ -40,7 +46,16 @@ public class PointerEventDispatcher extends InputEventReceiver { try { if (event instanceof MotionEvent && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { - final MotionEvent motionEvent = (MotionEvent) event; + MotionEvent motionEvent = (MotionEvent) event; + if (ENABLE_PER_WINDOW_INPUT_ROTATION) { + int rotation = mDisplayContent.getRotation(); + if (rotation != Surface.ROTATION_0) { + motionEvent = MotionEvent.obtain(motionEvent); + motionEvent.transform(MotionEvent.createRotateMatrix(rotation, + mDisplayContent.getDisplayMetrics().widthPixels, + mDisplayContent.getDisplayMetrics().heightPixels)); + } + } PointerEventListener[] listeners; synchronized (mListeners) { if (mListenersArray == null) { diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp index 5a5b0a8d30aa..7b78b8d23b4b 100644 --- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp +++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp @@ -44,7 +44,6 @@ namespace android { namespace { using android::base::borrowed_fd; -using android::base::ReadFully; using android::base::unique_fd; using namespace std::literals; @@ -173,7 +172,7 @@ static inline int32_t readLEInt32(borrowed_fd fd) { static inline std::vector<char> readBytes(borrowed_fd fd) { int32_t size = readLEInt32(fd); std::vector<char> result(size); - ReadFully(fd, result.data(), size); + android::base::ReadFully(fd, result.data(), size); return result; } @@ -569,7 +568,7 @@ private: // Awaiting adb handshake. char okay_buf[OKAY.size()]; if (!android::base::ReadFully(inout, okay_buf, OKAY.size())) { - ALOGE("Failed to receive OKAY. Abort."); + ALOGE("Failed to receive OKAY. Abort. Error %d", errno); return false; } if (std::string_view(okay_buf, OKAY.size()) != OKAY) { @@ -693,12 +692,12 @@ private: continue; } if (res < 0) { - ALOGE("Failed to poll. Abort."); + ALOGE("Failed to poll. Abort. Error %d", res); mStatusListener->reportStatus(DATA_LOADER_UNRECOVERABLE); break; } if (res == mEventFd) { - ALOGE("Received stop signal. Sending EXIT to server."); + ALOGE("DataLoader requested to stop. Sending EXIT to server."); sendRequest(inout, EXIT); break; } @@ -712,7 +711,7 @@ private: auto header = readHeader(remainingData); if (header.fileIdx == -1 && header.blockType == 0 && header.compressionType == 0 && header.blockIdx == 0 && header.blockSize == 0) { - ALOGI("Stop signal received. Sending exit command (remaining bytes: %d).", + ALOGI("Stop command received. Sending exit command (remaining bytes: %d).", int(remainingData.size())); sendRequest(inout, EXIT); @@ -721,16 +720,15 @@ private: } if (header.fileIdx < 0 || header.blockSize <= 0 || header.blockType < 0 || header.compressionType < 0 || header.blockIdx < 0) { - ALOGE("invalid header received. Abort."); + ALOGE("Invalid header received. Abort."); mStopReceiving = true; break; } + const FileIdx fileIdx = header.fileIdx; const android::dataloader::FileId fileId = convertFileIndexToFileId(mode, fileIdx); if (!android::incfs::isValidFileId(fileId)) { - ALOGE("Unknown data destination for file ID %d. " - "Ignore.", - header.fileIdx); + ALOGE("Unknown data destination for file ID %d. Ignore.", header.fileIdx); continue; } @@ -738,7 +736,7 @@ private: if (writeFd < 0) { writeFd.reset(this->mIfs->openForSpecialOps(fileId).release()); if (writeFd < 0) { - ALOGE("Failed to open file %d for writing (%d). Aborting.", header.fileIdx, + ALOGE("Failed to open file %d for writing (%d). Abort.", header.fileIdx, -writeFd); break; } diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 886c1e5b98ea..2fa927bcccfd 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -66,6 +66,8 @@ struct Constants { static constexpr auto blockSize = 4096; static constexpr auto systemPackage = "android"sv; + static constexpr auto userStatusDelay = 100ms; + static constexpr auto progressUpdateInterval = 1000ms; static constexpr auto perUidTimeoutOffset = progressUpdateInterval * 2; static constexpr auto minPerUidTimeout = progressUpdateInterval * 3; @@ -2306,13 +2308,24 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount LOG(ERROR) << "Mount ID mismatch: expected " << id() << ", but got: " << mountId; return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch."); } + if (newStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) { + // User-provided status, let's postpone the handling to avoid possible deadlocks. + mService.addTimedJob(*mService.mTimedQueue, id(), Constants::userStatusDelay, + [this, newStatus]() { setCurrentStatus(newStatus); }); + return binder::Status::ok(); + } + + setCurrentStatus(newStatus); + return binder::Status::ok(); +} +void IncrementalService::DataLoaderStub::setCurrentStatus(int newStatus) { int targetStatus, oldStatus; DataLoaderStatusListener listener; { std::unique_lock lock(mMutex); if (mCurrentStatus == newStatus) { - return binder::Status::ok(); + return; } oldStatus = mCurrentStatus; @@ -2332,14 +2345,12 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount << newStatus << " (target " << targetStatus << ")"; if (listener) { - listener->onStatusChanged(mountId, newStatus); + listener->onStatusChanged(id(), newStatus); } fsmStep(); mStatusCondition.notify_all(); - - return binder::Status::ok(); } binder::Status IncrementalService::DataLoaderStub::reportStreamHealth(MountId mountId, diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index 459ed3293510..d8f2c91a971c 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -234,6 +234,8 @@ private: binder::Status onStatusChanged(MountId mount, int newStatus) final; binder::Status reportStreamHealth(MountId mount, int newStatus) final; + void setCurrentStatus(int newStatus); + sp<content::pm::IDataLoader> getDataLoader(); bool bind(); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 2b09d12c97c7..dd2dd8150165 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -326,6 +326,8 @@ public final class SystemServer implements Dumpable { "com.android.server.musicrecognition.MusicRecognitionManagerService"; private static final String SYSTEM_CAPTIONS_MANAGER_SERVICE_CLASS = "com.android.server.systemcaptions.SystemCaptionsManagerService"; + private static final String TEXT_TO_SPEECH_MANAGER_SERVICE_CLASS = + "com.android.server.texttospeech.TextToSpeechManagerService"; private static final String TIME_ZONE_RULES_MANAGER_SERVICE_CLASS = "com.android.server.timezone.RulesManagerService$Lifecycle"; private static final String IOT_SERVICE_CLASS = @@ -1713,6 +1715,7 @@ public final class SystemServer implements Dumpable { startAttentionService(context, t); startRotationResolverService(context, t); startSystemCaptionsManagerService(context, t); + startTextToSpeechManagerService(context, t); // System Speech Recognition Service if (deviceHasConfigString(context, @@ -2918,6 +2921,13 @@ public final class SystemServer implements Dumpable { t.traceEnd(); } + private void startTextToSpeechManagerService(@NonNull Context context, + @NonNull TimingsTraceAndSlog t) { + t.traceBegin("StartTextToSpeechManagerService"); + mSystemServiceManager.startService(TEXT_TO_SPEECH_MANAGER_SERVICE_CLASS); + t.traceEnd(); + } + private void startContentCaptureService(@NonNull Context context, @NonNull TimingsTraceAndSlog t) { // First check if it was explicitly enabled by DeviceConfig diff --git a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java index 0cb729d924b4..87b2c84a30f7 100644 --- a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java +++ b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerPerUserService.java @@ -16,6 +16,7 @@ package com.android.server.musicrecognition; +import static android.Manifest.permission.RECORD_AUDIO; import static android.media.musicrecognition.MusicRecognitionManager.RECOGNITION_FAILED_AUDIO_UNAVAILABLE; import static android.media.musicrecognition.MusicRecognitionManager.RECOGNITION_FAILED_SERVICE_KILLED; import static android.media.musicrecognition.MusicRecognitionManager.RECOGNITION_FAILED_SERVICE_UNAVAILABLE; @@ -25,6 +26,7 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; +import android.app.AppOpsManager; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; @@ -45,6 +47,7 @@ import com.android.server.infra.AbstractPerUserSystemService; import java.io.IOException; import java.io.OutputStream; +import java.util.Objects; /** * Handles per-user requests received by @@ -64,11 +67,20 @@ public final class MusicRecognitionManagerPerUserService extends @Nullable @GuardedBy("mLock") private RemoteMusicRecognitionService mRemoteService; + private final AppOpsManager mAppOpsManager; + + private String mAttributionTag; + private String mAttributionMessage; + private ServiceInfo mServiceInfo; MusicRecognitionManagerPerUserService( @NonNull MusicRecognitionManagerService primary, @NonNull Object lock, int userId) { super(primary, lock, userId); + mAppOpsManager = getContext().getSystemService(AppOpsManager.class); + mAttributionMessage = String.format("MusicRecognitionManager.invokedByUid.%s", userId); + mAttributionTag = null; + mServiceInfo = null; } @NonNull @@ -114,6 +126,13 @@ public final class MusicRecognitionManagerPerUserService extends new MusicRecognitionServiceCallback(clientCallback), mMaster.isBindInstantServiceAllowed(), mMaster.verbose); + try { + mServiceInfo = + getContext().getPackageManager().getServiceInfo( + mRemoteService.getComponentName(), 0); + } catch (PackageManager.NameNotFoundException e) { + Slog.e(TAG, "Service was not found.", e); + } } return mRemoteService; @@ -127,12 +146,8 @@ public final class MusicRecognitionManagerPerUserService extends public void beginRecognitionLocked( @NonNull RecognitionRequest recognitionRequest, @NonNull IBinder callback) { - int maxAudioLengthSeconds = Math.min(recognitionRequest.getMaxAudioLengthSeconds(), - MAX_STREAMING_SECONDS); IMusicRecognitionManagerCallback clientCallback = IMusicRecognitionManagerCallback.Stub.asInterface(callback); - AudioRecord audioRecord = createAudioRecord(recognitionRequest, maxAudioLengthSeconds); - mRemoteService = ensureRemoteServiceLocked(clientCallback); if (mRemoteService == null) { try { @@ -158,52 +173,92 @@ public final class MusicRecognitionManagerPerUserService extends ParcelFileDescriptor clientRead = clientPipe.first; mMaster.mExecutorService.execute(() -> { - try (OutputStream fos = - new ParcelFileDescriptor.AutoCloseOutputStream(audioSink)) { - int halfSecondBufferSize = - audioRecord.getBufferSizeInFrames() / maxAudioLengthSeconds; - byte[] byteBuffer = new byte[halfSecondBufferSize]; - int bytesRead = 0; - int totalBytesRead = 0; - int ignoreBytes = - recognitionRequest.getIgnoreBeginningFrames() * BYTES_PER_SAMPLE; - audioRecord.startRecording(); - while (bytesRead >= 0 && totalBytesRead - < audioRecord.getBufferSizeInFrames() * BYTES_PER_SAMPLE - && mRemoteService != null) { - bytesRead = audioRecord.read(byteBuffer, 0, byteBuffer.length); - if (bytesRead > 0) { - totalBytesRead += bytesRead; - // If we are ignoring the first x bytes, update that counter. - if (ignoreBytes > 0) { - ignoreBytes -= bytesRead; - // If we've dipped negative, we've skipped through all ignored bytes - // and then some. Write out the bytes we shouldn't have skipped. - if (ignoreBytes < 0) { - fos.write(byteBuffer, bytesRead + ignoreBytes, -ignoreBytes); - } - } else { - fos.write(byteBuffer); - } - } - } - Slog.i(TAG, String.format("Streamed %s bytes from audio record", totalBytesRead)); - } catch (IOException e) { - Slog.e(TAG, "Audio streaming stopped.", e); - } finally { - audioRecord.release(); - try { - clientCallback.onAudioStreamClosed(); - } catch (RemoteException ignored) { - // Ignored. - } - } + streamAudio(recognitionRequest, clientCallback, audioSink); }); // Send the pipe down to the lookup service while we write to it asynchronously. mRemoteService.writeAudioToPipe(clientRead, recognitionRequest.getAudioFormat()); } /** + * Streams audio based on given request to the given audioSink. Notifies callback of errors. + * + * @param recognitionRequest the recognition request specifying audio parameters. + * @param clientCallback the callback to notify on errors. + * @param audioSink the sink to which to stream audio to. + */ + private void streamAudio(@NonNull RecognitionRequest recognitionRequest, + IMusicRecognitionManagerCallback clientCallback, ParcelFileDescriptor audioSink) { + try { + startRecordAudioOp(); + } catch (SecurityException e) { + // A security exception can occur if the MusicRecognitionService (receiving the audio) + // does not (or does no longer) hold the necessary permissions to record audio. + Slog.e(TAG, "RECORD_AUDIO op not permitted on behalf of " + + mServiceInfo.getComponentName(), e); + try { + clientCallback.onRecognitionFailed( + RECOGNITION_FAILED_AUDIO_UNAVAILABLE); + } catch (RemoteException ignored) { + // Ignored. + } + return; + } + + int maxAudioLengthSeconds = Math.min(recognitionRequest.getMaxAudioLengthSeconds(), + MAX_STREAMING_SECONDS); + AudioRecord audioRecord = createAudioRecord(recognitionRequest, maxAudioLengthSeconds); + try (OutputStream fos = + new ParcelFileDescriptor.AutoCloseOutputStream(audioSink)) { + streamAudio(recognitionRequest, maxAudioLengthSeconds, audioRecord, fos); + } catch (IOException e) { + Slog.e(TAG, "Audio streaming stopped.", e); + } finally { + audioRecord.release(); + finishRecordAudioOp(); + try { + clientCallback.onAudioStreamClosed(); + } catch (RemoteException ignored) { + // Ignored. + } + } + } + + /** Performs the actual streaming from audioRecord into outputStream. **/ + private void streamAudio(@NonNull RecognitionRequest recognitionRequest, + int maxAudioLengthSeconds, AudioRecord audioRecord, OutputStream outputStream) + throws IOException { + int halfSecondBufferSize = + audioRecord.getBufferSizeInFrames() / maxAudioLengthSeconds; + byte[] byteBuffer = new byte[halfSecondBufferSize]; + int bytesRead = 0; + int totalBytesRead = 0; + int ignoreBytes = + recognitionRequest.getIgnoreBeginningFrames() * BYTES_PER_SAMPLE; + audioRecord.startRecording(); + while (bytesRead >= 0 && totalBytesRead + < audioRecord.getBufferSizeInFrames() * BYTES_PER_SAMPLE + && mRemoteService != null) { + bytesRead = audioRecord.read(byteBuffer, 0, byteBuffer.length); + if (bytesRead > 0) { + totalBytesRead += bytesRead; + // If we are ignoring the first x bytes, update that counter. + if (ignoreBytes > 0) { + ignoreBytes -= bytesRead; + // If we've dipped negative, we've skipped through all ignored bytes + // and then some. Write out the bytes we shouldn't have skipped. + if (ignoreBytes < 0) { + outputStream.write(byteBuffer, bytesRead + ignoreBytes, -ignoreBytes); + } + } else { + outputStream.write(byteBuffer); + } + } + } + Slog.i(TAG, + String.format("Streamed %s bytes from audio record", totalBytesRead)); + } + + /** * Callback invoked by {@link android.service.musicrecognition.MusicRecognitionService} to pass * back the music search result. */ @@ -264,6 +319,29 @@ public final class MusicRecognitionManagerPerUserService extends } } + /** + * Tracks that the RECORD_AUDIO operation started (attributes it to the service receiving the + * audio). + */ + private void startRecordAudioOp() { + mAppOpsManager.startProxyOp( + Objects.requireNonNull(AppOpsManager.permissionToOp(RECORD_AUDIO)), + mServiceInfo.applicationInfo.uid, + mServiceInfo.packageName, + mAttributionTag, + mAttributionMessage); + } + + + /** Tracks that the RECORD_AUDIO operation finished. */ + private void finishRecordAudioOp() { + mAppOpsManager.finishProxyOp( + Objects.requireNonNull(AppOpsManager.permissionToOp(RECORD_AUDIO)), + mServiceInfo.applicationInfo.uid, + mServiceInfo.packageName, + mAttributionTag); + } + /** Establishes an audio stream from the DSP audio source. */ private static AudioRecord createAudioRecord( @NonNull RecognitionRequest recognitionRequest, diff --git a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java index 38f43138aee0..e145d3301292 100644 --- a/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java +++ b/services/musicrecognition/java/com/android/server/musicrecognition/MusicRecognitionManagerService.java @@ -45,7 +45,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** - * Service which allows a DSP audio event to be securely streamed to a designated {@link + * Service which allows audio to be securely streamed to a designated {@link * MusicRecognitionService}. */ public class MusicRecognitionManagerService extends diff --git a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java index 732c08c98f68..23a4c2f417c5 100644 --- a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java @@ -30,7 +30,6 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.os.Handler; -import android.platform.test.annotations.Presubmit; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -44,7 +43,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest -@Presubmit @RunWith(AndroidJUnit4.class) public class AutomaticBrightnessControllerTest { private static final float BRIGHTNESS_MIN_FLOAT = 0.0f; diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java index 9396ed256409..f0b4f1bec77b 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java @@ -30,7 +30,6 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.hardware.display.BrightnessConfiguration; import android.os.PowerManager; -import android.platform.test.annotations.Presubmit; import android.util.MathUtils; import android.util.Spline; @@ -43,7 +42,6 @@ import org.junit.runner.RunWith; import java.util.Arrays; @SmallTest -@Presubmit @RunWith(AndroidJUnit4.class) public class BrightnessMappingStrategyTest { diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index ee0f2e8c6f6a..81b2381cd629 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -47,7 +47,6 @@ import android.hardware.SensorManager; import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.Looper; -import android.platform.test.annotations.Presubmit; import android.provider.DeviceConfig; import android.provider.Settings; import android.test.mock.MockContentResolver; @@ -83,7 +82,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @SmallTest -@Presubmit @RunWith(AndroidJUnit4.class) public class DisplayModeDirectorTest { // The tolerance within which we consider something approximately equals. diff --git a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java index d72606ac44e5..196454bd32ce 100644 --- a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java +++ b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java @@ -22,7 +22,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.hardware.display.BrightnessConfiguration; -import android.platform.test.annotations.Presubmit; import android.util.Pair; import androidx.test.filters.SmallTest; @@ -41,7 +40,6 @@ import java.io.OutputStream; import java.nio.charset.StandardCharsets; @SmallTest -@Presubmit @RunWith(AndroidJUnit4.class) public class PersistentDataStoreTest { private PersistentDataStore mDataStore; diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index 3ebe4efee013..7d7af03ecd3d 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -2043,7 +2043,7 @@ public class NetworkPolicyManagerServiceTest { final NetworkCapabilities networkCapabilities = new NetworkCapabilities(); networkCapabilities.addTransportType(TRANSPORT_WIFI); networkCapabilities.setSSID(TEST_SSID); - return new NetworkState(TYPE_WIFI, prop, networkCapabilities, null, null, TEST_SSID); + return new NetworkState(TYPE_WIFI, prop, networkCapabilities, null, null); } private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception { @@ -2067,7 +2067,7 @@ public class NetworkPolicyManagerServiceTest { new NetworkState(TYPE_MOBILE, buildLinkProperties(TEST_IFACE), buildNetworkCapabilities(TEST_SUB_ID, roaming), - new Network(TEST_NET_ID), TEST_IMSI, null) + new Network(TEST_NET_ID), TEST_IMSI) }); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 9c1614393554..2c2c09a5750a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -61,6 +61,7 @@ import static org.mockito.Mockito.clearInvocations; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityTaskManager.RootTaskInfo; +import android.app.IRequestFinishCallback; import android.app.PictureInPictureParams; import android.content.pm.ActivityInfo; import android.content.pm.ParceledListSlice; @@ -976,7 +977,8 @@ public class WindowOrganizerTests extends WindowTestsBase { assertTrue(stack2.isOrganized()); // Verify a back pressed does not call the organizer - mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token); + mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token, + new IRequestFinishCallback.Default()); // Ensure events dispatch to organizer. mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); verify(organizer, never()).onBackPressedOnTaskRoot(any()); @@ -986,7 +988,8 @@ public class WindowOrganizerTests extends WindowTestsBase { stack.mRemoteToken.toWindowContainerToken(), true); // Verify now that the back press does call the organizer - mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token); + mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token, + new IRequestFinishCallback.Default()); // Ensure events dispatch to organizer. mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); verify(organizer, times(1)).onBackPressedOnTaskRoot(any()); @@ -996,7 +999,8 @@ public class WindowOrganizerTests extends WindowTestsBase { stack.mRemoteToken.toWindowContainerToken(), false); // Verify now that the back press no longer calls the organizer - mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token); + mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(activity.token, + new IRequestFinishCallback.Default()); // Ensure events dispatch to organizer. mWm.mAtmService.mTaskOrganizerController.dispatchPendingEvents(); verify(organizer, times(1)).onBackPressedOnTaskRoot(any()); @@ -1201,7 +1205,8 @@ public class WindowOrganizerTests extends WindowTestsBase { mWm.mWindowPlacerLocked.deferLayout(); stack.removeImmediately(); - mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(record.token); + mWm.mAtmService.mActivityClientController.onBackPressedOnTaskRoot(record.token, + new IRequestFinishCallback.Default()); waitUntilHandlersIdle(); ArrayList<PendingTaskEvent> pendingEvents = getTaskPendingEvent(stack); diff --git a/services/texttospeech/Android.bp b/services/texttospeech/Android.bp new file mode 100644 index 000000000000..bacc932f760f --- /dev/null +++ b/services/texttospeech/Android.bp @@ -0,0 +1,13 @@ +filegroup { + name: "services.texttospeech-sources", + srcs: ["java/**/*.java"], + path: "java", + visibility: ["//frameworks/base/services"], +} + +java_library_static { + name: "services.texttospeech", + defaults: ["platform_service_defaults"], + srcs: [":services.texttospeech-sources"], + libs: ["services.core"], +}
\ No newline at end of file diff --git a/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerPerUserService.java b/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerPerUserService.java new file mode 100644 index 000000000000..f80590420d09 --- /dev/null +++ b/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerPerUserService.java @@ -0,0 +1,184 @@ +/* + * 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.server.texttospeech; + +import static com.android.internal.infra.AbstractRemoteService.PERMANENT_BOUND_TIMEOUT_MS; + +import android.annotation.NonNull; +import android.annotation.UserIdInt; +import android.app.AppGlobals; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.os.IBinder.DeathRecipient; +import android.os.RemoteException; +import android.speech.tts.ITextToSpeechService; +import android.speech.tts.ITextToSpeechSession; +import android.speech.tts.ITextToSpeechSessionCallback; +import android.speech.tts.TextToSpeech; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.infra.ServiceConnector; +import com.android.server.infra.AbstractPerUserSystemService; + +import java.util.NoSuchElementException; + +/** + * Manages per-user text to speech session activated by {@link TextToSpeechManagerService}. + * Creates {@link TtsClient} interface object with direct connection to + * {@link android.speech.tts.TextToSpeechService} provider. + * + * @see ITextToSpeechSession + * @see TextToSpeech + */ +final class TextToSpeechManagerPerUserService extends + AbstractPerUserSystemService<TextToSpeechManagerPerUserService, + TextToSpeechManagerService> { + + private static final String TAG = TextToSpeechManagerPerUserService.class.getSimpleName(); + + TextToSpeechManagerPerUserService( + @NonNull TextToSpeechManagerService master, + @NonNull Object lock, @UserIdInt int userId) { + super(master, lock, userId); + } + + void createSessionLocked(String engine, ITextToSpeechSessionCallback sessionCallback) { + TextToSpeechSessionConnection.start(getContext(), mUserId, engine, sessionCallback); + } + + @GuardedBy("mLock") + @Override // from PerUserSystemService + @NonNull + protected ServiceInfo newServiceInfoLocked( + @SuppressWarnings("unused") @NonNull ComponentName serviceComponent) + throws PackageManager.NameNotFoundException { + try { + return AppGlobals.getPackageManager().getServiceInfo(serviceComponent, + PackageManager.GET_META_DATA, mUserId); + } catch (RemoteException e) { + throw new PackageManager.NameNotFoundException( + "Could not get service for " + serviceComponent); + } + } + + private static class TextToSpeechSessionConnection extends + ServiceConnector.Impl<ITextToSpeechService> { + + private final String mEngine; + private final ITextToSpeechSessionCallback mCallback; + private final DeathRecipient mUnbindOnDeathHandler; + + static void start(Context context, @UserIdInt int userId, String engine, + ITextToSpeechSessionCallback callback) { + new TextToSpeechSessionConnection(context, userId, engine, callback).start(); + } + + private TextToSpeechSessionConnection(Context context, @UserIdInt int userId, String engine, + ITextToSpeechSessionCallback callback) { + super(context, + new Intent(TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE).setPackage(engine), + Context.BIND_AUTO_CREATE, + userId, + ITextToSpeechService.Stub::asInterface); + mEngine = engine; + mCallback = callback; + mUnbindOnDeathHandler = () -> unbindEngine("client process death is reported"); + } + + private void start() { + Slog.d(TAG, "Trying to start connection to TTS engine: " + mEngine); + + connect() + .thenAccept( + serviceBinder -> { + if (serviceBinder != null) { + Slog.d(TAG, + "Connected successfully to TTS engine: " + mEngine); + try { + mCallback.onConnected(new ITextToSpeechSession.Stub() { + @Override + public void disconnect() { + unbindEngine("client disconnection request"); + } + }, serviceBinder.asBinder()); + + mCallback.asBinder().linkToDeath(mUnbindOnDeathHandler, 0); + } catch (RemoteException ex) { + Slog.w(TAG, "Error notifying the client on connection", ex); + + unbindEngine( + "failed communicating with the client - process " + + "is dead"); + } + } else { + Slog.w(TAG, "Failed to obtain TTS engine binder"); + runSessionCallbackMethod( + () -> mCallback.onError("Failed creating TTS session")); + } + }) + .exceptionally(ex -> { + Slog.w(TAG, "TTS engine binding error", ex); + runSessionCallbackMethod( + () -> mCallback.onError( + "Failed creating TTS session: " + ex.getCause())); + + return null; + }); + } + + @Override // from ServiceConnector.Impl + protected void onServiceConnectionStatusChanged( + ITextToSpeechService service, boolean connected) { + if (!connected) { + Slog.w(TAG, "Disconnected from TTS engine"); + runSessionCallbackMethod(mCallback::onDisconnected); + + try { + mCallback.asBinder().unlinkToDeath(mUnbindOnDeathHandler, 0); + } catch (NoSuchElementException ex) { + Slog.d(TAG, "The death recipient was not linked."); + } + } + } + + @Override // from ServiceConnector.Impl + protected long getAutoDisconnectTimeoutMs() { + return PERMANENT_BOUND_TIMEOUT_MS; + } + + private void unbindEngine(String reason) { + Slog.d(TAG, "Unbinding TTS engine: " + mEngine + ". Reason: " + reason); + unbind(); + } + } + + static void runSessionCallbackMethod(ThrowingRunnable callbackRunnable) { + try { + callbackRunnable.runOrThrow(); + } catch (RemoteException ex) { + Slog.w(TAG, "Failed running callback method", ex); + } + } + + interface ThrowingRunnable { + void runOrThrow() throws RemoteException; + } +} diff --git a/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerService.java b/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerService.java new file mode 100644 index 000000000000..9015563f439e --- /dev/null +++ b/services/texttospeech/java/com/android/server/texttospeech/TextToSpeechManagerService.java @@ -0,0 +1,77 @@ +/* + * 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.server.texttospeech; + +import static com.android.server.texttospeech.TextToSpeechManagerPerUserService.runSessionCallbackMethod; + +import android.annotation.NonNull; +import android.annotation.UserIdInt; +import android.content.Context; +import android.os.UserHandle; +import android.speech.tts.ITextToSpeechManager; +import android.speech.tts.ITextToSpeechSessionCallback; + +import com.android.server.infra.AbstractMasterSystemService; + + +/** + * A service that allows secured synthesizing of text to speech audio. Upon request creates a + * session + * that is managed by {@link TextToSpeechManagerPerUserService}. + * + * @see ITextToSpeechManager + */ +public final class TextToSpeechManagerService extends + AbstractMasterSystemService<TextToSpeechManagerService, + TextToSpeechManagerPerUserService> { + + private static final String TAG = TextToSpeechManagerService.class.getSimpleName(); + + public TextToSpeechManagerService(@NonNull Context context) { + super(context, /* serviceNameResolver= */ null, + /* disallowProperty = */null); + } + + @Override // from SystemService + public void onStart() { + publishBinderService(Context.TEXT_TO_SPEECH_MANAGER_SERVICE, + new TextToSpeechManagerServiceStub()); + } + + @Override + protected TextToSpeechManagerPerUserService newServiceLocked( + @UserIdInt int resolvedUserId, boolean disabled) { + return new TextToSpeechManagerPerUserService(this, mLock, resolvedUserId); + } + + private final class TextToSpeechManagerServiceStub extends ITextToSpeechManager.Stub { + @Override + public void createSession(String engine, + ITextToSpeechSessionCallback sessionCallback) { + synchronized (mLock) { + TextToSpeechManagerPerUserService perUserService = getServiceForUserLocked( + UserHandle.getCallingUserId()); + if (perUserService != null) { + perUserService.createSessionLocked(engine, sessionCallback); + } else { + runSessionCallbackMethod( + () -> sessionCallback.onError("Service is not available for user")); + } + } + } + } +} diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index 6bf67154efd5..c53c95cc982e 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -42,13 +42,13 @@ import android.hardware.usb.ParcelableUsbPort; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; +import android.hardware.usb.V1_0.IUsb; import android.hardware.usb.V1_0.PortRole; import android.hardware.usb.V1_0.PortRoleType; import android.hardware.usb.V1_0.Status; import android.hardware.usb.V1_1.PortStatus_1_1; import android.hardware.usb.V1_2.IUsbCallback; import android.hardware.usb.V1_2.PortStatus; -import android.hardware.usb.V1_3.IUsb; import android.hidl.manager.V1_0.IServiceManager; import android.hidl.manager.V1_0.IServiceNotification; import android.os.Bundle; diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index f687e4bb9567..8628f89a49c1 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -430,25 +430,17 @@ public class VoiceInteractionManagerService extends SystemService { // Eventually it will be an error to not specify this. setCurInteractor(new ComponentName(curInteractorInfo.getServiceInfo().packageName, curInteractorInfo.getServiceInfo().name), userHandle); - if (curInteractorInfo.getRecognitionService() != null) { - setCurRecognizer( - new ComponentName(curInteractorInfo.getServiceInfo().packageName, - curInteractorInfo.getRecognitionService()), userHandle); - return; - } + } else { + // No voice interactor, so clear the setting. + setCurInteractor(null, userHandle); } - // No voice interactor, we'll just set up a simple recognizer. - initSimpleRecognizer(curInteractorInfo, userHandle); + initRecognizer(userHandle); } - public void initSimpleRecognizer(VoiceInteractionServiceInfo curInteractorInfo, - int userHandle) { + public void initRecognizer(int userHandle) { ComponentName curRecognizer = findAvailRecognizer(null, userHandle); if (curRecognizer != null) { - if (curInteractorInfo == null) { - setCurInteractor(null, userHandle); - } setCurRecognizer(curRecognizer, userHandle); } } @@ -1607,20 +1599,6 @@ public class VoiceInteractionManagerService extends SystemService { } } - private @NonNull String getDefaultRecognizer(@NonNull UserHandle user) { - ResolveInfo resolveInfo = mPm.resolveServiceAsUser( - new Intent(RecognitionService.SERVICE_INTERFACE), - PackageManager.GET_META_DATA, user.getIdentifier()); - - if (resolveInfo == null || resolveInfo.serviceInfo == null) { - Log.w(TAG, "Unable to resolve default voice recognition service."); - return ""; - } - - return new ComponentName(resolveInfo.serviceInfo.packageName, - resolveInfo.serviceInfo.name).flattenToShortString(); - } - /** * Convert the assistant-role holder into settings. The rest of the system uses the * settings. @@ -1642,9 +1620,6 @@ public class VoiceInteractionManagerService extends SystemService { Settings.Secure.ASSISTANT, "", userId); Settings.Secure.putStringForUser(getContext().getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE, "", userId); - Settings.Secure.putStringForUser(getContext().getContentResolver(), - Settings.Secure.VOICE_RECOGNITION_SERVICE, getDefaultRecognizer(user), - userId); } else { // Assistant is singleton role String pkg = roleHolders.get(0); @@ -1671,9 +1646,6 @@ public class VoiceInteractionManagerService extends SystemService { Settings.Secure.putStringForUser(getContext().getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE, serviceComponentName, userId); - Settings.Secure.putStringForUser(getContext().getContentResolver(), - Settings.Secure.VOICE_RECOGNITION_SERVICE, serviceRecognizerName, - userId); return; } @@ -1693,9 +1665,6 @@ public class VoiceInteractionManagerService extends SystemService { activityInfo.getComponentName().flattenToShortString(), userId); Settings.Secure.putStringForUser(getContext().getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE, "", userId); - Settings.Secure.putStringForUser(getContext().getContentResolver(), - Settings.Secure.VOICE_RECOGNITION_SERVICE, - getDefaultRecognizer(user), userId); return; } } @@ -1772,7 +1741,9 @@ public class VoiceInteractionManagerService extends SystemService { synchronized (VoiceInteractionManagerServiceStub.this) { Slog.i(TAG, "Force stopping current voice recognizer: " + getCurRecognizer(userHandle)); - initSimpleRecognizer(null, userHandle); + // TODO: Figure out why the interactor was being cleared and document it. + setCurInteractor(null, userHandle); + initRecognizer(userHandle); } } return hitInt || hitRec; @@ -1793,6 +1764,9 @@ public class VoiceInteractionManagerService extends SystemService { if (isPackageAppearing(pkgName) != PACKAGE_UNCHANGED) { return; } + if (getCurRecognizer(mCurUser) == null) { + initRecognizer(mCurUser); + } final String curInteractorStr = Settings.Secure.getStringForUser( mContext.getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE, mCurUser); @@ -1807,12 +1781,6 @@ public class VoiceInteractionManagerService extends SystemService { availInteractorInfo.getServiceInfo().packageName, availInteractorInfo.getServiceInfo().name); setCurInteractor(availInteractor, mCurUser); - if (getCurRecognizer(mCurUser) == null && - availInteractorInfo.getRecognitionService() != null) { - setCurRecognizer(new ComponentName( - availInteractorInfo.getServiceInfo().packageName, - availInteractorInfo.getRecognitionService()), mCurUser); - } } } else { if (didSomePackagesChange()) { @@ -1843,10 +1811,7 @@ public class VoiceInteractionManagerService extends SystemService { if (curRecognizer == null) { // Could a new recognizer appear when we don't have one pre-installed? if (anyPackagesAppearing()) { - curRecognizer = findAvailRecognizer(null, userHandle); - if (curRecognizer != null) { - setCurRecognizer(curRecognizer, userHandle); - } + initRecognizer(userHandle); } return; } diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java index 48a5ab6d204b..5e50bea05057 100644 --- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java @@ -686,6 +686,67 @@ public final class TelephonyPermissions { } /** + * Given a list of permissions, check to see if the caller has at least one of them. If the + * caller has none of these permissions, throw a SecurityException. + */ + public static void enforceAnyPermissionGranted(Context context, int uid, String message, + String... permissions) { + if (permissions.length == 0) return; + boolean isGranted = false; + for (String perm : permissions) { + if (context.checkCallingOrSelfPermission(perm) == PERMISSION_GRANTED) { + isGranted = true; + break; + } + } + + if (isGranted) return; + + StringBuilder b = new StringBuilder(message); + b.append(": Neither user "); + b.append(uid); + b.append(" nor current process has "); + b.append(permissions[0]); + for (int i = 1; i < permissions.length; i++) { + b.append(" or "); + b.append(permissions[i]); + } + throw new SecurityException(b.toString()); + } + + /** + * Given a list of permissions, check to see if the caller has at least one of them granted. If + * not, check to see if the caller has carrier privileges. If the caller does not have any of + * these permissions, throw a SecurityException. + */ + public static void enforceAnyPermissionGrantedOrCarrierPrivileges(Context context, int subId, + int uid, String message, String... permissions) { + if (permissions.length == 0) return; + boolean isGranted = false; + for (String perm : permissions) { + if (context.checkCallingOrSelfPermission(perm) == PERMISSION_GRANTED) { + isGranted = true; + break; + } + } + + if (isGranted) return; + if (checkCarrierPrivilegeForSubId(context, subId)) return; + + StringBuilder b = new StringBuilder(message); + b.append(": Neither user "); + b.append(uid); + b.append(" nor current process has "); + b.append(permissions[0]); + for (int i = 1; i < permissions.length; i++) { + b.append(" or "); + b.append(permissions[i]); + } + b.append(" or carrier privileges"); + throw new SecurityException(b.toString()); + } + + /** * Throws if the caller is not of a shell (or root) UID. * * @param callingUid pass Binder.callingUid(). diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 6d3fa81a856d..8c68d856d896 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4230,10 +4230,6 @@ public class CarrierConfigManager { public static final String KEY_RETRANSMIT_TIMER_MSEC_INT_ARRAY = KEY_PREFIX + "retransmit_timer_sec_int_array"; - /** Controls if wifi mac Id should be added to network access identifier(NAI) */ - public static final String KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL = - KEY_PREFIX + "add_wifi_mac_addr_to_nai_bool"; - /** * Specifies the local identity type for IKE negotiations. Possible values are {@link * #ID_TYPE_FQDN}, {@link #ID_TYPE_RFC822_ADDR}, {@link #ID_TYPE_KEY_ID} @@ -4557,7 +4553,6 @@ public class CarrierConfigManager { KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY, new int[] {EPDG_ADDRESS_PLMN, EPDG_ADDRESS_STATIC}); defaults.putStringArray(KEY_MCC_MNCS_STRING_ARRAY, new String[] {}); - defaults.putBoolean(KEY_ADD_WIFI_MAC_ADDR_TO_NAI_BOOL, false); defaults.putInt(KEY_IKE_LOCAL_ID_TYPE_INT, ID_TYPE_RFC822_ADDR); defaults.putInt(KEY_IKE_REMOTE_ID_TYPE_INT, ID_TYPE_FQDN); defaults.putBoolean(KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL, false); @@ -4749,7 +4744,7 @@ public class CarrierConfigManager { public static final String KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL = "network_temp_not_metered_supported_bool"; - /* + /** * Boolean indicating whether the SIM PIN can be stored and verified * seamlessly after an unattended reboot. * @@ -4764,7 +4759,7 @@ public class CarrierConfigManager { public static final String KEY_STORE_SIM_PIN_FOR_UNATTENDED_REBOOT_BOOL = "store_sim_pin_for_unattended_reboot_bool"; - /** + /** * Determine whether "Enable 2G" toggle can be shown. * * Used to trade privacy/security against potentially reduced carrier coverage for some @@ -4772,6 +4767,16 @@ public class CarrierConfigManager { */ public static final String KEY_HIDE_ENABLE_2G = "hide_enable_2g_bool"; + /** + * Indicates the allowed APN types that can be used for LTE initial attach. The order of APN + * types in the configuration is the order of APN types that will be used for initial attach. + * Empty list indicates that no APN types are allowed for initial attach. + * + * @hide + */ + public static final String KEY_ALLOWED_INITIAL_ATTACH_APN_TYPES_STRING_ARRAY = + "allowed_initial_attach_apn_types_string_array"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -5330,6 +5335,8 @@ public class CarrierConfigManager { sDefaults.putInt(KEY_DEFAULT_RTT_MODE_INT, 0); sDefaults.putBoolean(KEY_STORE_SIM_PIN_FOR_UNATTENDED_REBOOT_BOOL, true); sDefaults.putBoolean(KEY_HIDE_ENABLE_2G, false); + sDefaults.putStringArray(KEY_ALLOWED_INITIAL_ATTACH_APN_TYPES_STRING_ARRAY, + new String[]{"ia", "default", "ims", "mms", "dun", "emergency"}); } /** diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 6a9b71d78dd9..d545c657614c 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -15216,8 +15216,13 @@ public class TelephonyManager { * <li>Generate the ks_NAF/ ks_Ext_NAF to be returned via the callback.</li> * </ol> * - * <p> Requires Permission: MODIFY_PHONE_STATE or that the calling app has carrier - * privileges (see {@link #hasCarrierPrivileges}). + * <p> Requires Permission: + * <ul> + * <li>{@link android.Manifest.permission#MODIFY_PHONE_STATE},</li> + * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> + * <li>or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).</li> + * </ul> * @param appType icc application type, like {@link #APPTYPE_USIM} or {@link * #APPTYPE_ISIM} or {@link#APPTYPE_UNKNOWN} * @param nafId Network Application Function(NAF) fully qualified domain name and @@ -15244,7 +15249,8 @@ public class TelephonyManager { */ @SystemApi @WorkerThread - @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(anyOf = {android.Manifest.permission.MODIFY_PHONE_STATE, + Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void bootstrapAuthenticationRequest( @UiccAppTypeExt int appType, @NonNull Uri nafId, @NonNull UaSecurityProtocolIdentifier securityProtocol, diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index 31ba8530e623..6fda2e12fffd 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -32,6 +32,7 @@ import android.os.ServiceSpecificException; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyFrameworkInitializer; +import android.telephony.TelephonyManager; import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IRcsConfigCallback; import android.telephony.ims.feature.MmTelFeature; @@ -1300,7 +1301,7 @@ public class ProvisioningManager { * provisioning. * <p> * Requires Permission: Manifest.permission.MODIFY_PHONE_STATE or that the calling app has - * carrier privileges (see {@link #hasCarrierPrivileges}). + * carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). * @param config The XML file to be read. ASCII/UTF8 encoded text if not compressed. * @param isCompressed The XML file is compressed in gzip format and must be decompressed * before being read. @@ -1330,7 +1331,7 @@ public class ProvisioningManager { * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration * status. */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE"; @@ -1375,7 +1376,7 @@ public class ProvisioningManager { * provisioning status events {@link #registerRcsProvisioningChangedCallback} * @param rcc RCS client configuration {@link RcsClientConfiguration} */ - @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void setRcsClientConfiguration( @NonNull RcsClientConfiguration rcc) throws ImsException { try { @@ -1390,6 +1391,14 @@ public class ProvisioningManager { /** * Returns a flag to indicate whether or not the device supports IMS single registration for * MMTEL and RCS features as well as if the carrier has provisioned the feature. + * + * <p> Requires Permission: + * <ul> + * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> + * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> + * <li>or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).</li> + * </ul> * @return true if IMS single registration is capable at this time, or false otherwise * @throws ImsException If the remote ImsService is not available for * any reason or the subscription associated with this instance is no @@ -1398,7 +1407,8 @@ public class ProvisioningManager { * @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION for whether or not this * device supports IMS single registration. */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isRcsVolteSingleRegistrationCapable() throws ImsException { try { return getITelephony().isRcsVolteSingleRegistrationCapable(mSubId); @@ -1408,36 +1418,44 @@ public class ProvisioningManager { } /** - * Registers a new {@link RcsProvisioningCallback} to listen to changes to - * RCS provisioning xml. - * - * <p>RCS application must be the default messaging application and must - * have already registered its {@link RcsClientConfiguration} by using - * {@link #setRcsClientConfiguration} before it registers the provisioning - * callback. If ProvisioningManager has a valid RCS configuration at the - * time of callback registration and a reconfiguration is not required - * due to RCS client parameters change, then the callback shall be invoked - * immediately with the xml. - * When the subscription associated with this callback is removed (SIM removed, - * ESIM swap,etc...), this callback will automatically be removed. - * - * @param executor The {@link Executor} to call the callback methods on - * @param callback The rcs provisioning callback to be registered. - * @see #unregisterRcsProvisioningChangedCallback(RcsProvisioningCallback) - * @see SubscriptionManager.OnSubscriptionsChangedListener - * @throws IllegalArgumentException if the subscription associated with this - * callback is not active (SIM is not inserted, ESIM inactive) or the - * subscription is invalid. - * @throws ImsException if the subscription associated with this callback is - * valid, but the {@link ImsService} associated with the subscription is not - * available. This can happen if the service crashed, for example. - * It shall also throw this exception when the RCS client parameters for the - * application are not valid. In that case application must set the client - * params (See {@link #setRcsClientConfiguration}) and re register the - * callback. - * See {@link ImsException#getCode()} for a more detailed reason. - */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + * Registers a new {@link RcsProvisioningCallback} to listen to changes to + * RCS provisioning xml. + * + * <p>RCS application must be the default messaging application and must + * have already registered its {@link RcsClientConfiguration} by using + * {@link #setRcsClientConfiguration} before it registers the provisioning + * callback. If ProvisioningManager has a valid RCS configuration at the + * time of callback registration and a reconfiguration is not required + * due to RCS client parameters change, then the callback shall be invoked + * immediately with the xml. + * When the subscription associated with this callback is removed (SIM removed, + * ESIM swap,etc...), this callback will automatically be removed. + * <p> Requires Permission: + * <ul> + * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> + * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> + * <li>or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).</li> + * </ul> + * + * @param executor The {@link Executor} to call the callback methods on + * @param callback The rcs provisioning callback to be registered. + * @see #unregisterRcsProvisioningChangedCallback(RcsProvisioningCallback) + * @see SubscriptionManager.OnSubscriptionsChangedListener + * @throws IllegalArgumentException if the subscription associated with this + * callback is not active (SIM is not inserted, ESIM inactive) or the + * subscription is invalid. + * @throws ImsException if the subscription associated with this callback is + * valid, but the {@link ImsService} associated with the subscription is not + * available. This can happen if the service crashed, for example. + * It shall also throw this exception when the RCS client parameters for the + * application are not valid. In that case application must set the client + * params (See {@link #setRcsClientConfiguration}) and re register the + * callback. + * See {@link ImsException#getCode()} for a more detailed reason. + */ + @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void registerRcsProvisioningChangedCallback( @NonNull @CallbackExecutor Executor executor, @NonNull RcsProvisioningCallback callback) throws ImsException { @@ -1459,13 +1477,22 @@ public class ProvisioningManager { * removed, ESIM swap, etc...), this callback will automatically be * removed. If this method is called for an inactive subscription, it * will result in a no-op. + * <p> Requires Permission: + * <ul> + * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> + * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> + * <li>or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).</li> + * </ul> + * * @param callback The existing {@link RcsProvisioningCallback} to be * removed. * @see #registerRcsProvisioningChangedCallback * @throws IllegalArgumentException if the subscription associated with this callback is * invalid. */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void unregisterRcsProvisioningChangedCallback( @NonNull RcsProvisioningCallback callback) { try { @@ -1480,7 +1507,7 @@ public class ProvisioningManager { * Reconfiguration triggered by the RCS application. Most likely cause * is the 403 forbidden to a HTTP request. */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerRcsReconfiguration() { try { getITelephony().triggerRcsReconfiguration(mSubId); diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java index 04421c9a2449..171842b26cb0 100644 --- a/telephony/java/android/telephony/ims/SipDelegateManager.java +++ b/telephony/java/android/telephony/ims/SipDelegateManager.java @@ -275,7 +275,8 @@ public class SipDelegateManager { * @see CarrierConfigManager.Ims#KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL * @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION */ - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isSupported() throws ImsException { try { IImsRcsController controller = mBinderCache.getBinder(); @@ -317,7 +318,7 @@ public class SipDelegateManager { * @throws ImsException Thrown if there was a problem communicating with the ImsService * associated with this SipDelegateManager. See {@link ImsException#getCode()}. */ - @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void createSipDelegate(@NonNull DelegateRequest request, @NonNull Executor executor, @NonNull DelegateConnectionStateCallback dc, @NonNull DelegateConnectionMessageCallback mc) throws ImsException { @@ -351,7 +352,7 @@ public class SipDelegateManager { * @param delegateConnection The SipDelegateConnection to destroy. * @param reason The reason for why this SipDelegateConnection was destroyed. */ - @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void destroySipDelegate(@NonNull SipDelegateConnection delegateConnection, @SipDelegateDestroyReason int reason) { @@ -392,6 +393,7 @@ public class SipDelegateManager { * this condition. May be {@code null} if there was no reason String provided from the * network. */ + @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerFullNetworkRegistration(@NonNull SipDelegateConnection connection, @IntRange(from = 100, to = 699) int sipCode, @Nullable String sipReason) { if (connection == null) { diff --git a/tests/PackageWatchdog/TEST_MAPPING b/tests/PackageWatchdog/TEST_MAPPING new file mode 100644 index 000000000000..6494a273eced --- /dev/null +++ b/tests/PackageWatchdog/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "PackageWatchdogTest" + } + ] +} diff --git a/tests/net/java/android/net/NetworkTemplateTest.kt b/tests/net/java/android/net/NetworkTemplateTest.kt index 1f8f6f311069..b39555d15dcb 100644 --- a/tests/net/java/android/net/NetworkTemplateTest.kt +++ b/tests/net/java/android/net/NetworkTemplateTest.kt @@ -65,7 +65,7 @@ class NetworkTemplateTest { setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true) setSSID(ssid) } - return NetworkState(type, lp, caps, mock(Network::class.java), subscriberId, ssid) + return NetworkState(type, lp, caps, mock(Network::class.java), subscriberId) } private fun NetworkTemplate.assertMatches(ident: NetworkIdentity) = diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 07341c76a141..24e559225027 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -84,6 +84,11 @@ import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED; import static android.net.NetworkPolicyManager.RULE_NONE; import static android.net.NetworkPolicyManager.RULE_REJECT_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; +import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; +import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; +import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; +import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; +import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_UNINITIALIZED; import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.os.Process.INVALID_UID; import static android.system.OsConstants.IPPROTO_TCP; @@ -355,6 +360,7 @@ public class ConnectivityServiceTest { private static final long TIMESTAMP = 1234L; private static final int NET_ID = 110; + private static final int OEM_PREF_ANY_NET_ID = -1; // Set a non-zero value to verify the flow to set tcp init rwnd value. private static final int TEST_TCP_INIT_RWND = 60; @@ -424,7 +430,6 @@ public class ConnectivityServiceTest { @Mock EthernetManager mEthernetManager; @Mock NetworkPolicyManager mNetworkPolicyManager; @Mock KeyStore mKeyStore; - @Mock IOnSetOemNetworkPreferenceListener mOnSetOemNetworkPreferenceListener; private ArgumentCaptor<ResolverParamsParcel> mResolverParamsParcelCaptor = ArgumentCaptor.forClass(ResolverParamsParcel.class); @@ -1612,10 +1617,13 @@ public class ConnectivityServiceTest { } switch (transport) { case TRANSPORT_WIFI: - assertEquals(mCm.getActiveNetwork(), mWiFiNetworkAgent.getNetwork()); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); break; case TRANSPORT_CELLULAR: - assertEquals(mCm.getActiveNetwork(), mCellNetworkAgent.getNetwork()); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + break; + case TRANSPORT_ETHERNET: + assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); break; default: break; @@ -1624,6 +1632,7 @@ public class ConnectivityServiceTest { assertNotNull(mCm.getNetworkInfo(mCm.getActiveNetwork())); assertEquals(transportToLegacyType(transport), mCm.getNetworkInfo(mCm.getActiveNetwork()).getType()); + assertNotNull(mCm.getActiveNetworkInfoForUid(Process.myUid())); // Test getNetworkCapabilities(Network) assertNotNull(mCm.getNetworkCapabilities(mCm.getActiveNetwork())); assertTrue(mCm.getNetworkCapabilities(mCm.getActiveNetwork()).hasTransport(transport)); @@ -8219,8 +8228,8 @@ public class ConnectivityServiceTest { reset(mNetworkManagementService); mCellNetworkAgent.connect(true); networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); - verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(), - eq(NetworkCapabilities.TRANSPORT_CELLULAR)); + verify(mMockNetd, times(1)).idletimerAddInterface(eq(MOBILE_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_CELLULAR))); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); final LinkProperties wifiLp = new LinkProperties(); @@ -8228,25 +8237,27 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.sendLinkProperties(wifiLp); // Network switch - reset(mNetworkManagementService); mWiFiNetworkAgent.connect(true); networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); - verify(mNetworkManagementService, times(1)).addIdleTimer(eq(WIFI_IFNAME), anyInt(), - eq(NetworkCapabilities.TRANSPORT_WIFI)); - verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(MOBILE_IFNAME)); + verify(mMockNetd, times(1)).idletimerAddInterface(eq(WIFI_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_WIFI))); + verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_CELLULAR))); // Disconnect wifi and switch back to cell - reset(mNetworkManagementService); + reset(mMockNetd); mWiFiNetworkAgent.disconnect(); networkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); assertNoCallbacks(networkCallback); - verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); - verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(), - eq(NetworkCapabilities.TRANSPORT_CELLULAR)); + verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(WIFI_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_WIFI))); + verify(mMockNetd, times(1)).idletimerAddInterface(eq(MOBILE_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_CELLULAR))); // reconnect wifi + reset(mMockNetd); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); wifiLp.setInterfaceName(WIFI_IFNAME); mWiFiNetworkAgent.sendLinkProperties(wifiLp); @@ -8254,9 +8265,12 @@ public class ConnectivityServiceTest { networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + verify(mMockNetd, times(1)).idletimerAddInterface(eq(WIFI_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_WIFI))); + verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_CELLULAR))); // Disconnect cell - reset(mNetworkManagementService); reset(mMockNetd); mCellNetworkAgent.disconnect(); networkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); @@ -8264,17 +8278,18 @@ public class ConnectivityServiceTest { // sent as network being switched. Ensure rule removal for cell will not be triggered // unexpectedly before network being removed. waitForIdle(); - verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME)); + verify(mMockNetd, times(0)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_CELLULAR))); verify(mMockNetd, times(1)).networkDestroy(eq(mCellNetworkAgent.getNetwork().netId)); verify(mMockDnsResolver, times(1)) .destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId)); // Disconnect wifi ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); - reset(mNetworkManagementService); mWiFiNetworkAgent.disconnect(); b.expectBroadcast(); - verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); + verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(WIFI_IFNAME), anyInt(), + eq(Integer.toString(TRANSPORT_WIFI))); // Clean up mCm.unregisterNetworkCallback(networkCallback); @@ -9445,7 +9460,7 @@ public class ConnectivityServiceTest { } private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid) - throws PackageManager.NameNotFoundException { + throws Exception { final ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = uid; when(mPackageManager.getApplicationInfo(eq(packageName), anyInt())) @@ -9465,7 +9480,7 @@ public class ConnectivityServiceTest { private OemNetworkPreferences createDefaultOemNetworkPreferences( @OemNetworkPreferences.OemNetworkPreference final int preference) - throws PackageManager.NameNotFoundException { + throws Exception { // Arrange PackageManager mocks mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID); @@ -9479,7 +9494,7 @@ public class ConnectivityServiceTest { public void testOemNetworkRequestFactoryPreferenceUninitializedThrowsError() throws PackageManager.NameNotFoundException { @OemNetworkPreferences.OemNetworkPreference final int prefToTest = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_UNINITIALIZED; + OEM_NETWORK_PREFERENCE_UNINITIALIZED; // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() assertThrows(IllegalArgumentException.class, @@ -9490,13 +9505,13 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryPreferenceOemPaid() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 1; final int expectedNumOfRequests = 3; @OemNetworkPreferences.OemNetworkPreference final int prefToTest = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; + OEM_NETWORK_PREFERENCE_OEM_PAID; // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final ArraySet<ConnectivityService.NetworkRequestInfo> nris = @@ -9519,13 +9534,13 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryPreferenceOemPaidNoFallback() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 1; final int expectedNumOfRequests = 2; @OemNetworkPreferences.OemNetworkPreference final int prefToTest = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; + OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final ArraySet<ConnectivityService.NetworkRequestInfo> nris = @@ -9545,13 +9560,13 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryPreferenceOemPaidOnly() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 1; final int expectedNumOfRequests = 1; @OemNetworkPreferences.OemNetworkPreference final int prefToTest = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final ArraySet<ConnectivityService.NetworkRequestInfo> nris = @@ -9568,13 +9583,13 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryPreferenceOemPrivateOnly() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 1; final int expectedNumOfRequests = 1; @OemNetworkPreferences.OemNetworkPreference final int prefToTest = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; + OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final ArraySet<ConnectivityService.NetworkRequestInfo> nris = @@ -9592,7 +9607,7 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryCreatesCorrectNumOfNris() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 2; @@ -9602,8 +9617,8 @@ public class ConnectivityServiceTest { mockGetApplicationInfo(testPackageName2, TEST_PACKAGE_UID); // Build OemNetworkPreferences object - final int testOemPref = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; - final int testOemPref2 = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; + final int testOemPref = OEM_NETWORK_PREFERENCE_OEM_PAID; + final int testOemPref2 = OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() .addNetworkPreference(TEST_PACKAGE_NAME, testOemPref) .addNetworkPreference(testPackageName2, testOemPref2) @@ -9619,7 +9634,7 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryCorrectlySetsUids() - throws PackageManager.NameNotFoundException { + throws Exception { // Arrange PackageManager mocks final String testPackageName2 = "com.google.apps.dialer"; final int testPackageNameUid2 = 456; @@ -9627,8 +9642,8 @@ public class ConnectivityServiceTest { mockGetApplicationInfo(testPackageName2, testPackageNameUid2); // Build OemNetworkPreferences object - final int testOemPref = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; - final int testOemPref2 = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; + final int testOemPref = OEM_NETWORK_PREFERENCE_OEM_PAID; + final int testOemPref2 = OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() .addNetworkPreference(TEST_PACKAGE_NAME, testOemPref) .addNetworkPreference(testPackageName2, testOemPref2) @@ -9650,7 +9665,7 @@ public class ConnectivityServiceTest { @Test public void testOemNetworkRequestFactoryAddsPackagesToCorrectPreference() - throws PackageManager.NameNotFoundException { + throws Exception { // Expectations final int expectedNumOfNris = 1; final int expectedNumOfAppUids = 2; @@ -9662,7 +9677,7 @@ public class ConnectivityServiceTest { mockGetApplicationInfo(testPackageName2, testPackageNameUid2); // Build OemNetworkPreferences object - final int testOemPref = OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; + final int testOemPref = OEM_NETWORK_PREFERENCE_OEM_PAID; final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() .addNetworkPreference(TEST_PACKAGE_NAME, testOemPref) .addNetworkPreference(testPackageName2, testOemPref) @@ -9680,8 +9695,6 @@ public class ConnectivityServiceTest { @Test public void testSetOemNetworkPreferenceNullListenerAndPrefParamThrowsNpe() { mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true); - @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; // Act on ConnectivityService.setOemNetworkPreference() assertThrows(NullPointerException.class, @@ -9692,15 +9705,637 @@ public class ConnectivityServiceTest { @Test public void testSetOemNetworkPreferenceFailsForNonAutomotive() - throws PackageManager.NameNotFoundException, RemoteException { + throws Exception { mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, false); @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; + OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; // Act on ConnectivityService.setOemNetworkPreference() assertThrows(UnsupportedOperationException.class, () -> mService.setOemNetworkPreference( createDefaultOemNetworkPreferences(networkPref), - mOnSetOemNetworkPreferenceListener)); + new TestOemListenerCallback())); + } + + private void setOemNetworkPreferenceAgentConnected(final int transportType, + final boolean connectAgent) throws Exception { + switch(transportType) { + // Corresponds to a metered cellular network. Will be used for the default network. + case TRANSPORT_CELLULAR: + if (!connectAgent) { + mCellNetworkAgent.disconnect(); + break; + } + mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); + mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_METERED); + mCellNetworkAgent.connect(true); + break; + // Corresponds to a restricted ethernet network with OEM_PAID/OEM_PRIVATE. + case TRANSPORT_ETHERNET: + if (!connectAgent) { + stopOemManagedNetwork(); + break; + } + startOemManagedNetwork(true); + break; + // Corresponds to unmetered Wi-Fi. + case TRANSPORT_WIFI: + if (!connectAgent) { + mWiFiNetworkAgent.disconnect(); + break; + } + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); + mWiFiNetworkAgent.connect(true); + break; + default: + throw new AssertionError("Unsupported transport type passed in."); + + } + waitForIdle(); + } + + private void startOemManagedNetwork(final boolean isOemPaid) throws Exception { + mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); + mEthernetNetworkAgent.addCapability( + isOemPaid ? NET_CAPABILITY_OEM_PAID : NET_CAPABILITY_OEM_PRIVATE); + mEthernetNetworkAgent.removeCapability(NET_CAPABILITY_NOT_RESTRICTED); + mEthernetNetworkAgent.connect(true); + } + + private void stopOemManagedNetwork() { + mEthernetNetworkAgent.disconnect(); + waitForIdle(); + } + + private void verifyMultipleDefaultNetworksTracksCorrectly( + final int expectedOemRequestsSize, + @NonNull final Network expectedDefaultNetwork, + @NonNull final Network expectedPerAppNetwork) { + // The current test setup assumes two tracked default network requests; one for the default + // network and the other for the OEM network preference being tested. This will be validated + // each time to confirm it doesn't change under test. + final int expectedDefaultNetworkRequestsSize = 2; + assertEquals(expectedDefaultNetworkRequestsSize, mService.mDefaultNetworkRequests.size()); + for (final ConnectivityService.NetworkRequestInfo defaultRequest + : mService.mDefaultNetworkRequests) { + final Network defaultNetwork = defaultRequest.getSatisfier() == null + ? null : defaultRequest.getSatisfier().network(); + // If this is the default request. + if (defaultRequest == mService.mDefaultRequest) { + assertEquals( + expectedDefaultNetwork, + defaultNetwork); + // Make sure this value doesn't change. + assertEquals(1, defaultRequest.mRequests.size()); + continue; + } + assertEquals(expectedPerAppNetwork, defaultNetwork); + assertEquals(expectedOemRequestsSize, defaultRequest.mRequests.size()); + } + } + + private void setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest( + @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup) + throws Exception { + final int testPackageNameUid = 123; + final String testPackageName = "per.app.defaults.package"; + setupMultipleDefaultNetworksForOemNetworkPreferenceTest( + networkPrefToSetup, testPackageNameUid, testPackageName); + } + + private void setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest( + @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup) + throws Exception { + final int testPackageNameUid = Process.myUid(); + final String testPackageName = "per.app.defaults.package"; + setupMultipleDefaultNetworksForOemNetworkPreferenceTest( + networkPrefToSetup, testPackageNameUid, testPackageName); + } + + private void setupMultipleDefaultNetworksForOemNetworkPreferenceTest( + @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup, + final int testPackageUid, @NonNull final String testPackageName) throws Exception { + // Only the default request should be included at start. + assertEquals(1, mService.mDefaultNetworkRequests.size()); + + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageUid)); + setupSetOemNetworkPreferenceForPreferenceTest( + networkPrefToSetup, uidRanges, testPackageName); + } + + private void setupSetOemNetworkPreferenceForPreferenceTest( + @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup, + @NonNull final UidRangeParcel[] uidRanges, + @NonNull final String testPackageName) + throws Exception { + mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true); + + // These tests work off a single UID therefore using 'start' is valid. + mockGetApplicationInfo(testPackageName, uidRanges[0].start); + + // Build OemNetworkPreferences object + final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() + .addNetworkPreference(testPackageName, networkPrefToSetup) + .build(); + + // Act on ConnectivityService.setOemNetworkPreference() + final TestOemListenerCallback mOnSetOemNetworkPreferenceTestListener = + new TestOemListenerCallback(); + mService.setOemNetworkPreference(pref, mOnSetOemNetworkPreferenceTestListener); + + // Verify call returned successfully + mOnSetOemNetworkPreferenceTestListener.expectOnComplete(); + } + + private static class TestOemListenerCallback implements IOnSetOemNetworkPreferenceListener { + final CompletableFuture<Object> mDone = new CompletableFuture<>(); + + @Override + public void onComplete() { + mDone.complete(new Object()); + } + + void expectOnComplete() throws Exception { + try { + mDone.get(TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + fail("Expected onComplete() not received after " + TIMEOUT_MS + " ms"); + } + } + + @Override + public IBinder asBinder() { + return null; + } + } + + @Test + public void testMultiDefaultGetActiveNetworkIsCorrect() throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + final int expectedOemPrefRequestSize = 1; + + // Setup the test process to use networkPref for their default network. + setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + // The active network for the default should be null at this point as this is a retricted + // network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + null, + mEthernetNetworkAgent.getNetwork()); + + // Verify that the active network is correct + verifyActiveNetwork(TRANSPORT_ETHERNET); + } + + @Test + public void testMultiDefaultIsActiveNetworkMeteredIsCorrect() throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + final int expectedOemPrefRequestSize = 1; + + // Setup the test process to use networkPref for their default network. + setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); + + // Returns true by default when no network is available. + assertTrue(mCm.isActiveNetworkMetered()); + + // Connect to an unmetered restricted network that will only be available to the OEM pref. + mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); + mEthernetNetworkAgent.addCapability(NET_CAPABILITY_OEM_PAID); + mEthernetNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); + mEthernetNetworkAgent.removeCapability(NET_CAPABILITY_NOT_RESTRICTED); + mEthernetNetworkAgent.connect(true); + waitForIdle(); + + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + null, + mEthernetNetworkAgent.getNetwork()); + + assertFalse(mCm.isActiveNetworkMetered()); + } + + @Test + public void testPerAppDefaultRegisterDefaultNetworkCallback() throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + final int expectedOemPrefRequestSize = 1; + final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); + + // Register the default network callback before the pref is already set. This means that + // the policy will be applied to the callback on setOemNetworkPreference(). + mCm.registerDefaultNetworkCallback(defaultNetworkCallback); + defaultNetworkCallback.assertNoCallback(); + + // Setup the test process to use networkPref for their default network. + setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + // The active nai for the default is null at this point as this is a restricted network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + null, + mEthernetNetworkAgent.getNetwork()); + + // At this point with a restricted network used, the available callback should trigger + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), + mEthernetNetworkAgent.getNetwork()); + + // Now bring down the default network which should trigger a LOST callback. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + + // At this point, with no network is available, the lost callback should trigger + defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent); + + // Confirm we can unregister without issues. + mCm.unregisterNetworkCallback(defaultNetworkCallback); + } + + @Test + public void testPerAppDefaultRegisterDefaultNetworkCallbackAfterPrefSet() throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + final int expectedOemPrefRequestSize = 1; + final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); + + // Setup the test process to use networkPref for their default network. + setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); + + // Register the default network callback after the pref is already set. This means that + // the policy will be applied to the callback on requestNetwork(). + mCm.registerDefaultNetworkCallback(defaultNetworkCallback); + defaultNetworkCallback.assertNoCallback(); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + // The active nai for the default is null at this point as this is a restricted network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + null, + mEthernetNetworkAgent.getNetwork()); + + // At this point with a restricted network used, the available callback should trigger + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), + mEthernetNetworkAgent.getNetwork()); + + // Now bring down the default network which should trigger a LOST callback. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + + // At this point, with no network is available, the lost callback should trigger + defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent); + + // Confirm we can unregister without issues. + mCm.unregisterNetworkCallback(defaultNetworkCallback); + } + + @Test + public void testPerAppDefaultRegisterDefaultNetworkCallbackDoesNotFire() throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + final int expectedOemPrefRequestSize = 1; + final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); + final int userId = UserHandle.getUserId(Process.myUid()); + + mCm.registerDefaultNetworkCallback(defaultNetworkCallback); + defaultNetworkCallback.assertNoCallback(); + + // Setup a process different than the test process to use the default network. This means + // that the defaultNetworkCallback won't be tracked by the per-app policy. + setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(networkPref); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + // The active nai for the default is null at this point as this is a restricted network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + null, + mEthernetNetworkAgent.getNetwork()); + + // As this callback does not have access to the OEM_PAID network, it will not fire. + defaultNetworkCallback.assertNoCallback(); + assertDefaultNetworkCapabilities(userId /* no networks */); + + // Bring up unrestricted cellular. This should now satisfy the default network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); + verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, + mCellNetworkAgent.getNetwork(), + mEthernetNetworkAgent.getNetwork()); + + // At this point with an unrestricted network used, the available callback should trigger + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), + mCellNetworkAgent.getNetwork()); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent); + + // Now bring down the per-app network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + + // Since the callback didn't use the per-app network, no callback should fire. + defaultNetworkCallback.assertNoCallback(); + + // Now bring down the default network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); + + // As this callback was tracking the default, this should now trigger. + defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); + + // Confirm we can unregister without issues. + mCm.unregisterNetworkCallback(defaultNetworkCallback); + } + + private void verifySetOemNetworkPreferenceForPreference( + @NonNull final UidRangeParcel[] uidRanges, + final int addUidRangesNetId, + final int addUidRangesTimes, + final int removeUidRangesNetId, + final int removeUidRangesTimes, + final boolean shouldDestroyNetwork) throws RemoteException { + final boolean useAnyIdForAdd = OEM_PREF_ANY_NET_ID == addUidRangesNetId; + final boolean useAnyIdForRemove = OEM_PREF_ANY_NET_ID == removeUidRangesNetId; + + // Validate netd. + verify(mMockNetd, times(addUidRangesTimes)) + .networkAddUidRanges( + (useAnyIdForAdd ? anyInt() : eq(addUidRangesNetId)), eq(uidRanges)); + verify(mMockNetd, times(removeUidRangesTimes)) + .networkRemoveUidRanges( + (useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)), eq(uidRanges)); + if (shouldDestroyNetwork) { + verify(mMockNetd, times(1)) + .networkDestroy((useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId))); + } + reset(mMockNetd); + } + + /** + * Test the tracked default requests clear previous OEM requests on setOemNetworkPreference(). + * @throws Exception + */ + @Test + public void testSetOemNetworkPreferenceClearPreviousOemValues() throws Exception { + @OemNetworkPreferences.OemNetworkPreference int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID; + final int testPackageUid = 123; + final String testPackageName = "com.google.apps.contacts"; + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageUid)); + + // Validate the starting requests only includes the fallback request. + assertEquals(1, mService.mDefaultNetworkRequests.size()); + + // Add an OEM default network request to track. + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, testPackageName); + + // Two requests should exist, one for the fallback and one for the pref. + assertEquals(2, mService.mDefaultNetworkRequests.size()); + + networkPref = OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, testPackageName); + + // Two requests should still exist validating the previous per-app request was replaced. + assertEquals(2, mService.mDefaultNetworkRequests.size()); + } + + /** + * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID following in order: + * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback + * @throws Exception + */ + @Test + public void testMultilayerForPreferenceOemPaidEvaluatesCorrectly() + throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID; + + // Arrange PackageManager mocks + final int testPackageNameUid = 123; + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); + + // Verify the starting state. No networks should be connected. + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Test lowest to highest priority requests. + // Bring up metered cellular. This will satisfy the fallback network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mCellNetworkAgent.getNetwork().netId, 1 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + mCellNetworkAgent.getNetwork().netId, 1 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up unmetered Wi-Fi. This will satisfy NET_CAPABILITY_NOT_METERED. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mWiFiNetworkAgent.getNetwork().netId, 1 /* times */, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + false /* shouldDestroyNetwork */); + + // Disconnecting OEM_PAID should have no effect as it is lower in priority then unmetered. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + // netd should not be called as default networks haven't changed. + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Disconnecting unmetered should put PANS on lowest priority fallback request. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mCellNetworkAgent.getNetwork().netId, 1 /* times */, + mWiFiNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); + + // Disconnecting the fallback network should result in no connectivity. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + mCellNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); + } + + /** + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK following in order: + * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID + * @throws Exception + */ + @Test + public void testMultilayerForPreferenceOemPaidNoFallbackEvaluatesCorrectly() + throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; + + // Arrange PackageManager mocks + final int testPackageNameUid = 123; + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); + + // Verify the starting state. This preference doesn't support using the fallback network + // therefore should be on the disconnected network as it has no networks to connect to. + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Test lowest to highest priority requests. + // Bring up metered cellular. This will satisfy the fallback network. + // This preference should not use this network as it doesn't support fallback usage. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up unmetered Wi-Fi. This will satisfy NET_CAPABILITY_NOT_METERED. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mWiFiNetworkAgent.getNetwork().netId, 1 /* times */, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + false /* shouldDestroyNetwork */); + + // Disconnecting unmetered should put PANS on OEM_PAID. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + mWiFiNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); + + // Disconnecting OEM_PAID should result in no connectivity. + // OEM_PAID_NO_FALLBACK not supporting a fallback now uses the disconnected network. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + mEthernetNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); + } + + /** + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY following in order: + * NET_CAPABILITY_OEM_PAID + * This preference should only apply to OEM_PAID networks. + * @throws Exception + */ + @Test + public void testMultilayerForPreferenceOemPaidOnlyEvaluatesCorrectly() + throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; + + // Arrange PackageManager mocks + final int testPackageNameUid = 123; + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); + + // Verify the starting state. This preference doesn't support using the fallback network + // therefore should be on the disconnected network as it has no networks to connect to. + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up metered cellular. This should not apply to this preference. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up unmetered Wi-Fi. This should not apply to this preference. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + false /* shouldDestroyNetwork */); + + // Disconnecting OEM_PAID should result in no connectivity. + setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + mEthernetNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); + } + + /** + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY following in order: + * NET_CAPABILITY_OEM_PRIVATE + * This preference should only apply to OEM_PRIVATE networks. + * @throws Exception + */ + @Test + public void testMultilayerForPreferenceOemPrivateOnlyEvaluatesCorrectly() + throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; + + // Arrange PackageManager mocks + final int testPackageNameUid = 123; + final UidRangeParcel[] uidRanges = + toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); + setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); + + // Verify the starting state. This preference doesn't support using the fallback network + // therefore should be on the disconnected network as it has no networks to connect to. + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up metered cellular. This should not apply to this preference. + setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up unmetered Wi-Fi. This should not apply to this preference. + setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); + verifySetOemNetworkPreferenceForPreference(uidRanges, + OEM_PREF_ANY_NET_ID, 0 /* times */, + OEM_PREF_ANY_NET_ID, 0 /* times */, + false /* shouldDestroyNetwork */); + + // Bring up ethernet with OEM_PRIVATE. This will satisfy NET_CAPABILITY_OEM_PRIVATE. + startOemManagedNetwork(false); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mEthernetNetworkAgent.getNetwork().netId, 1 /* times */, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + false /* shouldDestroyNetwork */); + + // Disconnecting OEM_PRIVATE should result in no connectivity. + stopOemManagedNetwork(); + verifySetOemNetworkPreferenceForPreference(uidRanges, + mService.mNoServiceNetwork.network.getNetId(), 1 /* times */, + mEthernetNetworkAgent.getNetwork().netId, 0 /* times */, + true /* shouldDestroyNetwork */); } } diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index 214c82da17dc..d644739ea25e 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -1461,7 +1461,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true); capabilities.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); capabilities.setSSID(TEST_SSID); - return new NetworkState(TYPE_WIFI, prop, capabilities, WIFI_NETWORK, null, TEST_SSID); + return new NetworkState(TYPE_WIFI, prop, capabilities, WIFI_NETWORK, null); } private static NetworkState buildMobile3gState(String subscriberId) { @@ -1475,8 +1475,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false); capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !isRoaming); capabilities.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - return new NetworkState( - TYPE_MOBILE, prop, capabilities, MOBILE_NETWORK, subscriberId, null); + return new NetworkState(TYPE_MOBILE, prop, capabilities, MOBILE_NETWORK, subscriberId); } private NetworkStats buildEmptyStats() { @@ -1486,7 +1485,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private static NetworkState buildVpnState() { final LinkProperties prop = new LinkProperties(); prop.setInterfaceName(TUN_IFACE); - return new NetworkState(TYPE_VPN, prop, new NetworkCapabilities(), VPN_NETWORK, null, null); + return new NetworkState(TYPE_VPN, prop, new NetworkCapabilities(), VPN_NETWORK, null); } private long getElapsedRealtime() { |