diff options
611 files changed, 7670 insertions, 6982 deletions
diff --git a/Android.bp b/Android.bp index 727842e063dc..ee3b39681ea2 100644 --- a/Android.bp +++ b/Android.bp @@ -279,6 +279,7 @@ java_defaults { "core/java/android/os/storage/IStorageShutdownObserver.aidl", "core/java/android/os/storage/IObbActionListener.aidl", "core/java/android/permission/IPermissionController.aidl", + "core/java/android/permission/IPermissionManager.aidl", ":keystore_aidl", "core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl", "core/java/android/service/appprediction/IPredictionService.aidl", @@ -842,6 +843,7 @@ java_library { java_library { name: "framework-annotation-proc", defaults: ["framework-defaults"], + installable: false, // Use UsedByApps annotation processor plugins: ["unsupportedappusage-annotation-processor"], } @@ -1880,3 +1882,13 @@ aidl_mapping { srcs: [":framework-defaults"], output: "framework-aidl-mappings.txt", } + +genrule { + name: "framework-annotation-proc-index", + srcs: [":framework-annotation-proc"], + cmd: "unzip -qp $(in) unsupportedappusage/unsupportedappusage_index.csv > $(out)", + out: ["unsupportedappusage_index.csv"], + dist: { + targets: ["droidcore"], + }, +} diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index 10f25ea1c8d1..c30a6f491807 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -581,6 +581,7 @@ Landroid/security/keystore/IKeystoreService;->ungrant(Ljava/lang/String;I)I Landroid/service/dreams/IDreamManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/dreams/IDreamManager; Landroid/service/dreams/IDreamManager;->getDreamComponents()[Landroid/content/ComponentName; Landroid/service/euicc/IEuiccService$Stub;-><init>()V +Landroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/media/IMediaBrowserServiceCallbacks; Landroid/service/notification/INotificationListener$Stub;-><init>()V Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService; Landroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager; diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 28d3165b8073..f655c8993456 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -8554,8 +8554,7 @@ public class Activity extends ContextThemeWrapper /** Log a lifecycle event for current user id and component class. */ private void writeEventLog(int event, String reason) { - EventLog.writeEvent(event, UserHandle.myUserId(), getComponentName().getClassName(), - reason); + EventLog.writeEvent(event, mIdent, getComponentName().getClassName(), reason); } class HostCallbacks extends FragmentHostCallback<Activity> { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 5ab694faca64..d741b610a0e2 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -113,6 +113,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; +import android.permission.IPermissionManager; import android.provider.BlockedNumberContract; import android.provider.CalendarContract; import android.provider.CallLog; @@ -287,6 +288,7 @@ public final class ActivityThread extends ClientTransactionHandler { @UnsupportedAppUsage static volatile IPackageManager sPackageManager; + private static volatile IPermissionManager sPermissionManager; @UnsupportedAppUsage final ApplicationThread mAppThread = new ApplicationThread(); @@ -2136,16 +2138,23 @@ public final class ActivityThread extends ClientTransactionHandler { @UnsupportedAppUsage public static IPackageManager getPackageManager() { if (sPackageManager != null) { - //Slog.v("PackageManager", "returning cur default = " + sPackageManager); return sPackageManager; } - IBinder b = ServiceManager.getService("package"); - //Slog.v("PackageManager", "default service binder = " + b); + final IBinder b = ServiceManager.getService("package"); sPackageManager = IPackageManager.Stub.asInterface(b); - //Slog.v("PackageManager", "default service = " + sPackageManager); return sPackageManager; } + /** Returns the permission manager */ + public static IPermissionManager getPermissionManager() { + if (sPermissionManager != null) { + return sPermissionManager; + } + final IBinder b = ServiceManager.getService("permissionmgr"); + sPermissionManager = IPermissionManager.Stub.asInterface(b); + return sPermissionManager; + } + private Configuration mMainThreadConfig = new Configuration(); Configuration applyConfigCompatMainThread(int displayDensity, Configuration config, @@ -6317,7 +6326,8 @@ public final class ActivityThread extends ClientTransactionHandler { final InstrumentationInfo ii; if (data.instrumentationName != null) { try { - ii = new ApplicationPackageManager(null, getPackageManager()) + ii = new ApplicationPackageManager( + null, getPackageManager(), getPermissionManager()) .getInstrumentationInfo(data.instrumentationName, 0); } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( diff --git a/core/java/android/app/AppGlobals.java b/core/java/android/app/AppGlobals.java index 1f737b60964c..8312327a8c1d 100644 --- a/core/java/android/app/AppGlobals.java +++ b/core/java/android/app/AppGlobals.java @@ -18,6 +18,7 @@ package android.app; import android.annotation.UnsupportedAppUsage; import android.content.pm.IPackageManager; +import android.permission.IPermissionManager; /** * Special private access for certain globals related to a process. @@ -52,6 +53,14 @@ public class AppGlobals { } /** + * Return the raw interface to the permission manager. + * @return The permission manager. + */ + public static IPermissionManager getPermissionManager() { + return ActivityThread.getPermissionManager(); + } + + /** * Gets the value of an integer core setting. * * @param key The setting key. diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 7a614cea1dd8..1c123dec1c10 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -82,6 +82,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; +import android.permission.IPermissionManager; import android.provider.Settings; import android.system.ErrnoException; import android.system.Os; @@ -1050,6 +1051,7 @@ public class ApplicationPackageManager extends PackageManager { } } + @UnsupportedAppUsage @Override public boolean setInstantAppCookie(@NonNull byte[] cookie) { try { @@ -1654,10 +1656,11 @@ public class ApplicationPackageManager extends PackageManager { } @UnsupportedAppUsage - protected ApplicationPackageManager(ContextImpl context, - IPackageManager pm) { + protected ApplicationPackageManager(ContextImpl context, IPackageManager pm, + IPermissionManager permissionManager) { mContext = context; mPM = pm; + mPermissionManager = permissionManager; } /** @@ -2929,6 +2932,7 @@ public class ApplicationPackageManager extends PackageManager { private final ContextImpl mContext; @UnsupportedAppUsage private final IPackageManager mPM; + private final IPermissionManager mPermissionManager; /** Assume locked until we hear otherwise */ private volatile boolean mUserUnlocked = false; diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 41a4fba0434c..ef23d5e7a424 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -68,6 +68,7 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; +import android.permission.IPermissionManager; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -297,10 +298,11 @@ class ContextImpl extends Context { return mPackageManager; } - IPackageManager pm = ActivityThread.getPackageManager(); - if (pm != null) { + final IPackageManager pm = ActivityThread.getPackageManager(); + final IPermissionManager permissionManager = ActivityThread.getPermissionManager(); + if (pm != null && permissionManager != null) { // Doesn't matter if we make more than one instance. - return (mPackageManager = new ApplicationPackageManager(this, pm)); + return (mPackageManager = new ApplicationPackageManager(this, pm, permissionManager)); } return null; diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java index 60fb6fb122e3..a812c32ae868 100644 --- a/core/java/android/bluetooth/BluetoothHearingAid.java +++ b/core/java/android/bluetooth/BluetoothHearingAid.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Binder; import android.os.IBinder; @@ -83,6 +84,7 @@ public final class BluetoothHearingAid implements BluetoothProfile { * * @hide */ + @UnsupportedAppUsage @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_ACTIVE_DEVICE_CHANGED = "android.bluetooth.hearingaid.profile.action.ACTIVE_DEVICE_CHANGED"; @@ -303,6 +305,7 @@ public final class BluetoothHearingAid implements BluetoothProfile { * @return false on immediate error, true otherwise * @hide */ + @UnsupportedAppUsage public boolean setActiveDevice(@Nullable BluetoothDevice device) { if (DBG) log("setActiveDevice(" + device + ")"); final IBluetoothHearingAid service = getService(); @@ -331,6 +334,7 @@ public final class BluetoothHearingAid implements BluetoothProfile { * is not active, it will be null on that position. Returns empty list on error. * @hide */ + @UnsupportedAppUsage @RequiresPermission(Manifest.permission.BLUETOOTH) public List<BluetoothDevice> getActiveDevices() { if (VDBG) log("getActiveDevices()"); diff --git a/core/java/android/content/om/OverlayInfo.java b/core/java/android/content/om/OverlayInfo.java index 1838babf7794..f39fc6674a11 100644 --- a/core/java/android/content/om/OverlayInfo.java +++ b/core/java/android/content/om/OverlayInfo.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.UnsupportedAppUsage; import android.annotation.UserIdInt; import android.os.Parcel; import android.os.Parcelable; @@ -169,6 +170,7 @@ public final class OverlayInfo implements Parcelable { * The state of this OverlayInfo as defined by the STATE_* constants in this class. * @hide */ + @UnsupportedAppUsage public final @State int state; /** diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index a7eecd7f4306..bd6ee7651916 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -171,9 +171,6 @@ interface IPackageManager { boolean isUidPrivileged(int uid); @UnsupportedAppUsage - String[] getAppOpPermissionPackages(String permissionName); - - @UnsupportedAppUsage ResolveInfo resolveIntent(in Intent intent, String resolvedType, int flags, int userId); ResolveInfo findPersistentPreferredActivity(in Intent intent, int userId); @@ -772,4 +769,12 @@ interface IPackageManager { void setRuntimePermissionsVersion(int version, int userId); void notifyPackagesReplacedReceived(in String[] packages); + + //------------------------------------------------------------------------ + // + // The following binder interfaces have been moved to IPermissionManager + // + //------------------------------------------------------------------------ + @UnsupportedAppUsage + String[] getAppOpPermissionPackages(String permissionName); } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index a2994af37e3e..a74c34ff4a88 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -8391,12 +8391,13 @@ public class PackageParser { public static PackageInfo generatePackageInfoFromApex(ApexInfo apexInfo, int flags) throws PackageParserException { PackageParser pp = new PackageParser(); - File apexFile = new File(apexInfo.packagePath); + File apexFile = new File(apexInfo.modulePath); final Package p = pp.parsePackage(apexFile, flags, false); PackageUserState state = new PackageUserState(); PackageInfo pi = generatePackageInfo(p, EmptyArray.INT, flags, 0, 0, Collections.emptySet(), state); pi.applicationInfo.sourceDir = apexFile.getPath(); + pi.applicationInfo.publicSourceDir = apexFile.getPath(); if (apexInfo.isFactory) { pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; } else { diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index b0b1874107ce..23fbefb73c50 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -17,7 +17,6 @@ package android.content.pm; import android.Manifest; -import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -177,8 +176,7 @@ public abstract class RegisteredServicesCache<V> { mContext.registerReceiver(mUserRemovedReceiver, userFilter); } - @VisibleForTesting - protected void handlePackageEvent(Intent intent, int userId) { + private void handlePackageEvent(Intent intent, int userId) { // Don't regenerate the services map when the package is removed or its // ASEC container unmounted as a step in replacement. The subsequent // _ADDED / _AVAILABLE call will regenerate the map in the final state. @@ -240,9 +238,6 @@ public abstract class RegisteredServicesCache<V> { public void invalidateCache(int userId) { synchronized (mServicesLock) { - if (DEBUG) { - Slog.d(TAG, "invalidating cache for " + userId + " " + mInterfaceName); - } final UserServices<V> user = findOrCreateUserLocked(userId); user.services = null; onServicesChangedLocked(userId); @@ -472,48 +467,34 @@ public abstract class RegisteredServicesCache<V> { * or null to assume that everything is affected. * @param userId the user for whom to update the services map. */ - private void generateServicesMap(@Nullable int[] changedUids, int userId) { + private void generateServicesMap(int[] changedUids, int userId) { if (DEBUG) { Slog.d(TAG, "generateServicesMap() for " + userId + ", changed UIDs = " + Arrays.toString(changedUids)); } + final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<>(); + final List<ResolveInfo> resolveInfos = queryIntentServices(userId); + for (ResolveInfo resolveInfo : resolveInfos) { + try { + ServiceInfo<V> info = parseServiceInfo(resolveInfo); + if (info == null) { + Log.w(TAG, "Unable to load service info " + resolveInfo.toString()); + continue; + } + serviceInfos.add(info); + } catch (XmlPullParserException | IOException e) { + Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e); + } + } + synchronized (mServicesLock) { final UserServices<V> user = findOrCreateUserLocked(userId); - final boolean cacheInvalid = user.services == null; - if (cacheInvalid) { + final boolean firstScan = user.services == null; + if (firstScan) { user.services = Maps.newHashMap(); } - final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<>(); - final List<ResolveInfo> resolveInfos = queryIntentServices(userId); - - for (ResolveInfo resolveInfo : resolveInfos) { - try { - // when changedUids == null, we want to do a rescan of everything, this means - // it's the initial scan, and containsUid will trivially return true - // when changedUids != null, we got here because a package changed, but - // invalidateCache could have been called (thus user.services == null), and we - // should query from PackageManager again - if (!cacheInvalid - && !containsUid( - changedUids, resolveInfo.serviceInfo.applicationInfo.uid)) { - if (DEBUG) { - Slog.d(TAG, "Skipping parseServiceInfo for " + resolveInfo); - } - continue; - } - ServiceInfo<V> info = parseServiceInfo(resolveInfo); - if (info == null) { - Log.w(TAG, "Unable to load service info " + resolveInfo.toString()); - continue; - } - serviceInfos.add(info); - } catch (XmlPullParserException | IOException e) { - Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e); - } - } - StringBuilder changes = new StringBuilder(); boolean changed = false; for (ServiceInfo<V> info : serviceInfos) { @@ -534,7 +515,7 @@ public abstract class RegisteredServicesCache<V> { changed = true; user.services.put(info.type, info); user.persistentServices.put(info.type, info.uid); - if (!(user.mPersistentServicesFileDidNotExist && cacheInvalid)) { + if (!(user.mPersistentServicesFileDidNotExist && firstScan)) { notifyListener(info.type, userId, false /* removed */); } } else if (previousUid == info.uid) { diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl index b0e31c8578b9..8c2a65faf8ed 100644 --- a/core/java/android/content/rollback/IRollbackManager.aidl +++ b/core/java/android/content/rollback/IRollbackManager.aidl @@ -24,7 +24,7 @@ import android.content.IntentSender; interface IRollbackManager { ParceledListSlice getAvailableRollbacks(); - ParceledListSlice getRecentlyExecutedRollbacks(); + ParceledListSlice getRecentlyCommittedRollbacks(); void commitRollback(int rollbackId, in ParceledListSlice causePackages, String callerPackageName, in IntentSender statusReceiver); diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java index b8811aa1225e..73b8a48d9153 100644 --- a/core/java/android/content/rollback/RollbackManager.java +++ b/core/java/android/content/rollback/RollbackManager.java @@ -114,7 +114,7 @@ public final class RollbackManager { }) public @NonNull List<RollbackInfo> getRecentlyCommittedRollbacks() { try { - return mBinder.getRecentlyExecutedRollbacks().getList(); + return mBinder.getRecentlyCommittedRollbacks().getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 04e8cf421baa..5ac13d8a067d 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -925,14 +925,14 @@ public abstract class CameraMetadata<TKey> { * case, when the application configures a RAW stream, the camera device will make sure * the active physical camera will remain active to ensure consistent RAW output * behavior, and not switch to other physical cameras.</p> - * <p>To maintain backward compatibility, the capture request and result metadata tags - * required for basic camera functionalities will be solely based on the - * logical camera capabiltity. Other request and result metadata tags, on the other - * hand, will be based on current active physical camera. For example, the physical - * cameras' sensor sensitivity and lens capability could be different from each other. - * So when the application manually controls sensor exposure time/gain, or does manual - * focus control, it must checks the current active physical camera's exposure, gain, - * and focus distance range.</p> + * <p>The capture request and result metadata tags required for backward compatible camera + * functionalities will be solely based on the logical camera capabiltity. On the other + * hand, the use of manual capture controls (sensor or post-processing) with a + * logical camera may result in unexpected behavior when the HAL decides to switch + * between physical cameras with different characteristics under the hood. For example, + * when the application manually sets exposure time and sensitivity while zooming in, + * the brightness of the camera images may suddenly change because HAL switches from one + * physical camera to the other.</p> * * @see CameraCharacteristics#LENS_DISTORTION * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java index c45b8ed52187..3e995b624112 100644 --- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java +++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java @@ -48,7 +48,8 @@ public class AmbientDisplayConfiguration { return pulseOnNotificationEnabled(user) || pulseOnLongPressEnabled(user) || alwaysOnEnabled(user) - || wakeScreenGestureEnabled(user) + || wakeLockScreenGestureEnabled(user) + || wakeDisplayGestureEnabled(user) || pickupGestureEnabled(user) || tapGestureEnabled(user) || doubleTapGestureEnabled(user); @@ -105,8 +106,14 @@ public class AmbientDisplayConfiguration { } /** {@hide} */ - public boolean wakeScreenGestureEnabled(int user) { - return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, user) + public boolean wakeLockScreenGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, user) + && wakeScreenGestureAvailable(); + } + + /** {@hide} */ + public boolean wakeDisplayGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, user) && wakeScreenGestureAvailable(); } diff --git a/core/java/android/hardware/hdmi/HdmiPlaybackClient.java b/core/java/android/hardware/hdmi/HdmiPlaybackClient.java index df231e600a1e..f13326b71ce6 100644 --- a/core/java/android/hardware/hdmi/HdmiPlaybackClient.java +++ b/core/java/android/hardware/hdmi/HdmiPlaybackClient.java @@ -73,8 +73,12 @@ public final class HdmiPlaybackClient extends HdmiClient { } /** - * Performs the feature 'one touch play' from playback device to turn on display - * and switch the input. + * Performs the feature 'one touch play' from playback device to turn on display and claim + * to be the streaming source. + * + * <p>Client side is responsible to send out intent to choose whichever internal + * source on the current device it would like to switch to. Otherwise the current + * device will remain on the current input. * * @param callback {@link OneTouchPlayCallback} object to get informed * of the result diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index f17cfbabfb7e..f53f45891f1a 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -166,6 +166,7 @@ public final class HdmiPortInfo implements Parcelable { public String toString() { StringBuffer s = new StringBuffer(); s.append("port_id: ").append(mId).append(", "); + s.append("type: ").append((mType == PORT_INPUT) ? "HDMI_IN" : "HDMI_OUT").append(", "); s.append("address: ").append(String.format("0x%04x", mAddress)).append(", "); s.append("cec: ").append(mCecSupported).append(", "); s.append("arc: ").append(mArcSupported).append(", "); diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 660cd848d1df..43ea5891d7f7 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -437,15 +437,23 @@ public abstract class NetworkAgent extends Handler { } /** - * Called by the bearer to indicate this network was manually selected by the user. + * Called by the bearer to indicate whether the network was manually selected by the user. * This should be called before the NetworkInfo is marked CONNECTED so that this - * Network can be given special treatment at that time. If {@code acceptUnvalidated} is - * {@code true}, then the system will switch to this network. If it is {@code false} and the - * network cannot be validated, the system will ask the user whether to switch to this network. - * If the user confirms and selects "don't ask again", then the system will call - * {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever - * calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement - * {@link #saveAcceptUnvalidated} to respect the user's choice. + * Network can be given special treatment at that time. + * + * If {@code explicitlySelected} is {@code true}, and {@code acceptUnvalidated} is {@code true}, + * then the system will switch to this network. If {@code explicitlySelected} is {@code true} + * and {@code acceptUnvalidated} is {@code false}, and the network cannot be validated, the + * system will ask the user whether to switch to this network. If the user confirms and selects + * "don't ask again", then the system will call {@link #saveAcceptUnvalidated} to persist the + * user's choice. Thus, if the transport ever calls this method with {@code explicitlySelected} + * set to {@code true} and {@code acceptUnvalidated} set to {@code false}, it must also + * implement {@link #saveAcceptUnvalidated} to respect the user's choice. + * + * If {@code explicitlySelected} is {@code false} and {@code acceptUnvalidated} is + * {@code true}, the system will interpret this as the user having accepted partial connectivity + * on this network. Thus, the system will switch to the network and consider it validated even + * if it only provides partial connectivity, but the network is not otherwise treated specially. */ public void explicitlySelected(boolean explicitlySelected, boolean acceptUnvalidated) { queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, diff --git a/core/java/android/os/IServiceManager.java b/core/java/android/os/IServiceManager.java deleted file mode 100644 index 053c5ede7224..000000000000 --- a/core/java/android/os/IServiceManager.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2006 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.os; - -import android.annotation.UnsupportedAppUsage; - -/** - * Basic interface for finding and publishing system services. - * - * An implementation of this interface is usually published as the - * global context object, which can be retrieved via - * BinderNative.getContextObject(). An easy way to retrieve this - * is with the static method BnServiceManager.getDefault(). - * - * @hide - */ -public interface IServiceManager extends IInterface -{ - /** - * Retrieve an existing service called @a name from the - * service manager. Blocks for a few seconds waiting for it to be - * published if it does not already exist. - */ - @UnsupportedAppUsage - IBinder getService(String name) throws RemoteException; - - /** - * Retrieve an existing service called @a name from the - * service manager. Non-blocking. - */ - @UnsupportedAppUsage - IBinder checkService(String name) throws RemoteException; - - /** - * Place a new @a service called @a name into the service - * manager. - */ - void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags) - throws RemoteException; - - /** - * Return a list of all currently running services. - */ - String[] listServices(int dumpFlags) throws RemoteException; - - static final String descriptor = "android.os.IServiceManager"; - - int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION; - int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1; - int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2; - int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3; - int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4; - int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5; - - /* - * Must update values in IServiceManager.h - */ - /* Allows services to dump sections according to priorities. */ - int DUMP_FLAG_PRIORITY_CRITICAL = 1 << 0; - int DUMP_FLAG_PRIORITY_HIGH = 1 << 1; - int DUMP_FLAG_PRIORITY_NORMAL = 1 << 2; - /** - * Services are by default registered with a DEFAULT dump priority. DEFAULT priority has the - * same priority as NORMAL priority but the services are not called with dump priority - * arguments. - */ - int DUMP_FLAG_PRIORITY_DEFAULT = 1 << 3; - int DUMP_FLAG_PRIORITY_ALL = DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH - | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PRIORITY_DEFAULT; - /* Allows services to dump sections in protobuf format. */ - int DUMP_FLAG_PROTO = 1 << 4; - -} diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java index 011dfa03c70a..7991cd46b65c 100644 --- a/core/java/android/os/ServiceManagerNative.java +++ b/core/java/android/os/ServiceManagerNative.java @@ -18,8 +18,6 @@ package android.os; import android.annotation.UnsupportedAppUsage; -import java.util.ArrayList; - /** * Native implementation of the service manager. Most clients will only * care about asInterface(). @@ -32,26 +30,27 @@ public final class ServiceManagerNative { /** * Cast a Binder object into a service manager interface, generating * a proxy if needed. + * + * TODO: delete this method and have clients use + * IServiceManager.Stub.asInterface instead */ @UnsupportedAppUsage - static public IServiceManager asInterface(IBinder obj) - { + public static IServiceManager asInterface(IBinder obj) { if (obj == null) { return null; } - IServiceManager in = - (IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor); - if (in != null) { - return in; - } + // ServiceManager is never local return new ServiceManagerProxy(obj); } } +// This class should be deleted and replaced with IServiceManager.Stub whenever +// mRemote is no longer used class ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote) { mRemote = remote; + mServiceManager = IServiceManager.Stub.asInterface(remote); } public IBinder asBinder() { @@ -60,73 +59,30 @@ class ServiceManagerProxy implements IServiceManager { @UnsupportedAppUsage public IBinder getService(String name) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0); - IBinder binder = reply.readStrongBinder(); - reply.recycle(); - data.recycle(); - return binder; + // Same as checkService (old versions of servicemanager had both methods). + return mServiceManager.checkService(name); } public IBinder checkService(String name) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - mRemote.transact(CHECK_SERVICE_TRANSACTION, data, reply, 0); - IBinder binder = reply.readStrongBinder(); - reply.recycle(); - data.recycle(); - return binder; + return mServiceManager.checkService(name); } public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - data.writeStrongBinder(service); - data.writeInt(allowIsolated ? 1 : 0); - data.writeInt(dumpPriority); - mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0); - reply.recycle(); - data.recycle(); + mServiceManager.addService(name, service, allowIsolated, dumpPriority); } public String[] listServices(int dumpPriority) throws RemoteException { - ArrayList<String> services = new ArrayList<String>(); - int n = 0; - while (true) { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeInt(n); - data.writeInt(dumpPriority); - n++; - try { - boolean res = mRemote.transact(LIST_SERVICES_TRANSACTION, data, reply, 0); - if (!res) { - break; - } - } catch (RuntimeException e) { - // The result code that is returned by the C++ code can - // cause the call to throw an exception back instead of - // returning a nice result... so eat it here and go on. - break; - } - services.add(reply.readString()); - reply.recycle(); - data.recycle(); - } - String[] array = new String[services.size()]; - services.toArray(array); - return array; + return mServiceManager.listServices(dumpPriority); } + /** + * Same as mServiceManager but used by apps. + * + * Once this can be removed, ServiceManagerProxy should be removed entirely. + */ @UnsupportedAppUsage private IBinder mRemote; + + private IServiceManager mServiceManager; } diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index b1212343b279..d70ba9921bfd 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -68,6 +68,7 @@ public final class UserHandle implements Parcelable { public static final @NonNull UserHandle CURRENT_OR_SELF = new UserHandle(USER_CURRENT_OR_SELF); /** @hide An undefined user id */ + @UnsupportedAppUsage public static final @UserIdInt int USER_NULL = -10000; /** diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl new file mode 100644 index 000000000000..67176e45c534 --- /dev/null +++ b/core/java/android/permission/IPermissionManager.aidl @@ -0,0 +1,26 @@ +/* + * 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 android.permission; + +/** + * Interface to communicate directly with the permission manager service. + * @see PermissionManager + * @hide + */ +interface IPermissionManager { + String[] getAppOpPermissionPackages(String permName); +} diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e5b79875d459..01058f936d9b 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -88,6 +88,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.MemoryIntArray; +import android.view.Display; import android.view.inputmethod.InputMethodSystemProperty; import com.android.internal.annotations.GuardedBy; @@ -4073,7 +4074,7 @@ public final class Settings { * preference, this rotation value will be used. Must be one of the * {@link android.view.Surface#ROTATION_0 Surface rotation constants}. * - * @see android.view.Display#getRotation + * @see Display#getRotation */ public static final String USER_ROTATION = "user_rotation"; @@ -7733,12 +7734,21 @@ public final class Settings { private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** - * Gesture that wakes up the display, showing the ambient version of the status bar. + * Gesture that wakes up the display, showing some version of the lock screen. * @hide */ - public static final String DOZE_WAKE_SCREEN_GESTURE = "doze_wake_screen_gesture"; + public static final String DOZE_WAKE_LOCK_SCREEN_GESTURE = "doze_wake_screen_gesture"; - private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + private static final Validator DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + + /** + * Gesture that wakes up the display, toggling between {@link Display.STATE_OFF} and + * {@link Display.STATE_DOZE}. + * @hide + */ + public static final String DOZE_WAKE_DISPLAY_GESTURE = "doze_wake_display_gesture"; + + private static final Validator DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** * Gesture that skips media. @@ -7754,6 +7764,12 @@ public final class Settings { */ public static final String SKIP_GESTURE_COUNT = "skip_gesture_count"; + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SKIP_TOUCH_COUNT = "skip_touch_count"; + private static final Validator SKIP_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; @@ -7798,11 +7814,22 @@ public final class Settings { public static final String SILENCE_CALL_GESTURE_COUNT = "silence_call_gesture_count"; /** - * Count of successful silence notification gestures. + * Count of non-gesture interaction. * @hide */ - public static final String SILENCE_NOTIFICATION_GESTURE_COUNT = - "silence_notification_gesture_count"; + public static final String SILENCE_ALARMS_TOUCH_COUNT = "silence_alarms_touch_count"; + + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_TIMER_TOUCH_COUNT = "silence_timer_touch_count"; + + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_CALL_TOUCH_COUNT = "silence_call_touch_count"; private static final Validator SILENCE_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; @@ -8266,6 +8293,16 @@ public final class Settings { BOOLEAN_VALIDATOR; /** + * Whether or not media is shown automatically when bypassing as a heads up. + * @hide + */ + public static final String SHOW_MEDIA_WHEN_BYPASSING = + "show_media_when_bypassing"; + + private static final Validator SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR = + BOOLEAN_VALIDATOR; + + /** * Whether or not face unlock requires attention. This is a cached value, the source of * truth is obtained through the HAL. * @hide @@ -8959,10 +8996,12 @@ public final class Settings { DOZE_PICK_UP_GESTURE, DOZE_DOUBLE_TAP_GESTURE, DOZE_TAP_SCREEN_GESTURE, - DOZE_WAKE_SCREEN_GESTURE, + DOZE_WAKE_LOCK_SCREEN_GESTURE, + DOZE_WAKE_DISPLAY_GESTURE, NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, + SHOW_MEDIA_WHEN_BYPASSING, FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, @@ -9009,10 +9048,13 @@ public final class Settings { NAVIGATION_MODE, AWARE_ENABLED, SKIP_GESTURE_COUNT, + SKIP_TOUCH_COUNT, SILENCE_ALARMS_GESTURE_COUNT, - SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_CALL_GESTURE_COUNT, SILENCE_TIMER_GESTURE_COUNT, + SILENCE_ALARMS_TOUCH_COUNT, + SILENCE_CALL_TOUCH_COUNT, + SILENCE_TIMER_TOUCH_COUNT, DARK_MODE_DIALOG_SEEN, GLOBAL_ACTIONS_PANEL_ENABLED, AWARE_LOCK_ENABLED @@ -9131,13 +9173,15 @@ public final class Settings { VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR); - VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_DISPLAY_GESTURE, DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR); VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR); VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR); + VALIDATORS.put(SHOW_MEDIA_WHEN_BYPASSING, SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR); @@ -9198,10 +9242,13 @@ public final class Settings { VALIDATORS.put(NAVIGATION_MODE, NAVIGATION_MODE_VALIDATOR); VALIDATORS.put(AWARE_ENABLED, AWARE_ENABLED_VALIDATOR); VALIDATORS.put(SKIP_GESTURE_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SKIP_TOUCH_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_ALARMS_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_TIMER_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_CALL_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); - VALIDATORS.put(SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_ALARMS_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_TIMER_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_CALL_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(ODI_CAPTIONS_ENABLED, ODI_CAPTIONS_ENABLED_VALIDATOR); VALIDATORS.put(DARK_MODE_DIALOG_SEEN, BOOLEAN_VALIDATOR); VALIDATORS.put(UI_NIGHT_MODE, UI_NIGHT_MODE_VALIDATOR); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index cb64ab1fd921..17f07b5a2ad4 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.content.res.CompatibilityInfo.Translator; import android.graphics.Canvas; +import android.graphics.ColorSpace; import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.RecordingCanvas; @@ -80,7 +81,8 @@ public class Surface implements Parcelable { private static native long nativeGetNextFrameNumber(long nativeObject); private static native int nativeSetScalingMode(long nativeObject, int scalingMode); private static native int nativeForceScopedDisconnect(long nativeObject); - private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer); + private static native int nativeAttachAndQueueBufferWithColorSpace(long nativeObject, + GraphicBuffer buffer, int colorSpaceId); private static native int nativeSetSharedBufferModeEnabled(long nativeObject, boolean enabled); private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled); @@ -699,21 +701,38 @@ public class Surface implements Parcelable { } /** - * Transfer ownership of buffer and present it on the Surface. + * Transfer ownership of buffer with a color space and present it on the Surface. + * The supported color spaces are SRGB and Display P3, other color spaces will be + * treated as SRGB. * @hide */ - public void attachAndQueueBuffer(GraphicBuffer buffer) { + public void attachAndQueueBufferWithColorSpace(GraphicBuffer buffer, ColorSpace colorSpace) { synchronized (mLock) { checkNotReleasedLocked(); - int err = nativeAttachAndQueueBuffer(mNativeObject, buffer); + if (colorSpace == null) { + colorSpace = ColorSpace.get(ColorSpace.Named.SRGB); + } + int err = nativeAttachAndQueueBufferWithColorSpace(mNativeObject, buffer, + colorSpace.getId()); if (err != 0) { throw new RuntimeException( - "Failed to attach and queue buffer to Surface (bad object?)"); + "Failed to attach and queue buffer to Surface (bad object?), " + + "native error: " + err); } } } /** + * Deprecated, use attachAndQueueBufferWithColorSpace instead. + * Transfer ownership of buffer and present it on the Surface. + * The color space of the buffer is treated as SRGB. + * @hide + */ + public void attachAndQueueBuffer(GraphicBuffer buffer) { + attachAndQueueBufferWithColorSpace(buffer, ColorSpace.get(ColorSpace.Named.SRGB)); + } + + /** * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture * @hide */ diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index d1ab7c99980e..522ad642ef0d 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1846,7 +1846,8 @@ public final class SurfaceControl implements Parcelable { final ScreenshotGraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width, height, useIdentityTransform, rotation); try { - consumer.attachAndQueueBuffer(buffer.getGraphicBuffer()); + consumer.attachAndQueueBufferWithColorSpace(buffer.getGraphicBuffer(), + buffer.getColorSpace()); } catch (RuntimeException e) { Log.w(TAG, "Failed to take screenshot - " + e.getMessage()); } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index f661e0646d75..6563e03853fb 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -23,7 +23,6 @@ import static android.view.WindowManagerPolicyConstants.APPLICATION_PANEL_SUBLAY import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.CompatibilityInfo.Translator; -import android.content.res.Configuration; import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Color; @@ -102,8 +101,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb private static final boolean DEBUG = false; @UnsupportedAppUsage - final ArrayList<SurfaceHolder.Callback> mCallbacks - = new ArrayList<SurfaceHolder.Callback>(); + final ArrayList<SurfaceHolder.Callback> mCallbacks = new ArrayList<>(); final int[] mLocation = new int[2]; @@ -127,7 +125,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb SurfaceControl mDeferredDestroySurfaceControl; SurfaceControl mBackgroundControl; final Rect mTmpRect = new Rect(); - final Configuration mConfiguration = new Configuration(); Paint mRoundedViewportPaint; @@ -137,25 +134,16 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb boolean mIsCreating = false; private volatile boolean mRtHandlingPositionUpdates = false; - private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener - = new ViewTreeObserver.OnScrollChangedListener() { - @Override - public void onScrollChanged() { - updateSurface(); - } - }; + private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener = + this::updateSurface; @UnsupportedAppUsage - private final ViewTreeObserver.OnPreDrawListener mDrawListener = - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - // reposition ourselves where the surface is - mHaveFrame = getWidth() > 0 && getHeight() > 0; - updateSurface(); - return true; - } - }; + private final ViewTreeObserver.OnPreDrawListener mDrawListener = () -> { + // reposition ourselves where the surface is + mHaveFrame = getWidth() > 0 && getHeight() > 0; + updateSurface(); + return true; + }; boolean mRequestedVisible = false; boolean mWindowVisibility = false; @@ -190,7 +178,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) final Rect mSurfaceFrame = new Rect(); int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1; - private Translator mTranslator; private boolean mGlobalListenersAdded; private boolean mAttachedToWindow; @@ -555,9 +542,9 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb return; } - mTranslator = viewRoot.mTranslator; - if (mTranslator != null) { - mSurface.setCompatibilityTranslator(mTranslator); + final Translator translator = viewRoot.mTranslator; + if (translator != null) { + mSurface.setCompatibilityTranslator(translator); } int myWidth = mRequestedWidth; @@ -596,8 +583,8 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mScreenRect.top = mWindowSpaceTop; mScreenRect.right = mWindowSpaceLeft + getWidth(); mScreenRect.bottom = mWindowSpaceTop + getHeight(); - if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mScreenRect); + if (translator != null) { + translator.translateRectInAppWindowToScreen(mScreenRect); } final Rect surfaceInsets = getParentSurfaceInsets(); @@ -683,11 +670,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mSurfaceFrame.left = 0; mSurfaceFrame.top = 0; - if (mTranslator == null) { + if (translator == null) { mSurfaceFrame.right = mSurfaceWidth; mSurfaceFrame.bottom = mSurfaceHeight; } else { - float appInvertedScale = mTranslator.applicationInvertedScale; + float appInvertedScale = translator.applicationInvertedScale; mSurfaceFrame.right = (int) (mSurfaceWidth * appInvertedScale + 0.5f); mSurfaceFrame.bottom = (int) (mSurfaceHeight * appInvertedScale + 0.5f); } @@ -821,8 +808,8 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mScreenRect.set(mWindowSpaceLeft, mWindowSpaceTop, mWindowSpaceLeft + mLocation[0], mWindowSpaceTop + mLocation[1]); - if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mScreenRect); + if (translator != null) { + translator.translateRectInAppWindowToScreen(mScreenRect); } if (mSurfaceControl == null) { @@ -1037,7 +1024,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb synchronized (mCallbacks) { // This is a linear search, but in practice we'll // have only a couple callbacks, so it doesn't matter. - if (mCallbacks.contains(callback) == false) { + if (!mCallbacks.contains(callback)) { mCallbacks.add(callback); } } diff --git a/core/java/android/view/TEST_MAPPING b/core/java/android/view/TEST_MAPPING index 87d428ab551e..4ea4310b25a4 100644 --- a/core/java/android/view/TEST_MAPPING +++ b/core/java/android/view/TEST_MAPPING @@ -1,10 +1,12 @@ { "presubmit": [ { - "name": "CtsUiRenderingTestCases" - }, - { "name": "CtsAccelerationTestCases" } + ], + "imports": [ + { + "path": "cts/tests/tests/uirendering" + } ] }
\ No newline at end of file diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 3d3d5dc7db32..f18aa81b95e5 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -17,6 +17,7 @@ package android.view; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; import android.graphics.HardwareRenderer; @@ -35,6 +36,7 @@ import com.android.internal.R; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; /** * Threaded renderer that proxies the rendering to a render thread. Most calls @@ -300,7 +302,8 @@ public final class ThreadedRenderer extends HardwareRenderer { private boolean mEnabled; private boolean mRequested = true; - private FrameDrawingCallback mNextRtFrameCallback; + @Nullable + private ArrayList<FrameDrawingCallback> mNextRtFrameCallbacks; ThreadedRenderer(Context context, boolean translucent, String name) { super(); @@ -441,8 +444,11 @@ public final class ThreadedRenderer extends HardwareRenderer { * * @param callback The callback to register. */ - void registerRtFrameCallback(FrameDrawingCallback callback) { - mNextRtFrameCallback = callback; + void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { + if (mNextRtFrameCallbacks == null) { + mNextRtFrameCallbacks = new ArrayList<>(); + } + mNextRtFrameCallbacks.add(callback); } /** @@ -583,10 +589,14 @@ public final class ThreadedRenderer extends HardwareRenderer { // Consume and set the frame callback after we dispatch draw to the view above, but before // onPostDraw below which may reset the callback for the next frame. This ensures that // updates to the frame callback during scroll handling will also apply in this frame. - final FrameDrawingCallback callback = mNextRtFrameCallback; - mNextRtFrameCallback = null; - if (callback != null) { - setFrameCallback(callback); + if (mNextRtFrameCallbacks != null) { + final ArrayList<FrameDrawingCallback> frameCallbacks = mNextRtFrameCallbacks; + mNextRtFrameCallbacks = null; + setFrameCallback(frame -> { + for (int i = 0; i < frameCallbacks.size(); ++i) { + frameCallbacks.get(i).onFrameDraw(frame); + } + }); } if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index cb51545a8a69..613ddcf577ed 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1132,7 +1132,7 @@ public final class ViewRootImpl implements ViewParent, * * @param callback The callback to register. */ - public void registerRtFrameCallback(FrameDrawingCallback callback) { + public void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.registerRtFrameCallback(frame -> { try { diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 882e6fd8e328..2e9d881f72f9 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -184,7 +184,7 @@ public final class AccessibilityManager { boolean mIsTouchExplorationEnabled; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768939) + @UnsupportedAppUsage(trackingBug = 123768939L) boolean mIsHighTextContrastEnabled; AccessibilityPolicy mAccessibilityPolicy; diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 564d972ac26d..86cec5e0f0a2 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -206,13 +206,13 @@ public class RemoteViews implements Parcelable, Filter { * * @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public ApplicationInfo mApplication; /** * The resource ID of the layout file. (Added to the parcel) */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage private final int mLayoutId; /** @@ -224,13 +224,13 @@ public class RemoteViews implements Parcelable, Filter { * An array of actions to perform on the view tree once it has been * inflated */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage private ArrayList<Action> mActions; /** * Maps bitmaps to unique indicies to avoid Bitmap duplication. */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage private BitmapCache mBitmapCache; /** @@ -252,7 +252,7 @@ public class RemoteViews implements Parcelable, Filter { * RemoteViews. */ private RemoteViews mLandscape = null; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage private RemoteViews mPortrait = null; @ApplyFlags @@ -430,7 +430,7 @@ public class RemoteViews implements Parcelable, Filter { // Do nothing } - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public int mergeBehavior() { return MERGE_REPLACE; } @@ -466,7 +466,7 @@ public class RemoteViews implements Parcelable, Filter { // Nothing to visit by default } - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage int viewId; } @@ -499,7 +499,7 @@ public class RemoteViews implements Parcelable, Filter { * * @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public void mergeRemoteViews(RemoteViews newRv) { if (newRv == null) return; // We first copy the new RemoteViews, as the process of merging modifies the way the actions @@ -690,7 +690,7 @@ public class RemoteViews implements Parcelable, Filter { return SET_PENDING_INTENT_TEMPLATE_TAG; } - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage PendingIntent pendingIntentTemplate; } @@ -1138,7 +1138,7 @@ public class RemoteViews implements Parcelable, Filter { private static class BitmapCache { - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage ArrayList<Bitmap> mBitmaps; int mBitmapMemory = -1; @@ -1190,9 +1190,9 @@ public class RemoteViews implements Parcelable, Filter { private class BitmapReflectionAction extends Action { int bitmapId; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage Bitmap bitmap; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage String methodName; BitmapReflectionAction(int viewId, String methodName, Bitmap bitmap) { @@ -1258,10 +1258,10 @@ public class RemoteViews implements Parcelable, Filter { static final int COLOR_STATE_LIST = 15; static final int ICON = 16; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage String methodName; int type; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage Object value; ReflectionAction(int viewId, String methodName, int type, Object value) { @@ -1554,7 +1554,7 @@ public class RemoteViews implements Parcelable, Filter { * ViewGroup methods that are related to adding Views. */ private class ViewGroupActionAdd extends Action { - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage private RemoteViews mNestedViews; private int mIndex; @@ -2469,7 +2469,7 @@ public class RemoteViews implements Parcelable, Filter { * Returns an estimate of the bitmap heap memory usage for this RemoteViews. */ /** @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public int estimateMemoryUsage() { return mBitmapCache.getBitmapMemory(); } @@ -2517,7 +2517,7 @@ public class RemoteViews implements Parcelable, Filter { * * @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public void addView(int viewId, RemoteViews nestedView, int index) { addAction(new ViewGroupActionAdd(viewId, nestedView, index)); } @@ -2994,7 +2994,8 @@ public class RemoteViews implements Parcelable, Filter { * @hide * @deprecated this appears to have no users outside of UnsupportedAppUsage? */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage + @Deprecated public void setRemoteAdapter(int viewId, ArrayList<RemoteViews> list, int viewTypeCount) { addAction(new SetRemoteViewsAdapterList(viewId, list, viewTypeCount)); } diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java index 3462e08a4c6a..0fd05c1cb8cd 100644 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -559,6 +559,13 @@ public class AlertController { final boolean hasButtonPanel = buttonPanel != null && buttonPanel.getVisibility() != View.GONE; + if (!parentPanel.isInTouchMode()) { + final View content = hasCustomPanel ? customPanel : contentPanel; + if (!requestFocusForContent(content)) { + requestFocusForDefaultButton(); + } + } + // Only display the text spacer if we don't have buttons. if (!hasButtonPanel) { if (contentPanel != null) { @@ -624,6 +631,29 @@ public class AlertController { a.recycle(); } + private boolean requestFocusForContent(View content) { + if (content != null && content.requestFocus()) { + return true; + } + + if (mListView != null) { + mListView.setSelection(0); + return true; + } + + return false; + } + + private void requestFocusForDefaultButton() { + if (mButtonPositive.getVisibility() == View.VISIBLE) { + mButtonPositive.requestFocus(); + } else if (mButtonNegative.getVisibility() == View.VISIBLE) { + mButtonNegative.requestFocus(); + } else if (mButtonNeutral.getVisibility() == View.VISIBLE) { + mButtonNeutral.requestFocus(); + } + } + private void setupCustomContent(ViewGroup customPanel) { final View customView; if (mView != null) { diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index f9d27bb46592..00206fc38d1d 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -1534,7 +1534,11 @@ public class ChooserActivity extends ResolverActivity { if (driList.get(i).getResolvedComponentName().equals( resultList.get(j).getTargetComponent())) { ShortcutManager.ShareShortcutInfo shareShortcutInfo = resultList.get(j); - ChooserTarget chooserTarget = convertToChooserTarget(shareShortcutInfo); + // Incoming results are ordered but without a score. Create a score + // based on the index in order to be sorted appropriately when joined + // with legacy direct share api results. + float score = Math.max(1.0f - (0.05f * j), 0.0f); + ChooserTarget chooserTarget = convertToChooserTarget(shareShortcutInfo, score); chooserTargets.add(chooserTarget); if (mDirectShareAppTargetCache != null && appTargets != null) { mDirectShareAppTargetCache.put(chooserTarget, appTargets.get(j)); @@ -1580,7 +1584,8 @@ public class ChooserActivity extends ResolverActivity { return false; } - private ChooserTarget convertToChooserTarget(ShortcutManager.ShareShortcutInfo shareShortcut) { + private ChooserTarget convertToChooserTarget(ShortcutManager.ShareShortcutInfo shareShortcut, + float score) { ShortcutInfo shortcutInfo = shareShortcut.getShortcutInfo(); Bundle extras = new Bundle(); extras.putString(Intent.EXTRA_SHORTCUT_ID, shortcutInfo.getId()); @@ -1591,7 +1596,7 @@ public class ChooserActivity extends ResolverActivity { null, // The ranking score for this target (0.0-1.0); the system will omit items with low // scores when there are too many Direct Share items. - 1.0f, + score, // The name of the component to be launched if this target is chosen. shareShortcut.getTargetComponent().clone(), // The extra values here will be merged into the Intent when this target is chosen. diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 7cc812889e0a..f905ea2dc6f2 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -29,7 +29,6 @@ import android.app.ActivityThread; import android.app.VoiceInteractor.PickOptionRequest; import android.app.VoiceInteractor.PickOptionRequest.Option; import android.app.VoiceInteractor.Prompt; -import android.app.role.RoleManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -111,7 +110,6 @@ public class ResolverActivity extends Activity { protected AbsListView mAdapterView; private Button mAlwaysButton; private Button mOnceButton; - private Button mSettingsButton; protected View mProfileView; private int mIconDpi; private int mLastSelected = AbsListView.INVALID_POSITION; @@ -146,6 +144,10 @@ public class ResolverActivity extends Activity { /** See {@link #setRetainInOnStop}. */ private boolean mRetainInOnStop; + private static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; + private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key"; + private static final String OPEN_LINKS_COMPONENT_KEY = "app_link_state"; + private final PackageMonitor mPackageMonitor = createPackageMonitor(); /** @@ -196,9 +198,13 @@ public class ResolverActivity extends Activity { // titles for layout that deals with http(s) intents public static final int BROWSABLE_TITLE_RES = - com.android.internal.R.string.whichGiveAccessToApplication; - public static final int BROWSABLE_NAMED_TITLE_RES = - com.android.internal.R.string.whichGiveAccessToApplicationNamed; + com.android.internal.R.string.whichOpenLinksWith; + public static final int BROWSABLE_HOST_TITLE_RES = + com.android.internal.R.string.whichOpenHostLinksWith; + public static final int BROWSABLE_HOST_APP_TITLE_RES = + com.android.internal.R.string.whichOpenHostLinksWithApp; + public static final int BROWSABLE_APP_TITLE_RES = + com.android.internal.R.string.whichOpenLinksWithApp; public final String action; public final int titleRes; @@ -322,9 +328,7 @@ public class ResolverActivity extends Activity { ? false : isHttpSchemeAndViewAction(getTargetIntent()); - // We don't want to support Always Use if browsable layout is being used, - // as to mitigate Intent Capturing vulnerability - mSupportsAlwaysUseOption = supportsAlwaysUseOption && !mUseLayoutForBrowsables; + mSupportsAlwaysUseOption = supportsAlwaysUseOption; if (configureContentView(mIntents, initialIntents, rList)) { return; @@ -554,10 +558,21 @@ public class ResolverActivity extends Activity { } else if (isHttpSchemeAndViewAction(intent)) { // If the Intent's scheme is http(s) then we need to warn the user that // they're giving access for the activity to open URLs from this specific host - return named - ? getString(ActionTitle.BROWSABLE_NAMED_TITLE_RES, intent.getData().getHost(), - mAdapter.getFilteredItem().getDisplayLabel()) - : getString(ActionTitle.BROWSABLE_TITLE_RES, intent.getData().getHost()); + String dialogTitle = null; + if (named && !mUseLayoutForBrowsables) { + dialogTitle = getString(ActionTitle.BROWSABLE_APP_TITLE_RES, + mAdapter.getFilteredItem().getDisplayLabel()); + } else if (named && mUseLayoutForBrowsables) { + dialogTitle = getString(ActionTitle.BROWSABLE_HOST_APP_TITLE_RES, + intent.getData().getHost(), + mAdapter.getFilteredItem().getDisplayLabel()); + } else if (mAdapter.areAllTargetsBrowsers()) { + dialogTitle = getString(ActionTitle.BROWSABLE_TITLE_RES); + } else { + dialogTitle = getString(ActionTitle.BROWSABLE_HOST_TITLE_RES, + intent.getData().getHost()); + } + return dialogTitle; } else { return named ? getString(title.namedTitleRes, mAdapter.getFilteredItem().getDisplayLabel()) @@ -856,6 +871,13 @@ public class ResolverActivity extends Activity { } else { enabled = true; } + if (mUseLayoutForBrowsables && !ri.handleAllWebDataURI) { + mAlwaysButton.setText(getResources() + .getString(R.string.activity_resolver_set_always)); + } else { + mAlwaysButton.setText(getResources() + .getString(R.string.activity_resolver_use_always)); + } } mAlwaysButton.setEnabled(enabled); } @@ -866,26 +888,29 @@ public class ResolverActivity extends Activity { ? mAdapter.getFilteredPosition() : mAdapterView.getCheckedItemPosition(); boolean hasIndexBeenFiltered = !mAdapter.hasFilteredItem(); - if (id == R.id.button_app_settings) { - showSettingsForSelected(which, hasIndexBeenFiltered); + ResolveInfo ri = mAdapter.resolveInfoForPosition(which, hasIndexBeenFiltered); + if (!ri.handleAllWebDataURI && id == R.id.button_always) { + showSettingsForSelected(ri); } else { startSelected(which, id == R.id.button_always, hasIndexBeenFiltered); } } - private void showSettingsForSelected(int which, boolean hasIndexBeenFiltered) { - ResolveInfo ri = mAdapter.resolveInfoForPosition(which, hasIndexBeenFiltered); + private void showSettingsForSelected(ResolveInfo ri) { Intent intent = new Intent(); - // For browsers, we open the Default Browser page + + final String packageName = ri.activityInfo.packageName; + Bundle showFragmentArgs = new Bundle(); + showFragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY, OPEN_LINKS_COMPONENT_KEY); + showFragmentArgs.putString("package", packageName); + // For regular apps, we open the Open by Default page - if (ri.handleAllWebDataURI) { - intent.setAction(Intent.ACTION_MANAGE_DEFAULT_APP) - .putExtra(Intent.EXTRA_ROLE_NAME, RoleManager.ROLE_BROWSER); - } else { - intent.setAction(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS) - .setData(Uri.fromParts("package", ri.activityInfo.packageName, null)) - .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); - } + intent.setAction(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS) + .setData(Uri.fromParts("package", packageName, null)) + .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) + .putExtra(EXTRA_FRAGMENT_ARG_KEY, OPEN_LINKS_COMPONENT_KEY) + .putExtra(EXTRA_SHOW_FRAGMENT_ARGS, showFragmentArgs); + startActivity(intent); } @@ -1332,41 +1357,15 @@ public class ResolverActivity extends Activity { R.dimen.resolver_button_bar_spacing) + inset); mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once); - mSettingsButton = (Button) buttonLayout.findViewById(R.id.button_app_settings); mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); - if (mUseLayoutForBrowsables) { - resetSettingsOrOnceButtonBar(); - } else { - resetAlwaysOrOnceButtonBar(); - } + resetAlwaysOrOnceButtonBar(); } else { Log.e(TAG, "Layout unexpectedly does not have a button bar"); } } - private void resetSettingsOrOnceButtonBar() { - //unsetting always button - mAlwaysButton.setVisibility(View.GONE); - - // When the items load in, if an item was already selected, - // enable the buttons - if (mAdapterView != null - && mAdapterView.getCheckedItemPosition() != ListView.INVALID_POSITION) { - mSettingsButton.setEnabled(true); - mOnceButton.setEnabled(true); - } - } - private void resetAlwaysOrOnceButtonBar() { - // This check needs to be made because layout with default - // doesn't have a settings button - if (mSettingsButton != null) { - //unsetting always button - mSettingsButton.setVisibility(View.GONE); - mSettingsButton = null; - } - if (useLayoutWithDefault() && mAdapter.getFilteredPosition() != ListView.INVALID_POSITION) { setAlwaysButtonEnabled(true, mAdapter.getFilteredPosition(), false); @@ -1626,6 +1625,7 @@ public class ResolverActivity extends Activity { private DisplayResolveInfo mOtherProfile; private ResolverListController mResolverListController; private int mPlaceholderCount; + private boolean mAllTargetsAreBrowsers = false; protected final LayoutInflater mInflater; @@ -1701,6 +1701,14 @@ public class ResolverActivity extends Activity { } /** + * @return true if all items in the display list are defined as browsers by + * ResolveInfo.handleAllWebDataURI + */ + public boolean areAllTargetsBrowsers() { + return mAllTargetsAreBrowsers; + } + + /** * Rebuild the list of resolvers. In some cases some parts will need some asynchronous work * to complete. * @@ -1712,6 +1720,7 @@ public class ResolverActivity extends Activity { mOtherProfile = null; mLastChosen = null; mLastChosenPosition = -1; + mAllTargetsAreBrowsers = false; mDisplayList.clear(); if (mBaseResolveList != null) { currentResolveList = mUnfilteredResolveList = new ArrayList<>(); @@ -1812,6 +1821,8 @@ public class ResolverActivity extends Activity { private void processSortedList(List<ResolvedComponentInfo> sortedComponents) { int N; if (sortedComponents != null && (N = sortedComponents.size()) != 0) { + mAllTargetsAreBrowsers = mUseLayoutForBrowsables; + // First put the initial items at the top. if (mInitialIntents != null) { for (int i = 0; i < mInitialIntents.length; i++) { @@ -1841,6 +1852,8 @@ public class ResolverActivity extends Activity { ri.noResourceId = true; ri.icon = 0; } + mAllTargetsAreBrowsers &= ri.handleAllWebDataURI; + addResolveInfo(new DisplayResolveInfo(ii, ri, ri.loadLabel(getPackageManager()), null, ii)); } @@ -1850,6 +1863,8 @@ public class ResolverActivity extends Activity { for (ResolvedComponentInfo rci : sortedComponents) { final ResolveInfo ri = rci.getResolveInfoAt(0); if (ri != null) { + mAllTargetsAreBrowsers &= ri.handleAllWebDataURI; + ResolveInfoPresentationGetter pg = makePresentationGetter(ri); addResolveInfoWithAlternates(rci, pg.getSubLabel(), pg.getLabel()); } @@ -2152,14 +2167,8 @@ public class ResolverActivity extends Activity { final boolean hasValidSelection = checkedPos != ListView.INVALID_POSITION; if (!useLayoutWithDefault() && (!hasValidSelection || mLastSelected != checkedPos) - && (mAlwaysButton != null || mSettingsButton != null)) { - if (mSettingsButton != null) { - // this implies that the layout for browsables is being used - mSettingsButton.setEnabled(true); - } else { - // this implies that mAlwaysButton != null - setAlwaysButtonEnabled(hasValidSelection, checkedPos, true); - } + && mAlwaysButton != null) { + setAlwaysButtonEnabled(hasValidSelection, checkedPos, true); mOnceButton.setEnabled(hasValidSelection); if (hasValidSelection) { mAdapterView.smoothScrollToPosition(checkedPos); diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 0e7c1d43e2aa..430fa610c76e 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -152,13 +152,6 @@ public final class SystemUiDeviceConfigFlags { */ public static final String ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS = "assist_handles_shown_frequency_threshold_ms"; - // Flag related to clock face - - /** - * (String) Contains the clock plugin service names that are not allow to be shown. - * Each service name is seperated by a comma(",") in the string. - */ - public static final String CLOCK_FACE_BLACKLIST = "clock_face_blacklist"; /** * (long) How long, in milliseconds, for teaching behaviors to wait before considering the user diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 244d5da9968c..866cfb735bae 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -188,6 +188,13 @@ public class ZygoteInit { System.loadLibrary("android"); System.loadLibrary("compiler_rt"); System.loadLibrary("jnigraphics"); + + // tolerate missing sfplugin_ccodec which is only present on Codec 2 devices + try { + System.loadLibrary("sfplugin_ccodec"); + } catch (Error | RuntimeException e) { + Log.w(TAG, "Problem preloading sfplugin_ccodec: " + e); + } } native private static void nativePreloadAppProcessHALs(); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 6f4f3374ac73..fe66cf9aab7d 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1311,7 +1311,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return semiTransparentBarColor; } else if ((flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0) { return Color.BLACK; - } else if (scrimTransparent && barColor == Color.TRANSPARENT) { + } else if (scrimTransparent && Color.alpha(barColor) == 0) { boolean light = (sysuiVis & lightSysuiFlag) != 0; return light ? SCRIM_LIGHT : semiTransparentBarColor; } else { diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java index 64291de38130..d00108edefd0 100644 --- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java +++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java @@ -16,8 +16,6 @@ package com.android.internal.view.menu; -import com.android.internal.view.menu.MenuPresenter.Callback; - import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.Nullable; @@ -26,14 +24,14 @@ import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; -import android.os.Build; -import android.util.DisplayMetrics; import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.widget.PopupWindow.OnDismissListener; +import com.android.internal.view.menu.MenuPresenter.Callback; + /** * Presents a menu as a small, simple popup anchored to another view. */ @@ -114,7 +112,7 @@ public class MenuPopupHelper implements MenuHelper { * @param forceShowIcon {@code true} to force icons to be shown, or * {@code false} for icons to be optionally shown */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public void setForceShowIcon(boolean forceShowIcon) { mForceShowIcon = forceShowIcon; if (mPopup != null) { diff --git a/core/jni/Android.bp b/core/jni/Android.bp index b21221f2efff..5eb840879e96 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -100,7 +100,6 @@ cc_library_shared { ], shared_libs: [ - "libandroidicu", "libbase", "libcutils", "libharfbuzz_ng", @@ -154,6 +153,7 @@ cc_library_shared { "android_view_InputEventReceiver.cpp", "android_view_InputEventSender.cpp", "android_view_InputQueue.cpp", + "android_view_FrameMetricsObserver.cpp", "android_view_KeyCharacterMap.cpp", "android_view_KeyEvent.cpp", "android_view_MotionEvent.cpp", @@ -267,6 +267,7 @@ cc_library_shared { ], shared_libs: [ + "libandroidicu", "libbpf_android", "libnetdbpf", "libnetdutils", @@ -344,6 +345,10 @@ cc_library_shared { include_dirs: [ "external/vulkan-headers/include", ], + shared_libs: [ + "libicui18n", + "libicuuc", + ], static_libs: [ "libandroidfw", "libcompiler_rt", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 5611cc401021..533f403034a9 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -158,6 +158,7 @@ extern int register_android_graphics_text_MeasuredText(JNIEnv* env); extern int register_android_graphics_text_LineBreaker(JNIEnv *env); extern int register_android_view_DisplayEventReceiver(JNIEnv* env); extern int register_android_view_DisplayListCanvas(JNIEnv* env); +extern int register_android_view_FrameMetricsObserver(JNIEnv* env); extern int register_android_view_InputApplicationHandle(JNIEnv* env); extern int register_android_view_InputWindowHandle(JNIEnv* env); extern int register_android_view_TextureLayer(JNIEnv* env); @@ -899,20 +900,16 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p addOption("-Ximage-compiler-option"); addOption("--compiler-filter=speed-profile"); } else { - // Make sure there is a preloaded-classes file. - if (!hasFile("/system/etc/preloaded-classes")) { - ALOGE("Missing preloaded-classes file, /system/etc/preloaded-classes not found: %s\n", - strerror(errno)); - return -1; - } - addOption("-Ximage-compiler-option"); - addOption("--image-classes=/system/etc/preloaded-classes"); + ALOGE("Missing boot-image.prof file, /system/etc/boot-image.prof not found: %s\n", + strerror(errno)); + return -1; + } - // If there is a dirty-image-objects file, push it. - if (hasFile("/system/etc/dirty-image-objects")) { - addOption("-Ximage-compiler-option"); - addOption("--dirty-image-objects=/system/etc/dirty-image-objects"); - } + + // If there is a dirty-image-objects file, push it. + if (hasFile("/system/etc/dirty-image-objects")) { + addOption("-Ximage-compiler-option"); + addOption("--dirty-image-objects=/system/etc/dirty-image-objects"); } property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, ""); @@ -1468,6 +1465,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_view_RenderNode), REG_JNI(register_android_view_RenderNodeAnimator), REG_JNI(register_android_view_DisplayListCanvas), + REG_JNI(register_android_view_FrameMetricsObserver), REG_JNI(register_android_view_InputApplicationHandle), REG_JNI(register_android_view_InputWindowHandle), REG_JNI(register_android_view_TextureLayer), diff --git a/core/jni/android_os_SystemClock.cpp b/core/jni/android_os_SystemClock.cpp index 1f000d748b1f..b1f600053b9b 100644 --- a/core/jni/android_os_SystemClock.cpp +++ b/core/jni/android_os_SystemClock.cpp @@ -29,10 +29,8 @@ #include "jni.h" #include "core_jni_helpers.h" -#include <sys/time.h> -#include <time.h> - #include <utils/SystemClock.h> +#include <utils/Timers.h> namespace android { @@ -49,11 +47,7 @@ static_assert(std::is_same<decltype(elapsedRealtimeNano()), int64_t>::value, */ static jlong android_os_SystemClock_currentThreadTimeMillis() { - struct timespec tm; - - clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); - - return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000; + return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_THREAD)); } /* @@ -61,11 +55,7 @@ static jlong android_os_SystemClock_currentThreadTimeMillis() */ static jlong android_os_SystemClock_currentThreadTimeMicro() { - struct timespec tm; - - clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); - - return tm.tv_sec * 1000000LL + tm.tv_nsec / 1000; + return nanoseconds_to_microseconds(systemTime(SYSTEM_TIME_THREAD)); } /* diff --git a/core/jni/android_view_FrameMetricsObserver.cpp b/core/jni/android_view_FrameMetricsObserver.cpp new file mode 100644 index 000000000000..febcb55bd0cd --- /dev/null +++ b/core/jni/android_view_FrameMetricsObserver.cpp @@ -0,0 +1,149 @@ +/* + * 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. + */ + +#include "android_view_FrameMetricsObserver.h" + +namespace android { + +struct { + jfieldID frameMetrics; + jfieldID timingDataBuffer; + jfieldID messageQueue; + jmethodID callback; +} gFrameMetricsObserverClassInfo; + +static JNIEnv* getenv(JavaVM* vm) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { + LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); + } + return env; +} + +static jlongArray get_metrics_buffer(JNIEnv* env, jobject observer) { + jobject frameMetrics = env->GetObjectField( + observer, gFrameMetricsObserverClassInfo.frameMetrics); + LOG_ALWAYS_FATAL_IF(frameMetrics == nullptr, "unable to retrieve data sink object"); + jobject buffer = env->GetObjectField( + frameMetrics, gFrameMetricsObserverClassInfo.timingDataBuffer); + LOG_ALWAYS_FATAL_IF(buffer == nullptr, "unable to retrieve data sink buffer"); + return reinterpret_cast<jlongArray>(buffer); +} + +class NotifyHandler : public MessageHandler { +public: + NotifyHandler(JavaVM* vm, FrameMetricsObserverProxy* observer) : mVm(vm), mObserver(observer) {} + + virtual void handleMessage(const Message& message); + +private: + JavaVM* const mVm; + FrameMetricsObserverProxy* const mObserver; +}; + +void NotifyHandler::handleMessage(const Message& message) { + JNIEnv* env = getenv(mVm); + + jobject target = env->NewLocalRef(mObserver->getObserverReference()); + + if (target != nullptr) { + jlongArray javaBuffer = get_metrics_buffer(env, target); + int dropCount = 0; + while (mObserver->getNextBuffer(env, javaBuffer, &dropCount)) { + env->CallVoidMethod(target, gFrameMetricsObserverClassInfo.callback, dropCount); + } + env->DeleteLocalRef(target); + } + + mObserver->decStrong(nullptr); +} + +FrameMetricsObserverProxy::FrameMetricsObserverProxy(JavaVM *vm, jobject observer) : mVm(vm) { + JNIEnv* env = getenv(mVm); + + mObserverWeak = env->NewWeakGlobalRef(observer); + LOG_ALWAYS_FATAL_IF(mObserverWeak == nullptr, + "unable to create frame stats observer reference"); + + jlongArray buffer = get_metrics_buffer(env, observer); + jsize bufferSize = env->GetArrayLength(reinterpret_cast<jarray>(buffer)); + LOG_ALWAYS_FATAL_IF(bufferSize != kBufferSize, + "Mismatched Java/Native FrameMetrics data format."); + + jobject messageQueueLocal = env->GetObjectField( + observer, gFrameMetricsObserverClassInfo.messageQueue); + mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal); + LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available"); + + mMessageHandler = new NotifyHandler(mVm, this); + LOG_ALWAYS_FATAL_IF(mMessageHandler == nullptr, + "OOM: unable to allocate NotifyHandler"); +} + +FrameMetricsObserverProxy::~FrameMetricsObserverProxy() { + JNIEnv* env = getenv(mVm); + env->DeleteWeakGlobalRef(mObserverWeak); +} + +bool FrameMetricsObserverProxy::getNextBuffer(JNIEnv* env, jlongArray sink, int* dropCount) { + FrameMetricsNotification& elem = mRingBuffer[mNextInQueue]; + + if (elem.hasData.load()) { + env->SetLongArrayRegion(sink, 0, kBufferSize, elem.buffer); + *dropCount = elem.dropCount; + mNextInQueue = (mNextInQueue + 1) % kRingSize; + elem.hasData = false; + return true; + } + + return false; +} + +void FrameMetricsObserverProxy::notify(const int64_t* stats) { + FrameMetricsNotification& elem = mRingBuffer[mNextFree]; + + if (!elem.hasData.load()) { + memcpy(elem.buffer, stats, kBufferSize * sizeof(stats[0])); + + elem.dropCount = mDroppedReports; + mDroppedReports = 0; + + incStrong(nullptr); + mNextFree = (mNextFree + 1) % kRingSize; + elem.hasData = true; + + mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage); + } else { + mDroppedReports++; + } +} + +int register_android_view_FrameMetricsObserver(JNIEnv* env) { + jclass observerClass = FindClassOrDie(env, "android/view/FrameMetricsObserver"); + gFrameMetricsObserverClassInfo.frameMetrics = GetFieldIDOrDie( + env, observerClass, "mFrameMetrics", "Landroid/view/FrameMetrics;"); + gFrameMetricsObserverClassInfo.messageQueue = GetFieldIDOrDie( + env, observerClass, "mMessageQueue", "Landroid/os/MessageQueue;"); + gFrameMetricsObserverClassInfo.callback = GetMethodIDOrDie( + env, observerClass, "notifyDataAvailable", "(I)V"); + + jclass metricsClass = FindClassOrDie(env, "android/view/FrameMetrics"); + gFrameMetricsObserverClassInfo.timingDataBuffer = GetFieldIDOrDie( + env, metricsClass, "mTimingData", "[J"); + return JNI_OK; +} + +} // namespace android
\ No newline at end of file diff --git a/core/jni/android_view_FrameMetricsObserver.h b/core/jni/android_view_FrameMetricsObserver.h new file mode 100644 index 000000000000..647f51c4492d --- /dev/null +++ b/core/jni/android_view_FrameMetricsObserver.h @@ -0,0 +1,71 @@ +/* + * 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. + */ + +#include "jni.h" +#include "core_jni_helpers.h" + +#include "android_os_MessageQueue.h" + +#include <FrameInfo.h> +#include <FrameMetricsObserver.h> + +namespace android { + +/* + * Implements JNI layer for hwui frame metrics reporting. + */ +class FrameMetricsObserverProxy : public uirenderer::FrameMetricsObserver { +public: + FrameMetricsObserverProxy(JavaVM *vm, jobject observer); + + ~FrameMetricsObserverProxy(); + + jweak getObserverReference() { + return mObserverWeak; + } + + bool getNextBuffer(JNIEnv* env, jlongArray sink, int* dropCount); + + virtual void notify(const int64_t* stats); + +private: + static const int kBufferSize = static_cast<int>(uirenderer::FrameInfoIndex::NumIndexes); + static constexpr int kRingSize = 3; + + class FrameMetricsNotification { + public: + FrameMetricsNotification() : hasData(false) {} + + std::atomic_bool hasData; + int64_t buffer[kBufferSize]; + int dropCount = 0; + }; + + JavaVM* const mVm; + jweak mObserverWeak; + + sp<MessageQueue> mMessageQueue; + sp<MessageHandler> mMessageHandler; + Message mMessage; + + int mNextFree = 0; + int mNextInQueue = 0; + FrameMetricsNotification mRingBuffer[kRingSize]; + + int mDroppedReports = 0; +}; + +} // namespace android diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 7c429944b521..0d95f99441ae 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -74,6 +74,24 @@ static struct { jfieldID bottom; } gRectClassInfo; +class JNamedColorSpace { +public: + // ColorSpace.Named.SRGB.ordinal() = 0; + static constexpr jint SRGB = 0; + + // ColorSpace.Named.DISPLAY_P3.ordinal() = 7; + static constexpr jint DISPLAY_P3 = 7; +}; + +constexpr ui::Dataspace fromNamedColorSpaceValueToDataspace(const jint colorSpace) { + switch (colorSpace) { + case JNamedColorSpace::DISPLAY_P3: + return ui::Dataspace::DISPLAY_P3; + default: + return ui::Dataspace::V0_SRGB; + } +} + // ---------------------------------------------------------------------------- // this is just a pointer we use to pass to inc/decStrong @@ -411,11 +429,12 @@ static jint nativeForceScopedDisconnect(JNIEnv *env, jclass clazz, jlong nativeO return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal); } -static jint nativeAttachAndQueueBuffer(JNIEnv *env, jclass clazz, jlong nativeObject, - jobject graphicBuffer) { +static jint nativeAttachAndQueueBufferWithColorSpace(JNIEnv *env, jclass clazz, jlong nativeObject, + jobject graphicBuffer, jint colorSpaceId) { Surface* surface = reinterpret_cast<Surface*>(nativeObject); sp<GraphicBuffer> bp = graphicBufferForJavaObject(env, graphicBuffer); - int err = Surface::attachAndQueueBuffer(surface, bp); + int err = Surface::attachAndQueueBufferWithDataspace(surface, bp, + fromNamedColorSpaceValueToDataspace(colorSpaceId)); return err; } @@ -517,7 +536,8 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber }, {"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode }, {"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect}, - {"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer}, + {"nativeAttachAndQueueBufferWithColorSpace", "(JLandroid/graphics/GraphicBuffer;I)I", + (void*)nativeAttachAndQueueBufferWithColorSpace}, {"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled}, {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 84c3b3a8acb5..ccb840d122df 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -25,12 +25,13 @@ #include <nativehelper/JNIHelp.h> #include "core_jni_helpers.h" #include <GraphicsJNI.h> -#include <nativehelper/ScopedPrimitiveArray.h> #include <gui/BufferItemConsumer.h> #include <gui/BufferQueue.h> #include <gui/Surface.h> +#include "android_view_FrameMetricsObserver.h" + #include <private/EGL/cache.h> #include <utils/RefBase.h> @@ -40,17 +41,11 @@ #include <android_runtime/android_view_Surface.h> #include <system/window.h> -#include "android_os_MessageQueue.h" - -#include <Animator.h> -#include <AnimationContext.h> #include <FrameInfo.h> -#include <FrameMetricsObserver.h> #include <IContextFactory.h> #include <Picture.h> #include <Properties.h> -#include <PropertyValuesAnimatorSet.h> -#include <RenderNode.h> +#include <RootRenderNode.h> #include <renderthread/CanvasContext.h> #include <renderthread/RenderProxy.h> #include <renderthread/RenderTask.h> @@ -64,13 +59,6 @@ using namespace android::uirenderer; using namespace android::uirenderer::renderthread; struct { - jfieldID frameMetrics; - jfieldID timingDataBuffer; - jfieldID messageQueue; - jmethodID callback; -} gFrameMetricsObserverClassInfo; - -struct { jclass clazz; jmethodID invokePictureCapturedCallback; } gHardwareRenderer; @@ -91,56 +79,18 @@ static JNIEnv* getenv(JavaVM* vm) { return env; } -class OnFinishedEvent { -public: - OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener) - : animator(animator), listener(listener) {} - sp<BaseRenderNodeAnimator> animator; - sp<AnimationListener> listener; -}; - -class InvokeAnimationListeners : public MessageHandler { -public: - explicit InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) { - mOnFinishedEvents.swap(events); - } - - static void callOnFinished(OnFinishedEvent& event) { - event.listener->onAnimationFinished(event.animator.get()); - } - - virtual void handleMessage(const Message& message) { - std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished); - mOnFinishedEvents.clear(); - } - -private: - std::vector<OnFinishedEvent> mOnFinishedEvents; -}; - -class FinishAndInvokeListener : public MessageHandler { +class JvmErrorReporter : public ErrorHandler { public: - explicit FinishAndInvokeListener(PropertyValuesAnimatorSet* anim) - : mAnimator(anim) { - mListener = anim->getOneShotListener(); - mRequestId = anim->getRequestId(); + JvmErrorReporter(JNIEnv* env) { + env->GetJavaVM(&mVm); } - virtual void handleMessage(const Message& message) { - if (mAnimator->getRequestId() == mRequestId) { - // Request Id has not changed, meaning there's no animation lifecyle change since the - // message is posted, so go ahead and call finish to make sure the PlayState is properly - // updated. This is needed because before the next frame comes in from UI thread to - // trigger an animation update, there could be reverse/cancel etc. So we need to update - // the playstate in time to ensure all the subsequent events get chained properly. - mAnimator->end(); - } - mListener->onAnimationFinished(nullptr); + virtual void onError(const std::string& message) override { + JNIEnv* env = getenv(mVm); + jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); } private: - sp<PropertyValuesAnimatorSet> mAnimator; - sp<AnimationListener> mListener; - uint32_t mRequestId; + JavaVM* mVm; }; class FrameCompleteWrapper : public LightRefBase<FrameCompleteWrapper> { @@ -175,419 +125,6 @@ private: } }; -class RootRenderNode : public RenderNode, ErrorHandler { -public: - explicit RootRenderNode(JNIEnv* env) : RenderNode() { - env->GetJavaVM(&mVm); - } - - virtual ~RootRenderNode() {} - - virtual void onError(const std::string& message) override { - JNIEnv* env = getenv(mVm); - jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); - } - - virtual void prepareTree(TreeInfo& info) override { - info.errorHandler = this; - - for (auto& anim : mRunningVDAnimators) { - // Assume that the property change in VD from the animators will not be consumed. Mark - // otherwise if the VDs are found in the display list tree. For VDs that are not in - // the display list tree, we stop providing animation pulses by 1) removing them from - // the animation list, 2) post a delayed message to end them at end time so their - // listeners can receive the corresponding callbacks. - anim->getVectorDrawable()->setPropertyChangeWillBeConsumed(false); - // Mark the VD dirty so it will damage itself during prepareTree. - anim->getVectorDrawable()->markDirty(); - } - if (info.mode == TreeInfo::MODE_FULL) { - for (auto &anim : mPausedVDAnimators) { - anim->getVectorDrawable()->setPropertyChangeWillBeConsumed(false); - anim->getVectorDrawable()->markDirty(); - } - } - // TODO: This is hacky - info.updateWindowPositions = true; - RenderNode::prepareTree(info); - info.updateWindowPositions = false; - info.errorHandler = nullptr; - } - - void attachAnimatingNode(RenderNode* animatingNode) { - mPendingAnimatingRenderNodes.push_back(animatingNode); - } - - void attachPendingVectorDrawableAnimators() { - mRunningVDAnimators.insert(mPendingVectorDrawableAnimators.begin(), - mPendingVectorDrawableAnimators.end()); - mPendingVectorDrawableAnimators.clear(); - } - - void detachAnimators() { - // Remove animators from the list and post a delayed message in future to end the animator - // For infinite animators, remove the listener so we no longer hold a global ref to the AVD - // java object, and therefore the AVD objects in both native and Java can be properly - // released. - for (auto& anim : mRunningVDAnimators) { - detachVectorDrawableAnimator(anim.get()); - anim->clearOneShotListener(); - } - for (auto& anim : mPausedVDAnimators) { - anim->clearOneShotListener(); - } - mRunningVDAnimators.clear(); - mPausedVDAnimators.clear(); - } - - // Move all the animators to the paused list, and send a delayed message to notify the finished - // listener. - void pauseAnimators() { - mPausedVDAnimators.insert(mRunningVDAnimators.begin(), mRunningVDAnimators.end()); - for (auto& anim : mRunningVDAnimators) { - detachVectorDrawableAnimator(anim.get()); - } - mRunningVDAnimators.clear(); - } - - void doAttachAnimatingNodes(AnimationContext* context) { - for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { - RenderNode* node = mPendingAnimatingRenderNodes[i].get(); - context->addAnimatingRenderNode(*node); - } - mPendingAnimatingRenderNodes.clear(); - } - - // Run VectorDrawable animators after prepareTree. - void runVectorDrawableAnimators(AnimationContext* context, TreeInfo& info) { - // Push staging. - if (info.mode == TreeInfo::MODE_FULL) { - pushStagingVectorDrawableAnimators(context); - } - - // Run the animators in the running list. - for (auto it = mRunningVDAnimators.begin(); it != mRunningVDAnimators.end();) { - if ((*it)->animate(*context)) { - it = mRunningVDAnimators.erase(it); - } else { - it++; - } - } - - // Run the animators in paused list during full sync. - if (info.mode == TreeInfo::MODE_FULL) { - // During full sync we also need to pulse paused animators, in case their targets - // have been added back to the display list. All the animators that passed the - // scheduled finish time will be removed from the paused list. - for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { - if ((*it)->animate(*context)) { - // Animator has finished, remove from the list. - it = mPausedVDAnimators.erase(it); - } else { - it++; - } - } - } - - // Move the animators with a target not in DisplayList to paused list. - for (auto it = mRunningVDAnimators.begin(); it != mRunningVDAnimators.end();) { - if (!(*it)->getVectorDrawable()->getPropertyChangeWillBeConsumed()) { - // Vector Drawable is not in the display list, we should remove this animator from - // the list, put it in the paused list, and post a delayed message to end the - // animator. - detachVectorDrawableAnimator(it->get()); - mPausedVDAnimators.insert(*it); - it = mRunningVDAnimators.erase(it); - } else { - it++; - } - } - - // Move the animators with a target in DisplayList from paused list to running list, and - // trim paused list. - if (info.mode == TreeInfo::MODE_FULL) { - // Check whether any paused animator's target is back in Display List. If so, put the - // animator back in the running list. - for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { - if ((*it)->getVectorDrawable()->getPropertyChangeWillBeConsumed()) { - mRunningVDAnimators.insert(*it); - it = mPausedVDAnimators.erase(it); - } else { - it++; - } - } - // Trim paused VD animators at full sync, so that when Java loses reference to an - // animator, we know we won't be requested to animate it any more, then we remove such - // animators from the paused list so they can be properly freed. We also remove the - // animators from paused list when the time elapsed since start has exceeded duration. - trimPausedVDAnimators(context); - } - - info.out.hasAnimations |= !mRunningVDAnimators.empty(); - } - - void trimPausedVDAnimators(AnimationContext* context) { - // Trim paused vector drawable animator list. - for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { - // Remove paused VD animator if no one else is referencing it. Note that animators that - // have passed scheduled finish time are removed from list when they are being pulsed - // before prepare tree. - // TODO: this is a bit hacky, need to figure out a better way to track when the paused - // animators should be freed. - if ((*it)->getStrongCount() == 1) { - it = mPausedVDAnimators.erase(it); - } else { - it++; - } - } - } - - void pushStagingVectorDrawableAnimators(AnimationContext* context) { - for (auto& anim : mRunningVDAnimators) { - anim->pushStaging(*context); - } - } - - void destroy() { - for (auto& renderNode : mPendingAnimatingRenderNodes) { - renderNode->animators().endAllStagingAnimators(); - } - mPendingAnimatingRenderNodes.clear(); - mPendingVectorDrawableAnimators.clear(); - } - - void addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim) { - mPendingVectorDrawableAnimators.insert(anim); - } - -private: - JavaVM* mVm; - std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes; - std::set< sp<PropertyValuesAnimatorSet> > mPendingVectorDrawableAnimators; - std::set< sp<PropertyValuesAnimatorSet> > mRunningVDAnimators; - // mPausedVDAnimators stores a list of animators that have not yet passed the finish time, but - // their VectorDrawable targets are no longer in the DisplayList. We skip these animators when - // render thread runs animators independent of UI thread (i.e. RT_ONLY mode). These animators - // need to be re-activated once their VD target is added back into DisplayList. Since that could - // only happen when we do a full sync, we need to make sure to pulse these paused animators at - // full sync. If any animator's VD target is found in DisplayList during a full sync, we move - // the animator back to the running list. - std::set< sp<PropertyValuesAnimatorSet> > mPausedVDAnimators; - void detachVectorDrawableAnimator(PropertyValuesAnimatorSet* anim) { - if (anim->isInfinite() || !anim->isRunning()) { - // Do not need to post anything if the animation is infinite (i.e. no meaningful - // end listener action), or if the animation has already ended. - return; - } - nsecs_t remainingTimeInMs = anim->getRemainingPlayTime(); - // Post a delayed onFinished event that is scheduled to be handled when the animator ends. - if (anim->getOneShotListener()) { - // VectorDrawable's oneshot listener is updated when there are user triggered animation - // lifecycle changes, such as start(), end(), etc. By using checking and clearing - // one shot listener, we ensure the same end listener event gets posted only once. - // Therefore no duplicates. Another benefit of using one shot listener is that no - // removal is necessary: the end time of animation will not change unless triggered by - // user events, in which case the already posted listener's id will become stale, and - // the onFinished callback will then be ignored. - sp<FinishAndInvokeListener> message - = new FinishAndInvokeListener(anim); - auto looper = Looper::getForThread(); - LOG_ALWAYS_FATAL_IF(looper == nullptr, "Not on a looper thread?"); - looper->sendMessageDelayed(ms2ns(remainingTimeInMs), message, 0); - anim->clearOneShotListener(); - } - } -}; - -class AnimationContextBridge : public AnimationContext { -public: - AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) - : AnimationContext(clock), mRootNode(rootNode) { - } - - virtual ~AnimationContextBridge() {} - - // Marks the start of a frame, which will update the frame time and move all - // next frame animations into the current frame - virtual void startFrame(TreeInfo::TraversalMode mode) { - if (mode == TreeInfo::MODE_FULL) { - mRootNode->doAttachAnimatingNodes(this); - mRootNode->attachPendingVectorDrawableAnimators(); - } - AnimationContext::startFrame(mode); - } - - // Runs any animations still left in mCurrentFrameAnimations - virtual void runRemainingAnimations(TreeInfo& info) { - AnimationContext::runRemainingAnimations(info); - mRootNode->runVectorDrawableAnimators(this, info); - } - - virtual void pauseAnimators() override { - mRootNode->pauseAnimators(); - } - - virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { - listener->onAnimationFinished(animator); - } - - virtual void destroy() { - AnimationContext::destroy(); - mRootNode->detachAnimators(); - } - -private: - sp<RootRenderNode> mRootNode; -}; - -class ContextFactoryImpl : public IContextFactory { -public: - explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} - - virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { - return new AnimationContextBridge(clock, mRootNode); - } - -private: - RootRenderNode* mRootNode; -}; - -class ObserverProxy; - -class NotifyHandler : public MessageHandler { -public: - NotifyHandler(JavaVM* vm, ObserverProxy* observer) : mVm(vm), mObserver(observer) {} - - virtual void handleMessage(const Message& message); - -private: - JavaVM* const mVm; - ObserverProxy* const mObserver; -}; - -static jlongArray get_metrics_buffer(JNIEnv* env, jobject observer) { - jobject frameMetrics = env->GetObjectField( - observer, gFrameMetricsObserverClassInfo.frameMetrics); - LOG_ALWAYS_FATAL_IF(frameMetrics == nullptr, "unable to retrieve data sink object"); - jobject buffer = env->GetObjectField( - frameMetrics, gFrameMetricsObserverClassInfo.timingDataBuffer); - LOG_ALWAYS_FATAL_IF(buffer == nullptr, "unable to retrieve data sink buffer"); - return reinterpret_cast<jlongArray>(buffer); -} - -/* - * Implements JNI layer for hwui frame metrics reporting. - */ -class ObserverProxy : public FrameMetricsObserver { -public: - ObserverProxy(JavaVM *vm, jobject observer) : mVm(vm) { - JNIEnv* env = getenv(mVm); - - mObserverWeak = env->NewWeakGlobalRef(observer); - LOG_ALWAYS_FATAL_IF(mObserverWeak == nullptr, - "unable to create frame stats observer reference"); - - jlongArray buffer = get_metrics_buffer(env, observer); - jsize bufferSize = env->GetArrayLength(reinterpret_cast<jarray>(buffer)); - LOG_ALWAYS_FATAL_IF(bufferSize != kBufferSize, - "Mismatched Java/Native FrameMetrics data format."); - - jobject messageQueueLocal = env->GetObjectField( - observer, gFrameMetricsObserverClassInfo.messageQueue); - mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal); - LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available"); - - mMessageHandler = new NotifyHandler(mVm, this); - LOG_ALWAYS_FATAL_IF(mMessageHandler == nullptr, - "OOM: unable to allocate NotifyHandler"); - } - - ~ObserverProxy() { - JNIEnv* env = getenv(mVm); - env->DeleteWeakGlobalRef(mObserverWeak); - } - - jweak getObserverReference() { - return mObserverWeak; - } - - bool getNextBuffer(JNIEnv* env, jlongArray sink, int* dropCount) { - FrameMetricsNotification& elem = mRingBuffer[mNextInQueue]; - - if (elem.hasData.load()) { - env->SetLongArrayRegion(sink, 0, kBufferSize, elem.buffer); - *dropCount = elem.dropCount; - mNextInQueue = (mNextInQueue + 1) % kRingSize; - elem.hasData = false; - return true; - } - - return false; - } - - virtual void notify(const int64_t* stats) { - FrameMetricsNotification& elem = mRingBuffer[mNextFree]; - - if (!elem.hasData.load()) { - memcpy(elem.buffer, stats, kBufferSize * sizeof(stats[0])); - - elem.dropCount = mDroppedReports; - mDroppedReports = 0; - - incStrong(nullptr); - mNextFree = (mNextFree + 1) % kRingSize; - elem.hasData = true; - - mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage); - } else { - mDroppedReports++; - } - } - -private: - static const int kBufferSize = static_cast<int>(FrameInfoIndex::NumIndexes); - static constexpr int kRingSize = 3; - - class FrameMetricsNotification { - public: - FrameMetricsNotification() : hasData(false) {} - - std::atomic_bool hasData; - int64_t buffer[kBufferSize]; - int dropCount = 0; - }; - - JavaVM* const mVm; - jweak mObserverWeak; - - sp<MessageQueue> mMessageQueue; - sp<NotifyHandler> mMessageHandler; - Message mMessage; - - int mNextFree = 0; - int mNextInQueue = 0; - FrameMetricsNotification mRingBuffer[kRingSize]; - - int mDroppedReports = 0; -}; - -void NotifyHandler::handleMessage(const Message& message) { - JNIEnv* env = getenv(mVm); - - jobject target = env->NewLocalRef(mObserver->getObserverReference()); - - if (target != nullptr) { - jlongArray javaBuffer = get_metrics_buffer(env, target); - int dropCount = 0; - while (mObserver->getNextBuffer(env, javaBuffer, &dropCount)) { - env->CallVoidMethod(target, gFrameMetricsObserverClassInfo.callback, dropCount); - } - env->DeleteLocalRef(target); - } - - mObserver->decStrong(nullptr); -} - static void android_view_ThreadedRenderer_rotateProcessStatsBuffer(JNIEnv* env, jobject clazz) { RenderProxy::rotateProcessStatsBuffer(); } @@ -604,7 +141,7 @@ static jint android_view_ThreadedRenderer_getRenderThreadTid(JNIEnv* env, jobjec } static jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { - RootRenderNode* node = new RootRenderNode(env); + RootRenderNode* node = new RootRenderNode(std::make_unique<JvmErrorReporter>(env)); node->incStrong(0); node->setName("RootRenderNode"); return reinterpret_cast<jlong>(node); @@ -1053,7 +590,7 @@ static jlong android_view_ThreadedRenderer_addFrameMetricsObserver(JNIEnv* env, renderthread::RenderProxy* renderProxy = reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); - FrameMetricsObserver* observer = new ObserverProxy(vm, fso); + FrameMetricsObserver* observer = new FrameMetricsObserverProxy(vm, fso); renderProxy->addFrameMetricsObserver(observer); return reinterpret_cast<jlong>(observer); } @@ -1172,17 +709,6 @@ static void attachRenderThreadToJvm(const char* name) { int register_android_view_ThreadedRenderer(JNIEnv* env) { env->GetJavaVM(&mJvm); RenderThread::setOnStartHook(&attachRenderThreadToJvm); - jclass observerClass = FindClassOrDie(env, "android/view/FrameMetricsObserver"); - gFrameMetricsObserverClassInfo.frameMetrics = GetFieldIDOrDie( - env, observerClass, "mFrameMetrics", "Landroid/view/FrameMetrics;"); - gFrameMetricsObserverClassInfo.messageQueue = GetFieldIDOrDie( - env, observerClass, "mMessageQueue", "Landroid/os/MessageQueue;"); - gFrameMetricsObserverClassInfo.callback = GetMethodIDOrDie( - env, observerClass, "notifyDataAvailable", "(I)V"); - - jclass metricsClass = FindClassOrDie(env, "android/view/FrameMetrics"); - gFrameMetricsObserverClassInfo.timingDataBuffer = GetFieldIDOrDie( - env, metricsClass, "mTimingData", "[J"); jclass hardwareRenderer = FindClassOrDie(env, "android/graphics/HardwareRenderer"); diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto index d06e1a6c1ccd..7e26952a92da 100644 --- a/core/proto/android/os/system_properties.proto +++ b/core/proto/android/os/system_properties.proto @@ -497,8 +497,7 @@ message SystemPropertiesProto { } optional Telephony telephony = 38; - optional string url_legal = 39; - optional string url_legal_android_privacy = 40; + reserved 39, 40; // Removed url_legal* props message Vendor { optional string build_date = 1; diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index 702ee2f71c83..d5528deeaf15 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -198,11 +198,19 @@ message SecureSettingsProto { optional SettingProto silence_alarms_count = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_calls_count = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto silence_notification_count = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // del: silence_notification_count = 5 optional SettingProto silence_timer_count = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_count = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_enabled = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + optional SettingProto silence_alarms_touch_count = 9 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_calls_touch_count = 10 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_timer_touch_count = 11 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto skip_touch_count = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Gesture gesture = 74; diff --git a/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml b/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml index 5a5ad9e62657..93b3fe500d9c 100644 --- a/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml +++ b/core/res/res/drawable/pointer_horizontal_double_arrow_icon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" android:bitmap="@drawable/pointer_horizontal_double_arrow" - android:hotSpotX="11dp" - android:hotSpotY="12dp" /> + android:hotSpotX="12dp" + android:hotSpotY="11dp" /> diff --git a/core/res/res/layout-car/car_preference.xml b/core/res/res/layout-car/car_preference.xml index b138f4d7cf50..2f9b46552561 100644 --- a/core/res/res/layout-car/car_preference.xml +++ b/core/res/res/layout-car/car_preference.xml @@ -49,7 +49,6 @@ android:id="@id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:ellipsize="end" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceListItem"/> diff --git a/core/res/res/layout-car/car_preference_category.xml b/core/res/res/layout-car/car_preference_category.xml index b674487cffa7..3def511ea013 100644 --- a/core/res/res/layout-car/car_preference_category.xml +++ b/core/res/res/layout-car/car_preference_category.xml @@ -56,7 +56,6 @@ android:id="@id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:ellipsize="end" android:singleLine="true" android:textColor="?android:attr/textColorSecondary"/> diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml index aeaccfded38a..1dd420746e8a 100644 --- a/core/res/res/layout/resolver_list.xml +++ b/core/res/res/layout/resolver_list.xml @@ -129,18 +129,6 @@ android:enabled="false" android:text="@string/activity_resolver_use_always" android:onClick="onButtonClick" /> - - <Button - android:id="@+id/button_app_settings" - android:layout_width="wrap_content" - android:layout_gravity="end" - android:maxLines="2" - android:minHeight="@dimen/alert_dialog_button_bar_height" - style="?attr/buttonBarPositiveButtonStyle" - android:layout_height="wrap_content" - android:enabled="false" - android:text="@string/activity_resolver_app_settings" - android:onClick="onButtonClick" /> </LinearLayout> </com.android.internal.widget.ResolverDrawerLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 3fef6a7c92c9..74f0e68ca498 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Maak oop met"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Maak oop met %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Maak oop"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Gee toegang tot oop <xliff:g id="HOST">%1$s</xliff:g>-skakels met"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Gee toegang tot oop <xliff:g id="HOST">%1$s</xliff:g>-skakels met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Verleen toegang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redigeer met"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigeer met %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altyd"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Net een keer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s steun nie werkprofiel nie"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 775291e6cca8..af0ed28ca379 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ክፈት በ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"ክፈት በ%1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ክፈት"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"የ<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን በዚህ ለመክፈት መዳረሻ ይስጡ፦"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"የ<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን በ<xliff:g id="APPLICATION">%2$s</xliff:g> ለመክፈት መዳረሻ ይስጡ"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"መዳረሻ ስጥ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ያርትዑ በ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ያርትዑ በ%1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ማሰሺያን አስነሳ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ጥሪ ተቀበል?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ዘወትር"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"አንዴ ብቻ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ቅንብሮች"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s የስራ መገለጫ አይደግፍም"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index e7bda87acde9..603239fc0936 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1211,8 +1211,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"فتح باستخدام"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"فتح باستخدام %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"فتح"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"منح إمكانية الوصول لفتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"منح إمكانية الوصول لفتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"منح إذن الوصول"</string> <string name="whichEditApplication" msgid="144727838241402655">"تعديل باستخدام"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"تعديل باستخدام %1$s"</string> @@ -1568,7 +1574,7 @@ <string name="disable_tether_notification_message" msgid="2913366428516852495">"اتصل بالمشرف للحصول على التفاصيل"</string> <string name="back_button_label" msgid="2300470004503343439">"رجوع"</string> <string name="next_button_label" msgid="1080555104677992408">"التالي"</string> - <string name="skip_button_label" msgid="1275362299471631819">"تخطي"</string> + <string name="skip_button_label" msgid="1275362299471631819">"التخطي"</string> <string name="no_matches" msgid="8129421908915840737">"ليس هناك أي مطابقات"</string> <string name="find_on_page" msgid="1946799233822820384">"بحث في الصفحة"</string> <plurals name="matches_found" formatted="false" msgid="1210884353962081884"> @@ -1676,6 +1682,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"دومًا"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"مرة واحدة فقط"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"الإعدادات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"لا يدعم %1$s الملفات الشخصية للعمل"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 01ccf891b87e..b126468c3869 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ইয়াৰ জৰিয়তে খোলক"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sৰ জৰিয়তে খোলক"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"খোলক"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ইয়াৰ দ্বাৰা <xliff:g id="HOST">%1$s</xliff:g> লিংক খুলিবলৈ এক্সেছ দিয়ক"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>ৰ দ্বাৰা <xliff:g id="HOST">%1$s</xliff:g> লিংক খুলিবলৈ এক্সেছ দিয়ক"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"এক্সেছ দিয়ক"</string> <string name="whichEditApplication" msgid="144727838241402655">"ইয়াৰ দ্বাৰা সম্পাদনা কৰক"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sৰদ্বাৰা সম্পাদনা কৰক"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ব্ৰাউজাৰ লঞ্চ কৰিবনে?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"কল স্বীকাৰ কৰিবনে?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"সদায়"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"মাত্ৰ এবাৰ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ছেটিংসমূহ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sএ কৰ্মস্থানৰ প্ৰ\'ফাইল সমৰ্থন নকৰে।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index cc5ed495d7d0..f372fec14a44 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Bununla açın"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ilə açın"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Açın"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Bu tətbiqlə <xliff:g id="HOST">%1$s</xliff:g> linklərini açmağa icazə verin:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ilə <xliff:g id="HOST">%1$s</xliff:g> linklərini açmağa icazə verin"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"İcazə verin"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bununla düzəliş edin:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ilə düzəliş edin"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s iş profilini dəstəkləmir"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 1db1aac8dca8..b4faae72fa2b 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvorite pomoću"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvorite pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dozvolite da se linkovi <xliff:g id="HOST">%1$s</xliff:g> otvaraju pomoću"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dozvolite da <xliff:g id="APPLICATION">%2$s</xliff:g> otvara linikove <xliff:g id="HOST">%1$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Izmenite pomoću"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Izmenite pomoću aplikacije %1$s"</string> @@ -1607,6 +1613,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Želite li da pokrenete pregledač?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Želite li da prihvatite poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvek"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Podešavanja"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 64b5b842fff7..996a02b13350 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Адкрыць з дапамогай"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Адкрыць з дапамогай %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Адкрыць"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Адкрываць спасылкі на сэрвіс <xliff:g id="HOST">%1$s</xliff:g> з дапамогай"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Адкрываць спасылкі на сэрвіс <xliff:g id="HOST">%1$s</xliff:g> з дапамогай праграмы \"<xliff:g id="APPLICATION">%2$s</xliff:g>\""</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даць доступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Рэдагаваць з дапамогай"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Рэдагаваць з дапамогай %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запусцiць браўзер?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прыняць выклік?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Заўсёды"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Толькі адзін раз"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налады"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не падтрымлівае працоўны профіль"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 47204029cd20..e4e1e808ae48 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отваряне чрез"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отваряне чрез %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отваряне"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Предоставяне на достъп за отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> с(ъс)"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Предоставяне на достъп за отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> с(ъс) <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даване на достъп"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редактиране чрез"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактиране чрез %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Винаги"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само веднъж"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддържа служебен потребителски профил"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index f5bfa5b343ff..ca4d12237544 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"এর মাধ্যমে খুলুন"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s দিয়ে খুলুন"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"খুলুন"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ব্যবহার করে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্ক খুলতে অ্যাক্সেস দিন"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ব্যবহার করে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্ক খুলতে অ্যাক্সেস দিন"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"অ্যাক্সেস দিন"</string> <string name="whichEditApplication" msgid="144727838241402655">"এর মাধ্যমে সম্পাদনা করুন"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s দিয়ে সম্পাদনা করুন"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ব্রাউজার লঞ্চ করতে চান?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"কল গ্রহণ করবেন?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"সবসময়"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"শুধু একবার"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"সেটিংস"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s কর্মস্থলের প্রোফাইল সমর্থন করে না।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index d5009471e1c9..fd441287bb39 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvori koristeći"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvori koristeći %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dozvolite pristup za otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dozvolite pristup za otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Uredi koristeći"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uredi koristeći %1$s"</string> @@ -1609,6 +1615,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokretanje preglednika?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo ovaj put"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 69e76b6253e8..1638fd82c243 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Obre amb"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Obre amb %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Obre"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dona accés per obrir enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dona accés per obrir enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dona accés"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edita amb"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edita amb %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vols iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vols acceptar la trucada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Només una vegada"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuració"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admet perfils professionals."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 28a8679b52c7..5208e5bc1c3a 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otevřít v aplikaci"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otevřít v aplikaci %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otevřít"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Udělte přístup k otevírání odkazů <xliff:g id="HOST">%1$s</xliff:g> pomocí aplikace"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Udělte přístup k otevírání odkazů <xliff:g id="HOST">%1$s</xliff:g> pomocí aplikace <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udělit přístup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Upravit v aplikaci"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upravit v aplikaci %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Pouze jednou"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavení"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s pracovní profily nepodporuje."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index bdf9b216e30c..401fa4f75334 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Åbn med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åbn med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åbn"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Giv adgang til at åbne <xliff:g id="HOST">%1$s</xliff:g>-link med"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Giv adgang til at åbne <xliff:g id="HOST">%1$s</xliff:g>-links med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Giv adgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altid"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kun én gang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Indstillinger"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s understøtter ikke arbejdsprofil"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 6cfbd10cbdc6..67c179dc5e95 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -400,9 +400,9 @@ <string name="permlab_readCallLog" msgid="3478133184624102739">"Anrufliste lesen"</string> <string name="permdesc_readCallLog" msgid="3204122446463552146">"Diese App kann deine Anrufliste lesen."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"Anrufliste bearbeiten"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Ermöglicht der App, die Anrufliste deines Tablets zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so deine Anrufliste löschen oder ändern."</string> - <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"Ermöglicht der App, die Anrufliste deines Fernsehers zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so deine Anrufliste löschen oder ändern."</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Ermöglicht der App, die Anrufliste deines Telefons zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so deine Anrufliste löschen oder ändern."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Ermöglicht der App, die Anrufliste deines Tablets zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so die Einträge in der Anrufliste löschen oder sie ändern."</string> + <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"Ermöglicht der App, die Anrufliste deines Fernsehers zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so die Einträge in der Anrufliste löschen oder sie ändern."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Ermöglicht der App, die Anrufliste deines Telefons zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so die Einträge in der Anrufliste löschen oder sie ändern."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"Auf Körpersensoren wie z. B. Pulsmesser zugreifen"</string> <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ermöglicht der App, auf Daten von Sensoren zuzugreifen, die deine körperliche Verfassung überwachen, beispielsweise deinen Puls"</string> <string name="permlab_readCalendar" msgid="6716116972752441641">"Kalendertermine und Details lesen"</string> @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Öffnen mit"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mit %1$s öffnen"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öffnen"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Zugriff zum Öffnen von <xliff:g id="HOST">%1$s</xliff:g>-Links erlauben"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Zugriff zum Öffnen von <xliff:g id="HOST">%1$s</xliff:g>-Links mit <xliff:g id="APPLICATION">%2$s</xliff:g> erlauben"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Zugriff erlauben"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bearbeiten mit"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Mit %1$s bearbeiten"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Anruf annehmen?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Immer"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Nur diesmal"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Einstellungen"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Das Arbeitsprofil wird von %1$s nicht unterstützt."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index b22dc9c36ec2..87d08444db0a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Άνοιγμα με"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Άνοιγμα με %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Άνοιγμα"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Παραχώρηση πρόσβασης για το άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Παραχώρηση πρόσβασης για το άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με την εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Παροχή πρόσβασης"</string> <string name="whichEditApplication" msgid="144727838241402655">"Επεξεργασία με"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Επεξεργασία με %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Εκκίνηση προγράμματος περιήγησης;"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Αποδοχή κλήσης;"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Πάντα"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Μόνο μία φορά"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ρυθμίσεις"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Το προφίλ εργασίας δεν υποστηρίζεται από %1$s"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 5423fecadf7f..51b031bc535c 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 4cbbe143d01e..fd14d4dc7e31 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 5423fecadf7f..51b031bc535c 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 5423fecadf7f..51b031bc535c 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index ffbe69ead131..638d29d2aa8f 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -1131,8 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Give access to open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Open links with"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Open links with <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1584,6 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Set to always open"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index a7fbf0984c00..43e0823a7c18 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Otorgar acceso para abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Otorgar acceso para abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Otorgar acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index ab4acb5b81f6..90bf8b6dc51b 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Permitir acceso para abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Permitir acceso para abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permitir acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ajustes"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 5f496489635f..cf84482078de 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Avamine:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avamine rakendusega %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ava"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Juurdepääsu andmine, et avada üksuse <xliff:g id="HOST">%1$s</xliff:g> lingid"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Juurdepääsu andmine, et avada üksuse <xliff:g id="HOST">%1$s</xliff:g> lingid rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Juudep. andmine"</string> <string name="whichEditApplication" msgid="144727838241402655">"Muutmine:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muutmine rakendusega %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Ainult üks kord"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Seaded"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei toeta tööprofiili"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d7190b7eb83b..ba1e0b2b8fdd 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ireki honekin:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Irekin %1$s aplikazioarekin"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ireki"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Eman <xliff:g id="HOST">%1$s</xliff:g> estekak irekitzeko baimena aplikazio honi:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Eman <xliff:g id="APPLICATION">%2$s</xliff:g> aplikazioari <xliff:g id="HOST">%1$s</xliff:g> irekitzeko baimena"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Eman sarbidea"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editatu honekin:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editatu %1$s aplikazioarekin"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Arakatzailea abiarazi nahi duzu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Deia onartu nahi duzu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Beti"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Behin soilik"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ezarpenak"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s abiarazleak ez du laneko profil hau onartzen"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 75c689e7e77f..280a56ec5f14 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"باز کردن با"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"باز کردن با %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"باز کردن"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ارائه دسترسی برای باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ارائه دسترسی برای باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با<xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ارائه دسترسی"</string> <string name="whichEditApplication" msgid="144727838241402655">"ویرایش با"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ویرایش با %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راهاندازی شود؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"تماس را میپذیرید؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"همیشه"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"فقط این بار"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"تنظیمات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s از نمایه کاری پشتیبانی نمیکند"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 7bb937803390..7a5003bacce3 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Avaa sovelluksessa"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avaa sovelluksessa %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Avaa"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Salli linkkien (<xliff:g id="HOST">%1$s</xliff:g>) avaaminen:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Salli linkkien (<xliff:g id="HOST">%1$s</xliff:g>) avaaminen: <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Salli"</string> <string name="whichEditApplication" msgid="144727838241402655">"Muokkaa sovelluksessa"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muokkaa sovelluksessa %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Käynnistetäänkö selain?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vastataanko puheluun?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Aina"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Vain kerran"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Asetukset"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei tue työprofiilia"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index fe46045b72d5..0ddb19abbdd6 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Accorder l\'accès pour ouvrir les liens de <xliff:g id="HOST">%1$s</xliff:g> avec"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Accorder l\'accès pour ouvrir les liens de <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne prend pas en charge le profil professionnel"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index b54892ef928c..5f98a8acd945 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Autoriser l\'ouverture des liens <xliff:g id="HOST">%1$s</xliff:g> avec"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Autoriser l\'ouverture des liens <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s n\'est pas compatible avec le profil professionnel."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 7d8da5b01009..740f699ec9c4 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acceso para abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acceso para abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar o navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceptar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só unha vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non admite o perfil de traballo"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 31c7bd400b4a..ddc4aaeec355 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"આની સાથે ખોલો"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s સાથે ખોલો"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ખોલો"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"આના વડે <xliff:g id="HOST">%1$s</xliff:g>ની લિંક ખોલવા માટે ઍક્સેસ આપો"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> વડે <xliff:g id="HOST">%1$s</xliff:g>ની લિંક ખોલવા માટે ઍક્સેસ આપો"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ઍક્સેસ આપો"</string> <string name="whichEditApplication" msgid="144727838241402655">"આનાથી સંપાદિત કરો"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s સાથે સંપાદિત કરો"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"બ્રાઉઝર લોન્ચ કરીએ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"કૉલ સ્વીકારીએ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"હંમેશા"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ફક્ત એક વાર"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"સેટિંગ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s કાર્ય પ્રોફાઇલનું સમર્થન કરતું નથી"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 2c2b7dd9cb58..0a1051bb6fc9 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -483,7 +483,7 @@ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"ऐप को वाई-फ़ाई नेटवर्क के बारे में जानकारी, जैसे WI-Fi चालू है या नहीं और कनेक्ट किए गए वाई-फ़ाई डिवाइस के नाम, देखने देता है."</string> <string name="permlab_changeWifiState" msgid="6550641188749128035">"वाई-फ़ाई से कनेक्ट और डिस्कनेक्ट करें"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है."</string> - <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाई-फ़ाई मल्टीकास्ट प्राप्ति को अनुमति दें"</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाई-फ़ाई मल्टीकास्ट पाने को अनुमति दें"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"ऐप को मल्टीकास्ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्त करने देती है. इसमें गैर-मल्टीकास्ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है."</string> @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"इसमें खोलें"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s में खोलें"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोलें"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"इससे <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलने का एक्सेस दें"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> से <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलने का एक्सेस दें"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"एक्सेस दें"</string> <string name="whichEditApplication" msgid="144727838241402655">"इसके ज़रिये बदलाव करें"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s की मदद से बदलाव करें"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउज़र लॉन्च करें?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकार करें?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"हमेशा"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"केवल एक बार"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s वर्क प्रोफ़ाइल का समर्थन नहीं करता"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 0c9d4993054e..cc8eb49e0dee 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvaranje pomoću aplikacije"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvaranje pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Omogućite pristup za otvaranje <xliff:g id="HOST">%1$s</xliff:g> veza pomoću aplikacije"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Omogućite pristup za otvaranje <xliff:g id="HOST">%1$s</xliff:g> veza pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogući pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Uređivanje pomoću aplikacije"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uređivanje pomoću aplikacije %1$s"</string> @@ -1607,6 +1613,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava radni profil"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 3453ca1ee302..4ce7d4282893 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Megnyitás a következővel:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Megnyitás a következővel: %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Megnyitás"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Engedély megadása, hogy a(z) <xliff:g id="HOST">%1$s</xliff:g> linkek a következő alkalmazásban nyíljanak meg:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Engedély megadása, hogy a(z) <xliff:g id="HOST">%1$s</xliff:g> linkek a következő alkalmazásban nyíljanak meg: <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Engedély adása"</string> <string name="whichEditApplication" msgid="144727838241402655">"Szerkesztés a következővel:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Szerkesztés a következővel: %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Böngésző indítása?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Fogadja a hívást?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Mindig"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Csak egyszer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Beállítások"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"A(z) %1$s nem támogatja a munkaprofilokat."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index d0a57c8c4f4d..2be6d6f32370 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Բացել հետևյալ ծրագրով՝"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Բացել հավելվածով՝ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Բացել"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Թույլատրեք, որ <xliff:g id="HOST">%1$s</xliff:g> տիրույթը հղումները բացվեն հետևյալ հավելվածում՝"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Թույլատրեք, որ <xliff:g id="HOST">%1$s</xliff:g> տիրույթի հղումները բացվեն <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածում"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Թույլատրել"</string> <string name="whichEditApplication" msgid="144727838241402655">"Խմբագրել հետևյալ ծրագրով՝"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Խմբագրել հետևյալով՝ %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Գործարկե՞լ զննարկիչը:"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ընդունե՞լ զանգը:"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Միշտ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Միայն մեկ անգամ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Կարգավորումներ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s-ը չի աջակցում աշխատանքային պրոֆիլներ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 511502f4c0df..e71ab41f378d 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -84,7 +84,7 @@ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dinonaktifkan sementara oleh operator"</string> <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dinonaktifkan sementara oleh operator untuk SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string> <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Tidak dapat menjangkau jaringan seluler"</string> - <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Coba ubah jaringan pilihan. Tap untuk mengubah."</string> + <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Coba ubah jaringan pilihan. Ketuk untuk mengubah."</string> <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Panggilan darurat tidak tersedia"</string> <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Tidak dapat melakukan panggilan darurat melalui Wi-Fi"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string> @@ -188,7 +188,7 @@ <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profil kerja tidak tersedia lagi di perangkat ini"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Terlalu banyak percobaan memasukkan sandi"</string> <string name="network_logging_notification_title" msgid="6399790108123704477">"Perangkat ini ada yang mengelola"</string> - <string name="network_logging_notification_text" msgid="7930089249949354026">"Organisasi mengelola perangkat ini dan mungkin memantau traffic jaringan. Tap untuk melihat detailnya."</string> + <string name="network_logging_notification_text" msgid="7930089249949354026">"Organisasi mengelola perangkat ini dan mungkin memantau traffic jaringan. Ketuk untuk melihat detailnya."</string> <string name="factory_reset_warning" msgid="5423253125642394387">"Perangkat akan dihapus"</string> <string name="factory_reset_message" msgid="9024647691106150160">"Aplikasi admin tidak dapat digunakan. Perangkat Anda kini akan dihapus.\n\nJika ada pertanyaan, hubungi admin organisasi."</string> <string name="printing_disabled_by" msgid="8936832919072486965">"Fitur pencetakan dinonaktifkan oleh <xliff:g id="OWNER_APP">%s</xliff:g>."</string> @@ -271,7 +271,7 @@ <string name="notification_channel_foreground_service" msgid="3931987440602669158">"Aplikasi yang menggunakan baterai"</string> <string name="foreground_service_app_in_background" msgid="1060198778219731292">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang menggunakan baterai"</string> <string name="foreground_service_apps_in_background" msgid="7175032677643332242">"<xliff:g id="NUMBER">%1$d</xliff:g> aplikasi sedang meggunakan baterai"</string> - <string name="foreground_service_tap_for_details" msgid="372046743534354644">"Tap untuk melihat detail penggunaan baterai dan data"</string> + <string name="foreground_service_tap_for_details" msgid="372046743534354644">"Ketuk untuk melihat detail penggunaan baterai dan data"</string> <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> @@ -801,7 +801,7 @@ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Ketik kode PUK dan PIN baru"</string> <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Kode PUK"</string> <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Kode Pin baru"</string> - <string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"Tap untuk mengetik sandi"</font></string> + <string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"Ketuk untuk mengetik sandi"</font></string> <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ketik sandi untuk membuka kunci"</string> <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ketik PIN untuk membuka kunci"</string> <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Kode PIN salah."</string> @@ -913,7 +913,7 @@ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Tetap di Halaman ini"</string> <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nYakin ingin beranjak dari halaman ini?"</string> <string name="save_password_label" msgid="6860261758665825069">"Konfirmasi"</string> - <string name="double_tap_toast" msgid="4595046515400268881">"Kiat: Tap dua kali untuk memperbesar dan memperkecil."</string> + <string name="double_tap_toast" msgid="4595046515400268881">"Kiat: Ketuk dua kali untuk memperbesar dan memperkecil."</string> <string name="autofill_this_form" msgid="4616758841157816676">"IsiOtomatis"</string> <string name="setup_autofill" msgid="7103495070180590814">"Siapkan Pengisian Otomatis"</string> <string name="autofill_window_title" msgid="4107745526909284887">"IsiOtomatis dengan <xliff:g id="SERVICENAME">%1$s</xliff:g>"</string> @@ -1116,7 +1116,7 @@ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Beberapa fungsi sistem mungkin tidak dapat bekerja"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Penyimpanan tidak cukup untuk sistem. Pastikan Anda memiliki 250 MB ruang kosong, lalu mulai ulang."</string> <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang berjalan"</string> - <string name="app_running_notification_text" msgid="1197581823314971177">"Tap untuk informasi selengkapnya atau menghentikan aplikasi."</string> + <string name="app_running_notification_text" msgid="1197581823314971177">"Ketuk untuk informasi selengkapnya atau menghentikan aplikasi."</string> <string name="ok" msgid="5970060430562524910">"Oke"</string> <string name="cancel" msgid="6442560571259935130">"Batal"</string> <string name="yes" msgid="5362982303337969312">"Oke"</string> @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Berikan akses untuk membuka link <xliff:g id="HOST">%1$s</xliff:g> dengan"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Berikan akses untuk membuka link <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string> @@ -1202,7 +1208,7 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string> - <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap untuk kembali ke game"</string> + <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Ketuk untuk kembali ke game"</string> <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Pilih game"</string> <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Agar performa tetap maksimal, hanya 1 game yang dapat dibuka sekaligus."</string> <string name="old_app_action" msgid="3044685170829526403">"Kembali ke <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> @@ -1210,7 +1216,7 @@ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> akan ditutup tanpa menyimpan"</string> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melampaui batas memori"</string> <string name="dump_heap_ready_notification" msgid="1162196579925048701">"Heap dump <xliff:g id="PROC">%1$s</xliff:g> siap"</string> - <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Informasi memori dikumpulkan. Tap untuk membagikan."</string> + <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Informasi memori dikumpulkan. Ketuk untuk membagikan."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share tumpukan membuang?"</string> <string name="dump_heap_text" msgid="8546022920319781701">"Proses <xliff:g id="PROC">%1$s</xliff:g> telah melampaui batas memori <xliff:g id="SIZE">%2$s</xliff:g>. Heap dump tersedia untuk Anda bagikan kepada developernya. Hati-hati, heap dump ini dapat memuat informasi pribadi yang dapat diakses oleh aplikasi."</string> <string name="dump_heap_system_text" msgid="3236094872980706024">"Proses <xliff:g id="PROC">%1$s</xliff:g> telah melampaui batas memori sebesar <xliff:g id="SIZE">%2$s</xliff:g>. Heap dump tersedia untuk Anda bagikan. Hati-hati, heap dump ini dapat memuat informasi pribadi sensitif yang dapat diakses oleh proses, yang dapat menyertakan informasi yang Anda ketik."</string> @@ -1250,7 +1256,7 @@ <string name="wifi_available_title_connecting" msgid="1139126673968899002">"Menghubungkan ke jaringan Wi-Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Terhubung ke jaringan Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menghubungkan ke jaringan Wi‑Fi"</string> - <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketuk untuk melihat semua jaringan"</string> <string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string> <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua jaringan"</string> <string name="wifi_suggestion_title" msgid="9099832833531486167">"Sambungkan perangkat ke jaringan Wi-Fi?"</string> @@ -1267,10 +1273,10 @@ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> <skip /> <string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> tidak memiliki akses internet"</string> - <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap untuk melihat opsi"</string> + <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketuk untuk melihat opsi"</string> <string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Tersambung"</string> <string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> memiliki konektivitas terbatas"</string> - <string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"Tap untuk tetap menyambungkan"</string> + <string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"Ketuk untuk tetap menyambungkan"</string> <string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan pada setelan hotspot Anda"</string> <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pita hotspot Anda telah berubah."</string> <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Perangkat ini tidak mendukung preferensi Anda, yaitu hanya 5GHz. Sebagai gantinya, perangkat ini akan menggunakan pita frekuensi 5GHz jika tersedia."</string> @@ -1294,7 +1300,7 @@ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Memulai Wi-Fi Direct. Opsi ini akan mematikan hotspot/klien Wi-Fi."</string> <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Tidak dapat memulai Wi-Fi Direct."</string> <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct aktif"</string> - <string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"Tap untuk setelan"</string> + <string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"Ketuk untuk setelan"</string> <string name="accept" msgid="1645267259272829559">"Terima"</string> <string name="decline" msgid="2112225451706137894">"Tolak"</string> <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Undangan terkirim"</string> @@ -1331,7 +1337,7 @@ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengaktifkan SIM baru"</string> <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download aplikasi"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baru dimasukkan"</string> - <string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap untuk menyiapkan"</string> + <string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketuk untuk menyiapkan"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Setel waktu"</string> <string name="date_picker_dialog_title" msgid="5879450659453782278">"Setel tanggal"</string> <string name="date_time_set" msgid="5777075614321087758">"Setel"</string> @@ -1348,17 +1354,17 @@ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB diaktifkan"</string> <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB diaktifkan"</string> <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Aksesori USB tersambung"</string> - <string name="usb_notification_message" msgid="3370903770828407960">"Tap untuk opsi lainnya."</string> - <string name="usb_power_notification_message" msgid="4647527153291917218">"Mengisi daya perangkat yang terhubung. Tap untuk opsi lainnya."</string> + <string name="usb_notification_message" msgid="3370903770828407960">"Ketuk untuk opsi lainnya."</string> + <string name="usb_power_notification_message" msgid="4647527153291917218">"Mengisi daya perangkat yang terhubung. Ketuk untuk opsi lainnya."</string> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog terdeteksi"</string> - <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Tap untuk mempelajari lebih lanjut."</string> + <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Ketuk untuk mempelajari lebih lanjut."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Proses debug USB terhubung"</string> - <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap untuk menonaktifkan proses debug USB"</string> + <string name="adb_active_notification_message" msgid="7463062450474107752">"Ketuk untuk menonaktifkan proses debug USB"</string> <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk menonaktifkan debugging USB."</string> <string name="test_harness_mode_notification_title" msgid="2216359742631914387">"Mode Tes Otomatis diaktifkan"</string> <string name="test_harness_mode_notification_message" msgid="1343197173054407119">"Lakukan reset ke setelan pabrik untuk menonaktifkan Mode Tes Otomatis."</string> <string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Cairan atau kotoran di port USB"</string> - <string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB otomatis dinonaktifkan. Tap untuk mempelajari lebih lanjut."</string> + <string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB otomatis dinonaktifkan. Ketuk untuk mempelajari lebih lanjut."</string> <string name="usb_contaminant_not_detected_title" msgid="7708281124088684821">"Boleh menggunakan port USB"</string> <string name="usb_contaminant_not_detected_message" msgid="2415791798244545292">"Ponsel tidak lagi mendeteksi adanya cairan atau kotoran."</string> <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan bug…"</string> @@ -1371,7 +1377,7 @@ <string name="show_ime" msgid="2506087537466597099">"Pertahankan di layar jika keyboard fisik masih aktif"</string> <string name="hardware" msgid="194658061510127999">"Tampilkan keyboard virtual"</string> <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Mengonfigurasi keyboard fisik"</string> - <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap untuk memilih bahasa dan tata letak"</string> + <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"Tampilkan di atas apl lain"</string> @@ -1382,13 +1388,13 @@ <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Memeriksa <xliff:g id="NAME">%s</xliff:g>…"</string> <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Meninjau konten saat ini"</string> <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> baru"</string> - <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tap untuk menyiapkan"</string> + <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Ketuk untuk menyiapkan"</string> <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk mentransfer foto dan media"</string> <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Masalah pada <xliff:g id="NAME">%s</xliff:g>"</string> - <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap untuk memperbaiki"</string> + <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Ketuk untuk memperbaiki"</string> <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> rusak. Pilih untuk memperbaikinya."</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak didukung"</string> - <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Perangkat tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Tap untuk menyiapkan dalam format yang didukung."</string> + <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Perangkat tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Ketuk untuk menyiapkan dalam format yang didukung."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Perangkat ini tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Pilih untuk menyiapkan dalam format yang didukung."</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tiba-tiba dicabut"</string> <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Keluarkan media sebelum mencabut agar konten tidak hilang"</string> @@ -1430,7 +1436,7 @@ <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"Mengizinkan aplikasi meminta penghapusan paket."</string> <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"meminta mengabaikan pengoptimalan baterai"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"Mengizinkan aplikasi meminta izin untuk mengabaikan pengoptimalan baterai bagi aplikasi tersebut."</string> - <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tap dua kali untuk kontrol perbesar/perkecil"</string> + <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Ketuk dua kali untuk kontrol perbesar/perkecil"</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Tidak dapat menambahkan widget."</string> <string name="ime_action_go" msgid="8320845651737369027">"Buka"</string> <string name="ime_action_search" msgid="658110271822807811">"Telusuri"</string> @@ -1461,8 +1467,8 @@ <string name="notification_ranker_binding_label" msgid="774540592299064747">"Layanan penentu peringkat notifikasi"</string> <string name="vpn_title" msgid="19615213552042827">"VPN diaktifkan"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN diaktifkan oleh <xliff:g id="APP">%s</xliff:g>"</string> - <string name="vpn_text" msgid="1610714069627824309">"Tap untuk mengelola jaringan."</string> - <string name="vpn_text_long" msgid="4907843483284977618">"Tersambung ke <xliff:g id="SESSION">%s</xliff:g>. Tap untuk mengelola jaringan."</string> + <string name="vpn_text" msgid="1610714069627824309">"Ketuk untuk mengelola jaringan."</string> + <string name="vpn_text_long" msgid="4907843483284977618">"Tersambung ke <xliff:g id="SESSION">%s</xliff:g>. Ketuk untuk mengelola jaringan."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Menyambungkan VPN selalu aktif..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN selalu aktif tersambung"</string> <string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Terputus dari VPN yang selalu aktif"</string> @@ -1473,9 +1479,9 @@ <string name="reset" msgid="2448168080964209908">"Setel ulang"</string> <string name="submit" msgid="1602335572089911941">"Kirim"</string> <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikasi mengemudi sedang berjalan"</string> - <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap untuk keluar dari aplikasi mengemudi."</string> + <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Ketuk untuk keluar dari aplikasi mengemudi."</string> <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering (Penambatan) atau hotspot aktif"</string> - <string name="tethered_notification_message" msgid="2113628520792055377">"Tap untuk menyiapkan."</string> + <string name="tethered_notification_message" msgid="2113628520792055377">"Ketuk untuk menyiapkan."</string> <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering dinonaktifkan"</string> <string name="disable_tether_notification_message" msgid="2913366428516852495">"Hubungi admin untuk mengetahui detailnya"</string> <string name="back_button_label" msgid="2300470004503343439">"Kembali"</string> @@ -1509,7 +1515,7 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string> <string name="number_picker_increment_button" msgid="2412072272832284313">"Tambah"</string> <string name="number_picker_decrement_button" msgid="476050778386779067">"Kurangi"</string> - <string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> sentuh & tahan."</string> + <string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> sentuh lama."</string> <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Geser ke atas untuk menambah dan ke bawah untuk mengurangi."</string> <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Tambah menit"</string> <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Kurangi menit"</string> @@ -1536,7 +1542,7 @@ <string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Tidak dapat meluncurkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="shareactionprovider_share_with" msgid="806688056141131819">"Berbagi dengan"</string> <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Berbagi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> - <string name="content_description_sliding_handle" msgid="415975056159262248">"Gagang geser. Sentuh & tahan."</string> + <string name="content_description_sliding_handle" msgid="415975056159262248">"Gagang geser. Sentuh lama."</string> <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Geser untuk membuka kunci."</string> <string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi ke beranda"</string> <string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi naik"</string> @@ -1559,7 +1565,7 @@ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Melebihi batas kuota Wi-Fi Anda"</string> <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Anda telah menggunakan <xliff:g id="SIZE">%s</xliff:g> melebihi batas yang ditetapkan"</string> <string name="data_usage_restricted_title" msgid="5965157361036321914">"Data latar belakang dibatasi"</string> - <string name="data_usage_restricted_body" msgid="469866376337242726">"Tap untuk menghapus batasan."</string> + <string name="data_usage_restricted_body" msgid="469866376337242726">"Ketuk untuk menghapus batasan."</string> <string name="data_usage_rapid_title" msgid="1809795402975261331">"Penggunaan kuota yang tinggi"</string> <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikasi Anda menggunakan lebih banyak kuota daripada biasanya"</string> <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> menggunakan lebih banyak kuota daripada biasanya"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setelan"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak mendukung profil kerja"</string> @@ -1669,7 +1677,7 @@ <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Pilih layanan yang akan digunakan saat mengetuk tombol aksesibilitas:"</string> <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan dua jari):"</string> <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan tiga jari):"</string> - <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Sentuh & tahan tombol aksesibilitas untuk beralih layanan."</string> + <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Sentuh lama tombol aksesibilitas untuk beralih layanan."</string> <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Geser dengan dua jari dan tahan untuk beralih layanan."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Geser ke atas dengan tiga jari dan tahan untuk beralih layanan."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string> @@ -1769,7 +1777,7 @@ <string name="reason_unknown" msgid="6048913880184628119">"tak diketahui"</string> <string name="reason_service_unavailable" msgid="7824008732243903268">"Layanan cetak tidak diaktifkan"</string> <string name="print_service_installed_title" msgid="2246317169444081628">"Layanan <xliff:g id="NAME">%s</xliff:g> telah terpasang"</string> - <string name="print_service_installed_message" msgid="5897362931070459152">"Tap untuk mengaktifkan"</string> + <string name="print_service_installed_message" msgid="5897362931070459152">"Ketuk untuk mengaktifkan"</string> <string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"Masukkan PIN admin"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Masukkan PIN"</string> <string name="restr_pin_incorrect" msgid="8571512003955077924">"Tidak benar"</string> @@ -1906,9 +1914,9 @@ <string name="new_sms_notification_content" msgid="7002938807812083463">"Buka aplikasi SMS untuk melihat"</string> <string name="profile_encrypted_title" msgid="4260432497586829134">"Beberapa fitur tidak dapat digunakan"</string> <string name="profile_encrypted_detail" msgid="3700965619978314974">"Profil kerja terkunci"</string> - <string name="profile_encrypted_message" msgid="6964994232310195874">"Tap untuk membuka kunci profil kerja"</string> + <string name="profile_encrypted_message" msgid="6964994232310195874">"Ketuk untuk membuka kunci profil kerja"</string> <string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Tersambung ke <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string> - <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap untuk melihat file"</string> + <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Ketuk untuk melihat file"</string> <string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string> <string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="5268556852031489931">"Memulai demo..."</string> @@ -1988,9 +1996,9 @@ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string> <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Jangan Ganggu"</string> <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"Baru: Mode Jangan Ganggu menyembunyikan notifikasi"</string> - <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Tap untuk mempelajari lebih lanjut dan mengubah."</string> + <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"Ketuk untuk mempelajari lebih lanjut dan mengubah."</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string> - <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap untuk memeriksa item yang diblokir."</string> + <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Ketuk untuk memeriksa item yang diblokir."</string> <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string> <string name="notification_app_name_settings" msgid="7751445616365753381">"Setelan"</string> <string name="notification_appops_camera_active" msgid="5050283058419699771">"Kamera"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index fe41f793315e..3d2acd9c7d24 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Opna með"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Opna með %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Opna"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Veita aðgang til að opna <xliff:g id="HOST">%1$s</xliff:g> tengla með"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Veita aðgang til að opna <xliff:g id="HOST">%1$s</xliff:g> tengla með <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Veita aðgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Breyta með"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Breyta með %1$s"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Opna vafra?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Samþykkja símtal?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltaf"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara einu sinni"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Stillingar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s styður ekki vinnusnið"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 62de3895ca07..6d1d132f2ea6 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Apri con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Apri con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Apri"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Dai l\'accesso per aprire i link di <xliff:g id="HOST">%1$s</xliff:g> con"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Dai l\'accesso per aprire i link di <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Fornisci accesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifica con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifica con %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Avviare l\'applicazione Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accettare la chiamata?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una volta"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Impostazioni"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non supporta il profilo di lavoro"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index cd87b9f36bb9..8add3d75c638 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"פתח באמצעות"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"פתח באמצעות %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"פתח"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"הענקת גישה לפתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"הענקת גישה לפתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"הענקת גישה"</string> <string name="whichEditApplication" msgid="144727838241402655">"ערוך באמצעות"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ערוך באמצעות %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"להפעיל את הדפדפן?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"האם לקבל את השיחה?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"תמיד"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"רק פעם אחת"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"הגדרות"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s אינו תומך בפרופיל עבודה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 47d0dbd16400..2d09d67df392 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"アプリで開く"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sで開く"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開く"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> のリンクを開くには、アクセス権を付与してください"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> で <xliff:g id="HOST">%1$s</xliff:g> のリンクを開くには、アクセス権を付与してください"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"アクセス権を付与"</string> <string name="whichEditApplication" msgid="144727838241402655">"編集に使用"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sで編集"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ブラウザを起動しますか?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"通話を受けますか?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"常時"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"1回のみ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sは仕事用プロファイルをサポートしていません"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 3b57d20a50f0..f81067837733 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"გახსნა აპით"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s-ით გახსნა"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"გახსნა"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების შემდეგი აპით გახსნის წვდომის მინიჭება:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების <xliff:g id="APPLICATION">%2$s</xliff:g>-ით გახსნის წვდომის მინიჭება"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"წვდომის მინიჭება"</string> <string name="whichEditApplication" msgid="144727838241402655">"რედაქტირება აპით:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"რედაქტირება %1$s-ით"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"გსურთ ბრაუზერის გაშვება?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"უპასუხებთ ზარს?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ყოველთვის"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"მხოლოდ ერთხელ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"პარამეტრები"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s მხარს არ უჭერს სამუშაო პროფილს"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 7177d7bf37ec..3c429865e063 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Басқаша ашу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s қолданбасымен ашу"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ашу"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін келесі қолданбамен ашу үшін рұқсат беру:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасымен ашу үшін рұқсат беру"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Рұқсат беру"</string> <string name="whichEditApplication" msgid="144727838241402655">"Келесімен өңдеу"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s көмегімен өңдеу"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Браузер қосылсын ба?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Қоңырауды қабылдау?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Үнемі"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Бір рет қана"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Параметрлер"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жұмыс профилін қолдамайды"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index a08b221107da..b088f4e811d6 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1133,8 +1133,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"បើកជាមួយ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"បើកជាមួយ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"បើក"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ផ្ដល់សិទ្ធិចូលប្រើ ដើម្បីបើកតំណ <xliff:g id="HOST">%1$s</xliff:g> តាមរយៈ"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ផ្ដល់សិទ្ធិចូលប្រើ ដើម្បីបើកតំណ <xliff:g id="HOST">%1$s</xliff:g> តាមរយៈ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ផ្តល់សិទ្ធិចូលប្រើ"</string> <string name="whichEditApplication" msgid="144727838241402655">"កែសម្រួលជាមួយ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"កែសម្រួលជាមួយ %1$s"</string> @@ -1586,6 +1592,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ចាប់ផ្ដើមកម្មវិធីអ៊ីនធឺណិត?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ទទួលការហៅ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ជានិច្ច"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"តែម្ដង"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ការកំណត់"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s មិនគាំទ្រប្រវត្តិរូបការងារ"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 7cbee5807922..6da7eec48161 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ಜೊತೆಗೆ ತೆರೆಯಿರಿ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ತೆರೆ"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಲು ಪ್ರವೇಶವನ್ನು ನೀಡಿ"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಲು ಪ್ರವೇಶವನ್ನು ನೀಡಿ"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ಪ್ರವೇಶ ಅನುಮತಿಸಿ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ಇವರ ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ಕರೆ ಸ್ವೀಕರಿಸುವುದೇ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ಯಾವಾಗಲೂ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ಒಮ್ಮೆ ಮಾತ್ರ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index dca3b14dbe98..853ccff84648 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"연결 프로그램"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s(으)로 열기"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"열기"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"다음으로 <xliff:g id="HOST">%1$s</xliff:g> 링크를 열려면 액세스 권한 부여"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>(으)로 <xliff:g id="HOST">%1$s</xliff:g> 링크를 열려면 액세스 권한 부여"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"권한 부여"</string> <string name="whichEditApplication" msgid="144727838241402655">"편집 프로그램:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s(으)로 수정"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"한 번만"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"설정"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s에서 직장 프로필을 지원하지 않습니다."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 45facdd79fa4..e5b11ba96753 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Төмөнкү менен ачуу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s менен ачуу"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ачуу"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Төмөнкү колдонмо менен <xliff:g id="HOST">%1$s</xliff:g> шилтемелерин ачууга уруксат берүү"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> колдонмосу менен <xliff:g id="HOST">%1$s</xliff:g> шилтемелерин ачууга уруксат берүү"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Мүмкүнчүлүк берүү"</string> <string name="whichEditApplication" msgid="144727838241402655">"Төмөнкү менен түзөтүү"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s менен түзөтүү"</string> @@ -1586,6 +1592,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Серепчи иштетилсинби?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Чалуу кабыл алынсынбы?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Дайыма"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Бир жолу гана"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Жөндөөлөр"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жумуш профилин колдоого албайт"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 6aeefb028a69..74b311a09432 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ເປີດໂດຍໃຊ້"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"ເປີດໂດຍໃຊ້ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ເປີດ"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ໃຫ້ສິດອະນຸຍາດເພື່ອເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ດ້ວຍ"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ໃຫ້ສິດອະນຸຍາດເພື່ອເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ດ້ວຍ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ໃຫ້ສິດອະນຸຍາດ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ແກ້ໄຂໃນ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ແກ້ໄຂໃນ %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ເປີດໂປຣແກຣມທ່ອງເວັບ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ຮັບການໂທບໍ່?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ທຸກຄັ້ງ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ຄັ້ງດຽວ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ການຕັ້ງຄ່າ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ບໍ່ຮອງຮັບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 9aecc80f613f..191108a0b73b 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Atidaryti naudojant"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atidaryti naudojant %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atidaryti"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Suteikite prieigą atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Suteikite prieigą atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant „<xliff:g id="APPLICATION">%2$s</xliff:g>“"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Suteikti prieigą"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redaguoti naudojant"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redaguoti naudojant %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tik kartą"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nustatymai"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nepalaiko darbo profilio"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 4f87520cf65a..94f14891eec7 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Atvērt, izmantojot"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atvērt, izmantojot %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atvērt"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Piekļuves piešķiršana, lai atvērtu <xliff:g id="HOST">%1$s</xliff:g> saites lietojumprogrammā"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Piekļuves piešķiršana, lai atvērtu <xliff:g id="HOST">%1$s</xliff:g> saites lietojumprogrammā <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Atļaut piekļuvi"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediģēt, izmantojot"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediģēt, izmantojot %1$s"</string> @@ -1607,6 +1613,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tikai vienreiz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Iestatījumi"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Programma %1$s neatbalsta darba profilus"</string> diff --git a/core/res/res/values-mcc313-mnc100/config.xml b/core/res/res/values-mcc313-mnc100/config.xml new file mode 100644 index 000000000000..ccd03f10616a --- /dev/null +++ b/core/res/res/values-mcc313-mnc100/config.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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. +*/ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array translatable="false" name="config_twoDigitNumberPattern"> + <item>"0"</item> + <item>"00"</item> + <item>"*0"</item> + <item>"*1"</item> + <item>"*2"</item> + <item>"*3"</item> + <item>"*4"</item> + <item>"*5"</item> + <item>"*6"</item> + <item>"*7"</item> + <item>"*8"</item> + <item>"*9"</item> + <item>"#0"</item> + <item>"#1"</item> + <item>"#2"</item> + <item>"#3"</item> + <item>"#4"</item> + <item>"#5"</item> + <item>"#6"</item> + <item>"#7"</item> + <item>"#8"</item> + <item>"#9"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 3829f66a6333..71d695ab7f02 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отвори со"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отвори со %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дајте пристап да се отвораат линкови на <xliff:g id="HOST">%1$s</xliff:g> со"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дајте пристап да се отвораат линкови на <xliff:g id="HOST">%1$s</xliff:g> со <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи пристап"</string> <string name="whichEditApplication" msgid="144727838241402655">"Измени со"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измени со %1$s"</string> @@ -1587,6 +1593,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Стартувај прелистувач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прифати повик?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Секогаш"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само еднаш"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Поставки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддржува работен профил"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index faade84d1b3c..b58f19502c91 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ഇത് ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"തുറക്കുക"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ഇനിപ്പറയുന്നത് ഉപയോഗിച്ച്, <xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ തുറക്കാൻ ആക്സസ് നൽകുക"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ഉപയോഗിച്ച്, <xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ തുറക്കാൻ ആക്സസ് നൽകുക"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ആക്സസ് നൽകുക"</string> <string name="whichEditApplication" msgid="144727838241402655">"ഇത് ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ബ്രൗസർ സമാരംഭിക്കണോ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"കോൾ സ്വീകരിക്കണോ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"എല്ലായ്പ്പോഴും"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ഒരിക്കൽ മാത്രം"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ക്രമീകരണം"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, ഔദ്യോഗിക പ്രൊഫൈലിനെ പിന്തുണയ്ക്കുന്നില്ല"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 369100370230..9f1de468a100 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Нээх"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ашиглан нээх"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Нээх"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосыг дараахаар нээх хандалт өгөх"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосыг <xliff:g id="APPLICATION">%2$s</xliff:g>-р нээх хандалт өгөх"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Хандалт өгөх"</string> <string name="whichEditApplication" msgid="144727838241402655">"Засварлах"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ашиглан засварлах"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Байнга"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Нэг удаа"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Тохиргоо"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ажлын профайлыг дэмждэггүй"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 2eae60912130..f2111e7ebcda 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"यासह उघडा"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s सह उघडा"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"उघडा"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"सह <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडण्याचा अॅक्सेस द्या"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> सह <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडण्याचा अॅक्सेस द्या"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"अॅक्सेस द्या"</string> <string name="whichEditApplication" msgid="144727838241402655">"सह संपादित करा"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s सह संपादित करा"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउझर लाँच करायचा?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकारायचा?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"नेहमी"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"फक्त एकदाच"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग्ज"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाईलचे समर्थन करीत नाही"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 01d8775dcf08..49a55782a3dd 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Berikan akses untuk membuka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Berikan akses untuk membuka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Tetapan"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak menyokong profil kerja"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 560ee551fff0..bbe115feb5f9 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"...ဖြင့် ဖွင့်မည်"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ဖြင့် ဖွင့်မည်"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ဖွင့်ပါ"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို အောက်ပါဖြင့် ဖွင့်ခွင့်ပေးပါ-"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို <xliff:g id="APPLICATION">%2$s</xliff:g> ဖြင့် ဖွင့်ခွင့်ပေးပါ"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ဖွင့်ခွင့်ပေးရန်"</string> <string name="whichEditApplication" msgid="144727838241402655">"...နှင့် တည်းဖြတ်ရန်"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s နှင့် တည်းဖြတ်ရန်"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ဘရောက်ဇာ ဖွင့်မည်လား။"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ဖုန်းခေါ်ဆိုမှုကို လက်ခံမလား?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"အမြဲတမ်း"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"တစ်ခါတည်း"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ဆက်တင်များ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s က အလုပ်ပရိုဖိုင်ကို မပံ့ပိုးပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 5af58a824dac..34275dff32e7 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Åpne med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åpne med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åpne"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Gi tilgang til å åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Gi tilgang til å åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Gi tilgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bare én gang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Innstillinger"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s støtter ikke arbeidsprofiler"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 8731a6039de8..80bd83a6016b 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1135,8 +1135,14 @@ <!-- no translation found for whichViewApplicationNamed (2286418824011249620) --> <skip /> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोल्नुहोस्"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"निम्नमार्फत <xliff:g id="HOST">%1$s</xliff:g>का लिंकहरू खोल्न पहुँच दिनुहोस्"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>मार्फत <xliff:g id="HOST">%1$s</xliff:g>का लिंकहरू खोल्न पहुँच दिनुहोस्"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"पहुँच दिनुहोस्"</string> <string name="whichEditApplication" msgid="144727838241402655">"सँग सम्पादन गर्नुहोस्"</string> <!-- String.format failed for translation --> @@ -1590,6 +1596,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैँ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"एक पटक मात्र"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिङहरू"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाइल समर्थन गर्दैन"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index bad1d5802d5f..7c23e2c1131b 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Openen met"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Openen met %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Openen"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Toegang verlenen om links naar <xliff:g id="HOST">%1$s</xliff:g> te openen met"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Toegang verlenen om links naar <xliff:g id="HOST">%1$s</xliff:g> te openen met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Toegang geven"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bewerken met"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Bewerken met %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Gesprek accepteren?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altijd"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Één keer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellingen"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ondersteunt werkprofielen niet"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 2189de049342..257dd065fe3e 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ସହିତ ଖୋଲନ୍ତୁ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ସହିତ ଖୋଲନ୍ତୁ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ଖୋଲନ୍ତୁ"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ଏହା ସହିତ ଲିଙ୍କ ଥିବା <xliff:g id="HOST">%1$s</xliff:g> ଖୋଲିବା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ସହିତ ଲିଙ୍କ ଥିବା <xliff:g id="HOST">%1$s</xliff:g> ଖୋଲିବା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ସହିତ ଏଡିଟ୍ କରନ୍ତୁ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sରେ ସଂଶୋଧନ କରନ୍ତୁ"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ବ୍ରାଉଜର୍ ଲଞ୍ଚ କରିବେ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"କଲ୍ ସ୍ୱୀକାର କରିବେ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ସର୍ବଦା"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ଥରେ ମାତ୍ର"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ସେଟିଂସ୍"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ୱର୍କ ପ୍ରୋଫାଇଲ୍କୁ ସପୋର୍ଟ କରୁନାହିଁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 6a903ef64f49..104fb40115f3 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ਖੋਲ੍ਹੋ"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ਇਸ ਨਾਲ <xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਪਹੁੰਚ ਦਿਓ"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ <xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਪਹੁੰਚ ਦਿਓ"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ਪਹੁੰਚ ਦਿਓ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ਇਸ ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ਕੀ ਬ੍ਰਾਊਜ਼ਰ ਲਾਂਚ ਕਰਨਾ ਹੈ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ਹਮੇਸ਼ਾਂ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ਕੇਵਲ ਇੱਕ ਵਾਰ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ਸੈਟਿੰਗਾਂ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 165c2531d429..a61555b3f652 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otwórz w aplikacji"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otwórz w aplikacji %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otwórz"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Przyznaj uprawnienia do otwierania linków z <xliff:g id="HOST">%1$s</xliff:g> w:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Przyznaj uprawnienia do otwierania linków z <xliff:g id="HOST">%1$s</xliff:g> w aplikacji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udziel uprawnień"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edytuj w aplikacji"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edytuj w aplikacji %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tylko raz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ustawienia"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nie obsługuje profilu do pracy"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 566509989f45..11c6a2880d1e 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com o app <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index d92752b980f5..ed26c2d7c927 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceda acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceda acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com a aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Apenas uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Definições"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não suporta o perfil de trabalho"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 566509989f45..11c6a2880d1e 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Conceder acesso para abrir links de <xliff:g id="HOST">%1$s</xliff:g> com o app <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index ed84e5078232..edbc2a4a427a 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Deschideți cu"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Deschideți cu %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Deschideți"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Permiteți accesul pentru a deschide linkurile <xliff:g id="HOST">%1$s</xliff:g> cu"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Permiteți accesul pentru a deschide linkurile <xliff:g id="HOST">%1$s</xliff:g> cu <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permiteți accesul"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editați cu"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editați cu %1$s"</string> @@ -1607,6 +1613,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansați browserul?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Numai o dată"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setări"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nu acceptă profilul de serviciu"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index cdf4d44cef05..a7c5c7a68e62 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Открыть с помощью приложения:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Открыть с помощью приложения \"%1$s\""</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Открыть"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Предоставьте доступ, чтобы открывать ссылки <xliff:g id="HOST">%1$s</xliff:g> в приложении"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Предоставьте доступ, чтобы открывать ссылки <xliff:g id="HOST">%1$s</xliff:g> в приложении <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Открыть доступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редактировать с помощью приложения:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактировать с помощью приложения \"%1$s\""</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Всегда"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Только сейчас"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддерживает рабочие профили"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index f68b55f99e5d..c23728e66a5c 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -1133,8 +1133,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"සමඟ විවෘත කරන්න"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s සමඟ විවෘත කරන්න"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"විවෘත කරන්න"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"මේවා මඟින් <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කිරීමට ප්රවේශය දෙන්න"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> මඟින් <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කිරීමට ප්රවේශය දෙන්න"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ප්රවේශය දෙන්න"</string> <string name="whichEditApplication" msgid="144727838241402655">"සමඟ සංස්කරණය කරන්න"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s සමඟ සංස්කරණය කරන්න"</string> @@ -1586,6 +1592,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"බ්රවුසරය දියත් කරන්නද?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවාද?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"සැම විටම"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"එක් වාරයයි"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"සැකසීම්"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s කාර්යාල පැතිකඩ සඳහා සහාය ලබනොදේ."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 5b1a33d5926c..76b211aac953 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvoriť v aplikácii"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvoriť v aplikácii %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvoriť"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Udeľte prístup na otváranie odkazov <xliff:g id="HOST">%1$s</xliff:g> pomocou aplikácie"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Udeľte prístup na otváranie odkazov <xliff:g id="HOST">%1$s</xliff:g> pomocou aplikácie <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udeliť prístup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Upraviť pomocou"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upraviť v aplikácii %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Len raz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavenia"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Spúšťač %1$s nepodporuje pracovné profily"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 72071137d01f..943e9e260a89 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Odpiranje z aplikacijo"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Odpiranje z aplikacijo %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Odpiranje"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Omogočanje dostopa za odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z aplikacijo"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Omogočanje dostopa za odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogoči dostop"</string> <string name="whichEditApplication" msgid="144727838241402655">"Urejanje z aplikacijo"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Urejanje z aplikacijo %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Ali želite odpreti brskalnik?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ali želite sprejeti klic?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vedno"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo tokrat"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavitve"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podpira delovnega profila"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index e6edb1159335..28f6062b16fb 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Hap me"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Hap me %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Hap"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Jep qasje për të hapur lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Jep qasje për të hapur lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Jep qasje"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redakto me"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redakto me %1$s"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Të hapet shfletuesi?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Dëshiron ta pranosh telefonatën?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Gjithmonë"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Vetëm një herë"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cilësimet"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nuk e mbështet profilin e punës"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 52fd7f09ad3e..4fdf30145741 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1151,8 +1151,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отворите помоћу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отворите помоћу апликације %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дозволите да се линкови <xliff:g id="HOST">%1$s</xliff:g> отварају помоћу"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дозволите да <xliff:g id="APPLICATION">%2$s</xliff:g> отвара линикове <xliff:g id="HOST">%1$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи приступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Измените помоћу"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измените помоћу апликације %1$s"</string> @@ -1607,6 +1613,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само једном"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Подешавања"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не подржава пословни профил"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 07b56321cabd..ff82a14db19c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Öppna med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Öppna med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öppna"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Tillåt att länkar från <xliff:g id="HOST">%1$s</xliff:g> öppnas med"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Tillåt att länkar från <xliff:g id="HOST">%1$s</xliff:g> öppnas med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ge åtkomst"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redigera med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigera med %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vill du öppna webbläsaren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vill du ta emot samtal?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara en gång"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Inställningar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s har inte stöd för arbetsprofil"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index c4dcc93d612a..528d5d7a159c 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -684,9 +684,9 @@ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Kuzima baadhi ya vipengele vya kufunga skrini"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Zuia matumizi ya baadhi ya vipengele vya kufunga skrini."</string> <string-array name="phoneTypes"> - <item msgid="8901098336658710359">"Nyumbani"</item> + <item msgid="8901098336658710359">"Ya nyumbani"</item> <item msgid="869923650527136615">"Simu ya mkononi"</item> - <item msgid="7897544654242874543">"Kazi"</item> + <item msgid="7897544654242874543">"Ya kazini"</item> <item msgid="1103601433382158155">"Pepesi ya Kazini"</item> <item msgid="1735177144948329370">"Pepesi ya Nyumbani"</item> <item msgid="603878674477207394">"Kurasa anwani"</item> @@ -727,9 +727,9 @@ <item msgid="1648797903785279353">"Jabber"</item> </string-array> <string name="phoneTypeCustom" msgid="1644738059053355820">"Maalum"</string> - <string name="phoneTypeHome" msgid="2570923463033985887">"Nyumbani"</string> + <string name="phoneTypeHome" msgid="2570923463033985887">"Ya nyumbani"</string> <string name="phoneTypeMobile" msgid="6501463557754751037">"Simu ya mkononi"</string> - <string name="phoneTypeWork" msgid="8863939667059911633">"Kazi"</string> + <string name="phoneTypeWork" msgid="8863939667059911633">"Ya kazini"</string> <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Pepesi ya Kazini"</string> <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Pepesi ya Nyumbani"</string> <string name="phoneTypePager" msgid="7582359955394921732">"Peja"</string> @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Fungua ukitumia"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Fungua ukitumia %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Fungua"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Ipe <xliff:g id="HOST">%1$s</xliff:g> ruhusa ya kufungua viungo kwa kutumia"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Ipe <xliff:g id="HOST">%1$s</xliff:g> ruhusa ya kufungua viungo kwa kutumia <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Idhinisha ufikiaji"</string> <string name="whichEditApplication" msgid="144727838241402655">"Badilisha kwa"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Badilisha kwa %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Zindua Kivinjari?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Kubali simu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Kila mara"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Mara moja tu"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mipangilio"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s haitumii wasifu wa kazini"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 2857ebdd8a38..39cd685c4aee 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"இதன்மூலம் திற"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s மூலம் திற"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"திற"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"மூலம் <xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளைத் திறப்பதற்கான அணுகலை வழங்குதல்"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> மூலம் <xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளைத் திறப்பதற்கான அணுகலை வழங்குதல்"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"அணுகலை வழங்கு"</string> <string name="whichEditApplication" msgid="144727838241402655">"இதன் மூலம் திருத்து"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s மூலம் திருத்து"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"உலாவியைத் துவக்கவா?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"அழைப்பை ஏற்கவா?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"எப்போதும்"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"இப்போது மட்டும்"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"அமைப்புகள்"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s பணிக் கணக்கை ஆதரிக்காது"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index c60b1badba65..3ba794a60017 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"దీనితో తెరువు"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sతో తెరువు"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"తెరువు"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> లింక్లను తెరవడానికి యాక్సెస్ ఇవ్వండి"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g>తో <xliff:g id="HOST">%1$s</xliff:g> లింక్లను తెరవడానికి యాక్సెస్ ఇవ్వండి"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"యాక్సెస్ ఇవ్వండి"</string> <string name="whichEditApplication" msgid="144727838241402655">"దీనితో సవరించు"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sతో సవరించు"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"బ్రౌజర్ను ప్రారంభించాలా?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"కాల్ను ఆమోదించాలా?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ఎల్లప్పుడూ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ఒకసారి మాత్రమే"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"సెట్టింగ్లు"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s కార్యాలయ ప్రొఫైల్కు మద్దతు ఇవ్వదు"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 93ab03155cb2..437d89eaaa05 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"เปิดด้วย"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"เปิดด้วย %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"เปิด"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"ให้สิทธิ์ในการเปิดลิงก์ของ <xliff:g id="HOST">%1$s</xliff:g> โดยใช้"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"ให้สิทธิ์ในการเปิดลิงก์ของ <xliff:g id="HOST">%1$s</xliff:g> โดยใช้ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ให้สิทธิ์"</string> <string name="whichEditApplication" msgid="144727838241402655">"แก้ไขด้วย"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"แก้ไขด้วย %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ทุกครั้ง"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"เฉพาะครั้งนี้"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"การตั้งค่า"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ไม่สนับสนุนโปรไฟล์งาน"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 9d82a308632e..8469e7ba1d6e 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buksan gamit ang"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buksan gamit ang %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buksan"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Magbigay ng access para buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> sa"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Magbigay ng access para buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> sa <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Bigyan ng access"</string> <string name="whichEditApplication" msgid="144727838241402655">"I-edit gamit ang"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"I-edit gamit ang %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Isang beses lang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mga Setting"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Hindi sinusuportahan ng %1$s ang profile sa trabaho"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 3460f674691d..8a28a0d2b415 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Şununla aç:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ile aç"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Aç"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Şununla <xliff:g id="HOST">%1$s</xliff:g> bağlantılarını açma izni verin"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasıyla <xliff:g id="HOST">%1$s</xliff:g> bağlantılarını açma izni verin"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Erişim ver"</string> <string name="whichEditApplication" msgid="144727838241402655">"Şununla düzenle:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ile düzenle"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Her zaman"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Yalnızca bir defa"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, iş profilini desteklemiyor"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d781f85ad592..b02208fc47e0 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1171,8 +1171,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Відкрити за допомогою"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Відкрити за допомогою %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Відкрити"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Дозвольте відкривати посилання на сайт <xliff:g id="HOST">%1$s</xliff:g> у додатку"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Дозвольте відкривати посилання на сайт <xliff:g id="HOST">%1$s</xliff:g> у додатку <xliff:g id="APPLICATION">%2$s</xliff:g>."</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволити"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редагувати за допомогою"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редагувати за допомогою %1$s"</string> @@ -1630,6 +1636,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Лише цього разу"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налаштування"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не підтримує робочий профіль"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index b65c5fb5d63b..5adf84e0f2d9 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"اس کے ساتھ کھولیں"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s کے ساتھ کھولیں"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"کھولیں"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"اس کے ساتھ <xliff:g id="HOST">%1$s</xliff:g> لنکس کو کھولنے کے لیے رسائی ديں"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="APPLICATION">%2$s</xliff:g> کے ساتھ <xliff:g id="HOST">%1$s</xliff:g> لنکس کو کھولنے کے لیے رسائی ديں"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"رسائی دیں"</string> <string name="whichEditApplication" msgid="144727838241402655">"اس کے ساتھ ترمیم کریں"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s کے ساتھ ترمیم کریں"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"براؤزر شروع کریں؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"کال قبول کریں؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ہمیشہ"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"بس ایک مرتبہ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ترتیبات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s دفتری پروفائل کا تعاون نہیں کرتا ہے"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 85b1cf3ad322..1452573b12e0 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ochish…"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s bilan ochish"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ochish"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini ushbu ilova bilan ochishga ruxsat bering:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini <xliff:g id="APPLICATION">%2$s</xliff:g> bilan ochishga ruxsat bering"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ruxsat berish"</string> <string name="whichEditApplication" msgid="144727838241402655">"Tahrirlash…"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"“%1$s” yordamida tahrirlash"</string> @@ -1585,6 +1591,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer ishga tushirilsinmi?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Qo‘ng‘iroqni qabul qilasizmi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Har doim"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Faqat hozir"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Sozlamalar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"“%1$s” ishchi profilni qo‘llab-quvvatlamaydi"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 92425ee80fca..b27e38963589 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Mở bằng"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mở bằng %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Mở"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Cấp quyền truy cập để mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Cấp quyền truy cập để mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Cấp quyền truy cập"</string> <string name="whichEditApplication" msgid="144727838241402655">"Chỉnh sửa bằng"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Chỉnh sửa bằng %1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Chạy trình duyệt?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn chọn"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Chỉ một lần"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cài đặt"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s không hỗ trợ hồ sơ công việc"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 224fbcfb7ea3..162b8807bc41 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"打开方式"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用%1$s打开"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"打开"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授权使用以下应用打开 <xliff:g id="HOST">%1$s</xliff:g> 链接:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授权使用<xliff:g id="APPLICATION">%2$s</xliff:g>打开 <xliff:g id="HOST">%1$s</xliff:g> 链接"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予访问权限"</string> <string name="whichEditApplication" msgid="144727838241402655">"编辑方式"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用%1$s编辑"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"仅此一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"设置"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s不支持工作资料"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index ad0e421bdfa2..f4ec4d050f6b 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"選擇開啟方式"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用 %1$s 開啟"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授予存取權以透過以下應用程式開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結:"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授予存取權以透過<xliff:g id="APPLICATION">%2$s</xliff:g>開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string> <string name="whichEditApplication" msgid="144727838241402655">"使用以下選擇器編輯:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"要啟動「瀏覽器」嗎?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"只此一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援公司檔案"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 77ee1a70eefb..547736a0d26c 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"選擇開啟工具"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"透過 %1$s 開啟"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"授權系統使用以下應用程式開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"授權系統使用「<xliff:g id="APPLICATION">%2$s</xliff:g>」開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string> <string name="whichEditApplication" msgid="144727838241402655">"選擇編輯工具"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"啟動「瀏覽器」嗎?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"僅限一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援工作設定檔"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index a2d14c907a6c..fa8eff327280 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1131,8 +1131,14 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Vula nge-"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Vula nge-%1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Kuvuliwe"</string> - <string name="whichGiveAccessToApplication" msgid="8279395245414707442">"Nika ukufinyelela kuzixhumanisi ezivulekile ze-<xliff:g id="HOST">%1$s</xliff:g> nge-"</string> - <string name="whichGiveAccessToApplicationNamed" msgid="7992388824107710849">"Nika ukufinyelela kuzixhumanisi ze-<xliff:g id="HOST">%1$s</xliff:g> ezivulekile nge-<xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> + <skip /> + <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> + <skip /> + <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> + <skip /> + <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> + <skip /> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Nikeza ukufinyel"</string> <string name="whichEditApplication" msgid="144727838241402655">"Hlela nge-"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Hlela nge-%1$s"</string> @@ -1584,6 +1590,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Njalo"</string> + <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> + <skip /> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kanye nje"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Izilungiselelo"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ayisekeli iphrofayela yomsebenzi"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index a62a1fb5bfef..f515b2dd45f0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3783,9 +3783,11 @@ <integer name="config_stableDeviceDisplayWidth">-1</integer> <integer name="config_stableDeviceDisplayHeight">-1</integer> - <!-- Decide whether to display 'No service' on status bar instead of 'Emergency calls only' - when SIM is unready. --> - <bool name="config_display_no_service_when_sim_unready">false</bool> + <!-- List of countries in which we display 'No service' on status bar + instead of 'Emergency calls only' when SIM is unready. --> + <string-array translatable="false" name="config_display_no_service_when_sim_unready"> + <item>"DE"</item> + </string-array> <!-- Class names of device specific services inheriting com.android.server.SystemService. The classes are instantiated in the order of the array. --> @@ -4114,6 +4116,15 @@ M9,10l-2,0l0,-2l-2,0l0,2l-2,0l0,2l2,0l0,2l2,0l0,-2l2,0z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09-2.08L20.59,22L22,20.59l-2.08-2.09 L22,16.41z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">11</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> + <!-- A dual tone battery meter draws the perimeter path twice - once to define the shape and a second time clipped to the fill level to indicate charge --> <bool name="config_batterymeterDualTone">false</bool> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 597f5048af47..6fd855c8f702 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3077,12 +3077,20 @@ <string name="whichViewApplicationNamed">Open with %1$s</string> <!-- Label for a link to a intent resolver dialog to view something --> <string name="whichViewApplicationLabel">Open</string> - <!-- Title of intent resolver dialog when selecting a viewer application that opens URI + <!-- Title of intent resolver dialog when selecting a browser/application that opens specific URIs + [CHAR LIMIT=128]. --> + <string name="whichOpenHostLinksWith">Open <xliff:g id="host" example="mail.google.com">%1$s</xliff:g> links with</string> + <!-- Title of intent resolver dialog when selecting a browser that opens URI + [CHAR LIMIT=128]. --> + <string name="whichOpenLinksWith">Open links with</string> + <!-- Title of intent resolver dialog when defaulting to a specific browser that opens URI [CHAR LIMIT=128]. --> - <string name="whichGiveAccessToApplication">Give access to open <xliff:g id="host" example="mail.google.com">%1$s</xliff:g> links with</string> + <string name="whichOpenLinksWithApp">Open links with <xliff:g id="application" example="Chrome">%1$s</xliff:g></string> + <!-- Title of intent resolver dialog when defaulting to a specific browser that opens URI + [CHAR LIMIT=128]. --> + <string name="whichOpenHostLinksWithApp">Open <xliff:g id="host" example="mail.google.com">%1$s</xliff:g> links with <xliff:g id="application" example="Chrome">%2$s</xliff:g></string> <!-- Title of intent resolver dialog when selecting a viewer application that opens URI and a previously used application is known [CHAR LIMIT=128]. --> - <string name="whichGiveAccessToApplicationNamed">Give access to open <xliff:g id="host" example="mail.google.com">%1$s</xliff:g> links with <xliff:g id="application" example="Gmail">%2$s</xliff:g></string> <!-- Label for a link to an intent resolver dialog to open URI [CHAR LIMIT=18] --> <string name="whichGiveAccessToApplicationLabel">Give access</string> <!-- Title of intent resolver dialog when selecting an editor application to run. --> @@ -4215,6 +4223,10 @@ <string name="activity_resolver_use_always">Always</string> <!-- Title for a button to choose the currently selected activity + as the default in the activity resolver. [CHAR LIMIT=50] --> + <string name="activity_resolver_set_always">Set to always open</string> + + <!-- Title for a button to choose the currently selected activity from the activity resolver to use just this once. [CHAR LIMIT=25] --> <string name="activity_resolver_use_once">Just once</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 05c0114907b4..6c908aac1ee8 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2242,7 +2242,6 @@ <java-symbol type="id" name="resolver_list" /> <java-symbol type="id" name="button_once" /> <java-symbol type="id" name="button_always" /> - <java-symbol type="id" name="button_app_settings" /> <java-symbol type="integer" name="config_globalActionsKeyTimeout" /> <java-symbol type="integer" name="config_screenshotChordKeyTimeout" /> <java-symbol type="integer" name="config_maxResolverActivityColumns" /> @@ -2624,14 +2623,17 @@ <java-symbol type="bool" name="config_use_voip_mode_for_ims" /> <java-symbol type="attr" name="touchscreenBlocksFocus" /> <java-symbol type="layout" name="resolver_list_with_default" /> - <java-symbol type="string" name="activity_resolver_app_settings" /> + <java-symbol type="string" name="activity_resolver_set_always" /> + <java-symbol type="string" name="activity_resolver_use_always" /> <java-symbol type="string" name="whichApplicationNamed" /> <java-symbol type="string" name="whichApplicationLabel" /> <java-symbol type="string" name="whichViewApplication" /> <java-symbol type="string" name="whichViewApplicationNamed" /> <java-symbol type="string" name="whichViewApplicationLabel" /> - <java-symbol type="string" name="whichGiveAccessToApplication" /> - <java-symbol type="string" name="whichGiveAccessToApplicationNamed" /> + <java-symbol type="string" name="whichOpenHostLinksWith" /> + <java-symbol type="string" name="whichOpenHostLinksWithApp" /> + <java-symbol type="string" name="whichOpenLinksWith" /> + <java-symbol type="string" name="whichOpenLinksWithApp" /> <java-symbol type="string" name="whichGiveAccessToApplicationLabel" /> <java-symbol type="string" name="whichEditApplication" /> <java-symbol type="string" name="whichEditApplicationNamed" /> @@ -3267,6 +3269,9 @@ <java-symbol type="string" name="config_batterymeterBoltPath" /> <java-symbol type="string" name="config_batterymeterPowersavePath" /> <java-symbol type="bool" name="config_batterymeterDualTone" /> + <java-symbol type="string" name="config_signalXPath" /> + <java-symbol type="dimen" name="config_signalCutoutWidthFraction" /> + <java-symbol type="dimen" name="config_signalCutoutHeightFraction" /> <java-symbol type="bool" name="config_debugEnableAutomaticSystemServerHeapDumps" /> <java-symbol type="integer" name="config_debugSystemServerPssThresholdBytes" /> @@ -3552,7 +3557,7 @@ <java-symbol type="integer" name="config_stableDeviceDisplayWidth" /> <java-symbol type="integer" name="config_stableDeviceDisplayHeight" /> - <java-symbol type="bool" name="config_display_no_service_when_sim_unready" /> + <java-symbol type="array" name="config_display_no_service_when_sim_unready" /> <java-symbol type="layout" name="slice_grid" /> <java-symbol type="layout" name="slice_message_local" /> diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml index ce209ce90905..6503f3ee6d57 100644 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -70,6 +70,7 @@ <item>@*android:drawable/ic_wifi_signal_3</item> <item>@*android:drawable/ic_wifi_signal_4</item> <item>@*android:drawable/perm_group_activity_recognition</item> + <item>@*android:drawable/perm_group_aural</item> <item>@*android:drawable/perm_group_calendar</item> <item>@*android:drawable/perm_group_call_log</item> <item>@*android:drawable/perm_group_camera</item> diff --git a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java index 4b0ed65e5fde..95da532045ac 100644 --- a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java +++ b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java @@ -90,7 +90,7 @@ public class ApplicationPackageManagerTest extends TestCase { private boolean mAllow3rdPartyOnInternal = true; public MockedApplicationPackageManager() { - super(null, null); + super(null, null, null); } public void setForceAllowOnExternal(boolean forceAllowOnExternal) { diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java index 71d9a46eaa24..58c43ac2cf91 100644 --- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java @@ -498,14 +498,14 @@ public class PackageParserTest { @Test public void testApexPackageInfoGeneration() throws Exception { - String apexPackageName = "com.android.tzdata.apex"; - File apexFile = copyRawResourceToFile(apexPackageName, + String apexModuleName = "com.android.tzdata.apex"; + File apexFile = copyRawResourceToFile(apexModuleName, R.raw.com_android_tzdata); ApexInfo apexInfo = new ApexInfo(); apexInfo.isActive = true; apexInfo.isFactory = false; - apexInfo.packageName = apexPackageName; - apexInfo.packagePath = apexFile.getPath(); + apexInfo.moduleName = apexModuleName; + apexInfo.modulePath = apexFile.getPath(); apexInfo.versionCode = 191000070; int flags = PackageManager.GET_META_DATA | PackageManager.GET_SIGNING_CERTIFICATES; PackageInfo pi = PackageParser.generatePackageInfoFromApex(apexInfo, flags); diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java index c8150b12a23b..365e97ded928 100644 --- a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java +++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java @@ -16,7 +16,6 @@ package android.content.pm; -import android.content.Intent; import android.content.res.Resources; import android.os.FileUtils; import android.os.Parcel; @@ -190,36 +189,6 @@ public class RegisteredServicesCacheTest extends AndroidTestCase { assertEquals(0, cache.getPersistentServicesSize(u1)); } - /** - * Check that an optimization to skip a call to PackageManager handles an invalidated cache. - * - * We added an optimization in generateServicesMap to only query PackageManager for packages - * that have been changed, because if a package is unchanged, we have already cached the - * services info for it, so we can save a query to PackageManager (and save some memory). - * However, if invalidateCache was called, we cannot optimize, and must do a full query. - * The initial optimization was buggy because it failed to check for an invalidated cache, and - * only scanned the changed packages, given in the ACTION_PACKAGE_CHANGED intent (b/122912184). - */ - public void testParseServiceInfoOptimizationHandlesInvalidatedCache() { - TestServicesCache cache = new TestServicesCache(); - cache.addServiceForQuerying(U0, r1, newServiceInfo(t1, UID1)); - cache.addServiceForQuerying(U0, r2, newServiceInfo(t2, UID2)); - assertEquals(2, cache.getAllServicesSize(U0)); - - // simulate the client of the cache invalidating it - cache.invalidateCache(U0); - - // there should be 0 services (userServices.services == null ) at this point, but we don't - // call getAllServicesSize since that would force a full scan of packages, - // instead we trigger a package change in a package that is in the list of services - Intent intent = new Intent(Intent.ACTION_PACKAGE_CHANGED); - intent.putExtra(Intent.EXTRA_UID, UID1); - cache.handlePackageEvent(intent, U0); - - // check that the optimization does a full query and caches both services - assertEquals(2, cache.getAllServicesSize(U0)); - } - private static RegisteredServicesCache.ServiceInfo<TestServiceType> newServiceInfo( TestServiceType type, int uid) { final ComponentInfo info = new ComponentInfo(); @@ -297,11 +266,6 @@ public class RegisteredServicesCacheTest extends AndroidTestCase { map = new HashMap<>(); mServices.put(userId, map); } - // in actual cases, resolveInfo should always have a serviceInfo, since we specifically - // query for intent services - resolveInfo.serviceInfo = new android.content.pm.ServiceInfo(); - resolveInfo.serviceInfo.applicationInfo = - new ApplicationInfo(serviceInfo.componentInfo.applicationInfo); map.put(resolveInfo, serviceInfo); } @@ -340,11 +304,6 @@ public class RegisteredServicesCacheTest extends AndroidTestCase { public void onUserRemoved(int userId) { super.onUserRemoved(userId); } - - @Override - public void handlePackageEvent(Intent intent, int userId) { - super.handlePackageEvent(intent, userId); - } } static class TestSerializer implements XmlSerializerAndParser<TestServiceType> { diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp new file mode 100644 index 000000000000..f13885e22b22 --- /dev/null +++ b/core/tests/utiltests/Android.bp @@ -0,0 +1,38 @@ +//######################################################################## +// Build FrameworksUtilTests package +//######################################################################## + +android_test { + name: "FrameworksUtilTests", + + // We only want this apk build for tests. + + // Include all test java files. + srcs: ["src/**/*.java"] + ["src/android/util/IRemoteMemoryIntArray.aidl"], + + jni_libs: [ + "libmemoryintarraytest", + "libcutils", + "libc++", + ], + + static_libs: [ + "androidx.test.rules", + "frameworks-base-testutils", + "mockito-target-minus-junit4", + "androidx.test.ext.junit", + ], + + libs: [ + "android.test.runner", + "android.test.base", + "android.test.mock", + ], + + platform_apis: true, + + certificate: "platform", + + test_suites: ["device-tests"], + +} diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk deleted file mode 100644 index 9ef73e9aad93..000000000000 --- a/core/tests/utiltests/Android.mk +++ /dev/null @@ -1,33 +0,0 @@ -######################################################################### -# Build FrameworksUtilTests package -######################################################################### - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_SRC_FILES += src/android/util/IRemoteMemoryIntArray.aidl - -LOCAL_JNI_SHARED_LIBRARIES := libmemoryintarraytest libcutils libc++ - -LOCAL_STATIC_JAVA_LIBRARIES := \ - androidx.test.rules \ - frameworks-base-testutils \ - mockito-target-minus-junit4 \ - androidx.test.ext.junit - -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock - -LOCAL_PACKAGE_NAME := FrameworksUtilTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_CERTIFICATE := platform - -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) - diff --git a/libs/androidfw/PosixUtils.cpp b/libs/androidfw/PosixUtils.cpp index df0dd7ce463d..f1ab1493012a 100644 --- a/libs/androidfw/PosixUtils.cpp +++ b/libs/androidfw/PosixUtils.cpp @@ -64,6 +64,9 @@ std::unique_ptr<ProcResult> ExecuteBinary(const std::vector<std::string>& argv) return nullptr; } + auto gid = getgid(); + auto uid = getuid(); + char const** argv0 = (char const**)malloc(sizeof(char*) * (argv.size() + 1)); for (size_t i = 0; i < argv.size(); i++) { argv0[i] = argv[i].c_str(); @@ -75,6 +78,16 @@ std::unique_ptr<ProcResult> ExecuteBinary(const std::vector<std::string>& argv) PLOG(ERROR) << "fork"; return nullptr; case 0: // child + if (setgid(gid) != 0) { + PLOG(ERROR) << "setgid"; + exit(1); + } + + if (setuid(uid) != 0) { + PLOG(ERROR) << "setuid"; + exit(1); + } + close(stdout[0]); if (dup2(stdout[1], STDOUT_FILENO) == -1) { abort(); diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 5814bb70475c..bfead1a70fab 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -250,6 +250,7 @@ cc_defaults { "ProfileData.cpp", "ProfileDataContainer.cpp", "Readback.cpp", + "RootRenderNode.cpp", "TreeInfo.cpp", "WebViewFunctorManager.cpp", "protos/graphicsstats.proto", diff --git a/libs/hwui/RootRenderNode.cpp b/libs/hwui/RootRenderNode.cpp new file mode 100644 index 000000000000..d8c1b57e2ef4 --- /dev/null +++ b/libs/hwui/RootRenderNode.cpp @@ -0,0 +1,284 @@ +/* + * 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. + */ + +#include "RootRenderNode.h" + +namespace android::uirenderer { + +class FinishAndInvokeListener : public MessageHandler { +public: + explicit FinishAndInvokeListener(PropertyValuesAnimatorSet* anim) : mAnimator(anim) { + mListener = anim->getOneShotListener(); + mRequestId = anim->getRequestId(); + } + + virtual void handleMessage(const Message& message) { + if (mAnimator->getRequestId() == mRequestId) { + // Request Id has not changed, meaning there's no animation lifecyle change since the + // message is posted, so go ahead and call finish to make sure the PlayState is properly + // updated. This is needed because before the next frame comes in from UI thread to + // trigger an animation update, there could be reverse/cancel etc. So we need to update + // the playstate in time to ensure all the subsequent events get chained properly. + mAnimator->end(); + } + mListener->onAnimationFinished(nullptr); + } + +private: + sp<PropertyValuesAnimatorSet> mAnimator; + sp<AnimationListener> mListener; + uint32_t mRequestId; +}; + +void RootRenderNode::prepareTree(TreeInfo& info) { + info.errorHandler = mErrorHandler.get(); + + for (auto& anim : mRunningVDAnimators) { + // Assume that the property change in VD from the animators will not be consumed. Mark + // otherwise if the VDs are found in the display list tree. For VDs that are not in + // the display list tree, we stop providing animation pulses by 1) removing them from + // the animation list, 2) post a delayed message to end them at end time so their + // listeners can receive the corresponding callbacks. + anim->getVectorDrawable()->setPropertyChangeWillBeConsumed(false); + // Mark the VD dirty so it will damage itself during prepareTree. + anim->getVectorDrawable()->markDirty(); + } + if (info.mode == TreeInfo::MODE_FULL) { + for (auto& anim : mPausedVDAnimators) { + anim->getVectorDrawable()->setPropertyChangeWillBeConsumed(false); + anim->getVectorDrawable()->markDirty(); + } + } + // TODO: This is hacky + info.updateWindowPositions = true; + RenderNode::prepareTree(info); + info.updateWindowPositions = false; + info.errorHandler = nullptr; +} + +void RootRenderNode::attachAnimatingNode(RenderNode* animatingNode) { + mPendingAnimatingRenderNodes.push_back(animatingNode); +} + +void RootRenderNode::attachPendingVectorDrawableAnimators() { + mRunningVDAnimators.insert(mPendingVectorDrawableAnimators.begin(), + mPendingVectorDrawableAnimators.end()); + mPendingVectorDrawableAnimators.clear(); +} + +void RootRenderNode::detachAnimators() { + // Remove animators from the list and post a delayed message in future to end the animator + // For infinite animators, remove the listener so we no longer hold a global ref to the AVD + // java object, and therefore the AVD objects in both native and Java can be properly + // released. + for (auto& anim : mRunningVDAnimators) { + detachVectorDrawableAnimator(anim.get()); + anim->clearOneShotListener(); + } + for (auto& anim : mPausedVDAnimators) { + anim->clearOneShotListener(); + } + mRunningVDAnimators.clear(); + mPausedVDAnimators.clear(); +} + +// Move all the animators to the paused list, and send a delayed message to notify the finished +// listener. +void RootRenderNode::pauseAnimators() { + mPausedVDAnimators.insert(mRunningVDAnimators.begin(), mRunningVDAnimators.end()); + for (auto& anim : mRunningVDAnimators) { + detachVectorDrawableAnimator(anim.get()); + } + mRunningVDAnimators.clear(); +} + +void RootRenderNode::doAttachAnimatingNodes(AnimationContext* context) { + for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { + RenderNode* node = mPendingAnimatingRenderNodes[i].get(); + context->addAnimatingRenderNode(*node); + } + mPendingAnimatingRenderNodes.clear(); +} + +// Run VectorDrawable animators after prepareTree. +void RootRenderNode::runVectorDrawableAnimators(AnimationContext* context, TreeInfo& info) { + // Push staging. + if (info.mode == TreeInfo::MODE_FULL) { + pushStagingVectorDrawableAnimators(context); + } + + // Run the animators in the running list. + for (auto it = mRunningVDAnimators.begin(); it != mRunningVDAnimators.end();) { + if ((*it)->animate(*context)) { + it = mRunningVDAnimators.erase(it); + } else { + it++; + } + } + + // Run the animators in paused list during full sync. + if (info.mode == TreeInfo::MODE_FULL) { + // During full sync we also need to pulse paused animators, in case their targets + // have been added back to the display list. All the animators that passed the + // scheduled finish time will be removed from the paused list. + for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { + if ((*it)->animate(*context)) { + // Animator has finished, remove from the list. + it = mPausedVDAnimators.erase(it); + } else { + it++; + } + } + } + + // Move the animators with a target not in DisplayList to paused list. + for (auto it = mRunningVDAnimators.begin(); it != mRunningVDAnimators.end();) { + if (!(*it)->getVectorDrawable()->getPropertyChangeWillBeConsumed()) { + // Vector Drawable is not in the display list, we should remove this animator from + // the list, put it in the paused list, and post a delayed message to end the + // animator. + detachVectorDrawableAnimator(it->get()); + mPausedVDAnimators.insert(*it); + it = mRunningVDAnimators.erase(it); + } else { + it++; + } + } + + // Move the animators with a target in DisplayList from paused list to running list, and + // trim paused list. + if (info.mode == TreeInfo::MODE_FULL) { + // Check whether any paused animator's target is back in Display List. If so, put the + // animator back in the running list. + for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { + if ((*it)->getVectorDrawable()->getPropertyChangeWillBeConsumed()) { + mRunningVDAnimators.insert(*it); + it = mPausedVDAnimators.erase(it); + } else { + it++; + } + } + // Trim paused VD animators at full sync, so that when Java loses reference to an + // animator, we know we won't be requested to animate it any more, then we remove such + // animators from the paused list so they can be properly freed. We also remove the + // animators from paused list when the time elapsed since start has exceeded duration. + trimPausedVDAnimators(context); + } + + info.out.hasAnimations |= !mRunningVDAnimators.empty(); +} + +void RootRenderNode::trimPausedVDAnimators(AnimationContext* context) { + // Trim paused vector drawable animator list. + for (auto it = mPausedVDAnimators.begin(); it != mPausedVDAnimators.end();) { + // Remove paused VD animator if no one else is referencing it. Note that animators that + // have passed scheduled finish time are removed from list when they are being pulsed + // before prepare tree. + // TODO: this is a bit hacky, need to figure out a better way to track when the paused + // animators should be freed. + if ((*it)->getStrongCount() == 1) { + it = mPausedVDAnimators.erase(it); + } else { + it++; + } + } +} + +void RootRenderNode::pushStagingVectorDrawableAnimators(AnimationContext* context) { + for (auto& anim : mRunningVDAnimators) { + anim->pushStaging(*context); + } +} + +void RootRenderNode::destroy() { + for (auto& renderNode : mPendingAnimatingRenderNodes) { + renderNode->animators().endAllStagingAnimators(); + } + mPendingAnimatingRenderNodes.clear(); + mPendingVectorDrawableAnimators.clear(); +} + +void RootRenderNode::addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim) { + mPendingVectorDrawableAnimators.insert(anim); +} + +void RootRenderNode::detachVectorDrawableAnimator(PropertyValuesAnimatorSet* anim) { + if (anim->isInfinite() || !anim->isRunning()) { + // Do not need to post anything if the animation is infinite (i.e. no meaningful + // end listener action), or if the animation has already ended. + return; + } + nsecs_t remainingTimeInMs = anim->getRemainingPlayTime(); + // Post a delayed onFinished event that is scheduled to be handled when the animator ends. + if (anim->getOneShotListener()) { + // VectorDrawable's oneshot listener is updated when there are user triggered animation + // lifecycle changes, such as start(), end(), etc. By using checking and clearing + // one shot listener, we ensure the same end listener event gets posted only once. + // Therefore no duplicates. Another benefit of using one shot listener is that no + // removal is necessary: the end time of animation will not change unless triggered by + // user events, in which case the already posted listener's id will become stale, and + // the onFinished callback will then be ignored. + sp<FinishAndInvokeListener> message = new FinishAndInvokeListener(anim); + auto looper = Looper::getForThread(); + LOG_ALWAYS_FATAL_IF(looper == nullptr, "Not on a looper thread?"); + looper->sendMessageDelayed(ms2ns(remainingTimeInMs), message, 0); + anim->clearOneShotListener(); + } +} + +class AnimationContextBridge : public AnimationContext { +public: + AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) + : AnimationContext(clock), mRootNode(rootNode) {} + + virtual ~AnimationContextBridge() {} + + // Marks the start of a frame, which will update the frame time and move all + // next frame animations into the current frame + virtual void startFrame(TreeInfo::TraversalMode mode) { + if (mode == TreeInfo::MODE_FULL) { + mRootNode->doAttachAnimatingNodes(this); + mRootNode->attachPendingVectorDrawableAnimators(); + } + AnimationContext::startFrame(mode); + } + + // Runs any animations still left in mCurrentFrameAnimations + virtual void runRemainingAnimations(TreeInfo& info) { + AnimationContext::runRemainingAnimations(info); + mRootNode->runVectorDrawableAnimators(this, info); + } + + virtual void pauseAnimators() override { mRootNode->pauseAnimators(); } + + virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { + listener->onAnimationFinished(animator); + } + + virtual void destroy() { + AnimationContext::destroy(); + mRootNode->detachAnimators(); + } + +private: + sp<RootRenderNode> mRootNode; +}; + +AnimationContext* ContextFactoryImpl::createAnimationContext(renderthread::TimeLord& clock) { + return new AnimationContextBridge(clock, mRootNode); +} + +} // namespace android::uirenderer diff --git a/libs/hwui/RootRenderNode.h b/libs/hwui/RootRenderNode.h new file mode 100644 index 000000000000..ea10921be20b --- /dev/null +++ b/libs/hwui/RootRenderNode.h @@ -0,0 +1,89 @@ +/* + * 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. + */ + +#pragma once + +#include <utils/Looper.h> + +#include <set> +#include <vector> + +#include "AnimationContext.h" +#include "Animator.h" +#include "PropertyValuesAnimatorSet.h" +#include "RenderNode.h" + +namespace android::uirenderer { + +class ANDROID_API RootRenderNode : public RenderNode { +public: + ANDROID_API explicit RootRenderNode(std::unique_ptr<ErrorHandler> errorHandler) + : RenderNode(), mErrorHandler(std::move(errorHandler)) {} + + ANDROID_API virtual ~RootRenderNode() {} + + virtual void prepareTree(TreeInfo& info) override; + + ANDROID_API void attachAnimatingNode(RenderNode* animatingNode); + + void attachPendingVectorDrawableAnimators(); + + void detachAnimators(); + + void pauseAnimators(); + + void doAttachAnimatingNodes(AnimationContext* context); + + // Run VectorDrawable animators after prepareTree. + void runVectorDrawableAnimators(AnimationContext* context, TreeInfo& info); + + void trimPausedVDAnimators(AnimationContext* context); + + void pushStagingVectorDrawableAnimators(AnimationContext* context); + + ANDROID_API void destroy(); + + ANDROID_API void addVectorDrawableAnimator(PropertyValuesAnimatorSet* anim); + +private: + const std::unique_ptr<ErrorHandler> mErrorHandler; + std::vector<sp<RenderNode> > mPendingAnimatingRenderNodes; + std::set<sp<PropertyValuesAnimatorSet> > mPendingVectorDrawableAnimators; + std::set<sp<PropertyValuesAnimatorSet> > mRunningVDAnimators; + // mPausedVDAnimators stores a list of animators that have not yet passed the finish time, but + // their VectorDrawable targets are no longer in the DisplayList. We skip these animators when + // render thread runs animators independent of UI thread (i.e. RT_ONLY mode). These animators + // need to be re-activated once their VD target is added back into DisplayList. Since that could + // only happen when we do a full sync, we need to make sure to pulse these paused animators at + // full sync. If any animator's VD target is found in DisplayList during a full sync, we move + // the animator back to the running list. + std::set<sp<PropertyValuesAnimatorSet> > mPausedVDAnimators; + + void detachVectorDrawableAnimator(PropertyValuesAnimatorSet* anim); +}; + +class ANDROID_API ContextFactoryImpl : public IContextFactory { +public: + ANDROID_API explicit ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} + + ANDROID_API virtual AnimationContext* createAnimationContext( + renderthread::TimeLord& clock) override; + +private: + RootRenderNode* mRootNode; +}; + +} // namespace android::uirenderer diff --git a/libs/hwui/TEST_MAPPING b/libs/hwui/TEST_MAPPING index d9f2acbb49d2..b1719a979ce5 100644 --- a/libs/hwui/TEST_MAPPING +++ b/libs/hwui/TEST_MAPPING @@ -1,13 +1,15 @@ { "presubmit": [ { - "name": "CtsUiRenderingTestCases" - }, - { "name": "CtsGraphicsTestCases" }, { "name": "CtsAccelerationTestCases" } + ], + "imports": [ + { + "path": "cts/tests/tests/uirendering" + } ] }
\ No newline at end of file diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index 7e8d12fd4597..f2481f83767d 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -40,7 +40,6 @@ class ErrorHandler { public: virtual void onError(const std::string& message) = 0; -protected: virtual ~ErrorHandler() = default; }; diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index 4f64da79c3fb..bbffb359aebe 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -27,15 +27,6 @@ namespace android { namespace uirenderer { namespace renderthread { -static bool IsTransformSupported(int transform) { - // For now, only support pure rotations, not flip or flip-and-rotate, until we have - // more time to test them and build sample code. As far as I know we never actually - // use anything besides pure rotations anyway. - return transform == 0 || transform == NATIVE_WINDOW_TRANSFORM_ROT_90 || - transform == NATIVE_WINDOW_TRANSFORM_ROT_180 || - transform == NATIVE_WINDOW_TRANSFORM_ROT_270; -} - static int InvertTransform(int transform) { switch (transform) { case NATIVE_WINDOW_TRANSFORM_ROT_90: @@ -68,28 +59,6 @@ static SkMatrix GetPreTransformMatrix(SkISize windowSize, int transform) { return SkMatrix::I(); } -void VulkanSurface::ComputeWindowSizeAndTransform(WindowInfo* windowInfo, const SkISize& minSize, - const SkISize& maxSize) { - SkISize& windowSize = windowInfo->size; - - // clamp width & height to handle currentExtent of -1 and protect us from broken hints - if (windowSize.width() < minSize.width() || windowSize.width() > maxSize.width() || - windowSize.height() < minSize.height() || windowSize.height() > maxSize.height()) { - int width = std::min(maxSize.width(), std::max(minSize.width(), windowSize.width())); - int height = std::min(maxSize.height(), std::max(minSize.height(), windowSize.height())); - ALOGE("Invalid Window Dimensions [%d, %d]; clamping to [%d, %d]", windowSize.width(), - windowSize.height(), width, height); - windowSize.set(width, height); - } - - windowInfo->actualSize = windowSize; - if (windowInfo->transform & NATIVE_WINDOW_TRANSFORM_ROT_90) { - windowInfo->actualSize.set(windowSize.height(), windowSize.width()); - } - - windowInfo->preTransform = GetPreTransformMatrix(windowInfo->size, windowInfo->transform); -} - static bool ConnectAndSetWindowDefaults(ANativeWindow* window) { ATRACE_CALL(); @@ -125,6 +94,24 @@ static bool ConnectAndSetWindowDefaults(ANativeWindow* window) { return false; } + // Let consumer drive the size of the buffers. + err = native_window_set_buffers_dimensions(window, 0, 0); + if (err != 0) { + ALOGE("native_window_set_buffers_dimensions(0,0) failed: %s (%d)", strerror(-err), err); + return false; + } + + // Enable auto prerotation, so when buffer size is driven by the consumer + // and the transform hint specifies a 90 or 270 degree rotation, the width + // and height used for buffer pre-allocation and dequeueBuffer will be + // additionally swapped. + err = native_window_set_auto_prerotation(window, true); + if (err != 0) { + ALOGE("VulkanSurface::UpdateWindow() native_window_set_auto_prerotation failed: %s (%d)", + strerror(-err), err); + return false; + } + return true; } @@ -132,10 +119,6 @@ VulkanSurface* VulkanSurface::Create(ANativeWindow* window, ColorMode colorMode, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, GrContext* grContext, const VulkanManager& vkManager, uint32_t extraBuffers) { - // TODO(http://b/134182502) - const SkISize minSize = SkISize::Make(1, 1); - const SkISize maxSize = SkISize::Make(4096, 4096); - // Connect and set native window to default configurations. if (!ConnectAndSetWindowDefaults(window)) { return nullptr; @@ -144,7 +127,7 @@ VulkanSurface* VulkanSurface::Create(ANativeWindow* window, ColorMode colorMode, // Initialize WindowInfo struct. WindowInfo windowInfo; if (!InitializeWindowInfoStruct(window, colorMode, colorType, colorSpace, vkManager, - extraBuffers, minSize, maxSize, &windowInfo)) { + extraBuffers, &windowInfo)) { return nullptr; } @@ -153,15 +136,14 @@ VulkanSurface* VulkanSurface::Create(ANativeWindow* window, ColorMode colorMode, return nullptr; } - return new VulkanSurface(window, windowInfo, minSize, maxSize, grContext); + return new VulkanSurface(window, windowInfo, grContext); } bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode colorMode, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const VulkanManager& vkManager, - uint32_t extraBuffers, const SkISize& minSize, - const SkISize& maxSize, WindowInfo* outWindowInfo) { + uint32_t extraBuffers, WindowInfo* outWindowInfo) { ATRACE_CALL(); int width, height; @@ -185,7 +167,13 @@ bool VulkanSurface::InitializeWindowInfoStruct(ANativeWindow* window, ColorMode } outWindowInfo->transform = query_value; - ComputeWindowSizeAndTransform(outWindowInfo, minSize, maxSize); + outWindowInfo->actualSize = outWindowInfo->size; + if (outWindowInfo->transform & NATIVE_WINDOW_TRANSFORM_ROT_90) { + outWindowInfo->actualSize.set(outWindowInfo->size.height(), outWindowInfo->size.width()); + } + + outWindowInfo->preTransform = + GetPreTransformMatrix(outWindowInfo->size, outWindowInfo->transform); err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); if (err != 0 || query_value < 0) { @@ -290,15 +278,6 @@ bool VulkanSurface::UpdateWindow(ANativeWindow* window, const WindowInfo& window return false; } - const SkISize& size = windowInfo.actualSize; - err = native_window_set_buffers_dimensions(window, size.width(), size.height()); - if (err != 0) { - ALOGE("VulkanSurface::UpdateWindow() native_window_set_buffers_dimensions(%d,%d) " - "failed: %s (%d)", - size.width(), size.height(), strerror(-err), err); - return false; - } - // native_window_set_buffers_transform() expects the transform the app is requesting that // the compositor perform during composition. With native windows, pre-transform works by // rendering with the same transform the compositor is applying (as in Vulkan), but @@ -331,12 +310,8 @@ bool VulkanSurface::UpdateWindow(ANativeWindow* window, const WindowInfo& window } VulkanSurface::VulkanSurface(ANativeWindow* window, const WindowInfo& windowInfo, - SkISize minWindowSize, SkISize maxWindowSize, GrContext* grContext) - : mNativeWindow(window) - , mWindowInfo(windowInfo) - , mGrContext(grContext) - , mMinWindowSize(minWindowSize) - , mMaxWindowSize(maxWindowSize) {} + GrContext* grContext) + : mNativeWindow(window), mWindowInfo(windowInfo), mGrContext(grContext) {} VulkanSurface::~VulkanSurface() { releaseBuffers(); @@ -379,56 +354,49 @@ VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() { // value at the end of the function if everything dequeued correctly. mCurrentBufferInfo = nullptr; - // check if the native window has been resized or rotated and update accordingly - SkISize newSize = SkISize::MakeEmpty(); + // Query the transform hint synced from the initial Surface connect or last queueBuffer. The + // auto prerotation on the buffer is based on the same transform hint in use by the producer. int transformHint = 0; - mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_WIDTH, &newSize.fWidth); - mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_HEIGHT, &newSize.fHeight); - mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); - if (newSize != mWindowInfo.actualSize || transformHint != mWindowInfo.transform) { - WindowInfo newWindowInfo = mWindowInfo; - newWindowInfo.size = newSize; - newWindowInfo.transform = IsTransformSupported(transformHint) ? transformHint : 0; - ComputeWindowSizeAndTransform(&newWindowInfo, mMinWindowSize, mMaxWindowSize); - - int err = 0; - if (newWindowInfo.actualSize != mWindowInfo.actualSize) { - // reset the native buffers and update the window - err = native_window_set_buffers_dimensions(mNativeWindow.get(), - newWindowInfo.actualSize.width(), - newWindowInfo.actualSize.height()); - if (err != 0) { - ALOGE("native_window_set_buffers_dimensions(%d,%d) failed: %s (%d)", - newWindowInfo.actualSize.width(), newWindowInfo.actualSize.height(), - strerror(-err), err); - return nullptr; - } + int err = + mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); + + // Since auto pre-rotation is enabled, dequeueBuffer to get the consumer driven buffer size + // from ANativeWindowBuffer. + ANativeWindowBuffer* buffer; + int fence_fd; + err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &fence_fd); + if (err != 0) { + ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), err); + return nullptr; + } + + SkISize actualSize = SkISize::Make(buffer->width, buffer->height); + if (actualSize != mWindowInfo.actualSize || transformHint != mWindowInfo.transform) { + if (actualSize != mWindowInfo.actualSize) { // reset the NativeBufferInfo (including SkSurface) associated with the old buffers. The // new NativeBufferInfo storage will be populated lazily as we dequeue each new buffer. + mWindowInfo.actualSize = actualSize; releaseBuffers(); - // TODO should we ask the nativewindow to allocate buffers? } - if (newWindowInfo.transform != mWindowInfo.transform) { + if (transformHint != mWindowInfo.transform) { err = native_window_set_buffers_transform(mNativeWindow.get(), - InvertTransform(newWindowInfo.transform)); + InvertTransform(transformHint)); if (err != 0) { - ALOGE("native_window_set_buffers_transform(%d) failed: %s (%d)", - newWindowInfo.transform, strerror(-err), err); - newWindowInfo.transform = mWindowInfo.transform; - ComputeWindowSizeAndTransform(&newWindowInfo, mMinWindowSize, mMaxWindowSize); + ALOGE("native_window_set_buffers_transform(%d) failed: %s (%d)", transformHint, + strerror(-err), err); + mNativeWindow->cancelBuffer(mNativeWindow.get(), buffer, fence_fd); + return nullptr; } + mWindowInfo.transform = transformHint; } - mWindowInfo = newWindowInfo; - } + mWindowInfo.size = actualSize; + if (mWindowInfo.transform & NATIVE_WINDOW_TRANSFORM_ROT_90) { + mWindowInfo.size.set(actualSize.height(), actualSize.width()); + } - ANativeWindowBuffer* buffer; - int fence_fd; - int err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &fence_fd); - if (err != 0) { - ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), err); - return nullptr; + mWindowInfo.preTransform = GetPreTransformMatrix(mWindowInfo.size, mWindowInfo.transform); } uint32_t idx; diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h index 54007e771999..5fa860a20916 100644 --- a/libs/hwui/renderthread/VulkanSurface.h +++ b/libs/hwui/renderthread/VulkanSurface.h @@ -101,16 +101,12 @@ private: SkMatrix preTransform; }; - VulkanSurface(ANativeWindow* window, const WindowInfo& windowInfo, SkISize minWindowSize, - SkISize maxWindowSize, GrContext* grContext); + VulkanSurface(ANativeWindow* window, const WindowInfo& windowInfo, GrContext* grContext); static bool InitializeWindowInfoStruct(ANativeWindow* window, ColorMode colorMode, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, const VulkanManager& vkManager, uint32_t extraBuffers, - const SkISize& minSize, const SkISize& maxSize, WindowInfo* outWindowInfo); static bool UpdateWindow(ANativeWindow* window, const WindowInfo& windowInfo); - static void ComputeWindowSizeAndTransform(WindowInfo* windowInfo, const SkISize& minSize, - const SkISize& maxSize); void releaseBuffers(); // TODO: Just use a vector? @@ -122,11 +118,8 @@ private: uint32_t mPresentCount = 0; NativeBufferInfo* mCurrentBufferInfo = nullptr; - - const SkISize mMinWindowSize; - const SkISize mMaxWindowSize; }; } /* namespace renderthread */ } /* namespace uirenderer */ -} /* namespace android */
\ No newline at end of file +} /* namespace android */ diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 1bdfe87bdb5b..f5330b444818 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -48,6 +48,7 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.location.ProviderProperties; +import com.android.internal.util.Preconditions; import java.util.ArrayList; import java.util.List; @@ -2298,18 +2299,19 @@ public class LocationManager { } /** - * Sends additional commands to a location provider. - * Can be used to support provider specific extensions to the Location Manager API + * Sends additional commands to a location provider. Can be used to support provider specific + * extensions to the Location Manager API. * * @param provider name of the location provider. - * @param command name of the command to send to the provider. - * @param extras optional arguments for the command (or null). - * The provider may optionally fill the extras Bundle with results from the command. - * - * @return true if the command succeeds. + * @param command name of the command to send to the provider. + * @param extras optional arguments for the command (or null). + * @return true always */ public boolean sendExtraCommand( @NonNull String provider, @NonNull String command, @Nullable Bundle extras) { + Preconditions.checkArgument(provider != null, "invalid null provider"); + Preconditions.checkArgument(command != null, "invalid null command"); + try { return mService.sendExtraCommand(provider, command, extras); } catch (RemoteException e) { diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 4ac6d35e351f..16ba63bf031b 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -25,6 +25,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.media.ExifInterface; import android.net.Uri; import android.os.BatteryManager; import android.os.RemoteException; @@ -47,6 +48,7 @@ import dalvik.system.CloseGuard; import com.google.android.collect.Sets; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -799,6 +801,54 @@ public class MtpDatabase implements AutoCloseable { } @VisibleForNative + private boolean getThumbnailInfo(int handle, long[] outLongs) { + MtpStorageManager.MtpObject obj = mManager.getObject(handle); + if (obj == null) { + return false; + } + + String path = obj.getPath().toString(); + switch (obj.getFormat()) { + case MtpConstants.FORMAT_HEIF: + case MtpConstants.FORMAT_EXIF_JPEG: + case MtpConstants.FORMAT_JFIF: + try { + ExifInterface exif = new ExifInterface(path); + long[] thumbOffsetAndSize = exif.getThumbnailRange(); + outLongs[0] = thumbOffsetAndSize != null ? thumbOffsetAndSize[1] : 0; + outLongs[1] = exif.getAttributeInt(ExifInterface.TAG_PIXEL_X_DIMENSION, 0); + outLongs[2] = exif.getAttributeInt(ExifInterface.TAG_PIXEL_Y_DIMENSION, 0); + return true; + } catch (IOException e) { + // ignore and fall through + } + } + return false; + } + + @VisibleForNative + private byte[] getThumbnailData(int handle) { + MtpStorageManager.MtpObject obj = mManager.getObject(handle); + if (obj == null) { + return null; + } + + String path = obj.getPath().toString(); + switch (obj.getFormat()) { + case MtpConstants.FORMAT_HEIF: + case MtpConstants.FORMAT_EXIF_JPEG: + case MtpConstants.FORMAT_JFIF: + try { + ExifInterface exif = new ExifInterface(path); + return exif.getThumbnail(); + } catch (IOException e) { + // ignore and fall through + } + } + return null; + } + + @VisibleForNative private int beginDeleteObject(int handle) { MtpStorageManager.MtpObject obj = mManager.getObject(handle); if (obj == null) { diff --git a/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl index 8238b8c4898d..7e3f2f8868fb 100644 --- a/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl +++ b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl @@ -19,7 +19,9 @@ oneway interface IMediaBrowserServiceCallbacks { * the playback of the media app. * @param extra Extras returned by the media service. */ + @UnsupportedAppUsage void onConnect(String root, in MediaSession.Token session, in Bundle extras); + @UnsupportedAppUsage void onConnectFailed(); void onLoadChildren(String mediaId, in ParceledListSlice list); void onLoadChildrenWithOptions(String mediaId, in ParceledListSlice list, diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 10f76b07c749..c49b1e496c66 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -47,7 +47,6 @@ cc_library_shared { "libstagefright_foundation", "libcamera_client", "libmtp", - "libexif", "libpiex", "libprocessgroup", "libandroidfw", diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 1f89d86947a1..0a3b47b6f901 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -30,13 +30,6 @@ #include "src/piex_types.h" #include "src/piex.h" -extern "C" { -#include "libexif/exif-content.h" -#include "libexif/exif-data.h" -#include "libexif/exif-tag.h" -#include "libexif/exif-utils.h" -} - #include <android_runtime/AndroidRuntime.h> #include <android_runtime/Log.h> #include <jni.h> @@ -70,6 +63,8 @@ static jmethodID method_setDeviceProperty; static jmethodID method_getObjectPropertyList; static jmethodID method_getObjectInfo; static jmethodID method_getObjectFilePath; +static jmethodID method_getThumbnailInfo; +static jmethodID method_getThumbnailData; static jmethodID method_beginDeleteObject; static jmethodID method_endDeleteObject; static jmethodID method_beginMoveObject; @@ -219,7 +214,7 @@ MtpDatabase::MtpDatabase(JNIEnv *env, jobject client) return; // Already threw. } mIntBuffer = (jintArray)env->NewGlobalRef(intArray); - jlongArray longArray = env->NewLongArray(2); + jlongArray longArray = env->NewLongArray(3); if (!longArray) { return; // Already threw. } @@ -780,57 +775,6 @@ MtpResponseCode MtpDatabase::getObjectPropertyList(MtpObjectHandle handle, return result; } -static void foreachentry(ExifEntry *entry, void* /* user */) { - char buf[1024]; - ALOGI("entry %x, format %d, size %d: %s", - entry->tag, entry->format, entry->size, exif_entry_get_value(entry, buf, sizeof(buf))); -} - -static void foreachcontent(ExifContent *content, void *user) { - ALOGI("content %d", exif_content_get_ifd(content)); - exif_content_foreach_entry(content, foreachentry, user); -} - -static long getLongFromExifEntry(ExifEntry *e) { - ExifByteOrder o = exif_data_get_byte_order(e->parent->parent); - return exif_get_long(e->data, o); -} - -static ExifData *getExifFromExtractor(const char *path) { - std::unique_ptr<uint8_t[]> exifBuf; - ExifData *exifdata = NULL; - - FILE *fp = fopen (path, "rb"); - if (!fp) { - ALOGE("failed to open file"); - return NULL; - } - - sp<NuMediaExtractor> extractor = new NuMediaExtractor(); - fseek(fp, 0L, SEEK_END); - if (extractor->setDataSource(fileno(fp), 0, ftell(fp)) != OK) { - ALOGE("failed to setDataSource"); - fclose(fp); - return NULL; - } - - off64_t offset; - size_t size; - if (extractor->getExifOffsetSize(&offset, &size) != OK) { - fclose(fp); - return NULL; - } - - exifBuf.reset(new uint8_t[size]); - fseek(fp, offset, SEEK_SET); - if (fread(exifBuf.get(), 1, size, fp) == size) { - exifdata = exif_data_new_from_data(exifBuf.get(), size); - } - - fclose(fp); - return exifdata; -} - MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info) { MtpStringBuffer path; @@ -877,26 +821,23 @@ MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle, case MTP_FORMAT_EXIF_JPEG: case MTP_FORMAT_HEIF: case MTP_FORMAT_JFIF: { - ExifData *exifdata; - if (info.mFormat == MTP_FORMAT_HEIF) { - exifdata = getExifFromExtractor(path); - } else { - exifdata = exif_data_new_from_file(path); - } - if (exifdata) { - if ((false)) { - exif_data_foreach_content(exifdata, foreachcontent, NULL); + env = AndroidRuntime::getJNIEnv(); + if (env->CallBooleanMethod( + mDatabase, method_getThumbnailInfo, (jint)handle, mLongBuffer)) { + + jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); + jlong size = longValues[0]; + jlong w = longValues[1]; + jlong h = longValues[2]; + if (size > 0 && size <= UINT32_MAX && + w > 0 && w <= UINT32_MAX && + h > 0 && h <= UINT32_MAX) { + info.mThumbCompressedSize = size; + info.mThumbFormat = MTP_FORMAT_EXIF_JPEG; + info.mImagePixWidth = w; + info.mImagePixHeight = h; } - - ExifEntry *w = exif_content_get_entry( - exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_X_DIMENSION); - ExifEntry *h = exif_content_get_entry( - exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_Y_DIMENSION); - info.mThumbCompressedSize = exifdata->data ? exifdata->size : 0; - info.mThumbFormat = MTP_FORMAT_EXIF_JPEG; - info.mImagePixWidth = w ? getLongFromExifEntry(w) : 0; - info.mImagePixHeight = h ? getLongFromExifEntry(h) : 0; - exif_data_unref(exifdata); + env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); } break; } @@ -941,22 +882,19 @@ void* MtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) { case MTP_FORMAT_EXIF_JPEG: case MTP_FORMAT_HEIF: case MTP_FORMAT_JFIF: { - ExifData *exifdata; - if (format == MTP_FORMAT_HEIF) { - exifdata = getExifFromExtractor(path); - } else { - exifdata = exif_data_new_from_file(path); + JNIEnv* env = AndroidRuntime::getJNIEnv(); + jbyteArray thumbData = (jbyteArray) env->CallObjectMethod( + mDatabase, method_getThumbnailData, (jint)handle); + if (thumbData == NULL) { + return nullptr; } - if (exifdata) { - if (exifdata->data) { - result = malloc(exifdata->size); - if (result) { - memcpy(result, exifdata->data, exifdata->size); - outThumbSize = exifdata->size; - } - } - exif_data_unref(exifdata); + jsize thumbSize = env->GetArrayLength(thumbData); + result = malloc(thumbSize); + if (result) { + env->GetByteArrayRegion(thumbData, 0, thumbSize, (jbyte*)result); + outThumbSize = thumbSize; } + env->DeleteLocalRef(thumbData); break; } @@ -1389,6 +1327,8 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) GET_METHOD_ID(getObjectPropertyList, clazz, "(IIIII)Landroid/mtp/MtpPropertyList;"); GET_METHOD_ID(getObjectInfo, clazz, "(I[I[C[J)Z"); GET_METHOD_ID(getObjectFilePath, clazz, "(I[C[J)I"); + GET_METHOD_ID(getThumbnailInfo, clazz, "(I[J)Z"); + GET_METHOD_ID(getThumbnailData, clazz, "(I)[B"); GET_METHOD_ID(beginDeleteObject, clazz, "(I)I"); GET_METHOD_ID(endDeleteObject, clazz, "(IZ)V"); GET_METHOD_ID(beginMoveObject, clazz, "(III)I"); diff --git a/packages/CarrierDefaultApp/res/values-in/strings.xml b/packages/CarrierDefaultApp/res/values-in/strings.xml index 01a9c6041ed5..f48d31f56586 100644 --- a/packages/CarrierDefaultApp/res/values-in/strings.xml +++ b/packages/CarrierDefaultApp/res/values-in/strings.xml @@ -5,7 +5,7 @@ <string name="android_system_label" msgid="2797790869522345065">"Operator Seluler"</string> <string name="portal_notification_id" msgid="5155057562457079297">"Data seluler telah habis"</string> <string name="no_data_notification_id" msgid="668400731803969521">"Data seluler telah dinonaktifkan"</string> - <string name="portal_notification_detail" msgid="2295729385924660881">"Tap untuk membuka situs web %s"</string> + <string name="portal_notification_detail" msgid="2295729385924660881">"Ketuk untuk membuka situs web %s"</string> <string name="no_data_notification_detail" msgid="3112125343857014825">"Hubungi penyedia layanan %s"</string> <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"Tidak ada sambungan data seluler"</string> <string name="no_mobile_data_connection" msgid="544980465184147010">"Tambahkan paket data atau roaming melalui %s"</string> diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml index c7523e391807..64ddf7ac1b20 100644 --- a/packages/InputDevices/res/values-hy/strings.xml +++ b/packages/InputDevices/res/values-hy/strings.xml @@ -40,7 +40,7 @@ <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Եբրայերեն"</string> <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Լիտվերեն"</string> <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Իսպաներեն (Լատինական)"</string> - <string name="keyboard_layout_latvian" msgid="4405417142306250595">"լատիշերեն"</string> + <string name="keyboard_layout_latvian" msgid="4405417142306250595">"լատվիերեն"</string> <string name="keyboard_layout_persian" msgid="3920643161015888527">"պարսկերեն"</string> <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"ադրբեջաներեն"</string> <string name="keyboard_layout_polish" msgid="1121588624094925325">"լեհերեն"</string> diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index 0f2f3de929dd..4f0f0f00bbb6 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml index 4579b627a64e..0acab9e796c7 100644 --- a/packages/PackageInstaller/res/values-am/strings.xml +++ b/packages/PackageInstaller/res/values-am/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index 389639cbd665..87f89ce192c4 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index d65a9c7e5f37..c900efdfb480 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml index d83ab25e4908..bc36123ed46a 100644 --- a/packages/PackageInstaller/res/values-az/strings.xml +++ b/packages/PackageInstaller/res/values-az/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 958117fb7dca..8c2fab0ae311 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml index 3fc4cbb890c8..e7cbf06624e3 100644 --- a/packages/PackageInstaller/res/values-be/strings.xml +++ b/packages/PackageInstaller/res/values-be/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml index d384a5a35501..12ba3ef413e8 100644 --- a/packages/PackageInstaller/res/values-bg/strings.xml +++ b/packages/PackageInstaller/res/values-bg/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml index d4515d38a58c..80255529c821 100644 --- a/packages/PackageInstaller/res/values-bn/strings.xml +++ b/packages/PackageInstaller/res/values-bn/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml index ebf0685fd295..421526b0f669 100644 --- a/packages/PackageInstaller/res/values-bs/strings.xml +++ b/packages/PackageInstaller/res/values-bs/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 1490d4841272..62940facce93 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml index 7b5763946787..e250c7bf6ff3 100644 --- a/packages/PackageInstaller/res/values-cs/strings.xml +++ b/packages/PackageInstaller/res/values-cs/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml index 271c1f2db770..ca9f37e64cde 100644 --- a/packages/PackageInstaller/res/values-da/strings.xml +++ b/packages/PackageInstaller/res/values-da/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml index bfe3f2850c88..7826cebf10a0 100644 --- a/packages/PackageInstaller/res/values-de/strings.xml +++ b/packages/PackageInstaller/res/values-de/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml index b158bedf66d3..2be6207f2f65 100644 --- a/packages/PackageInstaller/res/values-el/strings.xml +++ b/packages/PackageInstaller/res/values-el/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml index 0c813ee19518..84cde474caa0 100644 --- a/packages/PackageInstaller/res/values-en-rAU/strings.xml +++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml index 0c813ee19518..84cde474caa0 100644 --- a/packages/PackageInstaller/res/values-en-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml index 0c813ee19518..84cde474caa0 100644 --- a/packages/PackageInstaller/res/values-en-rGB/strings.xml +++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml index 0c813ee19518..84cde474caa0 100644 --- a/packages/PackageInstaller/res/values-en-rIN/strings.xml +++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml index b5406e4f12a8..128cbaefd5e1 100644 --- a/packages/PackageInstaller/res/values-en-rXC/strings.xml +++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml index 5cd1caedcfe2..117c9f64f2ee 100644 --- a/packages/PackageInstaller/res/values-es-rUS/strings.xml +++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index 592aa7429d76..1049c3ca6b93 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml index c8d74f9748b4..b6387807a2d8 100644 --- a/packages/PackageInstaller/res/values-et/strings.xml +++ b/packages/PackageInstaller/res/values-et/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index dbcb2bb431f2..2011013ddf57 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml index d5549aed2b37..d08409e284ac 100644 --- a/packages/PackageInstaller/res/values-fa/strings.xml +++ b/packages/PackageInstaller/res/values-fa/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml index ca4894ada9f7..d52eddf82998 100644 --- a/packages/PackageInstaller/res/values-fi/strings.xml +++ b/packages/PackageInstaller/res/values-fi/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml index df550435dc4e..365493f8bbb9 100644 --- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml index c90cc6d4a224..b85eb9751053 100644 --- a/packages/PackageInstaller/res/values-fr/strings.xml +++ b/packages/PackageInstaller/res/values-fr/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml index 638bf20527cd..1ad1174eacad 100644 --- a/packages/PackageInstaller/res/values-gl/strings.xml +++ b/packages/PackageInstaller/res/values-gl/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml index 09a023088da9..20fbafe0e78a 100644 --- a/packages/PackageInstaller/res/values-gu/strings.xml +++ b/packages/PackageInstaller/res/values-gu/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml index d3f706fdab10..47f83019594f 100644 --- a/packages/PackageInstaller/res/values-hi/strings.xml +++ b/packages/PackageInstaller/res/values-hi/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml index ba83200dd116..ba5d3784376a 100644 --- a/packages/PackageInstaller/res/values-hr/strings.xml +++ b/packages/PackageInstaller/res/values-hr/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml index 0000d5de8772..2b951de645d3 100644 --- a/packages/PackageInstaller/res/values-hu/strings.xml +++ b/packages/PackageInstaller/res/values-hu/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml index c7418f944a5c..c05040b147c0 100644 --- a/packages/PackageInstaller/res/values-hy/strings.xml +++ b/packages/PackageInstaller/res/values-hy/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml index d0a956831810..52aa3c061928 100644 --- a/packages/PackageInstaller/res/values-in/strings.xml +++ b/packages/PackageInstaller/res/values-in/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml index 46754630b4ff..82d10d3d5aaf 100644 --- a/packages/PackageInstaller/res/values-is/strings.xml +++ b/packages/PackageInstaller/res/values-is/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index 0eefc417c968..cee14bc66d95 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index e602af6754a9..7cabdd532ffb 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index cd4dbefd0d6c..1ba36e7745c2 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml index 7a7ae4e55685..779fa0e11c8d 100644 --- a/packages/PackageInstaller/res/values-ka/strings.xml +++ b/packages/PackageInstaller/res/values-ka/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml index 8253d5eb253d..3e6d25d29ba7 100644 --- a/packages/PackageInstaller/res/values-kk/strings.xml +++ b/packages/PackageInstaller/res/values-kk/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml index 9b1135584b25..af7ef0b9f314 100644 --- a/packages/PackageInstaller/res/values-km/strings.xml +++ b/packages/PackageInstaller/res/values-km/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml index fdefb4c36462..19842eba0ef3 100644 --- a/packages/PackageInstaller/res/values-kn/strings.xml +++ b/packages/PackageInstaller/res/values-kn/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index 989cbe2b4dcd..2f11159f82c2 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml index ae47ab14b0cb..61ff87f09690 100644 --- a/packages/PackageInstaller/res/values-ky/strings.xml +++ b/packages/PackageInstaller/res/values-ky/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml index 0fb541fc6e15..c52f5090d388 100644 --- a/packages/PackageInstaller/res/values-lo/strings.xml +++ b/packages/PackageInstaller/res/values-lo/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml index 3e840e96fa99..e88bde45ba45 100644 --- a/packages/PackageInstaller/res/values-lt/strings.xml +++ b/packages/PackageInstaller/res/values-lt/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml index a0d49f7436d8..fa1452794422 100644 --- a/packages/PackageInstaller/res/values-lv/strings.xml +++ b/packages/PackageInstaller/res/values-lv/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index 5f385287b0c6..c6256747c4c5 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml index 609b2af1f79c..c22ead4bc186 100644 --- a/packages/PackageInstaller/res/values-ml/strings.xml +++ b/packages/PackageInstaller/res/values-ml/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml index e8265f302d60..61aba5746611 100644 --- a/packages/PackageInstaller/res/values-mn/strings.xml +++ b/packages/PackageInstaller/res/values-mn/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml index 200c99381bcd..56661e8837fb 100644 --- a/packages/PackageInstaller/res/values-mr/strings.xml +++ b/packages/PackageInstaller/res/values-mr/strings.xml @@ -4,9 +4,9 @@ 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. @@ -37,7 +37,7 @@ <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमच्या टीव्हीवर इंस्टॉल केले जाऊ शकत नाही."</string> <string name="install_failed_msg" product="default" msgid="6484461562647915707">"<xliff:g id="APP_NAME">%1$s</xliff:g> तुमच्या फोनवर इंस्टॉल केले जाऊ शकत नाही."</string> <string name="launch" msgid="3952550563999890101">"उघडा"</string> - <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"अज्ञात स्रोतांकडून मिळवलेल्या अॅप्स इंस्टॉलेशनला तुमचा प्रशासक अनुमती देत नाही"</string> + <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"अज्ञात स्रोतांकडून मिळवलेल्या अॅप्स इंस्टॉलेशनला तुमचा प्रशासक अनुमती देत नाही"</string> <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"या वापरकर्त्याद्वारे अज्ञात अॅप्स इंस्टॉल केली जाऊ शकत नाहीत"</string> <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"या वापरकर्त्याला अॅप्स इंस्टॉल करण्याची अनुमती नाही"</string> <string name="ok" msgid="7871959885003339302">"ओके"</string> @@ -67,8 +67,8 @@ <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल केले"</string> <string name="uninstall_failed" msgid="1847750968168364332">"अनइंस्टॉल करता आले नाही."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल करता आले नाही."</string> - <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"अॅक्टिव्ह डिव्हाइस प्रशासक अॅप अनइंस्टॉल करू शकत नाही"</string> - <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> साठी अॅक्टिव्ह डिव्हाइस प्रशासक अॅप अनइंस्टॉल करू शकत नाही"</string> + <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"अॅक्टिव्ह डिव्हाइस प्रशासक अॅप अनइंस्टॉल करू शकत नाही"</string> + <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> साठी अॅक्टिव्ह डिव्हाइस प्रशासक अॅप अनइंस्टॉल करू शकत नाही"</string> <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"हे अॅप काही वापरकर्ते किंवा प्रोफाइलसाठी आवश्यक आहे आणि इतरांसाठी अनइंस्टॉल करण्यात आले"</string> <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"तुमच्या प्रोफाइलसाठी हे अॅप आवश्यक आहे आणि अनइंस्टॉल केले जाऊ शकत नाही."</string> <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"तुमच्या डिव्हाइस प्रशासकास हे अॅप आवश्यक आहे आणि ते अनइंस्टॉल केले जाऊ शकत नाही."</string> diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml index 9b7007316744..17815be1f4fd 100644 --- a/packages/PackageInstaller/res/values-ms/strings.xml +++ b/packages/PackageInstaller/res/values-ms/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml index 96c6892f8b4b..356c370c4e3d 100644 --- a/packages/PackageInstaller/res/values-my/strings.xml +++ b/packages/PackageInstaller/res/values-my/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml index 739c098310cb..6f2f11299823 100644 --- a/packages/PackageInstaller/res/values-nb/strings.xml +++ b/packages/PackageInstaller/res/values-nb/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index d4ddacffa3ce..dffaba510dff 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index 2b1b52592291..108c86fe8369 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index c28045bd1db3..8c89ce9ca0eb 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index a6de4d0d29f5..5a417af14733 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml index b08dc559358e..7b50547eac69 100644 --- a/packages/PackageInstaller/res/values-pl/strings.xml +++ b/packages/PackageInstaller/res/values-pl/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml index 20e66cb1515c..abeb72d458e9 100644 --- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index 252e903e9a17..65d14272d2e3 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml index 20e66cb1515c..abeb72d458e9 100644 --- a/packages/PackageInstaller/res/values-pt/strings.xml +++ b/packages/PackageInstaller/res/values-pt/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index f8a17202b973..9c22fcd217fd 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml index 38aefc7de921..a9ae543518c7 100644 --- a/packages/PackageInstaller/res/values-ru/strings.xml +++ b/packages/PackageInstaller/res/values-ru/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml index 1de2bc0082b4..5fad69d02268 100644 --- a/packages/PackageInstaller/res/values-si/strings.xml +++ b/packages/PackageInstaller/res/values-si/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index 2fbecf58f140..ae914bd53aff 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml index d535dc048cc3..a0702d6d62cb 100644 --- a/packages/PackageInstaller/res/values-sl/strings.xml +++ b/packages/PackageInstaller/res/values-sl/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml index 5e0f3c9df867..0cde28ea2b5b 100644 --- a/packages/PackageInstaller/res/values-sq/strings.xml +++ b/packages/PackageInstaller/res/values-sq/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 39a1e4502b8e..51995a30a012 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index 87646ea3765a..d0902c34ccc9 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml index 9bcb291f2a9c..7c1472b54ec8 100644 --- a/packages/PackageInstaller/res/values-sw/strings.xml +++ b/packages/PackageInstaller/res/values-sw/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml index afa2e9c33bd3..a1307128b472 100644 --- a/packages/PackageInstaller/res/values-ta/strings.xml +++ b/packages/PackageInstaller/res/values-ta/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index baa3e54e5a3b..5cbb268ad7fb 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml index 1f6e10a2e8c8..9c1f02816a25 100644 --- a/packages/PackageInstaller/res/values-th/strings.xml +++ b/packages/PackageInstaller/res/values-th/strings.xml @@ -4,9 +4,9 @@ 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. @@ -72,7 +72,7 @@ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"แอปนี้จำเป็นสำหรับผู้ใช้หรือโปรไฟล์บางส่วน และถอนการติดตั้งไปแล้วสำหรับส่วนอื่น"</string> <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"แอปนี้จำเป็นสำหรับโปรไฟล์ของคุณและถอนการติดตั้งไม่ได้"</string> <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"ผู้ดูแลระบบอุปกรณ์กำหนดให้ใช้แอปนี้และถอนการติดตั้งไม่ได้"</string> - <string name="manage_device_administrators" msgid="3092696419363842816">"จัดการแอปผู้ดูแลระบบอุปกรณ์"</string> + <string name="manage_device_administrators" msgid="3092696419363842816">"จัดการแอปดูแลอุปกรณ์"</string> <string name="manage_users" msgid="1243995386982560813">"จัดการผู้ใช้"</string> <string name="uninstall_failed_msg" msgid="2176744834786696012">"ถอนการติดตั้ง <xliff:g id="APP_NAME">%1$s</xliff:g> ไม่ได้"</string> <string name="Parse_error_dlg_text" msgid="1661404001063076789">"พบปัญหาในการแยกวิเคราะห์แพ็กเกจ"</string> diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml index dbae64735b84..9fcc064ddacc 100644 --- a/packages/PackageInstaller/res/values-tl/strings.xml +++ b/packages/PackageInstaller/res/values-tl/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml index b8e0832be898..c6e2d441e7ca 100644 --- a/packages/PackageInstaller/res/values-tr/strings.xml +++ b/packages/PackageInstaller/res/values-tr/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml index 5f614e380177..4c49bf4c1433 100644 --- a/packages/PackageInstaller/res/values-uk/strings.xml +++ b/packages/PackageInstaller/res/values-uk/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml index e11e16a65319..d8f2c5086bb8 100644 --- a/packages/PackageInstaller/res/values-ur/strings.xml +++ b/packages/PackageInstaller/res/values-ur/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml index 4e24948d61e7..0c1871fae9d9 100644 --- a/packages/PackageInstaller/res/values-uz/strings.xml +++ b/packages/PackageInstaller/res/values-uz/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml index 7dd5cd9f0c5a..a1d6f8923038 100644 --- a/packages/PackageInstaller/res/values-vi/strings.xml +++ b/packages/PackageInstaller/res/values-vi/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml index 27062f7a7416..6110938fb600 100644 --- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml index 2c52420bd9ea..128f3714c1e4 100644 --- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml index f82b89c08ba0..507b5d4ad69f 100644 --- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml index c711354b07da..bdcb7e16765c 100644 --- a/packages/PackageInstaller/res/values-zu/strings.xml +++ b/packages/PackageInstaller/res/values-zu/strings.xml @@ -4,9 +4,9 @@ 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. diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index 881f4b183f40..c11e1a03cb00 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -34,6 +34,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.RemoteException; +import android.permission.IPermissionManager; import android.util.Log; /** @@ -45,12 +46,14 @@ public class InstallStart extends Activity { private static final String DOWNLOADS_AUTHORITY = "downloads"; private IPackageManager mIPackageManager; + private IPermissionManager mIPermissionManager; private boolean mAbortInstall = false; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mIPackageManager = AppGlobals.getPackageManager(); + mIPermissionManager = AppGlobals.getPermissionManager(); Intent intent = getIntent(); String callingPackage = getCallingPackage(); @@ -137,7 +140,7 @@ public class InstallStart extends Activity { private boolean declaresAppOpPermission(int uid, String permission) { try { - final String[] packages = mIPackageManager.getAppOpPermissionPackages(permission); + final String[] packages = mIPermissionManager.getAppOpPermissionPackages(permission); if (packages == null) { return false; } diff --git a/packages/SettingsLib/SearchWidget/res/values-sw/strings.xml b/packages/SettingsLib/SearchWidget/res/values-sw/strings.xml index 297ecdb8b32a..199845bc51da 100644 --- a/packages/SettingsLib/SearchWidget/res/values-sw/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-sw/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1604061903696928905">"Tafuta mipangilio"</string> + <string name="search_menu" msgid="1604061903696928905">"Tafuta katika mipangilio"</string> </resources> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index bdbde46fd95a..13890e029274 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -219,7 +219,7 @@ <string name="mock_location_app_set" msgid="8966420655295102685">"অনুরূপ লোকেশন অ্যাপ্লিকেশান: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"নেটওয়ার্কিং"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"ওয়্যারলেস ডিসপ্লে সার্টিফিকেশন"</string> - <string name="wifi_verbose_logging" msgid="4203729756047242344">"ওয়াই-ফাই ভারবোস লগিং সক্ষম করুন"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"ওয়াই-ফাই ভারবোস লগিং চালু করুন"</string> <string name="wifi_scan_throttling" msgid="160014287416479843">"ওয়াই-ফাই স্ক্যান থ্রোটলিং"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"মোবাইল ডেটা সব সময় সক্রিয় থাক"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন"</string> @@ -262,7 +262,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"মক অবস্থানগুলি মঞ্জুর করুন"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"অ্যাট্রিবিউট ইন্সপেকশন দেখা চালু করুন"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ওয়াই-ফাই সক্রিয় থাকার সময়েও (দ্রুত নেটওয়ার্কে পাল্টানোর জন্য) সর্বদা মোবাইল ডেটা সক্রিয় রাখুন।"</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন উপলব্ধ থাকলে ব্যবহার করুন"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন উপলভ্য থাকলে ব্যবহার করুন"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB ডিবাগিং মঞ্জুর করবেন?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB ডিবাগিং কেবলমাত্র বিকাশ করার উদ্দেশ্যে। আপনার কম্পিউটার এবং আপনার ডিভাইসের মধ্যে ডেটা অনুলিপি করতে এটি ব্যবহার করুন, বিজ্ঞপ্তি ছাড়া আপনার ডিভাইসে অ্যাপ্লিকেশানগুলি ইনস্টল করুন এবং ডেটা লগ পড়ুন।"</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"আপনি আগে যে সব কম্পিউটার USB ডিবাগিং এর অ্যাক্সেসের অনুমতি দিয়েছিলেন তা প্রত্যাহার করবেন?"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index d464256f8f50..afdb105ca560 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -220,7 +220,7 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Xarxes"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Certificació de pantalla sense fil"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Activa el registre Wi‑Fi detallat"</string> - <string name="wifi_scan_throttling" msgid="160014287416479843">"Regulació de la cerca de xarxes Wi‑Fi"</string> + <string name="wifi_scan_throttling" msgid="160014287416479843">"Limitació de la cerca de xarxes Wi‑Fi"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Dades mòbils sempre actives"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per a compartició de xarxa"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostra els dispositius Bluetooth sense el nom"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 7c03afb30379..d8da638fcd2b 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -246,7 +246,7 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Hostname des DNS-Anbieters eingeben"</string> <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Verbindung nicht möglich"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"WLAN-Protokollierungsebene erhöhen, in WiFi Picker pro SSID RSSI anzeigen"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"WLAN-Protokollierungsebene erhöhen, pro SSID RSSI in WiFi Picker anzeigen"</string> <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"Verringert den Akkuverbrauch und verbessert die Netzwerkleistung"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"Kostenpflichtig"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"Kostenlos"</string> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index 5e502972c3a3..63f6c3e3ea98 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -43,7 +43,7 @@ <item msgid="8937994881315223448">"Conectado a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> <item msgid="1330262655415760617">"Suspendida"</item> <item msgid="7698638434317271902">"Desconectando de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item> - <item msgid="197508606402264311">"Desconectada"</item> + <item msgid="197508606402264311">"Desconectado"</item> <item msgid="8578370891960825148">"Con error"</item> <item msgid="5660739516542454527">"Bloqueada"</item> <item msgid="1805837518286731242">"Inhabilitando conexión inestable temporalmente..."</item> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index e1277d862122..8baf7a21c1ae 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"No se puede buscar redes."</string> <string name="wifi_security_none" msgid="7985461072596594400">"Ninguna"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Guardado"</string> - <string name="wifi_disconnected" msgid="8085419869003922556">"Desconectada"</string> + <string name="wifi_disconnected" msgid="8085419869003922556">"Desconectado"</string> <string name="wifi_disabled_generic" msgid="4259794910584943386">"Inhabilitado"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Error de configuración de IP"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"No conectado debido a la baja calidad de la red"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index d2e3a3868a5f..fd3936d39ed3 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -246,7 +246,7 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Idatzi DNS hornitzailearen ostalari-izena"</string> <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ezin izan da konektatu"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Erakutsi hari gabe bistaratzeko ziurtagiriaren aukerak"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautagailuan."</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautatzailean."</string> <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"Bateria gutxiago kontsumituko da, eta sarearen errendimendua hobetuko."</string> <string name="wifi_metered_label" msgid="4514924227256839725">"Sare neurtua"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"Neurtu gabeko sarea"</string> @@ -261,7 +261,7 @@ <string name="allow_mock_location" msgid="2787962564578664888">"Onartu kokapen faltsuak"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"Onartu kokapen faltsuak"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Gaitu ikuspegiaren atributuak ikuskatzeko aukera"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantendu mugikorreko datuak beti aktibo, baita wifi-konexioa aktibo dagoenean ere (sarez bizkor aldatu ahal izateko)"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantendu datu-konexioa beti aktibo, baita wifi-konexioa aktibo dagoenean ere (sare batetik bestera bizkor aldatu ahal izateko)."</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Erabilgarri badago, erabili konexioa partekatzeko hardwarearen azelerazioa"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB arazketa onartu?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB arazketa garapen-xedeetarako soilik dago diseinatuta. Erabil ezazu ordenagailuaren eta gailuaren artean datuak kopiatzeko, aplikazioak gailuan jakinarazi gabe instalatzeko eta erregistro-datuak irakurtzeko."</string> @@ -462,7 +462,7 @@ <string name="alarm_template_far" msgid="3779172822607461675">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Iraupena"</string> <string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Galdetu beti"</string> - <string name="zen_mode_forever" msgid="2704305038191592967">"Desaktibatu arte"</string> + <string name="zen_mode_forever" msgid="2704305038191592967">"Zuk desaktibatu arte"</string> <string name="time_unit_just_now" msgid="6363336622778342422">"Oraintxe"</string> <string name="media_transfer_this_device_name" msgid="1636276898262571213">"Gailu hau"</string> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 6632752c629c..352c27683834 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -261,7 +261,7 @@ <string name="allow_mock_location" msgid="2787962564578664888">"مکانهای کاذب مجاز هستند"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"مکانهای کاذب مجاز هستند"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"فعال کردن نمایش بازبینی ویژگی"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"داده سلولی همیشه فعال نگه داشته میشود، حتی وقتی Wi-Fi فعال است (برای جابهجایی سریع شبکه)."</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"داده تلفن همراه همیشه فعال نگه داشته میشود، حتی وقتی Wi-Fi فعال است (برای جابهجایی سریع شبکه)."</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"استفاده از شتاب سختافزاری اشتراکگذاری اینترنت درصورت دردسترس بودن"</string> <string name="adb_warning_title" msgid="6234463310896563253">"اشکالزدایی USB انجام شود؟"</string> <string name="adb_warning_message" msgid="7316799925425402244">"اشکالزدایی USB فقط برای اهداف برنامهنویسی در نظر گرفته شده است. از آن برای رونوشتبرداری داده بین رایانه و دستگاهتان، نصب برنامهها در دستگاهتان بدون اعلان و خواندن دادههای گزارش استفاده کنید."</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 3aa8db984c3d..cf4ee1302872 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -146,7 +146,7 @@ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Partage connexion Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Partage de connexion"</string> <string name="tether_settings_title_all" msgid="8356136101061143841">"Partage de connexion"</string> - <string name="managed_user_title" msgid="8109605045406748842">"Toutes applis profession."</string> + <string name="managed_user_title" msgid="8109605045406748842">"Toutes les applis professionnelles"</string> <string name="user_guest" msgid="8475274842845401871">"Invité"</string> <string name="unknown" msgid="1592123443519355854">"Inconnu"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Utilisateur : <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> @@ -243,7 +243,7 @@ <string name="private_dns_mode_off" msgid="8236575187318721684">"Désactivé"</string> <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string> <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string> - <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Saisissez le nom d\'hôte du fournisseur DNS"</string> + <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Indiquez le nom d\'hôte du fournisseur DNS"</string> <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Impossible de se connecter"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options pour la certification de l\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler les infos Wi-Fi, afficher par RSSI de SSID dans l\'outil de sélection Wi-Fi"</string> @@ -385,8 +385,8 @@ <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string> <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) --> <skip /> - <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> - <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation"</string> + <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> selon utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> + <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> selon utilisation"</string> <string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only" msgid="107616694963545745">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="1372817269546888804">"Jusqu\'à <xliff:g id="TIME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 4bd1c785080c..b998a74700b5 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -402,8 +402,8 @@ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"É posible que a tableta se apague en breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string> <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"É posible que o dispositivo se apague en breve (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> - <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo que queda ata cargar de todo: <xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ata completar a carga"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo que queda para completar a carga: <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> para completar a carga"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Descoñecido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 8c6ff8e51f88..5d512a84ef99 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -37,7 +37,7 @@ <string name="wifi_no_internet" msgid="4663834955626848401">"इंटरनेट नहीं है"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> के द्वारा सहेजा गया"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s के ज़रिए ऑटोमैटिक रूप से कनेक्ट है"</string> - <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदाता के ज़रिए अपने आप कनेक्ट है"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग कंपनी के ज़रिए अपने आप कनेक्ट है"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string> <string name="connected_via_app" msgid="5571999941988929520">"<xliff:g id="NAME">%1$s</xliff:g> के ज़रिए कनेक्ट किया गया"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 0684b3d292a5..798ea3c80cb0 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -41,7 +41,7 @@ <string name="connected_via_passpoint" msgid="2826205693803088747">"Terhubung melalui %1$s"</string> <string name="connected_via_app" msgid="5571999941988929520">"Tersambung melalui <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string> - <string name="tap_to_sign_up" msgid="6449724763052579434">"Tap untuk mendaftar"</string> + <string name="tap_to_sign_up" msgid="6449724763052579434">"Ketuk untuk mendaftar"</string> <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tersambung, tidak ada internet"</string> <string name="wifi_limited_connection" msgid="7717855024753201527">"Koneksi terbatas"</string> <string name="wifi_status_no_internet" msgid="5784710974669608361">"Tidak ada internet"</string> @@ -52,7 +52,7 @@ <string name="osu_opening_provider" msgid="5488997661548640424">"Membuka <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string> <string name="osu_connect_failed" msgid="2187750899158158934">"Tidak dapat tersambung"</string> <string name="osu_completing_sign_up" msgid="9037638564719197082">"Menyelesaikan pendaftaran…"</string> - <string name="osu_sign_up_failed" msgid="7296159750352873260">"Tidak dapat menyelesaikan pendaftaran. Tap untuk mencoba lagi."</string> + <string name="osu_sign_up_failed" msgid="7296159750352873260">"Tidak dapat menyelesaikan pendaftaran. Ketuk untuk mencoba lagi."</string> <string name="osu_sign_up_complete" msgid="8207626049093289203">"Pendaftaran selesai. Menyambungkan…"</string> <string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Lambat"</string> <string name="speed_label_slow" msgid="813109590815810235">"Lambat"</string> @@ -338,7 +338,7 @@ <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Aktifkan dukungan untuk jendela eksperimental berformat bebas."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Sandi backup desktop"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Saat ini backup desktop sepenuhnya tidak dilindungi"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Tap guna mengubah atau menghapus sandi untuk cadangan lengkap desktop"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Ketuk guna mengubah atau menghapus sandi untuk cadangan lengkap desktop"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Sandi cadangan baru telah disetel"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Sandi baru dan konfirmasinya tidak cocok."</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Gagal menyetel sandi cadangan"</string> @@ -354,8 +354,8 @@ <item msgid="5363960654009010371">"Warna yang dioptimalkan untuk konten digital"</item> </string-array> <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikasi standby"</string> - <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Tidak aktif. Tap untuk beralih."</string> - <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Tap untuk beralih."</string> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Tidak aktif. Ketuk untuk beralih."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Ketuk untuk beralih."</string> <string name="standby_bucket_summary" msgid="6567835350910684727">"Status standby aplikasi:<xliff:g id="BUCKET"> %s</xliff:g>"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Layanan yang sedang berjalan"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Melihat dan mengontrol layanan yang sedang berjalan"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index c5176b02a31a..68c0f17a3b41 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -220,7 +220,7 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Reti"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Certificazione display wireless"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Attiva logging dettagliato Wi-Fi"</string> - <string name="wifi_scan_throttling" msgid="160014287416479843">"Limitazione della ricerca di reti Wi‑Fi"</string> + <string name="wifi_scan_throttling" msgid="160014287416479843">"Limita ricerca di reti Wi‑Fi"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Dati mobili sempre attivi"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering accelerazione hardware"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostra dispositivi Bluetooth senza nome"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 1e572972a78f..246e3eb3c532 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -221,7 +221,7 @@ <string name="wifi_display_certification" msgid="8611569543791307533">"Сымсыз дисплей сертификаты"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi егжей-тегжейлі журналы"</string> <string name="wifi_scan_throttling" msgid="160014287416479843">"Wi‑Fi іздеуін шектеу"</string> - <string name="mobile_data_always_on" msgid="8774857027458200434">"Мобильдік деректер әрқашан қосулы"</string> + <string name="mobile_data_always_on" msgid="8774857027458200434">"Мобильдік интернет әрқашан қосулы"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"Тетеринг режиміндегі аппараттық жеделдету"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth құрылғыларын атаусыз көрсету"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Абсолютті дыбыс деңгейін өшіру"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index fb09c2f494a0..36cf2d473faa 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -402,8 +402,8 @@ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="7466484148515796216">"ថេប្លេតអាចនឹងបិទក្នុងពេលបន្តិចទៀត (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string> <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"ឧបករណ៍អាចនឹងបិទក្នុងពេលបន្តិចទៀត (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> - <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"សល់ <xliff:g id="TIME">%1$s</xliff:g> ទើបសាកថ្មពេញ"</string> - <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> រហូតដល់សាកពេញ"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> ទៀតទើបសាកថ្មពេញ"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ទៀតទើបសាកថ្មពេញ"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"មិនស្គាល់"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"កំពុងបញ្ចូលថ្ម"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"កំពុងសាកថ្ម"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index abdfa041ada8..8f8bbc1a4721 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -247,7 +247,7 @@ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"연결할 수 없음"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"무선 디스플레이 인증서 옵션 표시"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시"</string> - <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"배터리 소모를 줄이고 네트워크 성능을 개선합니다."</string> + <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"배터리 소모를 줄이고 네트워크 성능 개선"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"종량제 네트워크"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"무제한 네트워크"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"로거 버퍼 크기"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 8bed22f1e763..dda346242616 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -262,7 +262,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Овозможи лажни локации"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Овозможете проверка на атрибутот на приказот"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Секогаш држи го активен мобилниот интернет, дури и при активно Wi-Fi (за брзо префрлување мрежа)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Ако е достапно, користете хардверско забрзување за врзување"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Ако е достапно, користи хардверско забрзување за врзување"</string> <string name="adb_warning_title" msgid="6234463310896563253">"Овозможи отстранување грешки на USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"Отстранувањето грешки на USB е наменето само за целите на развој. Користете го за копирање податоци меѓу вашиот компјутер и вашиот уред, за инсталирање апликации на вашиот уред без известување и за читање евиденција на податоци."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"Отповикај пристап кон отстранување грешка од USB од сите претходно овластени компјутери?"</string> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index a364db91beff..7b467601f9d5 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -145,9 +145,9 @@ </string-array> <string-array name="bluetooth_audio_active_device_summaries"> <item msgid="4862957058729193940"></item> - <item msgid="6481691720774549651">", अॅक्टिव्ह"</item> - <item msgid="8962366465966010158">", अॅक्टिव्ह (मीडिया)"</item> - <item msgid="4046665544396189228">", अॅक्टिव्ह (फोन)"</item> + <item msgid="6481691720774549651">", अॅक्टिव्ह"</item> + <item msgid="8962366465966010158">", अॅक्टिव्ह (मीडिया)"</item> + <item msgid="4046665544396189228">", अॅक्टिव्ह (फोन)"</item> </string-array> <string-array name="select_logd_size_titles"> <item msgid="8665206199209698501">"बंद"</item> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 367b13d4ce09..54723a80b51c 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -34,7 +34,7 @@ <string name="wifi_check_password_try_again" msgid="516958988102584767">"पासवर्ड तपासा आणि पुन्हा प्रयत्न करा"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"परिक्षेत्रामध्ये नाही"</string> <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"स्वयंचलितपणे कनेक्ट करणार नाही"</string> - <string name="wifi_no_internet" msgid="4663834955626848401">"इंटरनेट अॅक्सेस नाही"</string> + <string name="wifi_no_internet" msgid="4663834955626848401">"इंटरनेट अॅक्सेस नाही"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> द्वारे सेव्ह केले"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s द्वारे स्वयंचलितपणे कनेक्ट केले"</string> <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदात्याद्वारे स्वयंचलितपणे कनेक्ट केले"</string> @@ -46,7 +46,7 @@ <string name="wifi_limited_connection" msgid="7717855024753201527">"मर्यादित कनेक्शन"</string> <string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट नाही"</string> <string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करणे आवश्यक आहे"</string> - <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string> <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ने कनेक्ट केले"</string> <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ने उपलब्ध"</string> <string name="osu_opening_provider" msgid="5488997661548640424">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> उघडत आहे"</string> @@ -74,8 +74,8 @@ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"कनेक्ट केले (फोन नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"कनेक्ट केले (मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"कनेक्ट केले (फोन किंवा मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> - <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"अॅक्टिव्ह, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string> - <string name="bluetooth_active_battery_level_untethered" msgid="6662649951391456747">"अॅक्टिव्ह, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string> + <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"अॅक्टिव्ह, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string> + <string name="bluetooth_active_battery_level_untethered" msgid="6662649951391456747">"अॅक्टिव्ह, L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string> <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बॅटरी"</string> <string name="bluetooth_battery_level_untethered" msgid="5974406100211667177">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> बॅटरी, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> बॅटरी"</string> <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"अॅक्टिव्ह"</string> @@ -83,12 +83,12 @@ <string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कॉल"</string> <string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानांतरण"</string> <string name="bluetooth_profile_hid" msgid="3680729023366986480">"इनपुट डिव्हाइस"</string> - <string name="bluetooth_profile_pan" msgid="3391606497945147673">"इंटरनेट अॅक्सेस"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"इंटरनेट अॅक्सेस"</string> <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"संपर्क शेअरिंग"</string> <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"संपर्क सामायिकरणासाठी वापरा"</string> <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन शेअररण"</string> <string name="bluetooth_profile_map" msgid="1019763341565580450">"मजकूर मेसेज"</string> - <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम अॅक्सेस"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम अॅक्सेस"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडिओ"</string> <string name="bluetooth_profile_hearing_aid" msgid="6680721080542444257">"श्रवण यंत्रे"</string> @@ -102,7 +102,7 @@ <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"इनपुट डिव्हाइसवर कनेक्ट केले"</string> <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"इंटरनेट अॅक्सेससाठी डिव्हाइसशी कनेक्ट केले"</string> <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"डिव्हाइससह स्थानिक इंटरनेट कनेक्शन शेअर करत आहे"</string> - <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"इंटरनेट अॅक्सेस करण्यासाठी वापरा"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"इंटरनेट अॅक्सेस करण्यासाठी वापरा"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"नकाशासाठी वापरा"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM प्रवेशासाठी वापरा"</string> <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"मीडिया ऑडिओसाठी वापरा"</string> @@ -113,7 +113,7 @@ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"पेअर करा"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"पेअर करा"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करा"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट केल्यावर पेअरींग तुमचे संपर्क आणि कॉल इतिहास यामध्ये अॅक्सेस देते."</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट केल्यावर पेअरींग तुमचे संपर्क आणि कॉल इतिहास यामध्ये अॅक्सेस देते."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> शी जोडू शकलो नाही."</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"अयोग्य पिन किंवा पासकीमुळे <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सह जोडू शकलो नाही."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> शी संवाद प्रस्थापित करू शकत नाही."</string> @@ -138,15 +138,15 @@ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"नेटवर्क उघडा"</string> <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"सुरक्षित नेटवर्क"</string> <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> - <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"काढलेले अॅप्स"</string> - <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"काढलेले अॅप्स आणि वापरकर्ते"</string> + <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"काढलेले अॅप्स"</string> + <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"काढलेले अॅप्स आणि वापरकर्ते"</string> <string name="data_usage_ota" msgid="5377889154805560860">"सिस्टम अपडेट"</string> <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB टेदरिंग"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"पोर्टेबल हॉटस्पॉट"</string> <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ब्लूटूथ टेदरिंग"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"टेदरिंग"</string> <string name="tether_settings_title_all" msgid="8356136101061143841">"टेदरिंग आणि पोर्टेबल हॉटस्पॉट"</string> - <string name="managed_user_title" msgid="8109605045406748842">"सर्व कार्य अॅप्स"</string> + <string name="managed_user_title" msgid="8109605045406748842">"सर्व कार्य अॅप्स"</string> <string name="user_guest" msgid="8475274842845401871">"अतिथी"</string> <string name="unknown" msgid="1592123443519355854">"अज्ञात"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"वापरकर्ता: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> @@ -200,7 +200,7 @@ <string name="development_settings_not_available" msgid="4308569041701535607">"या वापरकर्त्यासाठी डेव्हलपर पर्याय उपलब्ध नाहीत"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"या वापरकर्त्यासाठी VPN सेटिंग्ज उपलब्ध नाहीत"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"या वापरकर्त्यासाठी टेदरिंग सेटिंग्ज उपलब्ध नाहीत"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"या वापरकर्त्यासाठी अॅक्सेस बिंदू नाव सेटिंग्ज उपलब्ध नाहीत"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"या वापरकर्त्यासाठी अॅक्सेस बिंदू नाव सेटिंग्ज उपलब्ध नाहीत"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करणे"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"USB कनेक्ट केलेले असताना डीबग मोड"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करणारी प्रमाणीकरणे रीव्होक करा"</string> @@ -261,14 +261,14 @@ <string name="allow_mock_location" msgid="2787962564578664888">"बनावट स्थानांना अनुमती द्या"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"बनावट स्थानांना अनुमती द्या"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"दृश्य विशेषता तपासणी सुरू करा"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"जरी वाय-फाय चालू असले तरीही, मोबाईल डेटा नेहमी चालू ठेवा (नेटवर्क जलदरीत्या स्विच करण्यासाठी)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"उपलब्ध असल्यास टेदरिंग हार्डवेअर प्रवेग वापरा"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"वाय-फाय चालू असतानाही मोबाइल डेटा नेहमी सुरू ठेवा (नेटवर्क जलदरीत्या स्विच करण्यासाठी)."</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"उपलब्ध असल्यास टेदरिंग हार्डवेअर अॅक्सिलरेशन वापरा"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB डीबग करण्यास अनुमती द्यायची?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डिव्हाइस वर अॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string> - <string name="adb_keys_warning_message" msgid="5659849457135841625">"तुम्ही पूर्वी अॉथोराइझ केलेल्या सर्व संगणकांवरुन USB डीबग करण्यासाठी अॅक्सेस रीव्होक करायचा?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डिव्हाइस वर अॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"तुम्ही पूर्वी अॉथोराइझ केलेल्या सर्व संगणकांवरुन USB डीबग करण्यासाठी अॅक्सेस रीव्होक करायचा?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"विकास सेटिंग्जला अनुमती द्यायची?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"या सेटिंग्जचा हेतू फक्त विकास वापरासाठी आहे. त्यामुळे तुमचे डिव्हाइस आणि त्यावरील अॅप्लिकेशन ब्रेक होऊ शकतात किंवा नेहमीपेक्षा वेगळे वर्तन करू शकतात."</string> - <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वर अॅप्स पडताळून पाहा"</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वर अॅप्स पडताळून पाहा"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक वर्तनासाठी ADB/ADT द्वारे इंस्टॉल अॅप्स तपासा."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"नावांशिवाय ब्लूटूथ डीव्हाइस (फक्त MAC पत्ते) दाखवले जातील"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"रिमोट डिव्हाइसमध्ये सहन न होणारा मोठा आवाज किंवा नियंत्रणाचा अभाव यासारखी आवाजाची समस्या असल्यास ब्लूटूथ संपूर्ण आवाज वैशिष्ट्य बंद करते."</string> @@ -290,7 +290,7 @@ <string name="media_category" msgid="4388305075496848353">"मीडिया"</string> <string name="debug_monitoring_category" msgid="7640508148375798343">"परीक्षण"</string> <string name="strict_mode" msgid="1938795874357830695">"कठोर मोड सुरू"</string> - <string name="strict_mode_summary" msgid="142834318897332338">"मुख्य थ्रेडवर अॅप्स मोठी कार्ये करतात तेव्हा स्क्रीन फ्लॅश करा"</string> + <string name="strict_mode_summary" msgid="142834318897332338">"मुख्य थ्रेडवर अॅप्स मोठी कार्ये करतात तेव्हा स्क्रीन फ्लॅश करा"</string> <string name="pointer_location" msgid="6084434787496938001">"पॉइंटर स्थान"</string> <string name="pointer_location_summary" msgid="840819275172753713">"वर्तमान स्पर्श डेटा दर्शविणारे स्क्रीन ओव्हरले"</string> <string name="show_touches" msgid="2642976305235070316">"टॅप दाखवा"</string> @@ -322,7 +322,7 @@ <string name="transition_animation_scale_title" msgid="387527540523595875">"ट्रांझिशन अॅनिमेशन स्केल"</string> <string name="animator_duration_scale_title" msgid="3406722410819934083">"अॅनिमेटर कालावधी स्केल"</string> <string name="overlay_display_devices_title" msgid="5364176287998398539">"दुय्यम डिस्प्ले सिम्युलेट करा"</string> - <string name="debug_applications_category" msgid="4206913653849771549">"अॅप्स"</string> + <string name="debug_applications_category" msgid="4206913653849771549">"अॅप्स"</string> <string name="immediately_destroy_activities" msgid="1579659389568133959">"अॅक्टिव्हिटी ठेवू नका"</string> <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"वापरकर्त्याने प्रत्येक अॅक्टिव्हिटी सोडताच ती नष्ट करा"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"पार्श्वभूमी प्रक्रिया मर्यादा"</string> @@ -353,7 +353,7 @@ <item msgid="8280754435979370728">"डोळ्यांनी पाहिले तसे नैसर्गिक रंग"</item> <item msgid="5363960654009010371">"डिजिटल सामग्रीसाठी ऑप्टिमाइझ केलेले रंग"</item> </string-array> - <string name="inactive_apps_title" msgid="9042996804461901648">"स्टँडबाय अॅप्स"</string> + <string name="inactive_apps_title" msgid="9042996804461901648">"स्टँडबाय अॅप्स"</string> <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"निष्क्रिय. टॉगल करण्यासाठी टॅप करा."</string> <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करण्यासाठी टॅप करा."</string> <string name="standby_bucket_summary" msgid="6567835350910684727">"अॅप स्टँडबाय स्थिती: <xliff:g id="BUCKET"> %s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 648cc4a99b4e..5725c22a5456 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -247,7 +247,7 @@ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"କନେକ୍ଟ କରିହେଲା ନାହିଁ"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ୱେୟାରଲେସ୍ ଡିସ୍ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପ ଦେଖାନ୍ତୁ"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string> - <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍ୱାର୍କ ପ୍ରଦର୍ଶନ ଉନ୍ନତ କରିଥାଏ"</string> + <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍ୱାର୍କ କାର୍ଯ୍ୟକ୍ଷମତା ଉନ୍ନତ କରିଥାଏ"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"ମପାଯାଉଥିବା"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"ମପାଯାଉନଥିବା"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"ଲଗର୍ ବଫର୍ ସାଇଜ୍"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 7967c71669c2..faccda7e9395 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -403,7 +403,7 @@ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="603933521600231649">"ਡੀਵਾਈਸ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ (<xliff:g id="LEVEL">%1$s</xliff:g>)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਲਈ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string> - <string name="power_charging_duration" msgid="4676999980973411875">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਤੱਕ <xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਵਿੱਚ <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ਅਗਿਆਤ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 0401e7fd2d02..806be6e5cdd6 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -220,7 +220,7 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Сети"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Серт. беспроводн. мониторов"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Подробный журнал Wi‑Fi"</string> - <string name="wifi_scan_throttling" msgid="160014287416479843">"Регулирование поиска сетей Wi‑Fi"</string> + <string name="wifi_scan_throttling" msgid="160014287416479843">"Ограничивать поиск сетей Wi‑Fi"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Не отключать мобильный Интернет"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"Аппаратное ускорение в режиме модема"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Показывать Bluetooth-устройства без названий"</string> @@ -247,7 +247,7 @@ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ошибка подключения"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Показывать параметры сертификации беспроводных мониторов"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Вести подробный журнал, показывать RSSI для каждого SSID при выборе сети"</string> - <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"Уменьшает расход заряда батареи и улучшает работу сетей."</string> + <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"Уменьшает расход заряда батареи и улучшает работу сети"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"Сеть с тарификацией трафика"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"Сеть без тарификации трафика"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"Размер буфера журнала"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 213b28557142..b16d5d91f7eb 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -246,7 +246,7 @@ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Vnesite ime gostitelja pri ponudniku DNS"</string> <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Povezave ni bilo mogoče vzpostaviti"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povečaj raven zapis. dnev. za Wi-Fi; v izbir. Wi‑Fi-ja pokaži glede na SSID RSSI"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povečaj raven zapisovanja dnevnika za Wi-Fi; v izbirniku Wi‑Fi-ja pokaži glede na SSID RSSI"</string> <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"Zmanjša porabo energije akumulatorja in izboljša delovanje omrežja"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"Omejen prenos podatkov"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"Z neomejenim prenosom podatkov"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 910b94ecdf03..0b184d241b55 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -247,7 +247,7 @@ <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"เชื่อมต่อไม่ได้"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string> - <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"ลดการหมดเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"</string> + <string name="wifi_scan_throttling_summary" msgid="4461922728822495763">"ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"ขนาดบัฟเฟอร์ของตัวบันทึก"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index c7380c580e2f..5ac788e1b374 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Path.Direction; @@ -33,6 +34,7 @@ import android.graphics.drawable.DrawableWrapper; import android.os.Handler; import android.telephony.SignalStrength; import android.util.LayoutDirection; +import android.util.PathParser; import com.android.settingslib.R; import com.android.settingslib.Utils; @@ -48,7 +50,6 @@ public class SignalDrawable extends DrawableWrapper { private static final float VIEWPORT = 24f; private static final float PAD = 2f / VIEWPORT; - private static final float CUT_OUT = 7.9f / VIEWPORT; private static final float DOT_SIZE = 3f / VIEWPORT; private static final float DOT_PADDING = 1.5f / VIEWPORT; @@ -65,21 +66,6 @@ public class SignalDrawable extends DrawableWrapper { private static final long DOT_DELAY = 1000; - private static float[][] X_PATH = new float[][]{ - {21.9f / VIEWPORT, 17.0f / VIEWPORT}, - {-1.1f / VIEWPORT, -1.1f / VIEWPORT}, - {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, - {-1.1f / VIEWPORT, 1.1f / VIEWPORT}, - {1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {1.1f / VIEWPORT, 1.1f / VIEWPORT}, - {1.9f / VIEWPORT, -1.9f / VIEWPORT}, - {1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {1.1f / VIEWPORT, -1.1f / VIEWPORT}, - {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, - }; - private final Paint mForegroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Paint mTransparentPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final int mDarkModeFillColor; @@ -87,7 +73,11 @@ public class SignalDrawable extends DrawableWrapper { private final Path mCutoutPath = new Path(); private final Path mForegroundPath = new Path(); private final Path mXPath = new Path(); + private final Matrix mXScaleMatrix = new Matrix(); + private final Path mScaledXPath = new Path(); private final Handler mHandler; + private final float mCutoutWidthFraction; + private final float mCutoutHeightFraction; private float mDarkIntensity = -1; private final int mIntrinsicSize; private boolean mAnimating; @@ -95,6 +85,14 @@ public class SignalDrawable extends DrawableWrapper { public SignalDrawable(Context context) { super(context.getDrawable(com.android.internal.R.drawable.ic_signal_cellular)); + final String xPathString = context.getString( + com.android.internal.R.string.config_signalXPath); + mXPath.set(PathParser.createPathFromPathData(xPathString)); + updateScaledXPath(); + mCutoutWidthFraction = context.getResources().getFloat( + com.android.internal.R.dimen.config_signalCutoutWidthFraction); + mCutoutHeightFraction = context.getResources().getFloat( + com.android.internal.R.dimen.config_signalCutoutHeightFraction); mDarkModeFillColor = Utils.getColorStateListDefaultColor(context, R.color.dark_mode_icon_color_single_tone); mLightModeFillColor = Utils.getColorStateListDefaultColor(context, @@ -106,6 +104,15 @@ public class SignalDrawable extends DrawableWrapper { setDarkIntensity(0); } + private void updateScaledXPath() { + if (getBounds().isEmpty()) { + mXScaleMatrix.setScale(1f, 1f); + } else { + mXScaleMatrix.setScale(getBounds().width() / VIEWPORT, getBounds().height() / VIEWPORT); + } + mXPath.transform(mXScaleMatrix, mScaledXPath); + } + @Override public int getIntrinsicWidth() { return mIntrinsicSize; @@ -170,6 +177,7 @@ public class SignalDrawable extends DrawableWrapper { @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); + updateScaledXPath(); invalidateSelf(); } @@ -205,19 +213,15 @@ public class SignalDrawable extends DrawableWrapper { canvas.drawPath(mCutoutPath, mTransparentPaint); canvas.drawPath(mForegroundPath, mForegroundPaint); } else if (isInState(STATE_CUT)) { - float cut = (CUT_OUT * width); - mCutoutPath.moveTo(width - padding, height - padding); - mCutoutPath.rLineTo(-cut, 0); - mCutoutPath.rLineTo(0, -cut); - mCutoutPath.rLineTo(cut, 0); - mCutoutPath.rLineTo(0, cut); + float cutX = (mCutoutWidthFraction * width / VIEWPORT); + float cutY = (mCutoutHeightFraction * height / VIEWPORT); + mCutoutPath.moveTo(width, height); + mCutoutPath.rLineTo(-cutX, 0); + mCutoutPath.rLineTo(0, -cutY); + mCutoutPath.rLineTo(cutX, 0); + mCutoutPath.rLineTo(0, cutY); canvas.drawPath(mCutoutPath, mTransparentPaint); - mXPath.reset(); - mXPath.moveTo(X_PATH[0][0] * width, X_PATH[0][1] * height); - for (int i = 1; i < X_PATH.length; i++) { - mXPath.rLineTo(X_PATH[i][0] * width, X_PATH[i][1] * height); - } - canvas.drawPath(mXPath, mForegroundPaint); + canvas.drawPath(mScaledXPath, mForegroundPaint); } if (isRtl) { canvas.restore(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 05fd774159b9..6adb305d4165 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1944,9 +1944,6 @@ class SettingsProtoDumpUtil { Settings.Secure.SILENCE_GESTURE, SecureSettingsProto.Gesture.SILENCE_ENABLED); dumpSetting(s, p, - Settings.Secure.SILENCE_NOTIFICATION_GESTURE_COUNT, - SecureSettingsProto.Gesture.SILENCE_NOTIFICATION_COUNT); - dumpSetting(s, p, Settings.Secure.SILENCE_TIMER_GESTURE_COUNT, SecureSettingsProto.Gesture.SILENCE_TIMER_COUNT); @@ -1956,6 +1953,19 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.SKIP_GESTURE, SecureSettingsProto.Gesture.SKIP_ENABLED); + + dumpSetting(s, p, + Settings.Secure.SILENCE_ALARMS_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_ALARMS_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_CALL_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_CALLS_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_TIMER_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_TIMER_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SKIP_TOUCH_COUNT, + SecureSettingsProto.Gesture.SKIP_TOUCH_COUNT); p.end(gestureToken); dumpSetting(s, p, diff --git a/packages/Shell/res/values-in/strings.xml b/packages/Shell/res/values-in/strings.xml index cf2ebe504c0f..5c5ba816e5d7 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -24,10 +24,10 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"Harap tunggu..."</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Laporan bug akan segera muncul di ponsel"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Pilih untuk membagikan laporan bug Anda"</string> - <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tap untuk membagikan laporan bug"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Ketuk untuk membagikan laporan bug"</string> <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Pilih untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Laporan bug berisi data dari berbagai file log sistem, yang mungkin mencakup data yang dianggap sensitif (seperti data penggunaan aplikasi dan lokasi). Hanya bagikan laporan bug dengan aplikasi dan orang yang Anda percaya."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Jangan tampilkan lagi"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Laporan bug"</string> diff --git a/packages/SystemUI/legacy/recents/res/values-fr/strings.xml b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml index 183b6beba76b..5b0d611c2588 100644 --- a/packages/SystemUI/legacy/recents/res/values-fr/strings.xml +++ b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml @@ -32,7 +32,7 @@ <string name="recents_search_bar_label" msgid="638132045925945941">"rechercher"</string> <string name="recents_launch_error_message" msgid="9107963563503438012">"Impossible de lancer l\'application <xliff:g id="APP">%s</xliff:g>."</string> <string name="recents_launch_disabled_message" msgid="826461671965217243">"L\'application <xliff:g id="APP">%s</xliff:g> est désactivée en mode sécurisé."</string> - <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Tout effacer"</string> + <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Tout fermer"</string> <string name="recents_drag_hint_message" msgid="610417221848280136">"Faire glisser ici pour utiliser l\'écran partagé"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Séparation horizontale"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Séparation verticale"</string> diff --git a/packages/SystemUI/res/anim/lock_in.xml b/packages/SystemUI/res/anim/lock_in.xml deleted file mode 100644 index c7014e80d33e..000000000000 --- a/packages/SystemUI/res/anim/lock_in.xml +++ /dev/null @@ -1,227 +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. ---> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt"> - <aapt:attr name="android:drawable"> - <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" - android:viewportWidth="32"> - <group android:name="_R_G"> - <group android:name="_R_G_L_2_G" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <path android:name="_R_G_L_2_G_D_0_P_0" android:strokeColor="#ffffff" - android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2" android:strokeAlpha="1" - android:pathData=" M22.33 21 C22.33,21 6.33,21 6.33,21 C5.6,21 5,20.4 5,19.67 C5,19.67 5,6.33 5,6.33 C5,5.6 5.6,5 6.33,5 C6.33,5 22.33,5 22.33,5 C23.07,5 23.67,5.6 23.67,6.33 C23.67,6.33 23.67,19.67 23.67,19.67 C23.67,20.4 23.07,21 22.33,21c "/> - </group> - <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <group android:name="_R_G_L_1_G" android:translateX="11.583" - android:translateY="10.257"> - <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff" - android:fillAlpha="1" android:fillType="nonZero" - android:pathData=" M2.75 0.25 C4.13,0.25 5.25,1.37 5.25,2.75 C5.25,4.13 4.13,5.25 2.75,5.25 C1.37,5.25 0.25,4.13 0.25,2.75 C0.25,1.37 1.37,0.25 2.75,0.25c "/> - </group> - </group> - <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <group android:name="_R_G_L_0_G_T_1" android:translateX="14.333" - android:translateY="3.172"> - <group android:name="_R_G_L_0_G" android:translateX="-9.667" - android:translateY="-9.667"> - <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff" - android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2" android:strokeAlpha="1" - android:trimPathStart="0.14" android:trimPathEnd="0.89" - android:trimPathOffset="0" - android:pathData=" M14.33 14.33 C14.33,14.33 14.33,9.67 14.33,9.67 C14.33,7.09 12.24,5 9.67,5 C7.09,5 5,7.09 5,9.67 C5,9.67 5,14.33 5,14.33 "/> - </group> - </group> - </group> - </group> - <group android:name="time_group"/> - </vector> - </aapt:attr> - <target android:name="_R_G_L_2_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_N_4_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="trimPathStart" android:duration="50" - android:startOffset="0" android:valueFrom="0.14" - android:valueTo="0.14" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator - android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="trimPathStart" android:duration="67" - android:startOffset="50" android:valueFrom="0.14" - android:valueTo="0" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator - android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="trimPathEnd" android:duration="50" - android:startOffset="0" android:valueFrom="0.89" - android:valueTo="0.89" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator - android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="trimPathEnd" android:duration="67" - android:startOffset="50" android:valueFrom="0.89" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator - android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_T_1"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="translateY" android:duration="150" - android:startOffset="0" android:valueFrom="3.172" - android:valueTo="0.34" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.23,-0.46 0.2,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_4_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="time_group"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="translateX" android:duration="717" - android:startOffset="0" android:valueFrom="0" android:valueTo="1" - android:valueType="floatType"/> - </set> - </aapt:attr> - </target> -</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_in_circular.xml b/packages/SystemUI/res/anim/lock_in_circular.xml deleted file mode 100644 index d1e98db6e0e3..000000000000 --- a/packages/SystemUI/res/anim/lock_in_circular.xml +++ /dev/null @@ -1,327 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<animated-vector xmlns:aapt="http://schemas.android.com/aapt" - xmlns:android="http://schemas.android.com/apk/res/android" > - - <aapt:attr name="android:drawable" > - <vector - android:height="32dp" - android:viewportHeight="32" - android:viewportWidth="32" - android:width="32dp" > - <group android:name="_R_G" > - <group - android:name="_R_G_L_2_G" - android:pivotX="9.583" - android:pivotY="8.916" - android:scaleX="0" - android:scaleY="0" - android:translateX="6.416" - android:translateY="10.416999999999998" > - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="#ffffff" - android:fillType="nonZero" - android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " /> - </group> - <group - android:name="_R_G_L_1_G_N_3_T_0" - android:pivotX="9.583" - android:pivotY="8.916" - android:scaleX="0" - android:scaleY="0" - android:translateX="6.416" - android:translateY="10.416999999999998" > - <group - android:name="_R_G_L_1_G" - android:translateX="7.334" - android:translateY="5.333" > - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="#ffffff" - android:fillType="nonZero" - android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " /> - <path - android:name="_R_G_L_1_G_D_1_P_0" - android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 " - android:strokeAlpha="1" - android:strokeColor="#ffffff" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.5" /> - </group> - </group> - <group - android:name="_R_G_L_0_G_N_3_T_0" - android:pivotX="9.583" - android:pivotY="8.916" - android:scaleX="0" - android:scaleY="0" - android:translateX="6.416" - android:translateY="10.416999999999998" > - <group - android:name="_R_G_L_0_G_T_1" - android:translateX="9.583" - android:translateY="-0.861" > - <group - android:name="_R_G_L_0_G" - android:translateX="-8.083" - android:translateY="-8.173" > - <path - android:name="_R_G_L_0_G_D_0_P_0" - android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " - android:strokeAlpha="1" - android:strokeColor="#ffffff" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.5" - android:trimPathEnd="0.9" - android:trimPathOffset="0" - android:trimPathStart="0.15" /> - </group> - </group> - </group> - </group> - <group android:name="time_group" /> - </vector> - </aapt:attr> - - <target android:name="_R_G_L_2_G" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_N_3_T_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="50" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0.15" - android:valueTo="0.15" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathStart" - android:startOffset="50" - android:valueFrom="0.15" - android:valueTo="0" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="50" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0.9" - android:valueTo="0.9" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathEnd" - android:startOffset="50" - android:valueFrom="0.9" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_T_1" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="150" - android:pathData="M 9.583,-0.861C 9.583,-1.32784640645981 9.583,-3.19515359354019 9.583,-3.662" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_3_T_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="time_group" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="717" - android:propertyName="translateX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> - </set> - </aapt:attr> - </target> - -</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_in_filled.xml b/packages/SystemUI/res/anim/lock_in_filled.xml deleted file mode 100644 index 4cde38d4f0dc..000000000000 --- a/packages/SystemUI/res/anim/lock_in_filled.xml +++ /dev/null @@ -1,190 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<animated-vector xmlns:aapt="http://schemas.android.com/aapt" - xmlns:android="http://schemas.android.com/apk/res/android" > - - <aapt:attr name="android:drawable" > - <vector - android:height="32dp" - android:viewportHeight="32" - android:viewportWidth="32" - android:width="32dp" > - <group android:name="_R_G" > - <group - android:name="_R_G_L_1_G" - android:pivotX="10.917" - android:pivotY="9.583" - android:scaleX="0" - android:scaleY="0" - android:translateX="5.083" - android:translateY="10.417" > - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="#ffffff" - android:fillType="nonZero" - android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " /> - </group> - <group - android:name="_R_G_L_0_G_N_2_T_0" - android:pivotX="10.917" - android:pivotY="9.583" - android:scaleX="0" - android:scaleY="0" - android:translateX="5.083" - android:translateY="10.417" > - <group - android:name="_R_G_L_0_G_T_1" - android:translateX="10.917" - android:translateY="0.579" > - <group - android:name="_R_G_L_0_G" - android:translateX="-9" - android:translateY="-9" > - <path - android:name="_R_G_L_0_G_D_0_P_0" - android:pathData=" M13 13 C13,13 13,9 13,9 C13,6.79 11.21,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " - android:strokeAlpha="1" - android:strokeColor="#ffffff" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2" /> - </group> - </group> - </group> - </group> - <group android:name="time_group" /> - </vector> - </aapt:attr> - - <target android:name="_R_G_L_1_G" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_T_1" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="150" - android:pathData="M 10.917,0.579C 10.917,-0.14248990631104008 10.917,-3.02851009368896 10.917,-3.75" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_2_T_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="time_group" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="717" - android:propertyName="translateX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> - </set> - </aapt:attr> - </target> - -</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_in_rounded.xml b/packages/SystemUI/res/anim/lock_in_rounded.xml deleted file mode 100644 index 7c8cf9d7b525..000000000000 --- a/packages/SystemUI/res/anim/lock_in_rounded.xml +++ /dev/null @@ -1,336 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<animated-vector xmlns:aapt="http://schemas.android.com/aapt" - xmlns:android="http://schemas.android.com/apk/res/android" > - - <aapt:attr name="android:drawable" > - <vector - android:height="38dp" - android:viewportHeight="38" - android:viewportWidth="32" - android:width="32dp" > - <group android:name="_R_G" > - <group - android:name="_R_G_L_2_G" - android:pivotX="14.667" - android:pivotY="12.667" - android:scaleX="0" - android:scaleY="0" - android:translateX="1.3330000000000002" - android:translateY="10.333" > - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c " - android:strokeAlpha="1" - android:strokeColor="#ffffff" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.5" /> - </group> - <group - android:name="_R_G_L_1_G_N_3_T_0" - android:pivotX="14.667" - android:pivotY="12.667" - android:scaleX="0" - android:scaleY="0" - android:translateX="1.3330000000000002" - android:translateY="10.333" > - <group - android:name="_R_G_L_1_G" - android:translateX="12.416" - android:translateY="10.417" > - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="#ffffff" - android:fillType="nonZero" - android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> - </group> - </group> - <group android:name="_R_G_L_0_G_N_3_T_0_M" > - <group - android:name="_R_G_L_0_G_N_3_T_0" - android:pivotX="14.667" - android:pivotY="12.667" - android:scaleX="0" - android:scaleY="0" - android:translateX="1.3330000000000002" - android:translateY="10.333" > - <group - android:name="_R_G_L_0_G_T_1" - android:translateX="14.666" - android:translateY="3.769" > - <group - android:name="_R_G_L_0_G" - android:translateX="-9.333" - android:translateY="-9.713" > - <path - android:name="_R_G_L_0_G_D_0_P_0" - android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " - android:strokeAlpha="1" - android:strokeColor="#ffffff" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.5" - android:trimPathEnd="0.9" - android:trimPathOffset="0" - android:trimPathStart="0.14" /> - </group> - </group> - </group> - </group> - </group> - <group android:name="time_group" /> - </vector> - </aapt:attr> - - <target android:name="_R_G_L_2_G" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_N_3_T_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="50" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0.14" - android:valueTo="0.14" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathStart" - android:startOffset="50" - android:valueFrom="0.14" - android:valueTo="0" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="50" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0.9" - android:valueTo="0.9" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathEnd" - android:startOffset="50" - android:valueFrom="0.9" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_T_1" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="150" - android:pathData="M 14.666,3.769C 14.666,3.18868762874603 14.666,0.8673123712539699 14.666,0.287" - android:propertyName="translateXY" - android:propertyXName="translateX" - android:propertyYName="translateY" - android:startOffset="0" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_3_T_0" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="233" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="233" - android:propertyName="scaleY" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1.025" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" - android:startOffset="233" - android:valueFrom="1.025" - android:valueTo="1" - android:valueType="floatType" > - <aapt:attr name="android:interpolator" > - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_3_T_0_M" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="0" - android:propertyName="scaleX" - android:startOffset="50" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> - </set> - </aapt:attr> - </target> - <target android:name="time_group" > - <aapt:attr name="android:animation" > - <set android:ordering="together" > - <objectAnimator - android:duration="717" - android:propertyName="translateX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType" /> - </set> - </aapt:attr> - </target> - -</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/pip_menu_activity.xml b/packages/SystemUI/res/layout/pip_menu_activity.xml index 0481310cf773..ee0bd14820bd 100644 --- a/packages/SystemUI/res/layout/pip_menu_activity.xml +++ b/packages/SystemUI/res/layout/pip_menu_activity.xml @@ -19,46 +19,47 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <!-- Menu layout --> - <FrameLayout - android:id="@+id/menu_container" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:forceHasOverlappingRendering="false"> + <!-- Menu layout --> + <FrameLayout + android:id="@+id/menu_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:forceHasOverlappingRendering="false" + android:accessibilityTraversalAfter="@id/dismiss"> - <!-- The margins for this container is calculated in the code depending on whether the - actions_container is visible. --> - <FrameLayout - android:id="@+id/expand_container" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <ImageButton - android:id="@+id/expand_button" - android:layout_width="60dp" - android:layout_height="60dp" - android:layout_gravity="center" - android:contentDescription="@string/pip_phone_expand" - android:padding="10dp" - android:src="@drawable/pip_expand" - android:background="?android:selectableItemBackgroundBorderless" /> - </FrameLayout> + <!-- The margins for this container is calculated in the code depending on whether the + actions_container is visible. --> + <FrameLayout + android:id="@+id/expand_container" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <ImageButton + android:id="@+id/expand_button" + android:layout_width="60dp" + android:layout_height="60dp" + android:layout_gravity="center" + android:contentDescription="@string/pip_phone_expand" + android:padding="10dp" + android:src="@drawable/pip_expand" + android:background="?android:selectableItemBackgroundBorderless" /> + </FrameLayout> - <FrameLayout - android:id="@+id/actions_container" - android:layout_width="match_parent" - android:layout_height="@dimen/pip_action_size" - android:layout_gravity="bottom" - android:visibility="invisible"> - <LinearLayout - android:id="@+id/actions_group" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="center_horizontal" - android:orientation="horizontal" - android:divider="@android:color/transparent" - android:showDividers="middle" /> - </FrameLayout> - </FrameLayout> + <FrameLayout + android:id="@+id/actions_container" + android:layout_width="match_parent" + android:layout_height="@dimen/pip_action_size" + android:layout_gravity="bottom" + android:visibility="invisible"> + <LinearLayout + android:id="@+id/actions_group" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center_horizontal" + android:orientation="horizontal" + android:divider="@android:color/transparent" + android:showDividers="middle" /> + </FrameLayout> + </FrameLayout> <ImageButton android:id="@+id/settings" diff --git a/packages/SystemUI/res/values-af/config.xml b/packages/SystemUI/res/values-af/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-af/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index da9ce6f9f3db..e0907aee49f6 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot sonsopkoms"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Donker-tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Donker-tema\nBatterybespaarder"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Donker-tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Donker-tema\nBatterybespaarder"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is gedeaktiveer"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is geaktiveer"</string> diff --git a/packages/SystemUI/res/values-am/config.xml b/packages/SystemUI/res/values-am/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-am/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 18f5dff0feb0..f16193a96863 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ጸሐይ እስክትወጣ ድረስ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ላይ ይበራል"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ጨለማ ገጽታ"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ጨለም ያለ ገጽታ\nየባትሪ ቆጣቢ"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ጨለማ ገጽታ"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ጨለም ያለ ገጽታ\nየባትሪ ቆጣቢ"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"ኤንኤፍሲ"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"ኤንኤፍሲ ተሰናክሏል"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"ኤንኤፍሲ ነቅቷል"</string> diff --git a/packages/SystemUI/res/values-ar/config.xml b/packages/SystemUI/res/values-ar/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ar/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 4ef9f302e453..7f85ec0dee6e 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -384,8 +384,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"حتى شروق الشمس"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"تفعيل الإعداد في <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"حتى <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"مظهر الألوان الداكنة"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"مظهر داكن\nتوفير شحن البطارية"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"مظهر داكن"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"مظهر داكن\nتوفير شحن البطارية"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"الاتصالات قصيرة المدى (NFC)"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"تم إيقاف الاتصال القريب المدى"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"تم تفعيل الاتصال القريب المدى"</string> diff --git a/packages/SystemUI/res/values-as/config.xml b/packages/SystemUI/res/values-as/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-as/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 04dfc2aadff5..c7b5f0893711 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"আপোনাৰ মুখমণ্ডল বিচাৰি থকা হৈছে"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"নিশ্চিত কৰিলে"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"সম্পূৰ্ণ কৰিবলৈ নিশ্চিত কৰক-ত টিপক"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"সূৰ্যোদয়ৰ লৈকে"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ত অন কৰক"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> পৰ্যন্ত"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"গাঢ় ৰঙৰ থীম"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"গাঢ় ৰঙৰ থীম\nবেটাৰী সঞ্চয়কাৰী"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"গাঢ় ৰঙৰ থীম"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"গাঢ় ৰঙৰ থীম\nবেটাৰী সঞ্চয়কাৰী"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string> diff --git a/packages/SystemUI/res/values-az/config.xml b/packages/SystemUI/res/values-az/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-az/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index edd49c06da14..847d10d20861 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Şəfəq vaxtına qədər"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> olduqda aktiv ediləcək"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> vaxtına qədər"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tünd Tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tünd Tema\nEnerjiyə Qənaət"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tünd tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tünd tema\nEnerjiyə Qənaət"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC deaktiv edilib"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC aktiv edilib"</string> @@ -559,7 +559,7 @@ <string name="stream_notification" msgid="2563720670905665031">"Bildiriş"</string> <string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string> <string name="stream_dtmf" msgid="2447177903892477915">"Çoxsaylı ton olan ikili tezlik"</string> - <string name="stream_accessibility" msgid="301136219144385106">"Münasiblik"</string> + <string name="stream_accessibility" msgid="301136219144385106">"Əlçatımlılıq"</string> <string name="ring_toggle_title" msgid="3281244519428819576">"Zənglər"</string> <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zəng"</string> <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrasiya"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/config.xml b/packages/SystemUI/res/values-b+sr+Latn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-b+sr+Latn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index eef7d58efa2e..78e9d0463361 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -378,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tamna tema\nUšteda baterije"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tamna tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tamna tema\nUšteda baterije"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> diff --git a/packages/SystemUI/res/values-be/config.xml b/packages/SystemUI/res/values-be/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-be/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 428463ac4786..26e34d318567 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ідзе пошук твару"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Твар распазнаны"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Пацверджана"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Націсніце \"Пацвердзіць\", каб завяршыць"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string> @@ -383,8 +382,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Да ўсходу сонца"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Уключыць у <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Да <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Цёмная тэма"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Цёмная тэма\nЭканомія зараду"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Цёмная тэма"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Цёмная тэма\nЭканомія зараду"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC адключаны"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC уключаны"</string> @@ -539,7 +538,7 @@ <string name="accessibility_volume_settings" msgid="4915364006817819212">"Налады гуку"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Разгарнуць"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Згарнуць"</string> - <string name="volume_odi_captions_tip" msgid="1193653197906918269">"Аўтаматычныя цітры"</string> + <string name="volume_odi_captions_tip" msgid="1193653197906918269">"Аўтаматычныя субцітры"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="1163987066404128967">"Падказка \"Схавайце цітры\""</string> <string name="volume_odi_captions_content_description" msgid="2950736796270214785">"Накладанне субцітраў"</string> <string name="volume_odi_captions_hint_enable" msgid="49750248924730302">"уключыць"</string> diff --git a/packages/SystemUI/res/values-bg/config.xml b/packages/SystemUI/res/values-bg/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bg/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index ffe1b75c3d58..a0128ebf74b3 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Лицето ви се търси"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лицето е удостоверено"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Потвърдено"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Докоснете „Потвърждаване“ за завършване"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрев"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ще се включи в <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тъмна тема"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Тъмна тема\nРежим за запазв. на батерията"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Тъмна тема"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Тъмна тема\nЗапазване на батерията: Режим"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"КБП"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"КБП е деактивирана"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"КБП е активирана"</string> diff --git a/packages/SystemUI/res/values-bn/config.xml b/packages/SystemUI/res/values-bn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 5c6dbfb85262..bf7dd0bc1676 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"আপনার ফেস খোঁজা হচ্ছে"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ফেস যাচাই করা হয়েছে"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"কনফার্ম করা হয়েছে"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"সম্পূর্ণ করতে \'কনফার্ম করুন\' বোতামে ট্যাপ করুন"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"সূর্যোদয় পর্যন্ত"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> এ চালু হবে"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> পর্যন্ত"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"গাঢ় থিম"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"গাঢ় থিম\nব্যাটারি সেভার"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"গাঢ় থিম"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"গাঢ় থিম\nব্যাটারি সেভার"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC অক্ষম করা আছে"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম করা আছে"</string> diff --git a/packages/SystemUI/res/values-bs/config.xml b/packages/SystemUI/res/values-bs/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bs/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 6f118a7402d8..d7e5c230e833 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -378,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svitanja"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tamna tema\nUšteda baterije"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tamna tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tamna tema\nUšteda baterije"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> diff --git a/packages/SystemUI/res/values-ca/config.xml b/packages/SystemUI/res/values-ca/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ca/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 992e2ba09189..23d5d5c15c2f 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"S\'està cercant la teva cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Cara autenticada"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmat"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirma per completar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fins a l\'alba"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema fosc"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema fosc\nEstalvi de bateria"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema fosc"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema fosc\nEstalvi de bateria"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"L\'NFC està desactivada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"L\'NFC està activada"</string> diff --git a/packages/SystemUI/res/values-cs/config.xml b/packages/SystemUI/res/values-cs/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-cs/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index ee78910f2805..80c617989b95 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Vyhledávání obličeje"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Obličej byl ověřen"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrzeno"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ověření dokončíte klepnutím na Potvrdit"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svítání"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Zapnout v <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tmavé téma"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tmavý motiv\nSpořič baterie"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tmavý motiv"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tmavý motiv\nSpořič baterie"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je vypnuto"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je zapnuto"</string> diff --git a/packages/SystemUI/res/values-da/config.xml b/packages/SystemUI/res/values-da/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-da/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 1334f3d7f695..08fb0b38c770 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Indtil solopgang"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Tænd kl. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Indtil <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mørkt tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Mørkt tema\nBatterisparefunktion"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Mørkt tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Mørkt tema\nBatterisparefunktion"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er deaktiveret"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er aktiveret"</string> diff --git a/packages/SystemUI/res/values-de/config.xml b/packages/SystemUI/res/values-de/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-de/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 015a65d1de56..408254f7c9e6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -380,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Bis Sonnenaufgang"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"An um <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Bis <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dunkles Design"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dunkles Design\nEnergiesparmodus"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dunkles Design"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dunkles Design\nEnergiesparmodus"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ist deaktiviert"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ist aktiviert"</string> diff --git a/packages/SystemUI/res/values-el/config.xml b/packages/SystemUI/res/values-el/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-el/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index e3e96173718b..0ceef42a9dc3 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Μέχρι την ανατολή"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ενεργοποίηση στις <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Έως τις <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Σκούρο θέμα"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Σκούρο θέμα\nΕξοικονόμηση μπαταρίας"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Σκούρο θέμα"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Σκούρο θέμα\nΕξοικονόμηση μπαταρίας"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Το NFC είναι απενεργοποιημένο"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Το NFC είναι ενεργοποιημένο"</string> diff --git a/packages/SystemUI/res/values-en-rAU/config.xml b/packages/SystemUI/res/values-en-rAU/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rAU/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index bd8df6f27a49..82252ba862a2 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark theme\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dark theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dark theme\nBattery Saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-en-rCA/config.xml b/packages/SystemUI/res/values-en-rCA/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rCA/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index e699c8763601..ca9e29aed15f 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark theme\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dark theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dark theme\nBattery Saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-en-rGB/config.xml b/packages/SystemUI/res/values-en-rGB/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rGB/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index bd8df6f27a49..82252ba862a2 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark theme\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dark theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dark theme\nBattery Saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-en-rIN/config.xml b/packages/SystemUI/res/values-en-rIN/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rIN/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index bd8df6f27a49..82252ba862a2 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark theme\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dark theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dark theme\nBattery Saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-en-rXC/config.xml b/packages/SystemUI/res/values-en-rXC/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rXC/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 919e14ad0fd0..d8c862affe08 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Until sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark Theme\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dark theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dark theme\nBattery saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-es-rUS/config.xml b/packages/SystemUI/res/values-es-rUS/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-es-rUS/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c29df5fdcb2e..37aae55d2b8b 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"A la(s) <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema oscuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema oscuro\nAhorro de batería"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema oscuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema oscuro\nAhorro de batería"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La tecnología NFC está inhabilitada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La tecnología NFC está habilitada"</string> diff --git a/packages/SystemUI/res/values-es/config.xml b/packages/SystemUI/res/values-es/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-es/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 1e45f0c4b922..bcb25f5e905f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Buscando tu cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Cara autenticada"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirmar para completar la acción"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Hora: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta las <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema oscuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema oscuro\nAhorro de batería"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema oscuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema oscuro\nAhorro de batería"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La conexión NFC está inhabilitada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La conexión NFC está habilitada"</string> diff --git a/packages/SystemUI/res/values-et/config.xml b/packages/SystemUI/res/values-et/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-et/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 2de1b20dd588..729bba4872bb 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuni päikesetõusuni"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Sisselülitam. kell <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tume teema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tume teema\nAkusäästja"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tume teema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tume teema\nAkusäästja"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on keelatud"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on lubatud"</string> diff --git a/packages/SystemUI/res/values-eu/config.xml b/packages/SystemUI/res/values-eu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-eu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index d5235c7b5373..a5f998914cec 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Aurpegia bilatzen"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Autentifikatu da aurpegia"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Berretsita"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Amaitzeko, sakatu \"Berretsi\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ilunabarrera arte"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> arte"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Gai iluna"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Gai iluna\nBateria-aurrezlea"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Gai iluna"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Gai iluna\nBateria-aurrezlea"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Desgaituta dago NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Gaituta dago NFC"</string> diff --git a/packages/SystemUI/res/values-fa/config.xml b/packages/SystemUI/res/values-fa/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fa/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 852cfa996c9a..bbbfe0ac8dc2 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"تا طلوع"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ساعت <xliff:g id="TIME">%s</xliff:g> روشن میشود"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"تا <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"طرح زمینه تیره"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"طرح زمینه تیره\nبهینهسازی باتری"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"طرح زمینه تیره"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"طرح زمینه تیره\nبهینهسازی باتری"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیرفعال است"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال است"</string> diff --git a/packages/SystemUI/res/values-fi/config.xml b/packages/SystemUI/res/values-fi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 1b2074025271..2a4f70eef78a 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Auringonnousuun"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Käyttöön klo <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> saakka"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tumma teema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tumma teema\nVirransäästö"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tumma teema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tumma teema\nVirransäästö"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on poistettu käytöstä"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on käytössä"</string> @@ -652,7 +652,7 @@ <string name="notification_silence_title" msgid="5763240612242137433">"Äänetön"</string> <string name="notification_alert_title" msgid="8031196611815490340">"Hälyttää"</string> <string name="notification_channel_summary_low" msgid="3387466082089715555">"Keskittyminen on helpompaa ilman ääntä tai värinää."</string> - <string name="notification_channel_summary_default" msgid="5994062840431965586">"Kiinnittää huomion ilman ääntä tai värinää."</string> + <string name="notification_channel_summary_default" msgid="5994062840431965586">"Kiinnittää huomion äänellä tai värinällä"</string> <string name="notification_unblockable_desc" msgid="4556908766584964102">"Näitä ilmoituksia ei voi muokata"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Tätä ilmoitusryhmää ei voi määrittää tässä"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Välitetty ilmoitus"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/config.xml b/packages/SystemUI/res/values-fr-rCA/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fr-rCA/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index bff93ae20254..a3069a1e174f 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"L\'appareil recherche votre visage…"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Visage authentifié"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmé"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Touchez Confirmer pour terminer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'au lev. soleil"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Thème sombre"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Thème sombre\nÉconomiseur de pile"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Thème sombre"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Thème sombre\nÉconomiseur de pile"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string> diff --git a/packages/SystemUI/res/values-fr/config.xml b/packages/SystemUI/res/values-fr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 2dfddaa10ac1..b25f2fcbdbdd 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -24,7 +24,7 @@ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string> <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string> - <string name="battery_low_title" msgid="9187898087363540349">"Il est possible que vous soyez bientôt à court de batterie"</string> + <string name="battery_low_title" msgid="9187898087363540349">"La batterie est bientôt épuisée"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restants"</string> <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – Temps restant : environ <xliff:g id="TIME">%2$s</xliff:g>"</string> @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"À partir de <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mode sombre"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Thème foncé\nÉconomiseur de batterie"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Thème foncé"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Thème foncé\nÉconomiseur de batterie"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string> diff --git a/packages/SystemUI/res/values-gl/config.xml b/packages/SystemUI/res/values-gl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-gl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index e2401d2971ed..1a914e097655 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Buscando a túa cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Autenticouse a cara"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirmar para completar o proceso"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ata o amencer"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Desde: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Ata: <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema escuro\nAforro de batería"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema escuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema escuro\nAforro de batería"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A opción NFC está desactivada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A opción NFC está activada"</string> diff --git a/packages/SystemUI/res/values-gu/config.xml b/packages/SystemUI/res/values-gu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-gu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 8510e22bf5aa..7a1994aac22d 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"તમારો ચહેરો શોધી રહ્યાં છીએ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ચહેરાનું પ્રમાણીકરણ થયું"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"પુષ્ટિ કરી"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"પરીક્ષણ પૂર્ણ કરવા કન્ફર્મ કરોને ટૅપ કરો"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"સૂર્યોદય સુધી"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> વાગ્યે"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> સુધી"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ઘેરી થીમ"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ઘેરી થીમ\nબૅટરી સેવર"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ઘેરી થીમ"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ઘેરી થીમ\nબૅટરી સેવર"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC અક્ષમ કરેલ છે"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC સક્ષમ કરેલ છે"</string> diff --git a/packages/SystemUI/res/values-hi/config.xml b/packages/SystemUI/res/values-hi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index e9a737e79a1c..ef29f9bfd0a4 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"आपके चेहरे की पुष्टि की जा रही है"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"चेहरे की पुष्टि हो गई"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"पुष्टि हो गई"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"\'पुष्टि करें\' पर टैप करके पूरा करें"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सुबह तक चालू रहेगी"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> पर चालू की जाएगी"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> तक"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"गहरे रंग वाली थीम"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"गहरे रंग वाली थीम\nबैटरी सेवर"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"गहरे रंग वाली थीम"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"गहरे रंग वाली थीम\nबैटरी सेवर"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"एनएफ़सी"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC बंद है"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC चालू है"</string> @@ -635,7 +634,7 @@ <string name="notification_channel_minimized" msgid="1664411570378910931">"इन सूचनाओं को छोटा कर दिया जाएगा"</string> <string name="notification_channel_silenced" msgid="2877199534497961942">"ये सूचनाएं बिना आवाज़ के दिखाई जाएंगी"</string> <string name="notification_channel_unsilenced" msgid="4790904571552394137">"ये सूचनाएं आपको अलर्ट करेंगी"</string> - <string name="inline_blocking_helper" msgid="3055064577771478591">"अाप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string> + <string name="inline_blocking_helper" msgid="3055064577771478591">"आप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string> <string name="inline_done_button" msgid="492513001558716452">"हो गया"</string> <string name="inline_ok_button" msgid="975600017662930615">"लागू करें"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ये सूचनाएं दिखाना जारी रखें?"</string> diff --git a/packages/SystemUI/res/values-hr/config.xml b/packages/SystemUI/res/values-hr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 35480c2f4152..2954de21b334 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -378,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tamna tema\nŠtednja baterije"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tamna tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tamna tema\nŠtednja baterije"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> diff --git a/packages/SystemUI/res/values-hu/config.xml b/packages/SystemUI/res/values-hu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index db019358f5f3..e7e039e930cb 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Napfelkeltéig"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bekapcsolás: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Eddig: <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Sötét téma"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Sötét téma\nAkkumulátorkímélő mód"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Sötét téma"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Sötét téma\nAkkumulátorkímélő mód"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Az NFC ki van kapcsolva"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Az NFC be van kapcsolva"</string> diff --git a/packages/SystemUI/res/values-hy/config.xml b/packages/SystemUI/res/values-hy/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hy/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 1bbe35799be2..6d614b1e3f45 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Դեմքի նույնականացում"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Դեմքը ճանաչվեց"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Հաստատվեց"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ավարտելու համար հպեք «Հաստատել»"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքի սկաներին"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Մինչև լուսաբաց"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Կմիացվի ժամը <xliff:g id="TIME">%s</xliff:g>-ին"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Մինչև <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Մուգ թեմա"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Մուգ թեմա\nՄարտկոցի տնտեսում"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Մուգ թեմա"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Մուգ թեմա\nՄարտկոցի տնտեսում"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-ն անջատված է"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-ն միացված է"</string> diff --git a/packages/SystemUI/res/values-in/config.xml b/packages/SystemUI/res/values-in/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-in/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index fd4959ac741e..59b6eb3b98e7 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -72,7 +72,7 @@ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan screenshot..."</string> <string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan screenshot..."</string> <string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot disimpan"</string> - <string name="screenshot_saved_text" msgid="7574667448002050363">"Tap untuk melihat screenshot"</string> + <string name="screenshot_saved_text" msgid="7574667448002050363">"Ketuk untuk melihat screenshot"</string> <string name="screenshot_failed_title" msgid="7612509838919089748">"Tidak dapat menyimpan screenshot"</string> <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Coba ambil screenshot lagi"</string> <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Tidak dapat menyimpan screenshot karena ruang penyimpanan terbatas"</string> @@ -119,12 +119,12 @@ <string name="cancel" msgid="6442560571259935130">"Batal"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string> <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Coba lagi"</string> - <string name="biometric_dialog_empty_space_description" msgid="7997936968009073717">"Area kosong. Tap untuk membatalkan autentikasi"</string> + <string name="biometric_dialog_empty_space_description" msgid="7997936968009073717">"Area kosong. Ketuk untuk membatalkan autentikasi"</string> <string name="biometric_dialog_face_icon_description_idle" msgid="4497694707475970790">"Coba lagi"</string> <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Mencari wajah Anda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Wajah diautentikasi"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Dikonfirmasi"</string> - <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Konfirmasi untuk menyelesaikan"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ketuk Konfirmasi untuk menyelesaikan"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string> @@ -298,7 +298,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Tap lama ikon untuk opsi lainnya"</string> + <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Sentuh lama ikon untuk opsi lainnya"</string> <string name="quick_settings_dnd_label" msgid="7112342227663678739">"Jangan Ganggu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Hanya untuk prioritas"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Hanya alarm"</string> @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Sampai pagi"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktif pada <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema Gelap"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema Gelap\nPenghemat baterai"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema gelap"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema gelap\nPenghemat baterai"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dinonaktifkan"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC diaktifkan"</string> @@ -399,7 +399,7 @@ <string name="zen_silence_introduction" msgid="3137882381093271568">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir."</string> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifikasi kurang darurat di bawah"</string> - <string name="notification_tap_again" msgid="7590196980943943842">"Tap lagi untuk membuka"</string> + <string name="notification_tap_again" msgid="7590196980943943842">"Ketuk lagi untuk membuka"</string> <string name="keyguard_unlock" msgid="6035822649218712063">"Geser ke atas untuk membuka"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Perangkat ini dikelola oleh organisasi"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Perangkat ini dikelola oleh <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> @@ -537,13 +537,13 @@ <string name="volume_odi_captions_hint_disable" msgid="8980842810619956593">"nonaktifkan"</string> <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ganti perangkat keluaran"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Layar dipasangi pin"</string> - <string name="screen_pinning_description" msgid="8909878447196419623">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Ringkasan untuk melepas pin."</string> - <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Beranda untuk melepas pin."</string> + <string name="screen_pinning_description" msgid="8909878447196419623">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Ringkasan untuk melepas pin."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Beranda untuk melepas pin."</string> <string name="screen_pinning_description_gestural" msgid="1191513974909607884">"Ini akan terus ditampilkan sampai Anda melepas pin. Geser ke atas & tahan untuk melepas pin."</string> - <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Ringkasan untuk melepas pin."</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Beranda untuk melepas pin."</string> - <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Ringkasan"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Beranda"</string> + <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Ringkasan untuk melepas pin."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Beranda untuk melepas pin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk melepas pin layar ini, sentuh lama tombol Kembali dan Ringkasan"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk melepas pin layar ini, sentuh lama tombol Kembali dan Beranda"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Mengerti"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Lain kali"</string> <string name="screen_pinning_start" msgid="1022122128489278317">"Layar dipasangi pin"</string> @@ -566,11 +566,11 @@ <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Nonaktifkan"</string> <string name="qs_status_phone_vibrate" msgid="204362991135761679">"Ponsel mode getar"</string> <string name="qs_status_phone_muted" msgid="5437668875879171548">"Ponsel dimatikan suaranya"</string> - <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap untuk menyuarakan."</string> - <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string> - <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string> - <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap untuk menyetel agar bergetar."</string> - <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap untuk menonaktifkan."</string> + <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketuk untuk menyuarakan."</string> + <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string> + <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string> + <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ketuk untuk menyetel agar bergetar."</string> + <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ketuk untuk menonaktifkan."</string> <string name="volume_ringer_hint_mute" msgid="9199811307292269601">"Tanpa suara"</string> <string name="volume_ringer_hint_unmute" msgid="6602880133293060368">"aktifkan"</string> <string name="volume_ringer_hint_vibrate" msgid="4036802135666515202">"getar"</string> @@ -805,8 +805,8 @@ <string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"Atas 50%"</string> <string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"Atas 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"Layar penuh di bawah"</string> - <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Posisi <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Tap dua kali untuk mengedit."</string> - <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. Tap dua kali untuk menambahkan."</string> + <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Posisi <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Ketuk dua kali untuk mengedit."</string> + <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. Ketuk dua kali untuk menambahkan."</string> <string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"Pindahkan <xliff:g id="TILE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"Hapus <xliff:g id="TILE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add" msgid="3520406665865985109">"Tambahkan <xliff:g id="TILE_NAME">%1$s</xliff:g> ke posisi <xliff:g id="POSITION">%2$d</xliff:g>"</string> @@ -873,7 +873,7 @@ <string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string> <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string> <string name="instant_apps_message" msgid="1183313016396018086">"Aplikasi dapat dibuka tanpa perlu diinstal."</string> - <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikasi dapat dibuka tanpa perlu diinstal. Tap untuk mempelajari lebih lanjut."</string> + <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Aplikasi dapat dibuka tanpa perlu diinstal. Ketuk untuk mempelajari lebih lanjut."</string> <string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string> <string name="go_to_web" msgid="2650669128861626071">"Buka browser"</string> <string name="mobile_data" msgid="7094582042819250762">"Data seluler"</string> @@ -889,7 +889,7 @@ <string name="qs_dnd_keep" msgid="1825009164681928736">"Simpan"</string> <string name="qs_dnd_replace" msgid="8019520786644276623">"Ganti"</string> <string name="running_foreground_services_title" msgid="381024150898615683">"Aplikasi yang sedang berjalan di latar belakang"</string> - <string name="running_foreground_services_msg" msgid="6326247670075574355">"Tap untuk melihat detail penggunaan baterai dan data"</string> + <string name="running_foreground_services_msg" msgid="6326247670075574355">"Ketuk untuk melihat detail penggunaan baterai dan data"</string> <string name="mobile_data_disable_title" msgid="1068272097382942231">"Nonaktifkan kuota?"</string> <string name="mobile_data_disable_message" msgid="4756541658791493506">"Anda tidak akan dapat mengakses data atau internet melalui <xliff:g id="CARRIER">%s</xliff:g>. Internet hanya akan tersedia melalui Wi-Fi."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6078110473451946831">"Operator Seluler Anda"</string> @@ -900,7 +900,7 @@ <string name="slice_permission_checkbox" msgid="7986504458640562900">"Izinkan <xliff:g id="APP">%1$s</xliff:g> menampilkan potongan dari aplikasi apa pun"</string> <string name="slice_permission_allow" msgid="2340244901366722709">"Izinkan"</string> <string name="slice_permission_deny" msgid="7683681514008048807">"Tolak"</string> - <string name="auto_saver_title" msgid="1217959994732964228">"Tap untuk menjadwalkan Penghemat Baterai"</string> + <string name="auto_saver_title" msgid="1217959994732964228">"Ketuk untuk menjadwalkan Penghemat Baterai"</string> <string name="auto_saver_text" msgid="2563289953551438248">"Aktifkan jika daya baterai kemungkinan akan habis"</string> <string name="no_auto_saver_action" msgid="8086002101711328500">"Tidak, terima kasih"</string> <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Jadwal Penghemat Baterai diaktifkan"</string> @@ -918,7 +918,7 @@ <string name="sensor_privacy_mode" msgid="8982771253020769598">"Sensor nonaktif"</string> <string name="device_services" msgid="1191212554435440592">"Layanan Perangkat"</string> <string name="music_controls_no_title" msgid="5236895307087002011">"Tanpa judul"</string> - <string name="restart_button_description" msgid="2035077840254950187">"Tap untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> + <string name="restart_button_description" msgid="2035077840254950187">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> <string name="bubbles_deep_link_button_description" msgid="8895837143057564517">"Buka <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubbles_settings_button_description" msgid="2970630476657287189">"Setelan untuk balon <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubbles_prompt" msgid="8807968030159469710">"Izinkan balon dari <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-is/config.xml b/packages/SystemUI/res/values-is/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-is/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index e4741514a1fa..0076add53045 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til sólarupprásar"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kveikt klukkan <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til klukkan <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dökkt þema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dökkt þema\nRafhlöðusparnaður"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Dökkt þema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Dökkt þema\nRafhlöðusparnaður"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Slökkt á NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Kveikt á NFC"</string> diff --git a/packages/SystemUI/res/values-it/config.xml b/packages/SystemUI/res/values-it/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-it/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 752b81c4671c..78d3d8a0aaa6 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fino all\'alba"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dalle <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fino alle <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema scuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema scuro\nRisparmio energetico"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema scuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema scuro\nRisparmio energetico"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC non attiva"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC attiva"</string> diff --git a/packages/SystemUI/res/values-iw/config.xml b/packages/SystemUI/res/values-iw/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-iw/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index e891edd368a5..3a1525ccc981 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"המערכת מחפשת את הפנים שלך"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"זיהוי הפנים בוצע"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"מאושר"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"יש להקיש על \'אישור\' לסיום"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"עד הזריחה"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"מופעל בשעה <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"עד <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"עיצוב כהה"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"עיצוב כהה\nלחיסכון בסוללה"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"עיצוב כהה"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"עיצוב כהה\nחיסכון בסוללה"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC מושבת"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC מופעל"</string> diff --git a/packages/SystemUI/res/values-ja/config.xml b/packages/SystemUI/res/values-ja/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ja/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ff9426ad0966..51e19a2955b2 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"顔を認証中です"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"顔を認証しました"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"確認しました"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"完了するには [確認] をタップしてください"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"日の出まで"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> まで"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ダークテーマ"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ダークテーマ\nバッテリー セーバー"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ダークテーマ"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ダークテーマ\nバッテリー セーバー"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string> diff --git a/packages/SystemUI/res/values-ka/config.xml b/packages/SystemUI/res/values-ka/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ka/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index a28ea06f5a47..058f23351bd8 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"მიმდინარეობს თქვენი სახის ძებნა"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"სახის ამოცნობილია"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"დადასტურებული"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"დასასრულებლად შეეხეთ „დადასტურებას“"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string> @@ -136,9 +135,9 @@ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth კავშირი გაწყვეტილია."</string> <string name="accessibility_no_battery" msgid="358343022352820946">"ბატარეა დამჯდარია."</string> <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ბატარეია ერთ ზოლზეა."</string> - <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ელემენტი ორ ზოლზე."</string> - <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ელემენტი სამ ზოლზე."</string> - <string name="accessibility_battery_full" msgid="8909122401720158582">"ელემენტი სავსეა."</string> + <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ბატარეა ორ ზოლზე."</string> + <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ბატარეა სამ ზოლზე."</string> + <string name="accessibility_battery_full" msgid="8909122401720158582">"ბატარეა სავსეა."</string> <string name="accessibility_no_phone" msgid="4894708937052611281">"ტელეფონი არ არის."</string> <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ტელეფონის სიგნალი ერთ ზოლზეა."</string> <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ტელეფონის სიგნალი ორ ზოლზეა."</string> @@ -226,7 +225,7 @@ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi გამორთულია."</string> <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi ჩართულია."</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"მობილურის <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> - <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ელემენტი: <xliff:g id="STATE">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ბატარეა: <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"თვითმფრინავის რეჟიმი გამორთულია."</string> <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"თვითმფრინავის რეჟიმი ჩართულია."</string> <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"თვითმფრინავის რეჟიმი გამოირთო."</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"მზის ამოსვლამდე"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ჩაირთოს <xliff:g id="TIME">%s</xliff:g>-ზე"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>-მდე"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"მუქი თემა"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"მუქი თემა\nბატარეის დამზოგი"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"მუქი თემა"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"მუქი თემა\nბატარეის დამზოგი"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC გათიშულია"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ჩართულია"</string> @@ -531,7 +530,7 @@ <string name="accessibility_volume_settings" msgid="4915364006817819212">"ხმის პარამეტრები"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"გავრცობა"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ჩაკეცვა"</string> - <string name="volume_odi_captions_tip" msgid="1193653197906918269">"ავტომატური სუბტიტრების მედია"</string> + <string name="volume_odi_captions_tip" msgid="1193653197906918269">"მედიის ავტომ. სუბტიტრირება"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="1163987066404128967">"მინიშნება სუბტიტრებისთვის"</string> <string name="volume_odi_captions_content_description" msgid="2950736796270214785">"სუბტიტრების გადაფარვა"</string> <string name="volume_odi_captions_hint_enable" msgid="49750248924730302">"ჩართვა"</string> diff --git a/packages/SystemUI/res/values-kk/config.xml b/packages/SystemUI/res/values-kk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-kk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b17154aeec6c..1b201ddf37dc 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Құрылғы бетіңізді талдап жатыр."</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Бет танылды."</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Расталды"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Аяқтау үшін \"Растау\" түймесін түртіңіз."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Күн шыққанға дейін"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> дейін"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Қараңғы тақырып"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Қараңғы тақырып\nBattery saver"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Қараңғы тақырып"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Қараңғы тақырып\nBattery saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өшірулі"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC қосулы"</string> diff --git a/packages/SystemUI/res/values-km/config.xml b/packages/SystemUI/res/values-km/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-km/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 674036e2ea91..a9ff164e5cd3 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"កំពុងផ្ទៀងផ្ទាត់មុខរបស់អ្នក"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"បានផ្ទៀងផ្ទាត់មុខ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"បានបញ្ជាក់"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ចុច \"បញ្ជាក់\" ដើម្បីបញ្ចប់"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"រហូតដល់ពេលថ្ងៃរះ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"រចនាប័ទ្មងងឹត"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"រចនាប័ទ្មងងឹត\nកម្មវិធីសន្សំថ្ម"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"រចនាប័ទ្មងងឹត"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"រចនាប័ទ្មងងឹត\nកម្មវិធីសន្សំថ្ម"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"បានបិទ NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"បានបើក NFC"</string> diff --git a/packages/SystemUI/res/values-kn/config.xml b/packages/SystemUI/res/values-kn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-kn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index a107db476e1b..e3f387992976 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ನಿಮ್ಮ ಮುಖದ ದೃಢೀಕರಣಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ಪೂರ್ಣಗೊಳಿಸಲು ದೃಢೀಕರಿಸಿ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ಸೂರ್ಯೋದಯದ ತನಕ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ಸಮಯದಲ್ಲಿ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೂ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ಡಾರ್ಕ್ ಥೀಮ್"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ಡಾರ್ಕ್ ಥೀಮ್\nಬ್ಯಾಟರಿ ಸೇವರ್"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ಡಾರ್ಕ್ ಥೀಮ್"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ಡಾರ್ಕ್ ಥೀಮ್\nಬ್ಯಾಟರಿ ಸೇವರ್"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/config.xml b/packages/SystemUI/res/values-ko/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ko/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 5115e3e8644c..75af4f142ae9 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"얼굴을 찾는 중"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"얼굴이 인증되었습니다."</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"확인함"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"완료하려면 확인을 탭하세요."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"일출까지"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>에"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>까지"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"어두운 테마"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"어두운 테마\n절전 모드"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"어두운 테마"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"어두운 테마\n절전 모드"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 사용 중지됨"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 사용 설정됨"</string> @@ -653,7 +652,7 @@ <string name="notification_silence_title" msgid="5763240612242137433">"무음"</string> <string name="notification_alert_title" msgid="8031196611815490340">"주의를 끄는 알림"</string> <string name="notification_channel_summary_low" msgid="3387466082089715555">"소리나 진동 없이 집중할 수 있도록 도와줍니다"</string> - <string name="notification_channel_summary_default" msgid="5994062840431965586">"소리나 진동으로 주의를 끕니다"</string> + <string name="notification_channel_summary_default" msgid="5994062840431965586">"소리나 진동으로 알립니다."</string> <string name="notification_unblockable_desc" msgid="4556908766584964102">"이 알림은 수정할 수 없습니다."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"이 알림 그룹은 여기에서 설정할 수 없습니다."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"프록시를 통한 알림"</string> diff --git a/packages/SystemUI/res/values-ky/config.xml b/packages/SystemUI/res/values-ky/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ky/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 204d4fb1ec32..b094746730bf 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Жүзүңүз изделүүдө"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Жүздүн аныктыгы текшерилди"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Ырасталды"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Бүтүрүү үчүн \"Ырастоо\" баскычын басыңыз"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Күн чыкканга чейин"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Саат <xliff:g id="TIME">%s</xliff:g> күйөт"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> чейин"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Түнкү режим"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Түнкү режим\nБатареяны үнөмдөгүч"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Түнкү режим"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Түнкү режим\nБатареяны үнөмдөгүч"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өчүрүлгөн"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC иштетилген"</string> @@ -651,9 +650,9 @@ <string name="inline_turn_off_notifications" msgid="8635596135532202355">"Билдирмелерди өчүрүү"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Бул колдонмонун эскертмелери көрсөтүлө берсинби?"</string> <string name="notification_silence_title" msgid="5763240612242137433">"Үнсүз"</string> - <string name="notification_alert_title" msgid="8031196611815490340">"Шашылыш билдирме"</string> + <string name="notification_alert_title" msgid="8031196611815490340">"Шашылыш билдирүү"</string> <string name="notification_channel_summary_low" msgid="3387466082089715555">"Үн же дирилдөөсүз ой топтоого жардам берет."</string> - <string name="notification_channel_summary_default" msgid="5994062840431965586">"Үн чыгарып же дирилдеп көңүлүңүздү бурат."</string> + <string name="notification_channel_summary_default" msgid="5994062840431965586">"Билдирүүдөн үн чыгат же дирилдейт."</string> <string name="notification_unblockable_desc" msgid="4556908766584964102">"Бул билдирмелерди өзгөртүүгө болбойт."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Прокси билдирмеси"</string> diff --git a/packages/SystemUI/res/values-lo/config.xml b/packages/SystemUI/res/values-lo/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lo/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 3fb107f75a7c..7bf95b19b748 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ກຳລັງເບິ່ງໃບໜ້າຂອງທ່ານ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ຢືນຢັນແລ້ວ"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ແຕະຢືນຢັນເພື່ອສຳເລັດ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມື"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ຈົນກວ່າຕາເວັນຂຶ້ນ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ເປີດຕອນ <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"ຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ຮູບແບບສີສັນມືດ"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ຮູບແບບສີສັນມືດ\nຕົວປະຢັດແບັດເຕີຣີ"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ຮູບແບບສີສັນມືດ"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ຮູບແບບສີສັນມືດ\nຕົວປະຢັດແບັດເຕີຣີ"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> diff --git a/packages/SystemUI/res/values-lt/config.xml b/packages/SystemUI/res/values-lt/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lt/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index cec34d55bedc..fb5ec206ca7d 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ieškoma veido"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Veidas autentifikuotas"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Patvirtinta"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Paliesk. „Patvirtinti“, kad užbaigtumėte"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite piršto antspaudo jutiklį"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Piršto antspaudo piktograma"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Iki saulėtekio"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Iki <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamsioji tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tamsioji tema\nAkum. tausojimo priemonė"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tamsioji tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tamsioji tema\nAkumul. tausojimo priemonė"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"ALR"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"ALR išjungtas"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"ALR įjungtas"</string> diff --git a/packages/SystemUI/res/values-lv/config.xml b/packages/SystemUI/res/values-lv/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lv/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index b4161364826e..581b68a02c64 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Tiek meklēta jūsu seja"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Seja autentificēta"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Apstiprināts"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Lai pabeigtu, pieskarieties Apstiprināt"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string> @@ -379,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Līdz saullēktam"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Plkst. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Līdz <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tumšais motīvs"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tumšais motīvs\nJaudas taupīšanas režīms"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tumšais motīvs"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tumšais motīvs\nJaudas taupīšanas režīms"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ir atspējoti"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ir iespējoti"</string> diff --git a/packages/SystemUI/res/values-mk/config.xml b/packages/SystemUI/res/values-mk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 197c2d74c475..d745f8a021e8 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрејсонце"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ќе се вклучи во <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Темна тема"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Темна тема\nШтедач на батерија"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Темна тема"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Темна тема\nШтедач на батерија"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC е оневозможено"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC е овозможено"</string> diff --git a/packages/SystemUI/res/values-ml/config.xml b/packages/SystemUI/res/values-ml/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ml/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index b6f4100d3afc..eeaf0f9d3367 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"നിങ്ങളുടെ മുഖത്തിന് വേണ്ടി തിരയുന്നു"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"സ്ഥിരീകരിച്ചു"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"പൂർത്തിയാക്കാൻ സ്ഥിരീകരിക്കുക ടാപ്പ് ചെയ്യൂ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്പർശിക്കുക"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"സൂര്യോദയം വരെ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-ന്"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> വരെ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ഇരുണ്ട തീം"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ഇരുണ്ട തീം\nബാറ്ററി ലാഭിക്കൽ"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ഇരുണ്ട തീം"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ഇരുണ്ട തീം\nബാറ്ററി ലാഭിക്കൽ"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC പ്രവർത്തനരഹിതമാക്കി"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string> diff --git a/packages/SystemUI/res/values-mn/config.xml b/packages/SystemUI/res/values-mn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index cc05bade8297..bd733ff048a0 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Таны царайг хайж байна"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Царайг баталгаажууллаа"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Баталгаажсан"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Дуусгахын тулд баталгаажуулахыг товших"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Нар мандах хүртэл"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-д"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> хүртэл"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Бараан загвар"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Бараан загвар\nБатарей хэмнэгч"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Бараан загвар"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Бараан загвар\nБатарей хэмнэгч"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-г цуцалсан"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-г идэвхжүүлсэн"</string> diff --git a/packages/SystemUI/res/values-mr/config.xml b/packages/SystemUI/res/values-mr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index bcc9b4448f63..20f638d04077 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"तुमचा चेहरा शोधत आहे"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"चेहरा ऑथेंटिकेशन केलेला आहे"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"निश्चित केले"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"पूर्ण करण्यासाठी खात्री करा वर टॅप करा"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयापर्यंत"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> वाजता चालू"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> पर्यंत"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"गडद थीम"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"गडद थीम\nबॅटरी सेव्हर"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"गडद थीम"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"गडद थीम\nबॅटरी सेव्हर"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC अक्षम केले आहे"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC सक्षम केले आहे"</string> diff --git a/packages/SystemUI/res/values-ms/config.xml b/packages/SystemUI/res/values-ms/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ms/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 76eafd005ed9..f58ea18619e1 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Mencari wajah anda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Wajah disahkan"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Disahkan"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ketik Sahkan untuk menyelesaikan"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hingga matahari terbit"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema Gelap"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema Gelap\nPenjimat bateri"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema gelap"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema gelap\nPenjimat bateri"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dilumpuhkan"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC didayakan"</string> diff --git a/packages/SystemUI/res/values-my/config.xml b/packages/SystemUI/res/values-my/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-my/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index aec376fcd429..19a9d1c96c2b 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -124,7 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"သင့်မျက်နှာကို ရှာနေသည်"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"အတည်ပြုပြီးပြီ"</string> - <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"အပြီးသတ်ရန်အတွက် \'အတည်ပြုရန်း ကို တို့ပါ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"အပြီးသတ်ရန်အတွက် \'အတည်ပြုရန်\' ကို တို့ပါ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string> @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"နေထွက်ချိန် အထိ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> တွင် ဖွင့်ရန်"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> အထိ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"မှောင်သည့် အပြင်အဆင်"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"မှောင်သည့် အပြင်အဆင်\nဘက်ထရီ အားထိန်း"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"မှောင်သည့် အပြင်အဆင်"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"မှောင်သည့် အပြင်အဆင်\nဘက်ထရီ အားထိန်း"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ကို ပိတ်ထားသည်"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ကို ဖွင့်ထားသည်"</string> diff --git a/packages/SystemUI/res/values-nb/config.xml b/packages/SystemUI/res/values-nb/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-nb/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 29f47954de5e..4288f3489891 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ser etter ansiktet ditt"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Ansiktet er autentisert"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bekreftet"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Trykk på Bekreft for å fullføre"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til soloppgang"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På kl. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mørkt tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Mørkt tema\nBatterisparing"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Mørkt tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Mørkt tema\nBatterisparing"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er slått av"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er slått på"</string> diff --git a/packages/SystemUI/res/values-ne/config.xml b/packages/SystemUI/res/values-ne/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ne/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 989800fcee28..70ebfd8ee60c 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"तपाईंको अनुहार खोज्दै"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"अनुहार प्रमाणीकरण गरियो"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"पुष्टि भयो"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"पूरा गर्नका लागि पुष्टि गर्नुहोस् नामक विकल्पमा ट्याप गर्नुहोस्"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयसम्म"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> मा सक्रिय"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"अँध्यारो विषयवस्तु"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"अँध्यारो विषयवस्तु\nब्याट्री सेभर"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"अँध्यारो विषयवस्तु"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"अँध्यारो विषयवस्तु\nब्याट्री सेभर"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC लाई असक्षम पारिएको छ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC लाई सक्षम पारिएको छ"</string> diff --git a/packages/SystemUI/res/values-nl/config.xml b/packages/SystemUI/res/values-nl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-nl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index ebcb8df6cfe0..88f5bd4e87bf 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot zonsopgang"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Donker thema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Donker thema\nBatterijbesparing"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Donker thema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Donker thema\nBatterijbesparing"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is uitgeschakeld"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is ingeschakeld"</string> diff --git a/packages/SystemUI/res/values-or/config.xml b/packages/SystemUI/res/values-or/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-or/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 6110603c33b6..7bc49ce1c57e 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ଆପଣଙ୍କର ମୁହଁକୁ ପ୍ରମାଣ କରୁଛି"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ମୁହଁ ପ୍ରାମାଣିକତା ହୋଇଛି"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ସୁନିଶ୍ଚିତ କରାଯାଇଛି"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁରେ ଟାପ୍ କରନ୍ତୁ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଟିପଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ସୂର୍ଯ୍ୟୋଦୟ ପର୍ଯ୍ୟନ୍ତ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ରେ ଅନ୍ ହେବ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ଗାଢ଼ା ଥିମ୍"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ଗାଢ଼ା ଥିମ୍\nବ୍ୟାଟେରୀ ସେଭର୍"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ଗାଢ଼ ଥିମ୍"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ଗାଢ଼ ଥିମ୍\nବ୍ୟାଟେରୀ ସେଭର୍"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string> diff --git a/packages/SystemUI/res/values-pa/config.xml b/packages/SystemUI/res/values-pa/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pa/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 5ac8984baa7a..64e2d098c598 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਿਰਤ ਹੋਇਆ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ਪੂਰਾ ਕਰਨ ਲਈ ਪੁਸ਼ਟੀ ਕਰੋ \'ਤੇ ਟੈਪ ਕਰੋ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ਸੂਰਜ ਚੜ੍ਹਨ ਤੱਕ"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ਵਜੇ ਚਾਲੂ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ਤੱਕ"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ਗੂੜ੍ਹਾ ਥੀਮ"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ਗੂੜ੍ਹਾ ਥੀਮ\nਬੈਟਰੀ ਸੇਵਰ"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ਗੂੜ੍ਹਾ ਥੀਮ"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ਗੂੜ੍ਹਾ ਥੀਮ\nਬੈਟਰੀ ਸੇਵਰ"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string> @@ -650,7 +649,7 @@ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ਸੁਚੇਤ ਰਖੋ"</string> <string name="inline_turn_off_notifications" msgid="8635596135532202355">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> - <string name="notification_silence_title" msgid="5763240612242137433">"ਖਮੋਸ਼"</string> + <string name="notification_silence_title" msgid="5763240612242137433">"ਸ਼ਾਂਤ"</string> <string name="notification_alert_title" msgid="8031196611815490340">"ਸੁਚੇਤਨਾ"</string> <string name="notification_channel_summary_low" msgid="3387466082089715555">"ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਦੇ ਫੋਕਸ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ।"</string> <string name="notification_channel_summary_default" msgid="5994062840431965586">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ।"</string> diff --git a/packages/SystemUI/res/values-pl/config.xml b/packages/SystemUI/res/values-pl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 703ed7ee415e..8463773316a1 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -382,8 +382,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do wschodu słońca"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Włącz o <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Ciemny motyw"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Ciemny motywy\nOszczędzanie baterii"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Ciemny motyw"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Ciemny motyw\nOszczędzanie baterii"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"Komunikacja NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Komunikacja NFC jest wyłączona"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Komunikacja NFC jest włączona"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/config.xml b/packages/SystemUI/res/values-pt-rBR/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt-rBR/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 6915b888250d..c7e526371573 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até o nascer do sol"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema escuro\nEconomia de bateria"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema escuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema escuro\nEconomia de bateria"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/config.xml b/packages/SystemUI/res/values-pt-rPT/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt-rPT/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 4fdec7dca865..f60dcac34b53 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até ao amanhecer"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativada à(s) <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema escuro\nPoupança de bateria"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema escuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema escuro\nPoupança de bateria"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"O NFC está desativado"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"O NFC está ativado"</string> diff --git a/packages/SystemUI/res/values-pt/config.xml b/packages/SystemUI/res/values-pt/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 6915b888250d..c7e526371573 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até o nascer do sol"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema escuro\nEconomia de bateria"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema escuro"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema escuro\nEconomia de bateria"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string> diff --git a/packages/SystemUI/res/values-ro/config.xml b/packages/SystemUI/res/values-ro/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ro/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 8aeb3978dd73..e070fd4fa75f 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Se caută chipul"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Chip autentificat"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmat"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Atingeți Confirmați pentru a finaliza"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string> @@ -379,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Până la răsărit"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activată la <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Până la <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Temă întunecată"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Temă întunecată\nEconomisirea bateriei"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Temă întunecată"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Temă întunecată\nEconomisirea bateriei"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Serviciul NFC este dezactivat"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Serviciul NFC este activat"</string> diff --git a/packages/SystemUI/res/values-ru/config.xml b/packages/SystemUI/res/values-ru/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ru/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d2e5fea6b693..f895c02a7f53 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Распознавание лица"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лицо распознано"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Подтверждено"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Нажмите \"Подтвердить\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До рассвета"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Включить в <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тёмная тема"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Тёмная тема\nРежим энергосбережения"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Тёмная тема"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Тёмная тема\nРежим энергосбережения"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"Модуль NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Модуль NFC отключен"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Модуль NFC включен"</string> diff --git a/packages/SystemUI/res/values-si/config.xml b/packages/SystemUI/res/values-si/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-si/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 1364c4a3b808..9e002152383e 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ඔබේ මුහුණ සොයනු ලැබේ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"මුහුණ සත්යාපන කළා"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"තහවුරු කළා"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"සම්පූර්ණ කිරීමට තහවුරු කරන්න තට්ටු කර."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"හිරු නගින තෙක්"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ට ක්රියාත්මකයි"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> තෙක්"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"අඳුරු තේමාව"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"අඳුරු තේමාව\nබැටරි සුරැකුම"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"අඳුරු තේමාව"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"අඳුරු තේමාව\nබැටරි සුරැකුම"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC අබලයි"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC සබලයි"</string> diff --git a/packages/SystemUI/res/values-sk/config.xml b/packages/SystemUI/res/values-sk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index ac91a9bd4b26..dabe3308235f 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Hľadá sa vaša tvár"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Tvár bola overená"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrdené"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Overenie dokončíte klepnutím na Potvrdiť"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknite sa senzora odtlačkov prstov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do východu slnka"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Od <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tmavý motív"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tmavý motív\nŠetrič batérie"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tmavý motív"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tmavý motív\nŠetrič batérie"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je deaktivované"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je aktivované"</string> diff --git a/packages/SystemUI/res/values-sl/config.xml b/packages/SystemUI/res/values-sl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index b85d814d3b06..2958dc870feb 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Iskanje obraza"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Pristnost obraza je potrjena"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potrjeno"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Za dokončanje se dotaknite »Potrdite«"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do sončnega vzhoda"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Vklop ob <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Temna tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Temna tema\nVarčevanje energije"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Temna tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Temna tema\nVarčevanje z energijo akumul."</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Tehnologija NFC je onemogočena"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Tehnologija NFC je omogočena"</string> @@ -652,14 +651,14 @@ <string name="inline_minimize_button" msgid="966233327974702195">"Minimiraj"</string> <string name="inline_silent_button_silent" msgid="5315879183296940969">"Tiho"</string> <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Še naprej prikazuj brez zvoka"</string> - <string name="inline_silent_button_alert" msgid="6008435419895088034">"Z zvočnim opozorilom"</string> + <string name="inline_silent_button_alert" msgid="6008435419895088034">"Z opozorilom"</string> <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Še naprej opozarjaj"</string> <string name="inline_turn_off_notifications" msgid="8635596135532202355">"Izklopi obvestila"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite, da so obvestila te aplikacije še naprej prikazana?"</string> <string name="notification_silence_title" msgid="5763240612242137433">"Tiho"</string> - <string name="notification_alert_title" msgid="8031196611815490340">"Z zvočnim opozorilom"</string> + <string name="notification_alert_title" msgid="8031196611815490340">"Z opozorilom"</string> <string name="notification_channel_summary_low" msgid="3387466082089715555">"Nemoteč prikaz brez zvoka ali vibriranja"</string> - <string name="notification_channel_summary_default" msgid="5994062840431965586">"Pritegnitev pozornosti z zvokom ali vibriranjem"</string> + <string name="notification_channel_summary_default" msgid="5994062840431965586">"Pritegne vašo pozornost z zvokom ali vibriranjem"</string> <string name="notification_unblockable_desc" msgid="4556908766584964102">"Za ta obvestila ni mogoče spremeniti nastavitev."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Te skupine obvestil ni mogoče konfigurirati tukaj"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Posredovano obvestilo"</string> diff --git a/packages/SystemUI/res/values-sq/config.xml b/packages/SystemUI/res/values-sq/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sq/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 9728054d9585..1058d74ab2b1 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Po kërkon për fytyrën tënde"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Fytyra u vërtetua"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Konfirmuar"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Trokit \"Konfirmo\" për ta përfunduar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Deri në lindje të diellit"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktive në <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema e errët"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tema e errët\nKursyesi i baterisë"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tema e errët"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tema e errët\nKursyesi i baterisë"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC është çaktivizuar"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC është aktivizuar"</string> diff --git a/packages/SystemUI/res/values-sr/config.xml b/packages/SystemUI/res/values-sr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 44afafa8ada8..f1bf3c9e356d 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -378,8 +378,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изласка сунца"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Укључује се у <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тамна тема"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Тамна тема\nУштеда батерије"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Тамна тема"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Тамна тема\nУштеда батерије"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC је онемогућен"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC је омогућен"</string> diff --git a/packages/SystemUI/res/values-sv/config.xml b/packages/SystemUI/res/values-sv/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sv/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 887c068e1373..764ad50b69db 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Till soluppgången"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På från <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Till <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mörkt tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Mörkt tema\nBatterisparläge"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Mörkt tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Mörkt tema\nBatterisparläge"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC är inaktiverat"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC är aktiverat"</string> diff --git a/packages/SystemUI/res/values-sw/config.xml b/packages/SystemUI/res/values-sw/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sw/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 488d84a3b7dd..182caa4c09de 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Inatafuta uso wako"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Uso umethibitishwa"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Imethibitishwa"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Gusa Thibitisha ili ukamilishe"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hadi macheo"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Itawashwa saa <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hadi <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mandhari Meusi"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Mandhari Meusi\nKiokoa betri"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Mandhari meusi"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Mandhari meusi\nKiokoa betri"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC imezimwa"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC imewashwa"</string> diff --git a/packages/SystemUI/res/values-ta/config.xml b/packages/SystemUI/res/values-ta/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ta/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 2b3dc82e6135..9f8f45e44ebf 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"உங்கள் முகத்தை அங்கீகரிக்கிறது"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"முகம் அங்கீகரிக்கப்பட்டது"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"உறுதிப்படுத்தப்பட்டது"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"முடிக்க \'உறுதிப்படுத்து\' என்பதை தட்டவும்"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை சென்சாரைத் தொடவும்"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"காலை வரை"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>க்கு ஆன் செய்"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> வரை"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"டார்க் தீம்"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"டார்க் தீம்\nபேட்டரி சேமிப்பான்"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"டார்க் தீம்"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"டார்க் தீம்\nபேட்டரி சேமிப்பான்"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC முடக்கப்பட்டது"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC இயக்கப்பட்டது"</string> diff --git a/packages/SystemUI/res/values-te/config.xml b/packages/SystemUI/res/values-te/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-te/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index b61d3fa2bfdf..5717e02f0877 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"మీ ముఖాన్ని క్యాప్చర్ చేస్తోంది"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ముఖం ప్రామాణీకరించబడింది"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"నిర్ధారించబడింది"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"పూర్తి చేయడానికి \"నిర్ధారించు\" నొక్కండి"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"సూర్యోదయం వరకు"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>కి"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ముదురు రంగు థీమ్"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ముదురు రంగు థీమ్\nబ్యాటరీ సేవర్"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ముదురు రంగు థీమ్"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ముదురు రంగు థీమ్\nబ్యాటరీ సేవర్"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC నిలిపివేయబడింది"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ప్రారంభించబడింది"</string> diff --git a/packages/SystemUI/res/values-th/config.xml b/packages/SystemUI/res/values-th/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-th/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index e8831f5b895d..ce123a5d9736 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"กำลังมองหาใบหน้าของคุณ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ตรวจสอบสิทธิ์ใบหน้าแล้ว"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ยืนยันแล้ว"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"แตะยืนยันเพื่อดำเนินการให้เสร็จสมบูรณ์"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"จนพระอาทิตย์ขึ้น"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"เปิดเวลา <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"จนถึง <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ธีมสีเข้ม"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"ทีมสีเข้ม\nโหมดประหยัดแบตเตอรี่"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"ธีมสีเข้ม"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"ธีมสีเข้ม\nโหมดประหยัดแบตเตอรี่"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ถูกปิดใช้งาน"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"เปิดใช้งาน NFC แล้ว"</string> diff --git a/packages/SystemUI/res/values-tl/config.xml b/packages/SystemUI/res/values-tl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-tl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index bd537aa3a62f..0ab01d8858e1 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Hinahanap ang iyong mukha"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Na-authenticate ang mukha"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Nakumpirma"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"I-tap ang Kumpirmahin para kumpletuhin"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hanggang sunrise"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Mao-on sa ganap na <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hanggang <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Madilim na Tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Madilim na Tema\nPangtipid sa Baterya"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Madilim na tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Madilim na tema\nPangtipid sa baterya"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Naka-disable ang NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Naka-enable ang NFC"</string> diff --git a/packages/SystemUI/res/values-tr/config.xml b/packages/SystemUI/res/values-tr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-tr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 723e90a7bbd5..4e2a8913d307 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Yüzünüz aranıyor"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Yüz kimliği doğrulandı"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Onaylandı"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tamamlamak için Onayla\'ya dokunun"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Gün doğumuna kadar"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Şu saatte açılacak: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Şu saate kadar: <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Koyu Tema"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Koyu Tema\nPil tasarrufu"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Koyu tema"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Koyu tema\nPil tasarrufu"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC devre dışı"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC etkin"</string> diff --git a/packages/SystemUI/res/values-uk/config.xml b/packages/SystemUI/res/values-uk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-uk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index c9288b2b6951..0e74993874d4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Триває розпізнавання обличчя"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Обличчя автентифіковано"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Підтверджено"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Щоб завершити, натисніть \"Підтвердити\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string> @@ -381,8 +380,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До сходу сонця"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Вмикається о <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Темна тема"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Нічний режим\nЕнергозбереження"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Темна тема"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Темна тема\nЕнергозбереження"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC вимкнено"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ввімкнено"</string> diff --git a/packages/SystemUI/res/values-ur/config.xml b/packages/SystemUI/res/values-ur/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ur/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index c9b3ad64cc1e..b698fe468673 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"طلوع آفتاب تک"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"آن ہوگی بوقت <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> تک"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"گہری تھیم"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"گہری تھیم\nبیٹری سیور"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"گہری تھیم"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"گہری تھیم\nبیٹری سیور"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیر فعال ہے"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال ہے"</string> diff --git a/packages/SystemUI/res/values-uz/config.xml b/packages/SystemUI/res/values-uz/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-uz/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 5dc1e9f9bf38..c732d4c460e4 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Yuz tekshirilmoqda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Yuzingiz aniqlandi"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Tasdiqlangan"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tasdiqlash uchun tegining"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Quyosh chiqqunicha"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> da yoqish"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> gacha"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tungi mavzu"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Tungi mavzu\nQuvvat tejash"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Tungi mavzu"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Tungi mavzu\nQuvvat tejash"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC o‘chiq"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC yoniq"</string> diff --git a/packages/SystemUI/res/values-vi/config.xml b/packages/SystemUI/res/values-vi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-vi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index e9efa93a17ff..affca3d05f05 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Đang tìm khuôn mặt của bạn"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Đã xác thực khuôn mặt"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Ðã xác nhận"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Nhấn vào Xác nhận để hoàn tất"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Cho đến khi trời sáng"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bật vào lúc <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Cho đến <xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Giao diện tối"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Giao diện tối\nTrình tiết kiệm pin"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Giao diện tối"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Giao diện tối\nTrình tiết kiệm pin"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC đã được tắt"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC đã được bật"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/config.xml b/packages/SystemUI/res/values-zh-rCN/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rCN/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 69f66286732b..b3bf97366c15 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -124,11 +124,10 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在查找您的面孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"面孔身份验证成功"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"已确认"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"点按“确认”即可完成"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string> - <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找中…"</string> + <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找您的面孔…"</string> <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"面孔图标"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"兼容性缩放按钮。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"将小屏幕的图片放大在较大屏幕上显示。"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出时关闭"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"在<xliff:g id="TIME">%s</xliff:g> 开启"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"直到<xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主题背景"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"深色主题背景\n省电模式"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"深色主题背景"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"深色主题背景\n省电模式"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已启用"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/config.xml b/packages/SystemUI/res/values-zh-rHK/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rHK/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index dc27a592e099..59480a9d99ee 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在尋找您的臉孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"臉孔已經驗證"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"已確認"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"輕按 [確定] 以完成"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出時關閉"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"直到<xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主題背景"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"深色主題背景\n省電模式"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"深色主題背景"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"深色主題背景\n省電模式"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/config.xml b/packages/SystemUI/res/values-zh-rTW/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rTW/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index f594dcddf6e8..76377fec2e2c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -124,8 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在尋找你的臉孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"臉孔驗證成功"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"確認完畢"</string> - <!-- no translation found for biometric_dialog_tap_confirm (4540715260292022404) --> - <skip /> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"輕觸 [確認] 完成驗證設定"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string> @@ -377,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"於日出時關閉"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> 關閉"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主題"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"深色主題\n節約耗電量"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"深色主題"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"深色主題\n節約耗電量"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string> diff --git a/packages/SystemUI/res/values-zu/config.xml b/packages/SystemUI/res/values-zu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 72cd29b89dca..74b9143bbcce 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -376,8 +376,8 @@ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuze kube sekuphumeni kwelanga"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kuvulwe ngo-<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string> - <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Itimu emnyama"</string> - <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Itimu emnyama\nIsilondolozi sebethri"</string> + <string name="quick_settings_ui_mode_night_label" msgid="3419947801072692538">"Itimu emnyama"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="7438725724589758362">"Itimu emnyama\nIsilondolozi sebethri"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"I-NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"I-NFC ikhutshaziwe"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"I-NFC inikwe amandla"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index bb7614a261b5..a549870ec780 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -141,6 +141,9 @@ <!-- The number of milliseconds before the heads up notification auto-dismisses. --> <integer name="heads_up_notification_decay">5000</integer> + <!-- The number of milliseconds before the heads up notification sent automatically by the system auto-dismisses. --> + <integer name="auto_heads_up_notification_decay">3000</integer> + <!-- The number of milliseconds after a heads up notification is pushed back before the app can interrupt again. --> <integer name="heads_up_default_snooze_length_ms">60000</integer> @@ -197,25 +200,9 @@ <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations --> <integer name="doze_pickup_vibration_threshold">2000</integer> - <!-- Doze: can we assume the pickup sensor includes a proximity check? - This is ignored if doze_pickup_subtype_performs_proximity_check is not empty. - @deprecated: use doze_pickup_subtype_performs_proximity_check instead.--> + <!-- Doze: can we assume the pickup sensor includes a proximity check? --> <bool name="doze_pickup_performs_proximity_check">false</bool> - <!-- Doze: a list of pickup sensor subtypes that perform a proximity check before they trigger. - If not empty, either * or !* must appear to specify the default. - If empty, falls back to doze_pickup_performs_proximity_check. - - Examples: 1,2,3,!* -> subtypes 1,2 and 3 perform the check, all others don't. - !1,!2,* -> subtypes 1 and 2 don't perform the check, all others do. - !8,* -> subtype 8 does not perform the check, all others do - 1,1,* -> illegal, every item may only appear once - 1,!1,* -> illegal, no contradictions allowed - 1,2 -> illegal, need either * or !* - 1,,4a3 -> illegal, no empty or non-numeric terms allowed - --> - <string name="doze_pickup_subtype_performs_proximity_check"></string> - <!-- Type of a sensor that provides a low-power estimate of the desired display brightness, suitable to listen to while the device is asleep (e.g. during always-on display) --> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index afe6d9c2552b..f4970d073741 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -382,22 +382,16 @@ <!-- The width of the panel that holds the quick settings. --> <dimen name="qs_panel_width">@dimen/notification_panel_width</dimen> - <dimen name="volume_dialog_panel_transparent_padding_right">8dp</dimen> + <dimen name="volume_dialog_panel_transparent_padding_right">4dp</dimen> <dimen name="volume_dialog_panel_transparent_padding">20dp</dimen> <dimen name="volume_dialog_stream_padding">8dp</dimen> - <!-- the amount the volume panel should be offset at the end from the view next to it (or - the screen edge, in portrait--> - <dimen name="volume_dialog_base_margin">8dp</dimen> - <dimen name="volume_dialog_panel_width">64dp</dimen> <dimen name="volume_dialog_slider_height">116dp</dimen> - <dimen name="volume_dialog_row_height">252dp</dimen> - <dimen name="volume_dialog_ringer_size">64dp</dimen> <dimen name="volume_dialog_ringer_icon_padding">20dp</dimen> @@ -414,8 +408,6 @@ <dimen name="volume_dialog_row_margin_bottom">8dp</dimen> - <dimen name="volume_dialog_settings_icon_size">16dp</dimen> - <dimen name="volume_dialog_elevation">9dp</dimen> <dimen name="volume_tool_tip_right_margin">76dp</dimen> diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java index 209074812d7a..11d093f22840 100644 --- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java +++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java @@ -303,6 +303,11 @@ public class CarrierTextController { } } else { subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false); + if (subs == null) { + subs = new ArrayList<>(); + } else { + filterMobileSubscriptionInSameGroup(subs); + } } return subs; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f465003a273d..0a834c88d803 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -28,6 +28,7 @@ import static android.os.BatteryManager.EXTRA_MAX_CHARGING_CURRENT; import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE; import static android.os.BatteryManager.EXTRA_PLUGGED; import static android.os.BatteryManager.EXTRA_STATUS; +import static android.telephony.PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE; import android.annotation.AnyThread; import android.annotation.MainThread; @@ -70,6 +71,7 @@ import android.os.UserManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; +import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -382,6 +384,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } }; + private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED); + } + }; + private OnSubscriptionsChangedListener mSubscriptionListener = new OnSubscriptionsChangedListener() { @Override @@ -431,7 +440,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleSimSubscriptionInfoChanged() { if (DEBUG_SIM_STATES) { Log.v(TAG, "onSubscriptionInfoChanged()"); - List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(); + List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(false); if (sil != null) { for (SubscriptionInfo subInfo : sil) { Log.v(TAG, "SubInfo:" + subInfo); @@ -483,7 +492,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { public List<SubscriptionInfo> getSubscriptionInfo(boolean forceReload) { List<SubscriptionInfo> sil = mSubscriptionInfo; if (sil == null || forceReload) { - sil = mSubscriptionManager.getActiveSubscriptionInfoList(); + sil = mSubscriptionManager.getActiveSubscriptionInfoList(false); } if (sil == null) { // getActiveSubscriptionInfoList was null callers expect an empty list. @@ -1080,6 +1089,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + } else if (TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) { + mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED); } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals( action)) { mHandler.sendEmptyMessage(MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED); @@ -1490,6 +1501,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); + filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); @@ -1563,6 +1575,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled(); updateAirplaneModeState(); + + TelephonyManager telephony = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (telephony != null) { + telephony.listen(mPhoneStateListener, LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); + } } private void updateAirplaneModeState() { @@ -1665,12 +1683,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { strongAuth == StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT || strongAuth == StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; + boolean canBypass = mKeyguardBypassController != null + && mKeyguardBypassController.canBypass(); // There's no reason to ask the HAL for authentication when the user can dismiss the // bouncer, unless we're bypassing and need to auto-dismiss the lock screen even when // TrustAgents or biometrics are keeping the device unlocked. - boolean bypassEnabled = mKeyguardBypassController != null - && mKeyguardBypassController.getBypassEnabled(); - boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || bypassEnabled; + boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass; // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware. diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9edb54c146df..9e2464ea4fbb 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -15,8 +15,6 @@ */ package com.android.keyguard.clock; -import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.CLOCK_FACE_BLACKLIST; - import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; @@ -26,12 +24,9 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; -import android.provider.DeviceConfig; import android.provider.Settings; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import androidx.annotation.VisibleForTesting; @@ -47,12 +42,10 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Supplier; -import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -74,8 +67,6 @@ public final class ClockManager { private final Handler mMainHandler = new Handler(Looper.getMainLooper()); private final CurrentUserObservable mCurrentUserObservable; - private final ArraySet<String> mBlacklistedClockPlugins = new ArraySet<>(); - /** * Observe settings changes to know when to switch the clock face. */ @@ -164,41 +155,6 @@ public final class ClockManager { DisplayMetrics dm = res.getDisplayMetrics(); mWidth = dm.widthPixels; mHeight = dm.heightPixels; - - updateBlackList(); - registerDeviceConfigListener(); - } - - private void updateBlackList() { - String blacklist = getBlackListFromConfig(); - - mBlacklistedClockPlugins.clear(); - if (blacklist != null && !blacklist.isEmpty()) { - mBlacklistedClockPlugins.addAll(Arrays.asList(blacklist.split(","))); - } - } - - String getBlackListFromConfig() { - return DeviceConfig.getString( - DeviceConfig.NAMESPACE_SYSTEMUI, CLOCK_FACE_BLACKLIST, null); - } - - private void registerDeviceConfigListener() { - DeviceConfig.addOnPropertiesChangedListener( - DeviceConfig.NAMESPACE_SYSTEMUI, - r -> mMainHandler.post(r), - properties -> onDeviceConfigPropertiesChanged(properties.getNamespace())); - } - - void onDeviceConfigPropertiesChanged(String namespace) { - if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) { - Log.e(TAG, "Received update from DeviceConfig for unrelated namespace: " - + namespace); - return; - } - - updateBlackList(); - reload(); } /** @@ -350,12 +306,10 @@ public final class ClockManager { } /** - * Get information about clock faces which are available and not in blacklist. + * Get information about available clock faces. */ List<ClockInfo> getInfo() { - return mClockInfo.stream() - .filter(info -> !mBlacklistedClockPlugins.contains(info.getId())) - .collect(Collectors.toList()); + return mClockInfo; } /** @@ -407,7 +361,7 @@ public final class ClockManager { if (ClockManager.this.isDocked()) { final String name = mSettingsWrapper.getDockedClockFace( mCurrentUserObservable.getCurrentUser().getValue()); - if (name != null && !mBlacklistedClockPlugins.contains(name)) { + if (name != null) { plugin = mClocks.get(name); if (plugin != null) { return plugin; @@ -416,7 +370,7 @@ public final class ClockManager { } final String name = mSettingsWrapper.getLockScreenCustomClockFace( mCurrentUserObservable.getCurrentUser().getValue()); - if (name != null && !mBlacklistedClockPlugins.contains(name)) { + if (name != null) { plugin = mClocks.get(name); } return plugin; diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 67ff0e7daa11..4d42e0c66817 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.annotation.NonNull; import android.app.AlarmManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -56,6 +57,7 @@ import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl; +import com.android.systemui.statusbar.phone.KeyguardLiftController; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationIconAreaController; @@ -66,6 +68,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeDialogComponent; @@ -224,6 +227,18 @@ public class SystemUIFactory { @Singleton @Provides + @Nullable + public KeyguardLiftController provideKeyguardLiftController(Context context, + StatusBarStateController statusBarStateController, + AsyncSensorManager asyncSensorManager) { + if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { + return null; + } + return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager); + } + + @Singleton + @Provides public NotificationListener provideNotificationListener(Context context) { return new NotificationListener(context); } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index cdcf66040f2f..cf04b7f192e4 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -76,6 +76,8 @@ public class DozeSensors { private final ProxSensor mProxSensor; private long mDebounceFrom; private boolean mSettingRegistered; + private boolean mListening; + private boolean mPaused; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, @@ -100,9 +102,12 @@ public class DozeSensors { mPickupSensor = new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE), Settings.Secure.DOZE_PICK_UP_GESTURE, + true /* settingDef */, config.dozePickupSensorAvailable(), DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */, - false /* touchscreen */), + false /* touchscreen */, + false /* ignoresSetting */, + mDozeParameters.getPickupPerformsProxCheck()), new TriggerSensor( findSensorWithType(config.doubleTapSensorType()), Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, @@ -127,15 +132,15 @@ public class DozeSensors { true /* touchscreen */), new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY), - Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, + Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, mConfig.wakeScreenGestureAvailable() && alwaysOn, DozeLog.REASON_SENSOR_WAKE_UP, false /* reports touch coordinates */, false /* touchscreen */), new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN), - Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, - mConfig.wakeScreenGestureAvailable() && alwaysOn, + Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, + mConfig.wakeScreenGestureAvailable(), DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, false /* reports touch coordinates */, false /* touchscreen */, mConfig.getWakeLockScreenDebounce()), @@ -170,11 +175,49 @@ public class DozeSensors { return null; } + /** + * If sensors should be registered and sending signals. + */ public void setListening(boolean listen) { + if (mListening == listen) { + return; + } + mListening = listen; + updateListening(); + } + + /** + * Unregister sensors, when listening, unless they are prox gated. + * @see #setListening(boolean) + */ + public void setPaused(boolean paused) { + if (mPaused == paused) { + return; + } + mPaused = paused; + updateListening(); + } + + private void updateListening() { + boolean anyListening = false; for (TriggerSensor s : mSensors) { + // We don't want to be listening while we're PAUSED (prox sensor is covered) + // except when the sensor is already gated by prox. + boolean listen = mListening && (!mPaused || s.performsProxCheck()); s.setListening(listen); + if (listen) { + anyListening = true; + } + } + + if (!anyListening) { + mResolver.unregisterContentObserver(mSettingsObserver); + } else if (!mSettingRegistered) { + for (TriggerSensor s : mSensors) { + s.registerSettingsObserver(mSettingsObserver); + } } - registerSettingsObserverIfNeeded(listen); + mSettingRegistered = anyListening; } /** Set the listening state of only the sensors that require the touchscreen. */ @@ -236,17 +279,6 @@ public class DozeSensors { return mProxSensor.mCurrentlyFar; } - private void registerSettingsObserverIfNeeded(boolean register) { - if (!register) { - mResolver.unregisterContentObserver(mSettingsObserver); - } else if (!mSettingRegistered) { - for (TriggerSensor s : mSensors) { - s.registerSettingsObserver(mSettingsObserver); - } - } - mSettingRegistered = register; - } - private class ProxSensor implements SensorEventListener { boolean mRequested; @@ -334,10 +366,11 @@ public class DozeSensors { final Sensor mSensor; final boolean mConfigured; final int mPulseReason; - final String mSetting; - final boolean mReportsTouchCoordinates; - final boolean mSettingDefault; - final boolean mRequiresTouchscreen; + private final String mSetting; + private final boolean mReportsTouchCoordinates; + private final boolean mSettingDefault; + private final boolean mRequiresTouchscreen; + private final boolean mSensorPerformsProxCheck; protected boolean mRequested; protected boolean mRegistered; @@ -354,12 +387,14 @@ public class DozeSensors { boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates, - requiresTouchscreen, false /* ignoresSetting */); + requiresTouchscreen, false /* ignoresSetting */, + false /* sensorPerformsProxCheck */); } private TriggerSensor(Sensor sensor, String setting, boolean settingDef, boolean configured, int pulseReason, boolean reportsTouchCoordinates, - boolean requiresTouchscreen, boolean ignoresSetting) { + boolean requiresTouchscreen, boolean ignoresSetting, + boolean sensorPerformsProxCheck) { mSensor = sensor; mSetting = setting; mSettingDefault = settingDef; @@ -368,6 +403,7 @@ public class DozeSensors { mReportsTouchCoordinates = reportsTouchCoordinates; mRequiresTouchscreen = requiresTouchscreen; mIgnoresSetting = ignoresSetting; + mSensorPerformsProxCheck = sensorPerformsProxCheck; } public void setListening(boolean listen) { @@ -427,14 +463,11 @@ public class DozeSensors { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event)); - boolean sensorPerformsProxCheck = false; if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) { int subType = (int) event.values[0]; MetricsLogger.action( mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE, subType); - sensorPerformsProxCheck = - mDozeParameters.getPickupSubtypePerformsProxCheck(subType); } mRegistered = false; @@ -444,7 +477,7 @@ public class DozeSensors { screenX = event.values[0]; screenY = event.values[1]; } - mCallback.onSensorPulse(mPulseReason, sensorPerformsProxCheck, screenX, screenY, + mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY, event.values); if (!mRegistered) { updateListener(); // reregister, this sensor only fires once @@ -452,6 +485,15 @@ public class DozeSensors { })); } + /** + * If the sensor itself performs proximity checks, to avoid pocket dialing. + * Gated sensors don't need to be stopped when the {@link DozeMachine} is + * {@link DozeMachine.State#DOZE_AOD_PAUSED}. + */ + public boolean performsProxCheck() { + return mSensorPerformsProxCheck; + } + public void registerSettingsObserver(ContentObserver settingsObserver) { if (mConfigured && !TextUtils.isEmpty(mSetting)) { mResolver.registerContentObserver( diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index a381e7b60f0a..97b08d5a12a6 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -107,9 +107,17 @@ public class DozeTriggers implements DozeMachine.Part { } private void onNotification() { - if (DozeMachine.DEBUG) Log.d(TAG, "requestNotificationPulse"); + if (DozeMachine.DEBUG) { + Log.d(TAG, "requestNotificationPulse"); + } + if (!sWakeDisplaySensorState) { + Log.d(TAG, "Wake display false. Pulse denied."); + return; + } mNotificationPulseTime = SystemClock.elapsedRealtime(); - if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) return; + if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { + return; + } requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */); DozeLog.traceNotificationPulse(mContext); } @@ -216,15 +224,21 @@ public class DozeTriggers implements DozeMachine.Part { if (state == DozeMachine.State.DOZE_PULSING || state == DozeMachine.State.DOZE_PULSING_BRIGHT) { boolean ignoreTouch = near; - if (DEBUG) Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch); + if (DEBUG) { + Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch); + } mDozeHost.onIgnoreTouchWhilePulsing(ignoreTouch); } if (far && (paused || pausing)) { - if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD"); + if (DEBUG) { + Log.i(TAG, "Prox FAR, unpausing AOD"); + } mMachine.requestState(DozeMachine.State.DOZE_AOD); } else if (near && aod) { - if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD"); + if (DEBUG) { + Log.i(TAG, "Prox NEAR, pausing AOD"); + } mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSING); } } @@ -282,6 +296,7 @@ public class DozeTriggers implements DozeMachine.Part { case DOZE_AOD: mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); + mDozeSensors.setPaused(false); if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) { onWakeScreen(false, newState); } @@ -289,12 +304,13 @@ public class DozeTriggers implements DozeMachine.Part { case DOZE_AOD_PAUSED: case DOZE_AOD_PAUSING: mDozeSensors.setProxListening(true); - mDozeSensors.setListening(false); + mDozeSensors.setPaused(true); break; case DOZE_PULSING: case DOZE_PULSING_BRIGHT: mDozeSensors.setTouchscreenSensorsListening(false); mDozeSensors.setProxListening(true); + mDozeSensors.setPaused(false); break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 06352310b3dd..5136682bb292 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; @@ -103,8 +104,8 @@ public class KeyguardSliceProvider extends SliceProvider implements private final Date mCurrentTime = new Date(); private final Handler mHandler; private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm; - private final HashSet<Integer> mMediaInvisibleStates; private final Object mMediaToken = new Object(); + private DozeParameters mDozeParameters; @VisibleForTesting protected SettableWakeLock mMediaWakeLock; @VisibleForTesting @@ -184,11 +185,6 @@ public class KeyguardSliceProvider extends SliceProvider implements mAlarmUri = Uri.parse(KEYGUARD_NEXT_ALARM_URI); mDndUri = Uri.parse(KEYGUARD_DND_URI); mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI); - - mMediaInvisibleStates = new HashSet<>(); - mMediaInvisibleStates.add(PlaybackState.STATE_NONE); - mMediaInvisibleStates.add(PlaybackState.STATE_STOPPED); - mMediaInvisibleStates.add(PlaybackState.STATE_PAUSED); } /** @@ -201,12 +197,14 @@ public class KeyguardSliceProvider extends SliceProvider implements public void initDependencies( NotificationMediaManager mediaManager, StatusBarStateController statusBarStateController, - KeyguardBypassController keyguardBypassController) { + KeyguardBypassController keyguardBypassController, + DozeParameters dozeParameters) { mMediaManager = mediaManager; mMediaManager.addCallback(this); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); mKeyguardBypassController = keyguardBypassController; + mDozeParameters = dozeParameters; } @AnyThread @@ -231,9 +229,9 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected boolean needsMediaLocked() { - boolean isBypass = mKeyguardBypassController != null - && mKeyguardBypassController.getBypassEnabled(); - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || isBypass); + boolean keepWhenAwake = mKeyguardBypassController != null + && mKeyguardBypassController.getBypassEnabled() && mDozeParameters.getAlwaysOn(); + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake); } protected void addMediaLocked(ListBuilder listBuilder) { @@ -458,7 +456,7 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onMetadataOrStateChanged(MediaMetadata metadata, @PlaybackState.State int state) { synchronized (this) { - boolean nextVisible = !mMediaInvisibleStates.contains(state); + boolean nextVisible = NotificationMediaManager.isPlayingState(state); mHandler.removeCallbacksAndMessages(mMediaToken); if (mMediaIsVisible && !nextVisible) { // We need to delay this event for a few millis when stopping to avoid jank in the @@ -477,7 +475,7 @@ public class KeyguardSliceProvider extends SliceProvider implements } private void updateMediaStateLocked(MediaMetadata metadata, @PlaybackState.State int state) { - boolean nextVisible = !mMediaInvisibleStates.contains(state); + boolean nextVisible = NotificationMediaManager.isPlayingState(state); CharSequence title = null; if (metadata != null) { title = metadata.getText(MediaMetadata.METADATA_KEY_TITLE); diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java index b9fb1a1c91c8..21f58128322d 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java @@ -239,9 +239,8 @@ public class PipMenuActivity extends Activity { }); mDismissButton = findViewById(R.id.dismiss); mDismissButton.setAlpha(0); - mDismissButton.setOnClickListener((v) -> { - dismissPip(); - }); + mDismissButton.setOnClickListener(v -> dismissPip()); + findViewById(R.id.expand_button).setOnClickListener(v -> expandPip()); mActionsGroup = findViewById(R.id.actions_group); mBetweenActionPaddingLand = getResources().getDimensionPixelSize( R.dimen.pip_between_action_padding_land); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 99f9e99cf359..ed6f599b69a6 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -119,7 +119,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private boolean mIsEnabled; private int mCurrentBoundedUserId = -1; private float mNavBarButtonAlpha; - private MotionEvent mStatusBarGestureDownEvent; + private boolean mInputFocusTransferStarted; private float mWindowCornerRadius; private boolean mSupportsRoundedCornersOnWindows; private int mNavBarMode = NAV_BAR_MODE_3BUTTON; @@ -164,6 +164,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } } + // TODO: change the method signature to use (boolean inputFocusTransferStarted) @Override public void onStatusBarMotionEvent(MotionEvent event) { if (!verifyCaller("onStatusBarMotionEvent")) { @@ -175,16 +176,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mHandler.post(()->{ StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { - bar.dispatchNotificationsPanelTouchEvent(event); int action = event.getActionMasked(); if (action == ACTION_DOWN) { - mStatusBarGestureDownEvent = MotionEvent.obtain(event); + mInputFocusTransferStarted = true; + } if (action == ACTION_UP || action == ACTION_CANCEL) { - mStatusBarGestureDownEvent.recycle(); - mStatusBarGestureDownEvent = null; + mInputFocusTransferStarted = false; } + bar.onInputFocusTransfer(mInputFocusTransferStarted); event.recycle(); } }); @@ -590,14 +591,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } public void cleanupAfterDeath() { - if (mStatusBarGestureDownEvent != null) { + if (mInputFocusTransferStarted) { mHandler.post(()-> { StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { - mStatusBarGestureDownEvent.setAction(MotionEvent.ACTION_CANCEL); - bar.dispatchNotificationsPanelTouchEvent(mStatusBarGestureDownEvent); - mStatusBarGestureDownEvent.recycle(); - mStatusBarGestureDownEvent = null; + mInputFocusTransferStarted = false; + bar.onInputFocusTransfer(false); } }); } @@ -782,6 +781,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags)); pw.print(" assistantGestureDisabled="); pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags)); + pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted); } public interface OverviewProxyListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index a59d590c9719..f001561754aa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -69,6 +69,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -91,6 +92,14 @@ public class NotificationMediaManager implements Dumpable { private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class); private final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); private final KeyguardBypassController mKeyguardBypassController; + private static final HashSet<Integer> PAUSED_MEDIA_STATES = new HashSet<>(); + static { + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_NONE); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_STOPPED); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_PAUSED); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_ERROR); + } + // Late binding private NotificationEntryManager mEntryManager; @@ -207,6 +216,10 @@ public class NotificationMediaManager implements Dumpable { mPropertiesChangedListener); } + public static boolean isPlayingState(int state) { + return !PAUSED_MEDIA_STATES.contains(state); + } + public void setUpWithPresenter(NotificationPresenter presenter) { mPresenter = presenter; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 0a8b7f8aa0da..4ccd0cd3353b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar; import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN_REVERSE; import static com.android.systemui.statusbar.phone.NotificationIconContainer.IconState.NO_VALUE; +import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import android.content.Context; import android.content.res.Configuration; @@ -48,8 +49,12 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.ViewState; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationIconContainer; +import javax.inject.Inject; +import javax.inject.Named; + /** * A notification shelf view that is placed inside the notification scroller. It manages the * overflow icons that don't fit into the regular list anymore. @@ -63,6 +68,7 @@ public class NotificationShelf extends ActivatableNotificationView implements = SystemProperties.getBoolean("debug.icon_scroll_animations", true); private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag; private static final String TAG = "NotificationShelf"; + private final KeyguardBypassController mBypassController; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; @@ -93,8 +99,12 @@ public class NotificationShelf extends ActivatableNotificationView implements private int mCutoutHeight; private int mGapHeight; - public NotificationShelf(Context context, AttributeSet attrs) { + @Inject + public NotificationShelf(@Named(VIEW_CONTEXT) Context context, + AttributeSet attrs, + KeyguardBypassController keyguardBypassController) { super(context, attrs); + mBypassController = keyguardBypassController; } @Override @@ -309,7 +319,10 @@ public class NotificationShelf extends ActivatableNotificationView implements colorTwoBefore = previousColor; transitionAmount = inShelfAmount; } - if (isLastChild) { + // We don't want to modify the color if the notification is hun'd + boolean canModifyColor = mAmbientState.isShadeExpanded() + && !(mAmbientState.isOnKeyguard() && mBypassController.getBypassEnabled()); + if (isLastChild && canModifyColor) { if (colorOfViewBeforeLast == NO_COLOR) { colorOfViewBeforeLast = ownColorUntinted; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 787cc971e6a1..aeb85748fd1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -16,8 +16,11 @@ package com.android.systemui.statusbar; +import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; + import android.content.Context; import android.content.res.Resources; +import android.os.Handler; import android.os.Trace; import android.os.UserHandle; import android.util.Log; @@ -44,6 +47,7 @@ import java.util.List; import java.util.Stack; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import dagger.Lazy; @@ -59,6 +63,8 @@ import dagger.Lazy; public class NotificationViewHierarchyManager implements DynamicPrivacyController.Listener { private static final String TAG = "NotificationViewHierarchyManager"; + private final Handler mHandler; + //TODO: change this top <Entry, List<Entry>>? private final HashMap<ExpandableNotificationRow, List<ExpandableNotificationRow>> mTmpChildOrderMap = new HashMap<>(); @@ -88,9 +94,13 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle // Used to help track down re-entrant calls to our update methods, which will cause bugs. private boolean mPerformingUpdate; + // Hack to get around re-entrant call in onDynamicPrivacyChanged() until we can track down + // the problem. + private boolean mIsHandleDynamicPrivacyChangeScheduled; @Inject public NotificationViewHierarchyManager(Context context, + @Named(MAIN_HANDLER_NAME) Handler mainHandler, NotificationLockscreenUserManager notificationLockscreenUserManager, NotificationGroupManager groupManager, VisualStabilityManager visualStabilityManager, @@ -100,6 +110,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle BubbleData bubbleData, KeyguardBypassController bypassController, DynamicPrivacyController privacyController) { + mHandler = mainHandler; mLockscreenUserManager = notificationLockscreenUserManager; mBypassController = bypassController; mGroupManager = groupManager; @@ -438,6 +449,20 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle @Override public void onDynamicPrivacyChanged() { + if (mPerformingUpdate) { + Log.w(TAG, "onDynamicPrivacyChanged made a re-entrant call"); + } + // This listener can be called from updateNotificationViews() via a convoluted listener + // chain, so we post here to prevent a re-entrant call. See b/136186188 + // TODO: Refactor away the need for this + if (!mIsHandleDynamicPrivacyChangeScheduled) { + mIsHandleDynamicPrivacyChangeScheduled = true; + mHandler.post(this::onHandleDynamicPrivacyChanged); + } + } + + private void onHandleDynamicPrivacyChanged() { + mIsHandleDynamicPrivacyChangeScheduled = false; updateNotificationViews(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt new file mode 100644 index 000000000000..ea474ced7632 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt @@ -0,0 +1,119 @@ +/* + * 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.notification + +import android.content.Context +import android.media.MediaMetadata +import android.provider.Settings +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.NotificationMediaManager +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone +import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.tuner.TunerService +import javax.inject.Inject +import javax.inject.Singleton + +/** + * A class that automatically creates heads up for important notification when bypassing the + * lockscreen + */ +@Singleton +class BypassHeadsUpNotifier @Inject constructor( + private val context: Context, + private val bypassController: KeyguardBypassController, + private val statusBarStateController: StatusBarStateController, + private val headsUpManager: HeadsUpManagerPhone, + private val mediaManager: NotificationMediaManager, + tunerService: TunerService) : StatusBarStateController.StateListener, + NotificationMediaManager.MediaListener { + + private lateinit var entryManager: NotificationEntryManager + private var currentMediaEntry: NotificationEntry? = null + private var enabled = true + + var fullyAwake = false + set(value) { + field = value + if (value) { + updateAutoHeadsUp(currentMediaEntry) + } + } + + init { + statusBarStateController.addCallback(this) + tunerService.addTunable( + TunerService.Tunable { _, _ -> + enabled = Settings.Secure.getIntForUser( + context.contentResolver, + Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING, + 1 /* default */, + KeyguardUpdateMonitor.getCurrentUser()) != 0 + }, Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING) + } + + fun setUp(entryManager: NotificationEntryManager) { + this.entryManager = entryManager + mediaManager.addCallback(this) + } + + override fun onMetadataOrStateChanged(metadata: MediaMetadata?, state: Int) { + val previous = currentMediaEntry + var newEntry = entryManager.notificationData.get(mediaManager.mediaNotificationKey) + if (!NotificationMediaManager.isPlayingState(state)) { + newEntry = null + } + if (newEntry?.isSensitive == true) { + newEntry = null + } + currentMediaEntry = newEntry + updateAutoHeadsUp(previous) + updateAutoHeadsUp(currentMediaEntry) + } + + private fun updateAutoHeadsUp(entry: NotificationEntry?) { + entry?.let { + val autoHeadsUp = it == currentMediaEntry && canAutoHeadsUp() + it.isAutoHeadsUp = autoHeadsUp + if (autoHeadsUp) { + headsUpManager.showNotification(it) + } + } + } + + override fun onStatePostChange() { + updateAutoHeadsUp(currentMediaEntry) + } + + private fun canAutoHeadsUp() : Boolean { + if (!enabled) { + return false + } + if (!bypassController.bypassEnabled) { + return false + } + if (statusBarStateController.state != StatusBarState.KEYGUARD) { + return false + } + if (!fullyAwake) { + return false + } + return true + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java index 8a23f718ef9a..d71d40781f2e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java @@ -24,7 +24,6 @@ import android.service.notification.StatusBarNotification; import android.util.Log; import com.android.internal.statusbar.NotificationVisibility; -import com.android.systemui.statusbar.AlertingNotificationManager; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -119,12 +118,11 @@ public class NotificationAlertingManager { shouldAlert = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); final boolean wasAlerting = mHeadsUpManager.isAlerting(entry.key); if (wasAlerting) { - if (!shouldAlert) { - // We don't want this to be interrupting anymore, let's remove it - mHeadsUpManager.removeNotification(entry.key, - false /* ignoreEarliestRemovalTime */); - } else { + if (shouldAlert) { mHeadsUpManager.updateNotification(entry.key, alertAgain); + } else if (!mHeadsUpManager.isEntryAutoHeadsUpped(entry.key)) { + // We don't want this to be interrupting anymore, let's remove it + mHeadsUpManager.removeNotification(entry.key, false /* removeImmediately */); } } else if (shouldAlert && alertAgain) { // This notification was updated to be alerting, show it! diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java index 1aa6bc9ae5f9..dfc64508cadf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java @@ -24,6 +24,8 @@ import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; +import androidx.annotation.NonNull; + /** * Listener interface for changes sent by NotificationEntryManager. */ @@ -45,7 +47,7 @@ public interface NotificationEntryListener { /** * Called when a new entry is created. */ - default void onNotificationAdded(NotificationEntry entry) { + default void onNotificationAdded(@NonNull NotificationEntry entry) { } /** @@ -61,7 +63,7 @@ public interface NotificationEntryListener { /** * Called when a notification was updated, after any filtering of notifications have occurred. */ - default void onPostEntryUpdated(NotificationEntry entry) { + default void onPostEntryUpdated(@NonNull NotificationEntry entry) { } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 9db715d129a5..b19d2ca29c96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -175,6 +175,7 @@ public final class NotificationEntry { private boolean mHighPriority; private boolean mSensitive = true; private Runnable mOnSensitiveChangedListener; + private boolean mAutoHeadsUp; public NotificationEntry(StatusBarNotification n) { this(n, null); @@ -670,11 +671,25 @@ public final class NotificationEntry { if (row != null) row.setHeadsUp(shouldHeadsUp); } - public void setHeadsUpAnimatingAway(boolean animatingAway) { if (row != null) row.setHeadsUpAnimatingAway(animatingAway); } + /** + * Set that this notification was automatically heads upped. This happens for example when + * the user bypasses the lockscreen and media is playing. + */ + public void setAutoHeadsUp(boolean autoHeadsUp) { + mAutoHeadsUp = autoHeadsUp; + } + + /** + * @return if this notification was automatically heads upped. This happens for example when + * * the user bypasses the lockscreen and media is playing. + */ + public boolean isAutoHeadsUp() { + return mAutoHeadsUp; + } public boolean mustStayOnScreen() { return row != null && row.mustStayOnScreen(); 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 ae534d278116..a8327f63dcf7 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 @@ -2698,6 +2698,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView l.setAlpha(1.0f); l.setLayerType(LAYER_TYPE_NONE, null); } + } else { + setHeadsUpAnimatingAway(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index e2cb8d4517ff..9e3d74b138fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -837,7 +837,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd break; } } - if (!mAmbientState.isDozing() || anySectionHasVisibleChild) { + boolean shouldDrawBackground; + if (mKeyguardBypassController.getBypassEnabled() && onKeyguard()) { + shouldDrawBackground = isPulseExpanding(); + } else { + shouldDrawBackground = !mAmbientState.isDozing() || anySectionHasVisibleChild; + } + if (shouldDrawBackground) { drawBackgroundRects(canvas, left, right, top, backgroundTopAnimationOffset); } @@ -3396,10 +3402,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { ExpandableNotificationRow row = eventPair.first; boolean isHeadsUp = eventPair.second; + if (isHeadsUp != row.isHeadsUp()) { + // For cases where we have a heads up showing and appearing again we shouldn't + // do the animations at all. + continue; + } int type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_OTHER; boolean onBottom = false; boolean pinnedAndClosed = row.isPinned() && !mIsExpanded; - if (!mIsExpanded && !isHeadsUp) { + boolean performDisappearAnimation = !mIsExpanded + // Only animate if we still have pinned heads up, otherwise we just have the + // regular collapse animation of the lock screen + || (mKeyguardBypassController.getBypassEnabled() && onKeyguard() + && mHeadsUpManager.hasPinnedHeadsUp()); + if (performDisappearAnimation && !isHeadsUp) { type = row.wasJustClicked() ? AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK : AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR; @@ -4700,14 +4716,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd return mIntrinsicPadding; } - /** - * @return the y position of the first notification - */ - @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public float getNotificationsTopY() { - return mTopPadding + getStackTranslation(); - } - @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public boolean shouldDelayChildPressedState() { @@ -6246,6 +6254,15 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAmbientState.onDragFinished(animView); updateContinuousShadowDrawing(); updateContinuousBackgroundDrawing(); + if (animView instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) animView; + if (row.isPinned() && !canChildBeDismissed(row) + && row.getStatusBarNotification().getNotification().fullScreenIntent + == null) { + mHeadsUpManager.removeNotification(row.getStatusBarNotification().getKey(), + true /* removeImmediately */); + } + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 09c6968867b8..35ba801c75ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -546,12 +546,12 @@ public class StackScrollAlgorithm { ExpandableViewState topState = topHeadsUpEntry == null ? null : topHeadsUpEntry.getViewState(); if (topState != null && !isTopEntry && (!mIsExpanded - || unmodifiedEndLocation < topState.yTranslation + topState.height)) { + || unmodifiedEndLocation > topState.yTranslation + topState.height)) { // Ensure that a headsUp doesn't vertically extend further than the heads-up at // the top most z-position childState.height = row.getIntrinsicHeight(); - childState.yTranslation = topState.yTranslation + topState.height - - childState.height; + childState.yTranslation = Math.min(topState.yTranslation + topState.height + - childState.height, childState.yTranslation); } // heads up notification show and this row is the top entry of heads up diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index 4f169eb50f88..0996ff27e9a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -28,6 +28,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; @@ -451,7 +452,11 @@ public class StackStateAnimator { if (row.isDismissed()) { needsAnimation = false; } - StatusBarIconView icon = row.getEntry().icon; + NotificationEntry entry = row.getEntry(); + StatusBarIconView icon = entry.icon; + if (entry.centeredIcon != null && entry.centeredIcon.getParent() != null) { + icon = entry.centeredIcon; + } if (icon.getParent() != null) { icon.getLocationOnScreen(mTmpLocation); float iconPosition = mTmpLocation[0] - icon.getTranslationX() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 89bd1b6b79f8..10b48e71005d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -22,9 +22,7 @@ import android.os.PowerManager; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; -import android.text.TextUtils; import android.util.MathUtils; -import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; @@ -41,13 +39,11 @@ import java.io.PrintWriter; public class DozeParameters implements TunerService.Tunable, com.android.systemui.plugins.statusbar.DozeParameters { private static final int MAX_DURATION = 60 * 1000; - public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully"; public static final boolean FORCE_NO_BLANKING = SystemProperties.getBoolean("debug.force_no_blanking", false); public static final boolean FORCE_BLANKING = SystemProperties.getBoolean("debug.force_blanking", false); - private static IntInOutMatcher sPickupSubtypePerformsProxMatcher; private static DozeParameters sInstance; private final Context mContext; @@ -92,20 +88,6 @@ public class DozeParameters implements TunerService.Tunable, pw.print(" getVibrateOnPickup(): "); pw.println(getVibrateOnPickup()); pw.print(" getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse()); pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold()); - pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println( - dumpPickupSubtypePerformsProxCheck()); - } - - private String dumpPickupSubtypePerformsProxCheck() { - // Refresh sPickupSubtypePerformsProxMatcher - getPickupSubtypePerformsProxCheck(0); - - if (sPickupSubtypePerformsProxMatcher == null) { - return "fallback: " + mContext.getResources().getBoolean( - R.bool.doze_pickup_performs_proximity_check); - } else { - return "spec: " + sPickupSubtypePerformsProxMatcher.mSpec; - } } public boolean getDisplayStateSupported() { @@ -225,21 +207,8 @@ public class DozeParameters implements TunerService.Tunable, return SystemProperties.get(propName, mContext.getString(resId)); } - public boolean getPickupSubtypePerformsProxCheck(int subType) { - String spec = getString("doze.pickup.proxcheck", - R.string.doze_pickup_subtype_performs_proximity_check); - - if (TextUtils.isEmpty(spec)) { - // Fall back to non-subtype based property. - return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check); - } - - if (sPickupSubtypePerformsProxMatcher == null - || !TextUtils.equals(spec, sPickupSubtypePerformsProxMatcher.mSpec)) { - sPickupSubtypePerformsProxMatcher = new IntInOutMatcher(spec); - } - - return sPickupSubtypePerformsProxMatcher.isIn(subType); + public boolean getPickupPerformsProxCheck() { + return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check); } public int getPulseVisibleDurationExtended() { @@ -258,81 +227,4 @@ public class DozeParameters implements TunerService.Tunable, public AlwaysOnDisplayPolicy getPolicy() { return mAlwaysOnPolicy; } - - /** - * Parses a spec of the form `1,2,3,!5,*`. The resulting object will match numbers that are - * listed, will not match numbers that are listed with a ! prefix, and will match / not match - * unlisted numbers depending on whether * or !* is present. - * - * * -> match any numbers that are not explicitly listed - * !* -> don't match any numbers that are not explicitly listed - * 2 -> match 2 - * !3 -> don't match 3 - * - * It is illegal to specify: - * - an empty spec - * - a spec containing that are empty, or a lone ! - * - a spec for anything other than numbers or * - * - multiple terms for the same number / multiple *s - */ - public static class IntInOutMatcher { - private static final String WILDCARD = "*"; - private static final char OUT_PREFIX = '!'; - - private final SparseBooleanArray mIsIn; - private final boolean mDefaultIsIn; - final String mSpec; - - public IntInOutMatcher(String spec) { - if (TextUtils.isEmpty(spec)) { - throw new IllegalArgumentException("Spec must not be empty"); - } - - boolean defaultIsIn = false; - boolean foundWildcard = false; - - mSpec = spec; - mIsIn = new SparseBooleanArray(); - - for (String itemPrefixed : spec.split(",", -1)) { - if (itemPrefixed.length() == 0) { - throw new IllegalArgumentException( - "Illegal spec, must not have zero-length items: `" + spec + "`"); - } - boolean isIn = itemPrefixed.charAt(0) != OUT_PREFIX; - String item = isIn ? itemPrefixed : itemPrefixed.substring(1); - - if (itemPrefixed.length() == 0) { - throw new IllegalArgumentException( - "Illegal spec, must not have zero-length items: `" + spec + "`"); - } - - if (WILDCARD.equals(item)) { - if (foundWildcard) { - throw new IllegalArgumentException("Illegal spec, `" + WILDCARD + - "` must not appear multiple times in `" + spec + "`"); - } - defaultIsIn = isIn; - foundWildcard = true; - } else { - int key = Integer.parseInt(item); - if (mIsIn.indexOfKey(key) >= 0) { - throw new IllegalArgumentException("Illegal spec, `" + key + - "` must not appear multiple times in `" + spec + "`"); - } - mIsIn.put(key, isIn); - } - } - - if (!foundWildcard) { - throw new IllegalArgumentException("Illegal spec, must specify either * or !*"); - } - - mDefaultIsIn = defaultIsIn; - } - - public boolean isIn(int value) { - return (mIsIn.get(value, mDefaultIsIn)); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index ade855e755e3..c44f953615e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -32,7 +32,6 @@ import android.view.ViewTreeObserver; import androidx.collection.ArraySet; import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.ScreenDecorations; @@ -67,6 +66,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, final int mExtensionTime; private final StatusBarStateController mStatusBarStateController; private final KeyguardBypassController mBypassController; + private final int mAutoHeadsUpNotificationDecay; private View mStatusBarWindowView; private NotificationGroupManager mGroupManager; private VisualStabilityManager mVisualStabilityManager; @@ -81,6 +81,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private boolean mTrackingHeadsUp; private HashSet<String> mSwipedOutKeys = new HashSet<>(); private HashSet<NotificationEntry> mEntriesToRemoveAfterExpand = new HashSet<>(); + private HashSet<String> mKeysToRemoveWhenLeavingKeyguard = new HashSet<>(); private ArraySet<NotificationEntry> mEntriesToRemoveWhenReorderingAllowed = new ArraySet<>(); private boolean mIsExpanded; @@ -121,6 +122,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, mAutoDismissNotificationDecayDozing = resources.getInteger( R.integer.heads_up_notification_decay_dozing); mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); + mAutoHeadsUpNotificationDecay = resources.getInteger( + R.integer.auto_heads_up_notification_decay); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); mBypassController = bypassController; @@ -231,7 +234,16 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override public void onStateChanged(int newState) { + boolean wasKeyguard = mStatusBarState == StatusBarState.KEYGUARD; + boolean isKeyguard = newState == StatusBarState.KEYGUARD; mStatusBarState = newState; + if (wasKeyguard && !isKeyguard && mKeysToRemoveWhenLeavingKeyguard.size() != 0) { + String[] keys = mKeysToRemoveWhenLeavingKeyguard.toArray(new String[0]); + for (String key : keys) { + removeAlertEntry(key); + } + mKeysToRemoveWhenLeavingKeyguard.clear(); + } } @Override @@ -245,6 +257,15 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } } + @Override + public boolean isEntryAutoHeadsUpped(String key) { + HeadsUpEntryPhone headsUpEntryPhone = getHeadsUpEntryPhone(key); + if (headsUpEntryPhone == null) { + return false; + } + return headsUpEntryPhone.isAutoHeadsUp(); + } + /** * Set that we are exiting the headsUp pinned mode, but some notifications might still be * animating out. This is used to keep the touchable regions in a sane state. @@ -420,6 +441,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override protected void onAlertEntryRemoved(AlertEntry alertEntry) { + mKeysToRemoveWhenLeavingKeyguard.remove(alertEntry.mEntry.key); super.onAlertEntryRemoved(alertEntry); mEntryPool.release((HeadsUpEntryPhone) alertEntry); } @@ -479,6 +501,11 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, */ private boolean extended; + /** + * Was this entry received while on keyguard + */ + private boolean mIsAutoHeadsUp; + @Override protected boolean isSticky() { @@ -494,10 +521,12 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, mEntriesToRemoveWhenReorderingAllowed.add(entry); mVisualStabilityManager.addReorderingAllowedCallback( HeadsUpManagerPhone.this); - } else if (!mTrackingHeadsUp) { - removeAlertEntry(entry.key); - } else { + } else if (mTrackingHeadsUp) { mEntriesToRemoveAfterExpand.add(entry); + } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { + mKeysToRemoveWhenLeavingKeyguard.add(entry.key); + } else { + removeAlertEntry(entry.key); } }; @@ -506,6 +535,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override public void updateEntry(boolean updatePostTime) { + mIsAutoHeadsUp = mEntry.isAutoHeadsUp(); super.updateEntry(updatePostTime); if (mEntriesToRemoveAfterExpand.contains(mEntry)) { @@ -514,6 +544,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, if (mEntriesToRemoveWhenReorderingAllowed.contains(mEntry)) { mEntriesToRemoveWhenReorderingAllowed.remove(mEntry); } + mKeysToRemoveWhenLeavingKeyguard.remove(mEntry.key); } @Override @@ -548,6 +579,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, super.reset(); mMenuShownPinned = false; extended = false; + mIsAutoHeadsUp = false; } private void extendPulse() { @@ -558,13 +590,35 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } @Override + public int compareTo(AlertEntry alertEntry) { + HeadsUpEntryPhone headsUpEntry = (HeadsUpEntryPhone) alertEntry; + boolean autoShown = isAutoHeadsUp(); + boolean otherAutoShown = headsUpEntry.isAutoHeadsUp(); + if (autoShown && !otherAutoShown) { + return 1; + } else if (!autoShown && otherAutoShown) { + return -1; + } + return super.compareTo(alertEntry); + } + + @Override protected long calculateFinishTime() { return mPostTime + getDecayDuration() + (extended ? mExtensionTime : 0); } private int getDecayDuration() { - return mStatusBarStateController.isDozing() ? mAutoDismissNotificationDecayDozing - : getRecommendedHeadsUpTimeoutMs(); + if (mStatusBarStateController.isDozing()) { + return mAutoDismissNotificationDecayDozing; + } else if (isAutoHeadsUp()) { + return getRecommendedHeadsUpTimeoutMs(mAutoHeadsUpNotificationDecay); + } else { + return getRecommendedHeadsUpTimeoutMs(mAutoDismissNotificationDecay); + } + } + + private boolean isAutoHeadsUp() { + return mIsAutoHeadsUp; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 3f1cb6c94e77..af23ac3e35c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -104,23 +104,11 @@ class KeyguardBypassController { */ fun onBiometricAuthenticated(biometricSourceType: BiometricSourceType): Boolean { if (bypassEnabled) { - if (bouncerShowing) { - // Whenever the bouncer is showing, we want to unlock. Otherwise we can get stuck - // in the shade locked where the bouncer wouldn't unlock - return true - } - if (statusBarStateController.state != StatusBarState.KEYGUARD) { - // We're bypassing but not actually on the lockscreen, the user should decide when - // to unlock - return false - } - if (launchingAffordance) { - return false - } - if (isPulseExpanding || qSExpanded) { + val can = canBypass() + if (!can && (isPulseExpanding || qSExpanded)) { pendingUnlockType = biometricSourceType - return false } + return can } return true } @@ -134,6 +122,22 @@ class KeyguardBypassController { } } + /** + * If keyguard can be dismissed because of bypass. + */ + fun canBypass(): Boolean { + if (bypassEnabled) { + return when { + bouncerShowing -> true + statusBarStateController.state != StatusBarState.KEYGUARD -> false + launchingAffordance -> false + isPulseExpanding || qSExpanded -> false + else -> true + } + } + return false + } + fun onStartedGoingToSleep() { pendingUnlockType = null } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt new file mode 100644 index 000000000000..f4635d1270a8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt @@ -0,0 +1,84 @@ +/* + * 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.phone + +import android.content.Context +import android.hardware.Sensor +import android.hardware.TriggerEvent +import android.hardware.TriggerEventListener +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.util.Assert +import com.android.systemui.util.AsyncSensorManager + +class KeyguardLiftController constructor( + context: Context, + private val statusBarStateController: StatusBarStateController, + private val asyncSensorManager: AsyncSensorManager +) : StatusBarStateController.StateListener, KeyguardUpdateMonitorCallback() { + + private val keyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context) + private val pickupSensor = asyncSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE) + private var isListening = false + private var bouncerVisible = false + + init { + statusBarStateController.addCallback(this) + keyguardUpdateMonitor.registerCallback(this) + updateListeningState() + } + + private val listener: TriggerEventListener = object : TriggerEventListener() { + override fun onTrigger(event: TriggerEvent?) { + Assert.isMainThread() + // Not listening anymore since trigger events unregister themselves + isListening = false + updateListeningState() + keyguardUpdateMonitor.requestFaceAuth() + } + } + + override fun onDozingChanged(isDozing: Boolean) { + updateListeningState() + } + + override fun onKeyguardBouncerChanged(bouncer: Boolean) { + bouncerVisible = bouncer + updateListeningState() + } + + override fun onKeyguardVisibilityChanged(showing: Boolean) { + updateListeningState() + } + + private fun updateListeningState() { + val onKeyguard = keyguardUpdateMonitor.isKeyguardVisible && + !statusBarStateController.isDozing + + val shouldListen = onKeyguard || bouncerVisible + if (shouldListen != isListening) { + isListening = shouldListen + + if (shouldListen) { + asyncSensorManager.requestTriggerSensor(listener, pickupSensor) + } else { + asyncSensorManager.cancelTriggerSensor(listener, pickupSensor) + } + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index ca001c6f3110..49afae7415ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import android.annotation.IntDef; @@ -29,12 +28,12 @@ import android.graphics.drawable.Animatable2; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricSourceType; -import android.os.Handler; import android.os.Trace; import android.provider.Settings; import android.text.TextUtils; import android.util.AttributeSet; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; import androidx.annotation.Nullable; @@ -43,6 +42,7 @@ import com.android.internal.graphics.ColorUtils; import com.android.internal.telephony.IccCardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -53,6 +53,7 @@ import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; import java.lang.annotation.Retention; @@ -67,7 +68,8 @@ import javax.inject.Named; public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, UnlockMethodCache.OnUnlockMethodChangedListener, - NotificationWakeUpCoordinator.WakeUpListener { + NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener, + OnHeadsUpChangedListener { private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; @@ -79,12 +81,13 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final AccessibilityController mAccessibilityController; private final DockManager mDockManager; - private final Handler mMainHandler; private final KeyguardMonitor mKeyguardMonitor; private final KeyguardBypassController mBypassController; private final NotificationWakeUpCoordinator mWakeUpCoordinator; + private final HeadsUpManagerPhone mHeadsUpManager; private int mLastState = 0; + private boolean mForceUpdate; private boolean mTransientBiometricsError; private boolean mIsFaceUnlockState; private boolean mSimLocked; @@ -92,23 +95,35 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private boolean mPulsing; private boolean mDozing; private boolean mDocked; - private boolean mLastDozing; - private boolean mLastPulsing; + private boolean mBlockUpdates; private int mIconColor; private float mDozeAmount; - private int mIconRes; - private boolean mBouncerShowing; - private boolean mWasPulsingOnThisFrame; + private boolean mBouncerShowingScrimmed; private boolean mWakeAndUnlockRunning; private boolean mKeyguardShowing; private boolean mShowingLaunchAffordance; + private boolean mUpdatePending; private final KeyguardMonitor.Callback mKeyguardMonitorCallback = new KeyguardMonitor.Callback() { @Override public void onKeyguardShowingChanged() { + boolean force = false; + boolean wasShowing = mKeyguardShowing; mKeyguardShowing = mKeyguardMonitor.isShowing(); - update(false /* force */); + if (!wasShowing && mKeyguardShowing && mBlockUpdates) { + mBlockUpdates = false; + force = true; + } + update(force); + } + + @Override + public void onKeyguardFadingAwayChanged() { + if (!mKeyguardMonitor.isKeyguardFadingAway() && mBlockUpdates) { + mBlockUpdates = false; + update(true /* force */); + } } }; private final DockManager.DockEventListener mDockEventListener = @@ -119,7 +134,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange || event == DockManager.STATE_DOCKED_HIDE; if (docked != mDocked) { mDocked = docked; - update(true /* force */); + update(); } } }; @@ -129,9 +144,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange @Override public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { - boolean oldSimLocked = mSimLocked; mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure(); - update(oldSimLocked != mSimLocked); + update(); } @Override @@ -149,11 +163,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange public void onStrongAuthStateChanged(int userId) { update(); } - - @Override - public void onBiometricsCleared() { - update(); - } }; @Inject @@ -165,7 +174,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange NotificationWakeUpCoordinator wakeUpCoordinator, KeyguardMonitor keyguardMonitor, @Nullable DockManager dockManager, - @Named(MAIN_HANDLER_NAME) Handler mainHandler) { + HeadsUpManagerPhone headsUpManager) { super(context, attrs); mContext = context; mUnlockMethodCache = UnlockMethodCache.getInstance(context); @@ -177,7 +186,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mWakeUpCoordinator = wakeUpCoordinator; mKeyguardMonitor = keyguardMonitor; mDockManager = dockManager; - mMainHandler = mainHandler; + mHeadsUpManager = headsUpManager; } @Override @@ -194,6 +203,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mDockManager.addListener(mDockEventListener); } onThemeChanged(); + update(); } @Override @@ -247,63 +257,100 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } public void update(boolean force) { + if (force) { + mForceUpdate = true; + } + if (!mUpdatePending) { + mUpdatePending = true; + getViewTreeObserver().addOnPreDrawListener(this); + } + } + + @Override + public boolean onPreDraw() { + mUpdatePending = false; + getViewTreeObserver().removeOnPreDrawListener(this); + int state = getState(); + int lastState = mLastState; mIsFaceUnlockState = state == STATE_SCANNING_FACE; - if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing || force) { - @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState, - state, mLastPulsing, mPulsing, mLastDozing, mDozing); - boolean isAnim = lockAnimIndex != -1; + mLastState = state; + boolean shouldUpdate = lastState != state || mForceUpdate; + if (mBlockUpdates && canBlockUpdates()) { + shouldUpdate = false; + } + if (shouldUpdate) { + mForceUpdate = false; + @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(lastState, + state, mPulsing, mDozing); + boolean isAnim = lockAnimIndex != -1; int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state); - if (iconRes != mIconRes) { - mIconRes = iconRes; - - Drawable icon = mContext.getDrawable(iconRes); - final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable - ? (AnimatedVectorDrawable) icon - : null; - setImageDrawable(icon, false); - if (mIsFaceUnlockState) { - announceForAccessibility(getContext().getString( - R.string.accessibility_scanning_face)); - } - if (animation != null && isAnim) { - animation.forceAnimationOnUI(); - animation.clearAnimationCallbacks(); - animation.registerAnimationCallback(new Animatable2.AnimationCallback() { - @Override - public void onAnimationEnd(Drawable drawable) { - if (getDrawable() == animation && state == getState() - && doesAnimationLoop(lockAnimIndex)) { - animation.start(); - } else { - Trace.endAsyncSection("LockIcon#Animation", state); - } - } - }); - Trace.beginAsyncSection("LockIcon#Animation", state); - animation.start(); - } + Drawable icon = mContext.getDrawable(iconRes); + final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable + ? (AnimatedVectorDrawable) icon + : null; + setImageDrawable(icon, false); + if (mIsFaceUnlockState) { + announceForAccessibility(getContext().getString( + R.string.accessibility_scanning_face)); } - updateDarkTint(); - mLastState = state; - mLastDozing = mDozing; - mLastPulsing = mPulsing; + if (animation != null && isAnim) { + animation.forceAnimationOnUI(); + animation.clearAnimationCallbacks(); + animation.registerAnimationCallback(new Animatable2.AnimationCallback() { + @Override + public void onAnimationEnd(Drawable drawable) { + if (getDrawable() == animation && state == getState() + && doesAnimationLoop(lockAnimIndex)) { + animation.start(); + } else { + Trace.endAsyncSection("LockIcon#Animation", state); + } + } + }); + Trace.beginAsyncSection("LockIcon#Animation", state); + animation.start(); + } } + updateDarkTint(); boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; - if (mBypassController.getBypassEnabled() - && mStatusBarStateController.getState() == StatusBarState.KEYGUARD - && !mWakeUpCoordinator.getNotificationsFullyHidden() - && !mBouncerShowing) { - invisible = true; + if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { + if (mHeadsUpManager.isHeadsUpGoingAway() + || mHeadsUpManager.hasPinnedHeadsUp() + || (mStatusBarStateController.getState() == StatusBarState.KEYGUARD + && !mWakeUpCoordinator.getNotificationsFullyHidden())) { + invisible = true; + } + } + boolean wasInvisible = getVisibility() == INVISIBLE; + if (invisible != wasInvisible) { + setVisibility(invisible ? INVISIBLE : VISIBLE); + animate().cancel(); + if (!invisible) { + setScaleX(0); + setScaleY(0); + animate() + .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN) + .scaleX(1) + .scaleY(1) + .withLayer() + .setDuration(233) + .start(); + } } - setVisibility(invisible ? INVISIBLE : VISIBLE); updateClickability(); + + return true; + } + + private boolean canBlockUpdates() { + return mKeyguardShowing || mKeyguardMonitor.isKeyguardFadingAway(); } private void updateClickability() { @@ -364,30 +411,22 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return lockAnimIndex == SCANNING; } - private int getAnimationIndexForTransition(int oldState, int newState, - boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing) { + private static int getAnimationIndexForTransition(int oldState, int newState, boolean pulsing, + boolean dozing) { // Never animate when screen is off - if (dozing && !pulsing && !mWasPulsingOnThisFrame) { + if (dozing && !pulsing) { return -1; } - boolean isError = oldState != STATE_BIOMETRICS_ERROR && newState == STATE_BIOMETRICS_ERROR; - boolean justUnlocked = oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN; - boolean justLocked = oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED; - boolean nowPulsing = !wasPulsing && pulsing; - boolean turningOn = wasDozing && !dozing && !mWasPulsingOnThisFrame; - - if (isError) { + if (newState == STATE_BIOMETRICS_ERROR) { return ERROR; - } else if (justUnlocked) { + } else if (oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN) { return UNLOCK; - } else if (justLocked) { + } else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED) { return LOCK; } else if (newState == STATE_SCANNING_FACE) { return SCANNING; - } else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) { - return LOCK_IN; } return -1; } @@ -399,45 +438,41 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } } - public void setBouncerShowing(boolean bouncerShowing) { - mBouncerShowing = bouncerShowing; + public void setBouncerShowingScrimmed(boolean bouncerShowing) { + mBouncerShowingScrimmed = bouncerShowing; if (mBypassController.getBypassEnabled()) { update(); } } @Retention(RetentionPolicy.SOURCE) - @IntDef({ERROR, UNLOCK, LOCK, SCANNING, LOCK_IN}) + @IntDef({ERROR, UNLOCK, LOCK, SCANNING}) @interface LockAnimIndex {} - private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3, LOCK_IN = 4; + private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3; private static final int[][] LOCK_ANIM_RES_IDS = new int[][] { { R.anim.lock_to_error, R.anim.lock_unlock, R.anim.lock_lock, - R.anim.lock_scanning, - R.anim.lock_in, + R.anim.lock_scanning }, { R.anim.lock_to_error_circular, R.anim.lock_unlock_circular, R.anim.lock_lock_circular, - R.anim.lock_scanning_circular, - R.anim.lock_in_circular, + R.anim.lock_scanning_circular }, { R.anim.lock_to_error_filled, R.anim.lock_unlock_filled, R.anim.lock_lock_filled, - R.anim.lock_scanning_filled, - R.anim.lock_in_filled, + R.anim.lock_scanning_filled }, { R.anim.lock_to_error_rounded, R.anim.lock_unlock_rounded, R.anim.lock_lock_rounded, - R.anim.lock_scanning_rounded, - R.anim.lock_in_rounded, + R.anim.lock_scanning_rounded }, }; @@ -462,7 +497,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return STATE_LOCK_OPEN; } else if (mTransientBiometricsError) { return STATE_BIOMETRICS_ERROR; - } else if (updateMonitor.isFaceDetectionRunning()) { + } else if (updateMonitor.isFaceDetectionRunning() && !mPulsing) { return STATE_SCANNING_FACE; } else { return STATE_LOCKED; @@ -481,12 +516,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange */ public void setPulsing(boolean pulsing) { mPulsing = pulsing; - if (!mPulsing) { - mWasPulsingOnThisFrame = true; - mMainHandler.post(() -> { - mWasPulsingOnThisFrame = false; - }); - } update(); } @@ -530,11 +559,17 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange /** * We need to hide the lock whenever there's a fingerprint unlock, otherwise you'll see the * icon on top of the black front scrim. + * @param wakeAndUnlock are we wake and unlocking + * @param isUnlock are we currently unlocking */ - public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + public void onBiometricAuthModeChanged(boolean wakeAndUnlock, boolean isUnlock) { if (wakeAndUnlock) { mWakeAndUnlockRunning = true; } + if (isUnlock && mBypassController.getBypassEnabled() && canBlockUpdates()) { + // We don't want the icon to change while we are unlocking + mBlockUpdates = true; + } update(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 776cd4d71c94..22e3edb2bbd8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -627,7 +627,7 @@ public class NavigationBarView extends FrameLayout implements if (mOverviewProxyService.isEnabled()) { // Force disable recents when not in legacy mode disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode); - if (pinningActive) { + if (pinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) { disableBack = disableHome = false; } } else if (pinningActive) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index cd9772237d59..d2159ca15b24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -248,7 +248,7 @@ public class NotificationIconAreaController implements DarkReceiver, if (onlyShowCenteredIcon) { return isCenteredNotificationIcon; } - if (hideCenteredIcon && isCenteredNotificationIcon) { + if (hideCenteredIcon && isCenteredNotificationIcon && !entry.isRowHeadsUp()) { return false; } if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 32dc96d75898..6eeb96813c94 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -290,6 +290,8 @@ public class NotificationPanelView extends PanelView implements private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; + private boolean mExpectingOpenPanelGesture; + /** * Current dark amount that follows regular interpolation curve of animation. */ @@ -930,7 +932,7 @@ public class NotificationPanelView extends PanelView implements protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { mHeadsUpTouchHelper.notifyFling(!expand); - setClosingWithAlphaFadeout(!expand && getFadeoutAlpha() == 1.0f); + setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @@ -1246,6 +1248,28 @@ public class NotificationPanelView extends PanelView implements } } + /** + * Input focus transfer is about to happen. + */ + public void startWaitingForOpenPanelGesture() { + if (!isFullyCollapsed()) { + return; + } + mExpectingOpenPanelGesture = true; + onTrackingStarted(); + } + + /** + * Input focus transfer has already happened as this view decided to intercept + * very first down event. + */ + public void stopWaitingForOpenPanelGesture() { + if (mExpectingOpenPanelGesture) { + mExpectingOpenPanelGesture = false; + onTrackingStopped(false); + } + } + @Override protected boolean flingExpands(float vel, float vectorVel, float x, float y) { boolean expands = super.flingExpands(vel, vectorVel, x, y); @@ -1258,8 +1282,12 @@ public class NotificationPanelView extends PanelView implements } @Override - protected boolean hasConflictingGestures() { - return mBarState != StatusBarState.SHADE; + protected boolean shouldGestureWaitForTouchSlop() { + if (mExpectingOpenPanelGesture) { + mExpectingOpenPanelGesture = false; + return false; + } + return isFullyCollapsed() || mBarState != StatusBarState.SHADE; } @Override @@ -2040,8 +2068,11 @@ public class NotificationPanelView extends PanelView implements } private float getFadeoutAlpha() { - float alpha = (getNotificationsTopY() + mNotificationStackScroller.getFirstItemMinHeight()) - / mQsMinExpansionHeight; + float alpha; + if (mQsMinExpansionHeight == 0) { + return 1.0f; + } + alpha = getExpandedHeight() / mQsMinExpansionHeight; alpha = Math.max(0, Math.min(alpha, 1)); alpha = (float) Math.pow(alpha, 0.75); return alpha; @@ -2099,18 +2130,18 @@ public class NotificationPanelView extends PanelView implements float alpha; if (mBarState == StatusBarState.KEYGUARD) { - // When on Keyguard, we hide the header as soon as the top card of the notification - // stack scroller is close enough (collision distance) to the bottom of the header. - alpha = getNotificationsTopY() + // When on Keyguard, we hide the header as soon as we expanded close enough to the + // header + alpha = getExpandedHeight() / (mKeyguardStatusBar.getHeight() + mNotificationsHeaderCollideDistance); } else { // In SHADE_LOCKED, the top card is already really close to the header. Hide it as // soon as we start translating the stack. - alpha = getNotificationsTopY() / mKeyguardStatusBar.getHeight(); + alpha = getExpandedHeight() / mKeyguardStatusBar.getHeight(); } - alpha = MathUtils.constrain(alpha, 0, 1); + alpha = MathUtils.saturate(alpha); alpha = (float) Math.pow(alpha, 0.75); return alpha; } @@ -2162,13 +2193,6 @@ public class NotificationPanelView extends PanelView implements mBigClockContainer.setAlpha(alpha); } - private float getNotificationsTopY() { - if (mNotificationStackScroller.getNotGoneChildCount() == 0) { - return getExpandedHeight(); - } - return mNotificationStackScroller.getNotificationsTopY(); - } - @Override protected void onExpandingStarted() { super.onExpandingStarted(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index a9a3b2d866e1..a5b221bbad8c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -301,7 +301,7 @@ public abstract class PanelView extends FrameLayout { final float y = event.getY(pointerIndex); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - mGestureWaitForTouchSlop = isFullyCollapsed() || hasConflictingGestures(); + mGestureWaitForTouchSlop = shouldGestureWaitForTouchSlop(); mIgnoreXTouchSlop = isFullyCollapsed() || shouldGestureIgnoreXTouchSlop(x, y); } @@ -519,7 +519,7 @@ public abstract class PanelView extends FrameLayout { return (int) (mUnlockFalsingThreshold * factor); } - protected abstract boolean hasConflictingGestures(); + protected abstract boolean shouldGestureWaitForTouchSlop(); protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 7db4afceee89..55f61fa8a6a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -80,6 +80,7 @@ import android.metrics.LogMaker; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Debug; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -193,6 +194,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.notification.ActivityLaunchAnimator; +import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier; import com.android.systemui.statusbar.notification.NotificationActivityStarter; import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationClicker; @@ -373,6 +375,11 @@ public class StatusBar extends SystemUI implements DemoMode, KeyguardBypassController mKeyguardBypassController; @Inject protected HeadsUpManagerPhone mHeadsUpManager; + @Inject + BypassHeadsUpNotifier mBypassHeadsUpNotifier; + @Nullable + @Inject + protected KeyguardLiftController mKeyguardLiftController; // expanded notifications protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -630,6 +637,7 @@ public class StatusBar extends SystemUI implements DemoMode, mGutsManager = Dependency.get(NotificationGutsManager.class); mMediaManager = Dependency.get(NotificationMediaManager.class); mEntryManager = Dependency.get(NotificationEntryManager.class); + mBypassHeadsUpNotifier.setUp(mEntryManager); mNotificationInterruptionStateProvider = Dependency.get(NotificationInterruptionStateProvider.class); mViewHierarchyManager = Dependency.get(NotificationViewHierarchyManager.class); @@ -646,7 +654,7 @@ public class StatusBar extends SystemUI implements DemoMode, KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance(); if (sliceProvider != null) { sliceProvider.initDependencies(mMediaManager, mStatusBarStateController, - mKeyguardBypassController); + mKeyguardBypassController, DozeParameters.getInstance(mContext)); } else { Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies"); } @@ -1151,8 +1159,9 @@ public class StatusBar extends SystemUI implements DemoMode, private void inflateShelf() { mNotificationShelf = - (NotificationShelf) LayoutInflater.from(mContext).inflate( - R.layout.status_bar_notification_shelf, mStackScroller, false); + (NotificationShelf) mInjectionInflater.injectable( + LayoutInflater.from(mContext)).inflate( + R.layout.status_bar_notification_shelf, mStackScroller, false); mNotificationShelf.setOnClickListener(mGoToLockedShadeListener); } @@ -1918,19 +1927,18 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarKeyguardViewManager.readyForKeyguardDone(); } - public void dispatchNotificationsPanelTouchEvent(MotionEvent ev) { + /** + * Called when another window is about to transfer it's input focus. + */ + public void onInputFocusTransfer(boolean start) { if (!mCommandQueue.panelsEnabled()) { return; } - mNotificationPanel.dispatchTouchEvent(ev); - int action = ev.getAction(); - if (action == MotionEvent.ACTION_DOWN) { - // Start ignoring all touch events coming to status bar window. - // TODO: handle case where ACTION_UP is not sent over the binder - mStatusBarWindowController.setNotTouchable(true); - } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { - mStatusBarWindowController.setNotTouchable(false); + if (start) { + mNotificationPanel.startWaitingForOpenPanelGesture(); + } else { + mNotificationPanel.stopWaitingForOpenPanelGesture(); } } @@ -3574,7 +3582,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBouncerShowing = bouncerShowing; mKeyguardBypassController.setBouncerShowing(bouncerShowing); mPulseExpansionHandler.setBouncerShowing(bouncerShowing); - mStatusBarWindow.setBouncerShowing(bouncerShowing); + mStatusBarWindow.setBouncerShowingScrimmed(isBouncerShowingScrimmed()); if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing); updateHideIconsForBouncer(true /* animate */); mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */); @@ -3627,6 +3635,7 @@ public class StatusBar extends SystemUI implements DemoMode, notifyHeadsUpGoingToSleep(); dismissVolumeDialog(); mWakeUpCoordinator.setFullyAwake(false); + mBypassHeadsUpNotifier.setFullyAwake(false); mKeyguardBypassController.onStartedGoingToSleep(); } @@ -3651,6 +3660,7 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onFinishedWakingUp() { mWakeUpCoordinator.setFullyAwake(true); + mBypassHeadsUpNotifier.setFullyAwake(true); mWakeUpCoordinator.setWakingUp(false); if (mLaunchCameraWhenFinishedWaking) { mNotificationPanel.launchCamera(false /* animate */, mLastCameraLaunchSource); @@ -3824,7 +3834,8 @@ public class StatusBar extends SystemUI implements DemoMode, public void notifyBiometricAuthModeChanged() { updateDozing(); updateScrimController(); - mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock()); + mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock(), + mBiometricUnlockController.isBiometricUnlock()); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 6dc2c8cab055..462b65f37ee0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -814,7 +814,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb */ public boolean shouldSubtleWindowAnimationsForUnlock() { return mStatusBar.mKeyguardBypassController.getBypassEnabled() - && mStatusBar.mState == StatusBarState.KEYGUARD; + && mStatusBar.mState == StatusBarState.KEYGUARD && !mBouncer.isAnimatingAway(); } public boolean isGoingToNotificationShade() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index a82e14efca2f..94054188d769 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -272,10 +272,11 @@ public class StatusBarWindowView extends FrameLayout { /** * Called when the biometric authentication mode changes. * @param wakeAndUnlock If the type is {@link BiometricUnlockController#isWakeAndUnlock()} + * @param isUnlock If the type is {@link BiometricUnlockController#isBiometricUnlock()} () */ - public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + public void onBiometricAuthModeChanged(boolean wakeAndUnlock, boolean isUnlock) { if (mLockIcon != null) { - mLockIcon.onBiometricAuthModeChanged(wakeAndUnlock); + mLockIcon.onBiometricAuthModeChanged(wakeAndUnlock, isUnlock); } } @@ -525,9 +526,9 @@ public class StatusBarWindowView extends FrameLayout { mBypassController = bypassController; } - public void setBouncerShowing(boolean bouncerShowing) { + public void setBouncerShowingScrimmed(boolean bouncerShowing) { if (mLockIcon != null) { - mLockIcon.setBouncerShowing(bouncerShowing); + mLockIcon.setBouncerShowingScrimmed(bouncerShowing); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index 78eb394e3336..f36c56f60965 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -190,6 +190,11 @@ public class UnlockMethodCache { public void onKeyguardVisibilityChanged(boolean showing) { update(false /* updateAlways */); } + + @Override + public void onBiometricsCleared() { + update(false /* alwaysUpdate */); + } }; public boolean isTrustManaged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index 40d5e4dcfd64..b84dc476dd6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -356,6 +356,10 @@ public abstract class HeadsUpManager extends AlertingNotificationManager { public void onDensityOrFontScaleChanged() { } + public boolean isEntryAutoHeadsUpped(String key) { + return false; + } + /** * This represents a notification and how long it is in a heads up mode. It also manages its * lifecycle automatically when created. @@ -416,16 +420,17 @@ public abstract class HeadsUpManager extends AlertingNotificationManager { @Override protected long calculateFinishTime() { - return mPostTime + getRecommendedHeadsUpTimeoutMs(); + return mPostTime + getRecommendedHeadsUpTimeoutMs(mAutoDismissNotificationDecay); } /** * Get user-preferred or default timeout duration. The larger one will be returned. * @return milliseconds before auto-dismiss + * @param requestedTimeout */ - protected int getRecommendedHeadsUpTimeoutMs() { + protected int getRecommendedHeadsUpTimeoutMs(int requestedTimeout) { return mAccessibilityMgr.getRecommendedTimeoutMillis( - mAutoDismissNotificationDecay, + requestedTimeout, AccessibilityManager.FLAG_CONTENT_CONTROLS | AccessibilityManager.FLAG_CONTENT_ICONS | AccessibilityManager.FLAG_CONTENT_TEXT); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java index 01498e6bd54d..f61b556e22ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java @@ -50,5 +50,6 @@ public interface KeyguardMonitor extends CallbackController<Callback> { interface Callback { void onKeyguardShowingChanged(); + default void onKeyguardFadingAwayChanged() {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java index b53ff0e45cea..68d00708b0d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java @@ -141,14 +141,24 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback } public void notifyKeyguardFadingAway(long delay, long fadeoutDuration) { - mKeyguardFadingAway = true; + setKeyguardFadingAway(true); mKeyguardFadingAwayDelay = delay; mKeyguardFadingAwayDuration = fadeoutDuration; } + private void setKeyguardFadingAway(boolean keyguardFadingAway) { + if (mKeyguardFadingAway != keyguardFadingAway) { + mKeyguardFadingAway = keyguardFadingAway; + ArrayList<Callback> callbacks = new ArrayList<>(mCallbacks); + for (int i = 0; i < callbacks.size(); i++) { + callbacks.get(i).onKeyguardFadingAwayChanged(); + } + } + } + public void notifyKeyguardDoneFading() { - mKeyguardFadingAway = false; mKeyguardGoingAway = false; + setKeyguardFadingAway(false); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 13f93b923505..b21ba096c361 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -376,9 +376,9 @@ public class MobileSignalController extends SignalController< } private void updateDataSim() { - int defaultDataSub = mDefaults.getDefaultDataSubId(); - if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) { - mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId(); + int activeDataSubId = mDefaults.getActiveDataSubId(); + if (SubscriptionManager.isValidSubscriptionId(activeDataSubId)) { + mCurrentState.dataSim = activeDataSubId == mSubscriptionInfo.getSubscriptionId(); } else { // There doesn't seem to be a data sim selected, however if // there isn't a MobileSignalController with dataSim set, then diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index b2972fcd1286..d545dc8f7428 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -361,7 +361,7 @@ public class NetworkControllerImpl extends BroadcastReceiver } private MobileSignalController getDataController() { - int dataSubId = mSubDefaults.getDefaultDataSubId(); + int dataSubId = mSubDefaults.getActiveDataSubId(); if (!SubscriptionManager.isValidSubscriptionId(dataSubId)) { if (DEBUG) Log.e(TAG, "No data sim selected"); return mDefaultSignalController; @@ -1098,6 +1098,10 @@ public class NetworkControllerImpl extends BroadcastReceiver public int getDefaultDataSubId() { return SubscriptionManager.getDefaultDataSubscriptionId(); } + + public int getActiveDataSubId() { + return SubscriptionManager.getActiveDataSubscriptionId(); + } } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 6185063e7966..aa4dcc0ca2ae 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -15,7 +15,7 @@ */ package com.android.systemui.tuner; -import static com.android.systemui.Dependency.BG_HANDLER_NAME; +import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; import android.app.ActivityManager; import android.content.ContentResolver; @@ -82,7 +82,7 @@ public class TunerServiceImpl extends TunerService { /** */ @Inject - public TunerServiceImpl(Context context, @Named(BG_HANDLER_NAME) Handler bgHandler, + public TunerServiceImpl(Context context, @Named(MAIN_HANDLER_NAME) Handler mainHandler, LeakDetector leakDetector) { mContext = context; mContentResolver = mContext.getContentResolver(); @@ -91,7 +91,7 @@ public class TunerServiceImpl extends TunerService { for (UserInfo user : UserManager.get(mContext).getUsers()) { mCurrentUser = user.getUserHandle().getIdentifier(); if (getValue(TUNER_VERSION, 0) != CURRENT_TUNER_VERSION) { - upgradeTuner(getValue(TUNER_VERSION, 0), CURRENT_TUNER_VERSION, bgHandler); + upgradeTuner(getValue(TUNER_VERSION, 0), CURRENT_TUNER_VERSION, mainHandler); } } @@ -112,7 +112,7 @@ public class TunerServiceImpl extends TunerService { mUserTracker.stopTracking(); } - private void upgradeTuner(int oldVersion, int newVersion, Handler bgHandler) { + private void upgradeTuner(int oldVersion, int newVersion, Handler mainHandler) { if (oldVersion < 1) { String blacklistStr = getValue(StatusBarIconController.ICON_BLACKLIST); if (blacklistStr != null) { @@ -134,7 +134,7 @@ public class TunerServiceImpl extends TunerService { if (oldVersion < 4) { // Delay this so that we can wait for everything to be registered first. final int user = mCurrentUser; - bgHandler.postDelayed( + mainHandler.postDelayed( () -> clearAllFromUser(user), 5000); } setValue(TUNER_VERSION, newVersion); diff --git a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java index 31f4991a82b5..b9c5ee5a7a7e 100644 --- a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java +++ b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java @@ -156,17 +156,21 @@ public class AsyncSensorManager extends SensorManager * Requests for all sensors that match the given type from all plugins. * @param sensor * @param listener + * @return true if there were plugins to register the listener to */ - public void registerPluginListener(SensorManagerPlugin.Sensor sensor, + public boolean registerPluginListener(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.SensorEventListener listener) { if (mPlugins.isEmpty()) { Log.w(TAG, "No plugins registered"); + return false; } mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).registerListener(sensor, listener); } }); + + return true; } /** diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java index d521e5534ad4..ede30046d6c3 100644 --- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java +++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java @@ -32,6 +32,7 @@ import com.android.systemui.qs.QSFooterImpl; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickStatusBarHeader; +import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationPanelView; @@ -138,6 +139,11 @@ public class InjectionInflationController { QSCarrierGroup createQSCarrierGroup(); /** + * Creates the Shelf. + */ + NotificationShelf creatNotificationShelf(); + + /** * Creates the KeyguardClockSwitch. */ KeyguardClockSwitch createKeyguardClockSwitch(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 6208ab82dda6..2e02fd598e56 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -52,6 +52,7 @@ import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; import org.junit.Before; @@ -88,6 +89,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private UserManager mUserManager; @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock + private KeyguardBypassController mKeyguardBypassController; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -332,6 +335,28 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + public void testTriesToAuthenticate_whenTrustOnAgentKeyguard_ifBypass() { + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + when(mKeyguardBypassController.canBypass()).thenReturn(true); + mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */); + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test + public void testIgnoresAuth_whenTrustAgentOnKeyguard_withoutBypass() { + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */); + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test public void testOnFaceAuthenticated_skipsFaceWhenAuthenticated() { mKeyguardUpdateMonitor.onFaceAuthenticated(KeyguardUpdateMonitor.getCurrentUser()); mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java index 6891f562a3c4..3330d1e6d0a8 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java @@ -20,14 +20,12 @@ 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.reset; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; -import android.provider.DeviceConfig; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -52,8 +50,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.List; - @SmallTest @RunWith(AndroidTestingRunner.class) // Need to run tests on main looper because LiveData operations such as setData, observe, @@ -67,7 +63,7 @@ public final class ClockManagerTest extends SysuiTestCase { private static final int SECONDARY_USER_ID = 11; private static final Uri SETTINGS_URI = null; - ClockManager mClockManager; + private ClockManager mClockManager; private ContentObserver mContentObserver; private DockManagerFake mFakeDockManager; private MutableLiveData<Integer> mCurrentUser; @@ -144,33 +140,6 @@ public final class ClockManagerTest extends SysuiTestCase { } @Test - public void getCurrentClock_inBlackList() { - mClockManager = spy(mClockManager); - // GIVEN that settings is set to the bubble clock face - when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); - // WHEN settings change event is fired - mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); - // GIVEN that bubble clock is in blacklist - when(mClockManager.getBlackListFromConfig()).thenReturn(BUBBLE_CLOCK); - // WHEN device config change of systemui is fired - mClockManager.onDeviceConfigPropertiesChanged(DeviceConfig.NAMESPACE_SYSTEMUI); - // THEN the result is null, indicated the current clock should be reset to the default one. - assertThat(mClockManager.getCurrentClock()).isNull(); - } - - @Test - public void getClockInfo_inBlackList() { - mClockManager = spy(mClockManager); - // GIVEN that bubble clock is in blacklist - when(mClockManager.getBlackListFromConfig()).thenReturn(BUBBLE_CLOCK); - // WHEN device config change of systemui is fired - mClockManager.onDeviceConfigPropertiesChanged(DeviceConfig.NAMESPACE_SYSTEMUI); - // THEN the ClockInfo should not contain bubble clock - List<ClockInfo> clocks = mClockManager.getClockInfos(); - assertThat(clocks.stream().anyMatch(info -> BUBBLE_CLOCK.equals(info.getId()))).isFalse(); - } - - @Test public void onClockChanged_customClock() { // GIVEN that settings is set to the bubble clock face when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); diff --git a/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java b/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java new file mode 100644 index 000000000000..ccc9afcd4296 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java @@ -0,0 +1,192 @@ +/* + * 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; + +import static junit.framework.Assert.fail; + +import static org.junit.Assert.assertEquals; + +import android.annotation.DrawableRes; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.text.TextUtils; +import android.util.TypedValue; + +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.util.XmlUtils; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class IconPackOverlayTest extends SysuiTestCase { + + private static final String[] ICON_PACK_OVERLAY_PACKAGES = { + "com.android.theme.icon_pack.circular.systemui", + "com.android.theme.icon_pack.rounded.systemui", + "com.android.theme.icon_pack.filled.systemui", + }; + + private static final int[] VECTOR_ATTRIBUTES = { + android.R.attr.tint, + android.R.attr.height, + android.R.attr.width, + android.R.attr.alpha, + android.R.attr.autoMirrored, + }; + + private final TypedValue mTargetTypedValue = new TypedValue(); + private final TypedValue mOverlayTypedValue = new TypedValue(); + + private Resources mResources; + private TypedArray mOverlayableIcons; + + @Before + public void setup() { + mResources = mContext.getResources(); + mOverlayableIcons = mResources.obtainTypedArray(R.array.overlayable_icons); + } + + @After + public void teardown() { + mOverlayableIcons.recycle(); + } + + /** + * Ensure that all icons contained in overlayable_icons_test.xml exist in all 3 overlay icon + * packs for systemui. This test fails if you remove or rename an overlaid icon. If so, + * make the same change to the corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. + */ + @Test + public void testIconPack_containAllOverlayedIcons() { + StringBuilder errors = new StringBuilder(); + + for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { + Resources overlayResources; + try { + overlayResources = mContext.getPackageManager() + .getResourcesForApplication(overlayPackage); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + + for (int i = 0; i < mOverlayableIcons.length(); i++) { + int sysuiRid = mOverlayableIcons.getResourceId(i, 0); + String sysuiResourceName = mResources.getResourceName(sysuiRid); + String overlayResourceName = sysuiResourceName + .replace(mContext.getPackageName(), overlayPackage); + if (overlayResources.getIdentifier(overlayResourceName, null, null) + == Resources.ID_NULL) { + errors.append(String.format("[%s] is not contained in overlay package [%s]", + overlayResourceName, overlayPackage)); + } + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + /** + * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the + * underlying drawable in systemui. To fix this test, make the attribute change to all of the + * corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. + */ + @Test + public void testIconPacks_haveEqualVectorDrawableAttributes() { + StringBuilder errors = new StringBuilder(); + + for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { + Resources overlayResources; + try { + overlayResources = mContext.getPackageManager() + .getResourcesForApplication(overlayPackage); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + + for (int i = 0; i < mOverlayableIcons.length(); i++) { + int sysuiRid = mOverlayableIcons.getResourceId(i, 0); + String sysuiResourceName = mResources.getResourceName(sysuiRid); + TypedArray sysuiAttrs = getAVDAttributes(mResources, sysuiRid); + if (sysuiAttrs == null) { + errors.append(String.format("[%s] does not exist or is not a valid AVD.", + sysuiResourceName)); + continue; + } + + String overlayResourceName = sysuiResourceName + .replace(mContext.getPackageName(), overlayPackage); + int overlayRid = overlayResources.getIdentifier(overlayResourceName, null, null); + TypedArray overlayAttrs = getAVDAttributes(overlayResources, overlayRid); + if (overlayAttrs == null) { + errors.append(String.format("[%s] does not exist or is not a valid AVD.", + overlayResourceName)); + continue; + } + + if (!attributesEquals(sysuiAttrs, overlayAttrs)) { + errors.append(String.format("[%s] AVD attributes do not match [%s]\n", + sysuiResourceName, overlayResourceName)); + } + sysuiAttrs.recycle(); + overlayAttrs.recycle(); + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + private TypedArray getAVDAttributes(Resources resources, @DrawableRes int rid) { + try { + XmlResourceParser parser = resources.getXml(rid); + XmlUtils.nextElement(parser); + return resources.obtainAttributes(parser, VECTOR_ATTRIBUTES); + } catch (XmlPullParserException | IOException | Resources.NotFoundException e) { + return null; + } + } + + private boolean attributesEquals(TypedArray target, TypedArray overlay) { + assertEquals(target.length(), overlay.length()); + for (int i = 0; i < target.length(); i++) { + target.getValue(i, mTargetTypedValue); + overlay.getValue(i, mOverlayTypedValue); + if (!attributesEquals(mTargetTypedValue, mOverlayTypedValue)) { + return false; + } + } + return true; + } + + private boolean attributesEquals(TypedValue target, TypedValue overlay) { + return target.type == overlay.type && target.data == overlay.data; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java index 9438cbb6ebcd..2d6ae2629ce4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java @@ -36,7 +36,7 @@ public class DozeConfigurationUtil { when(params.getPulseOnSigMotion()).thenReturn(false); when(params.getPickupVibrationThreshold()).thenReturn(0); when(params.getProxCheckBeforePulse()).thenReturn(true); - when(params.getPickupSubtypePerformsProxCheck(anyInt())).thenReturn(true); + when(params.getPickupPerformsProxCheck()).thenReturn(true); when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class)); when(params.doubleTapReportsTouchCoordinates()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 33042918cfc9..7df45a3d8949 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -77,7 +78,9 @@ public class DozeSensorsTest extends SysuiTestCase { @Mock private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; @Mock - private TriggerSensor mMockTriggerSensor; + private TriggerSensor mTriggerSensor; + @Mock + private TriggerSensor mProxGatedTriggerSensor; private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener; private TestableLooper mTestableLooper; private DozeSensors mDozeSensors; @@ -85,6 +88,7 @@ public class DozeSensorsTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); + when(mProxGatedTriggerSensor.performsProxCheck()).thenReturn(true); mTestableLooper = TestableLooper.get(this); when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L); when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); @@ -114,21 +118,34 @@ public class DozeSensorsTest extends SysuiTestCase { @Test public void testSetListening_firstTrue_registerSettingsObserver() { - mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; - mDozeSensors.setListening(true); - verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); + verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); } @Test public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { - mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; mDozeSensors.setListening(true); - mDozeSensors.setListening(true); - verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + } + + @Test + public void testSetPaused_onlyPausesNonGatedSensors() { + mDozeSensors.setListening(true); + verify(mTriggerSensor).setListening(eq(true)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); + + clearInvocations(mTriggerSensor, mProxGatedTriggerSensor); + mDozeSensors.setPaused(true); + verify(mTriggerSensor).setListening(eq(false)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); + + clearInvocations(mTriggerSensor, mProxGatedTriggerSensor); + mDozeSensors.setPaused(false); + verify(mTriggerSensor).setListening(eq(true)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); } private class TestableDozeSensors extends DozeSensors { @@ -144,6 +161,7 @@ public class DozeSensorsTest extends SysuiTestCase { mWakeLockScreenListener = (PluginSensor) sensor; } } + mSensors = new TriggerSensor[] {mTriggerSensor, mProxGatedTriggerSensor}; } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index bf067947f2b9..893f3d184acb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.util.wakelock.SettableWakeLock; @@ -84,6 +85,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private SettableWakeLock mMediaWakeLock; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private DozeParameters mDozeParameters; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; @@ -94,7 +97,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mProvider = new TestableKeyguardSliceProvider(); mProvider.attachInfo(getContext(), null); mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController, - mKeyguardBypassController); + mKeyguardBypassController, mDozeParameters); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); } @@ -130,6 +133,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { MediaMetadata metadata = mock(MediaMetadata.class); when(metadata.getText(any())).thenReturn("metadata"); when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + when(mDozeParameters.getAlwaysOn()).thenReturn(true); mProvider.onMetadataOrStateChanged(metadata, PlaybackState.STATE_PLAYING); mProvider.onBindSlice(mProvider.getUri()); verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java index 010b85edacdd..58fb53aae7bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java @@ -20,12 +20,16 @@ import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.os.Handler; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.View; @@ -79,13 +83,19 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { @Mock private VisualStabilityManager mVisualStabilityManager; @Mock private ShadeController mShadeController; + private TestableLooper mTestableLooper; + private Handler mHandler; private NotificationViewHierarchyManager mViewHierarchyManager; private NotificationTestHelper mHelper; + private boolean mMadeReentrantCall = false; @Before public void setUp() { MockitoAnnotations.initMocks(this); - Assert.sMainLooper = TestableLooper.get(this).getLooper(); + mTestableLooper = TestableLooper.get(this); + Assert.sMainLooper = mTestableLooper.getLooper(); + mHandler = Handler.createAsync(mTestableLooper.getLooper()); + mDependency.injectTestDependency(NotificationEntryManager.class, mEntryManager); mDependency.injectTestDependency(NotificationLockscreenUserManager.class, mLockscreenUserManager); @@ -98,7 +108,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { when(mEntryManager.getNotificationData()).thenReturn(mNotificationData); mViewHierarchyManager = new NotificationViewHierarchyManager(mContext, - mLockscreenUserManager, mGroupManager, mVisualStabilityManager, + mHandler, mLockscreenUserManager, mGroupManager, mVisualStabilityManager, mock(StatusBarStateControllerImpl.class), mEntryManager, () -> mShadeController, new BubbleData(mContext), mock(KeyguardBypassController.class), @@ -215,9 +225,60 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { verify(entry0.getRow(), times(1)).showAppOpsIcons(any()); } + @Test + public void testReentrantCallsToOnDynamicPrivacyChangedPostForLater() { + // GIVEN a ListContainer that will make a re-entrant call to updateNotificationViews() + mMadeReentrantCall = false; + doAnswer((invocation) -> { + if (!mMadeReentrantCall) { + mMadeReentrantCall = true; + mViewHierarchyManager.onDynamicPrivacyChanged(); + } + return null; + }).when(mListContainer).setMaxDisplayedNotifications(anyInt()); + + // WHEN we call updateNotificationViews() + mViewHierarchyManager.updateNotificationViews(); + + // THEN onNotificationViewUpdateFinished() is only called once + verify(mListContainer).onNotificationViewUpdateFinished(); + + // WHEN we drain the looper + mTestableLooper.processAllMessages(); + + // THEN updateNotificationViews() is called a second time (for the reentrant call) + verify(mListContainer, times(2)).onNotificationViewUpdateFinished(); + } + + @Test + public void testMultipleReentrantCallsToOnDynamicPrivacyChangedOnlyPostOnce() { + // GIVEN a ListContainer that will make many re-entrant calls to updateNotificationViews() + mMadeReentrantCall = false; + doAnswer((invocation) -> { + if (!mMadeReentrantCall) { + mMadeReentrantCall = true; + mViewHierarchyManager.onDynamicPrivacyChanged(); + mViewHierarchyManager.onDynamicPrivacyChanged(); + mViewHierarchyManager.onDynamicPrivacyChanged(); + mViewHierarchyManager.onDynamicPrivacyChanged(); + } + return null; + }).when(mListContainer).setMaxDisplayedNotifications(anyInt()); + + // WHEN we call updateNotificationViews() and drain the looper + mViewHierarchyManager.updateNotificationViews(); + verify(mListContainer).onNotificationViewUpdateFinished(); + clearInvocations(mListContainer); + mTestableLooper.processAllMessages(); + + // THEN updateNotificationViews() is called only one more time + verify(mListContainer).onNotificationViewUpdateFinished(); + } + private class FakeListContainer implements NotificationListContainer { final LinearLayout mLayout = new LinearLayout(mContext); final List<View> mRows = Lists.newArrayList(); + private boolean mMakeReentrantCallDuringSetMaxDisplayedNotifications; @Override public void setChildTransferInProgress(boolean childTransferInProgress) {} @@ -266,7 +327,11 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { } @Override - public void setMaxDisplayedNotifications(int maxNotifications) {} + public void setMaxDisplayedNotifications(int maxNotifications) { + if (mMakeReentrantCallDuringSetMaxDisplayedNotifications) { + mViewHierarchyManager.onDynamicPrivacyChanged(); + } + } @Override public ViewGroup getViewParentForNotification(NotificationEntry entry) { @@ -301,5 +366,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { return false; } + @Override + public void onNotificationViewUpdateFinished() { } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java index f6f4eb489603..60050b182e0f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.phone; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; - import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; @@ -33,7 +29,6 @@ import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; import com.android.systemui.doze.DozeScreenState; -import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher; import org.junit.Assert; import org.junit.Test; @@ -44,160 +39,6 @@ import org.junit.runner.RunWith; public class DozeParametersTest extends SysuiTestCase { @Test - public void test_inOutMatcher_defaultIn() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("*"); - - assertTrue(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(-1)); - assertTrue(intInOutMatcher.isIn(0)); - } - - @Test - public void test_inOutMatcher_defaultOut() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertFalse(intInOutMatcher.isIn(-1)); - assertFalse(intInOutMatcher.isIn(0)); - } - - @Test - public void test_inOutMatcher_someIn() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("1,2,3,!*"); - - assertTrue(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(2)); - assertTrue(intInOutMatcher.isIn(3)); - - assertFalse(intInOutMatcher.isIn(0)); - assertFalse(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_someOut() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!1,!2,!3,*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertFalse(intInOutMatcher.isIn(2)); - assertFalse(intInOutMatcher.isIn(3)); - - assertTrue(intInOutMatcher.isIn(0)); - assertTrue(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_mixed() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!1,2,!3,*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(2)); - assertFalse(intInOutMatcher.isIn(3)); - - assertTrue(intInOutMatcher.isIn(0)); - assertTrue(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_failEmpty() { - try { - new IntInOutMatcher(""); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failNull() { - try { - new IntInOutMatcher(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failEmptyClause() { - try { - new IntInOutMatcher("!1,*,"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failDuplicate() { - try { - new IntInOutMatcher("!1,*,!1"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failDuplicateDefault() { - try { - new IntInOutMatcher("!1,*,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failMalformedNot() { - try { - new IntInOutMatcher("!,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failText() { - try { - new IntInOutMatcher("!abc,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failContradiction() { - try { - new IntInOutMatcher("1,!1,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failContradictionDefault() { - try { - new IntInOutMatcher("1,*,!*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failMissingDefault() { - try { - new IntInOutMatcher("1"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test public void test_setControlScreenOffAnimation_setsDozeAfterScreenOff_false() { TestableDozeParameters dozeParameters = new TestableDozeParameters(getContext()); PowerManager mockedPowerManager = dozeParameters.getPowerManager(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 3464fe574007..9ae9ceb2629f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -181,6 +181,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void setDefaultSubId(int subId) { when(mMockSubDefaults.getDefaultDataSubId()).thenReturn(subId); when(mMockSubDefaults.getDefaultVoiceSubId()).thenReturn(subId); + when(mMockSubDefaults.getActiveDataSubId()).thenReturn(subId); } protected void setSubscriptions(int... subIds) { diff --git a/packages/SystemUI/tools/lint/baseline.xml b/packages/SystemUI/tools/lint/baseline.xml index 8c43222894ec..096a63901b9d 100644 --- a/packages/SystemUI/tools/lint/baseline.xml +++ b/packages/SystemUI/tools/lint/baseline.xml @@ -2685,39 +2685,6 @@ <issue id="UnusedResources" - message="The resource `R.dimen.volume_dialog_base_margin` appears to be unused" - errorLine1=" <dimen name="volume_dialog_base_margin">8dp</dimen>" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="res/values/dimens.xml" - line="308" - column="12"/> - </issue> - - <issue - id="UnusedResources" - message="The resource `R.dimen.volume_dialog_row_height` appears to be unused" - errorLine1=" <dimen name="volume_dialog_row_height">252dp</dimen>" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="res/values/dimens.xml" - line="314" - column="12"/> - </issue> - - <issue - id="UnusedResources" - message="The resource `R.dimen.volume_dialog_settings_icon_size` appears to be unused" - errorLine1=" <dimen name="volume_dialog_settings_icon_size">16dp</dimen>" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="res/values/dimens.xml" - line="328" - column="12"/> - </issue> - - <issue - id="UnusedResources" message="The resource `R.dimen.carrier_label_height` appears to be unused" errorLine1=" <dimen name="carrier_label_height">24dp</dimen>" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> diff --git a/packages/overlays/Android.mk b/packages/overlays/Android.mk index 3f16c128f664..3eb90491f902 100644 --- a/packages/overlays/Android.mk +++ b/packages/overlays/Android.mk @@ -44,7 +44,6 @@ LOCAL_REQUIRED_MODULES := \ IconPackRoundedSystemUIOverlay \ IconPackRoundedThemePickerUIOverlay \ IconShapeRoundedRectOverlay \ - IconShapeSquareOverlay \ IconShapeSquircleOverlay \ IconShapeTeardropOverlay \ NavigationBarMode3ButtonOverlay \ diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..64802640a9ec --- /dev/null +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.64,3 L12.64,8.82352941 C12.2536,8.5 11.772,8.29411765 11.24,8.29411765 C10.0024,8.29411765 9,9.34705882 9,10.6470588 C9,11.9470588 10.0024,13 11.24,13 C12.4776,13 13.48,11.9470588 13.48,10.6470588 L13.48,5.00157166 L15.02,5.00157166 C15.5576,5.00157166 16,4.53686577 16,3.97215989 L16,3 L12.64,3 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M20,2 C20,0.9 19.1,0 18,0 L6,0 C4.9,0 4,0.9 4,2 L4,14 C4,15.1 4.9,16 6,16 L18,16 C19.1,16 20,15.1 20,14 L20,2 Z M18.5,14 C18.5,14.28 18.28,14.5 18,14.5 L6,14.5 C5.72,14.5 5.5,14.28 5.5,14 L5.5,2 C5.5,1.72 5.72,1.5 6,1.5 L18,1.5 C18.28,1.5 18.5,1.72 18.5,2 L18.5,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M0.5,4.75 L0.5,16.75 C0.5,18.27 1.73,19.5 3.25,19.5 L15.25,19.5 C15.66,19.5 16,19.16 16,18.75 C16,18.34 15.66,18 15.25,18 L3.25,18 C2.56,18 2,17.44 2,16.75 L2,4.75 C2,4.34 1.66,4 1.25,4 C0.84,4 0.5,4.34 0.5,4.75 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml index ae5cc2bf9883..30f29f778858 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml @@ -30,4 +30,12 @@ <string name="config_batterymeterPowersavePath" translatable="false"> M 3.75,11.25 H 5.25 V 12.75 C 5.25,13.16 5.59,13.5 6,13.5 6.41,13.5 6.75,13.16 6.75,12.75 V 11.25 H 8.25 C 8.66,11.25 9,10.91 9,10.5 9,10.09 8.6601,9.75 8.25,9.75 H 6.75 V 8.25 C 6.75,7.84 6.41,7.5 6,7.5 5.59,7.5 5.25,7.84 5.25,8.25 V 9.75 H 3.75 C 3.34,9.75 3,10.09 3,10.5 3,10.91 3.34,11.25 3.75,11.25 Z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 17.81,18.75 L 19.81,16.75 C 20.01,16.56 20.09,16.28 20.02,16.02 C 19.96,15.75 19.75,15.54 19.48,15.47 C 19.22,15.41 18.94,15.49 18.75,15.69 L 16.75,17.69 L 14.75,15.69 C 14.56,15.49 14.28,15.41 14.02,15.47 C 13.75,15.54 13.54,15.75 13.47,16.02 C 13.41,16.28 13.49,16.56 13.69,16.75 L 15.69,18.75 L 13.69,20.75 C 13.4,21.04 13.4,21.52 13.69,21.81 C 13.98,22.1 14.46,22.1 14.75,21.81 L 16.75,19.81 L 18.75,21.81 C 19.04,22.1 19.52,22.1 19.81,21.81 C 20.1,21.52 20.1,21.04 19.81,20.75 Z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">10.5</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> </resources> diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..0572fb72f82e --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,18.5 C6.313,18.5 2.5,14.687 2.5,10 C2.5,8.182 3.078,6.498 4.055,5.114 L15.887,16.945 C14.503,17.922 12.818,18.5 11,18.5 M20.031,18.969 L2.032,0.971 C1.739,0.678 1.264,0.678 0.971,0.971 C0.678,1.264 0.678,1.738 0.971,2.031 L2.983,4.043 C1.742,5.707 1,7.765 1,10 C1,15.522 5.477,20 11,20 C13.236,20 15.293,19.258 16.957,18.017 L18.971,20.029 C19.117,20.176 19.309,20.249 19.501,20.249 C19.693,20.249 19.885,20.176 20.031,20.029 C20.324,19.736 20.324,19.262 20.031,18.969" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,1.5 C15.687,1.5 19.5,5.313 19.5,10 C19.5,11.782 18.946,13.436 18.006,14.804 L19.078,15.877 C20.281,14.226 21,12.199 21,10 C21,4.478 16.522,0 11,0 C8.801,0 6.774,0.719 5.124,1.922 L6.196,2.994 C7.564,2.054 9.218,1.5 11,1.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..41962b27b270 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.25,0.2637 L12.25,1.8127 C15.847,2.8017 18.5,6.0927 18.5,9.9997 C18.5,14.6867 14.687,18.4997 10,18.4997 C5.313,18.4997 1.5,14.6867 1.5,9.9997 C1.5,6.0927 4.153,2.8017 7.75,1.8127 L7.75,0.2637 C3.312,1.2847 0,5.2517 0,9.9997 C0,15.5227 4.477,19.9997 10,19.9997 C15.523,19.9997 20,15.5227 20,9.9997 C20,5.2517 16.687,1.2847 12.25,0.2637" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.0303,9.9697 C14.7373,9.6767 14.2623,9.6767 13.9693,9.9697 L10.7503,13.1897 L10.7503,0.7387 C10.7503,0.3307 10.4143,-0.0003 10.0003,-0.0003 C9.5863,-0.0003 9.2503,0.3307 9.2503,0.7387 L9.2503,13.1897 L6.0303,9.9697 C5.7373,9.6767 5.2623,9.6767 4.9693,9.9697 C4.6763,10.2627 4.6763,10.7377 4.9693,11.0307 L10.0003,16.0607 L15.0303,11.0307 C15.3233,10.7377 15.3233,10.2627 15.0303,9.9697" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..a0233ba8acc9 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.9902,13.5098 C12.9902,13.7858 12.7652,14.0098 12.4902,14.0098 C12.2142,14.0098 11.9902,13.7858 11.9902,13.5098 L11.9902,11.5098 C11.9902,11.2348 12.2142,11.0098 12.4902,11.0098 C12.7652,11.0098 12.9902,11.2348 12.9902,11.5098 L12.9902,13.5098 Z M12.4902,16.0098 C12.2142,16.0098 11.9902,15.7858 11.9902,15.5098 C11.9902,15.2348 12.2142,15.0098 12.4902,15.0098 C12.7652,15.0098 12.9902,15.2348 12.9902,15.5098 C12.9902,15.7858 12.7652,16.0098 12.4902,16.0098 L12.4902,16.0098 Z M15.5182,11.7848 C15.8372,10.9048 16.0102,9.9558 16.0102,8.9698 C16.0102,6.0698 14.5002,3.4798 12.1102,2.0098 L14.5102,2.0098 C14.9102,1.9998 15.2502,1.6598 15.2502,1.2498 C15.2502,0.8398 14.9102,0.4998 14.5002,0.4998 L9.2502,0.4998 L9.2502,6.2498 C9.2502,6.6598 9.5902,6.9998 10.0002,6.9998 C10.4102,6.9998 10.7502,6.6598 10.7502,6.2498 L10.7502,2.9398 C13.0302,4.0598 14.5002,6.3698 14.5002,8.9698 C14.5002,9.5068 14.4172,10.0238 14.2982,10.5268 C13.7682,10.2048 13.1542,10.0098 12.4902,10.0098 C10.5562,10.0098 8.9902,11.5768 8.9902,13.5098 C8.9902,15.4438 10.5562,17.0098 12.4902,17.0098 C14.4232,17.0098 15.9902,15.4438 15.9902,13.5098 C15.9902,12.8798 15.8092,12.2958 15.5182,11.7848 L15.5182,11.7848 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M6.3901,1.04 C2.6301,1.91 0.0001,5.21 0.0001,9.07 C0.0001,11.65 1.2001,13.98 3.1301,15.5 L1.5001,15.5 C1.0901,15.5 0.7501,15.84 0.7501,16.25 C0.7501,16.66 1.0901,17 1.5001,17 L6.7501,17 L6.7501,11.75 C6.7501,11.34 6.4101,11 6.0001,11 C5.5901,11 5.2501,11.34 5.2501,11.75 L5.2501,15.09 C2.9701,13.97 1.5001,11.66 1.5001,9.06 C1.5001,5.91 3.6501,3.21 6.7301,2.5 C7.1301,2.41 7.3901,2 7.2901,1.6 C7.2001,1.2 6.8001,0.95 6.3901,1.04" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..3f5c75b66f4c --- /dev/null +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path android:pathData="M0 0h24v24H0z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M20 2H8c-1.1 0-2 0.9-2 2v12c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2V4c0-1.1-0.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c0.57 0 1.08 0.19 1.5 0.51 V5h4v2zM4 6H2v14c0 1.1 0.9 2 2 2h14v-2H4V6z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml index 6b59b6265c54..f1d8c7345396 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml @@ -33,4 +33,12 @@ M 9,11 C 9,11.55 8.55,12 8,12 H 7 V 13 C 7,13.55 6.55,14 6,14 5.45,14 5,13.55 5,13 V 12 H 4 C 3.45,12 3,11.55 3,11 3,10.45 3.45,10.005 4,10 H 5 V 9 C 5,8.45 5.45,8 6,8 6.55,8 7,8.45 7,9 V 10 H 8 C 8.55,10 9,10.45 9,11 Z </string> <bool name="config_batterymeterDualTone">true</bool> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 21.7,20.28 L 19.92,18.5 L 21.7,16.72 C 22.1,16.32 22.1,15.68 21.71,15.29 C 21.32,14.9 20.68,14.9 20.28,15.3 L 18.5,17.08 L 16.72,15.3 C 16.32,14.9 15.68,14.9 15.29,15.29 C 14.9,15.68 14.9,16.32 15.3,16.72 L 17.08,18.5 L 15.3,20.28 C 14.9,20.68 14.9,21.32 15.29,21.71 C 15.68,22.1 16.32,22.1 16.72,21.7 L 18.5,19.92 L 20.28,21.7 C 20.68,22.1 21.32,22.1 21.71,21.71 C 22.1,21.32 22.1,20.68 21.7,20.28 + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">11</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> </resources> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..b816e4e838fe --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:scaleX="-1" + android:translateX="-12.000000" + android:translateY="-12.000000" > + <path + android:fillType="evenOdd" + android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" + android:strokeWidth="1" /> + </group> + <path + android:fillColor="@android:color/white" + android:pathData="M12.11,2 C10.33,2 8.67,2.46 7.22,3.28 L8.7,4.76 C9.74,4.28 10.89,4 12.11,4 C16.52,4 20.11,7.59 20.11,12 C20.11,13.22 19.83,14.37 19.35,15.41 L20.83,16.89 C21.65,15.44 22.11,13.78 22.11,12 C22.11,6.48 17.63,2 12.11,2 Z M18.23,17.13 L6.98,5.87 L4.12750442,3.01750442 C3.73635677,2.62635677 3.10252735,2.62523693 2.71,3.015 C2.31926097,3.40298735 2.31703029,4.0342698 2.70501764,4.42500883 C2.70584509,4.42584216 2.70667402,4.42667402 2.70750442,4.42750442 L4.19,5.91 C2.88,7.59 2.11,9.71 2.11,12 C2.11,17.52 6.59,22 12.11,22 C14.4,22 16.52,21.23 18.2,19.92 L19.685,21.405 C20.0743607,21.7943607 20.7056393,21.7943607 21.095,21.405 C21.4843607,21.0156393 21.4843607,20.3843607 21.095,19.995 L18.23,17.13 Z M12.11,20 C7.7,20 4.11,16.41 4.11,12 C4.11,10.26 4.67,8.65 5.62,7.34 L16.77,18.49 C15.46,19.44 13.85,20 12.11,20 Z M8.7,4.76 L7.22,3.28 L8.7,4.76 Z" + android:strokeWidth="1" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..d0b6209b38ad --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:scaleX="-1" + android:translateX="-12.000000" + android:translateY="-12.000000" > + <path + android:fillType="evenOdd" + android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" + android:strokeWidth="1" /> + </group> + <path + android:fillColor="@android:color/white" + android:pathData="M13.0016705,11.5012475 L15.3917467,11.5012475 C15.9314188,11.5012475 16.206996,12.1426752 15.8165949,12.5140281 L12.4292913,15.822445 C12.1961989,16.0553846 11.8138355,16.0598858 11.5761501,15.8314475 C11.5738536,15.8280716 11.5704089,15.8258209 11.5681124,15.822445 L8.17851232,12.5117775 C7.79729714,12.1392993 8.06713319,11.5012475 8.60565705,11.5012475 L11.002341,11.5012475 L11.002341,2.99966471 C11.002341,2.44756514 11.4499062,2 12.0020057,2 C12.5541053,2 13.0016705,2.44756514 13.0016705,2.99966471 L13.0016705,11.5012475 Z M15,2.46 L15,4.59 C17.93,5.78 20,8.65 20,12 C20,16.41 16.41,20 12,20 C7.59,20 4,16.41 4,12 C4,8.65 6.07,5.78 9,4.59 L9,2.46 C4.94,3.74 2,7.53 2,12 C2,17.52 6.48,22 12,22 C17.52,22 22,17.52 22,12 C22,7.53 19.06,3.74 15,2.46 Z" + android:strokeWidth="1" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..f2dd9e818fc4 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path android:pathData="M0 0h24v24H0z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M3 12c0 2.21 0.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24C5.68 15.15 5 13.66 5 12c0-2.61 1.67-4.83 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24C18.32 8.85 19 10.34 19 12c0 2.61-1.67 4.83-4 5.65v2.09c3.45-0.89 6-4.01 6-7.74 0-2.21-0.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..8cd240d47b2d --- /dev/null +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M18,0 L6,0 C4.9,0 4,0.9 4,2 L4,14 C4,15.1 4.9,16 6,16 L18,16 C19.1,16 20,15.1 20,14 L20,2 C20,0.9 19.1,0 18,0 Z M18.5,14 C18.5,14.28 18.28,14.5 18,14.5 L6,14.5 C5.72,14.5 5.5,14.28 5.5,14 L5.5,2 C5.5,1.72 5.72,1.5 6,1.5 L18,1.5 C18.28,1.5 18.5,1.72 18.5,2 L18.5,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.86,3.10740288 C15.7704,3.02963963 15.6528,2.990758 15.5352,3.00186703 L13.0152,3.27959295 C12.8024,3.30736554 12.64,3.48511013 12.64,3.69618182 L12.64,9.056292 C12.2536,8.75079349 11.772,8.55638535 11.24,8.55638535 C10.0024,8.55638535 9,9.55064413 9,10.7781927 C9,12.0057412 10.0024,13 11.24,13 C12.4776,13 13.48,12.0057412 13.48,10.7781927 L13.48,5.01241596 L15.6248,4.77912619 C15.8376,4.7513536 16,4.57360901 16,4.36253732 L16,3.41845591 C16,3.30181102 15.9496,3.18516614 15.86,3.10740288 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M15.25,18 L3.25,18 C2.56,18 2,17.44 2,16.75 L2,4.75 C2,4.34 1.66,4 1.25,4 C0.84,4 0.5,4.34 0.5,4.75 L0.5,16.75 C0.5,18.27 1.73,19.5 3.25,19.5 L15.25,19.5 C15.66,19.5 16,19.16 16,18.75 C16,18.34 15.66,18 15.25,18 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml index ebcac82c695f..b7bfaad56249 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml @@ -30,4 +30,12 @@ <string name="config_batterymeterPowersavePath" translatable="false"> M 3.75,11.25 H 5.25 V 12.75 C 5.25,13.16 5.59,13.5 6,13.5 6.41,13.5 6.75,13.16 6.75,12.75 V 11.25 H 8.25 C 8.66,11.25 9,10.91 9,10.5 9,10.09 8.66,9.7499 8.25,9.7499 H 6.75 V 8.2499 C 6.75,7.8399 6.41,7.4999 6,7.4999 5.59,7.4999 5.2794,7.841 5.25,8.2499 V 9.7499 H 3.75 C 3.34,9.7499 3,10.09 3,10.5 3,10.91 3.3401,11.25 3.75,11.25 Z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 20.72,16.22 L 19,17.94 L 17.28,16.22 C 16.99,15.93 16.51,15.93 16.22,16.22 C 15.93,16.51 15.93,16.99 16.22,17.28 L 17.94,19 L 16.22,20.72 C 15.93,21.01 15.93,21.49 16.22,21.78 C 16.37,21.93 16.56,22 16.75,22 C 16.94,22 17.13,21.93 17.28,21.78 L 19,20.06 L 20.72,21.78 C 20.87,21.93 21.06,22 21.25,22 C 21.44,22 21.63,21.93 21.78,21.78 C 22.07,21.49 22.07,21.01 21.78,20.72 L 20.06,19 L 21.78,17.28 C 22.07,16.99 22.07,16.51 21.78,16.22 C 21.49,15.93 21.01,15.93 20.72,16.22 Z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">10</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">10</item> </resources> diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..0572fb72f82e --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,18.5 C6.313,18.5 2.5,14.687 2.5,10 C2.5,8.182 3.078,6.498 4.055,5.114 L15.887,16.945 C14.503,17.922 12.818,18.5 11,18.5 M20.031,18.969 L2.032,0.971 C1.739,0.678 1.264,0.678 0.971,0.971 C0.678,1.264 0.678,1.738 0.971,2.031 L2.983,4.043 C1.742,5.707 1,7.765 1,10 C1,15.522 5.477,20 11,20 C13.236,20 15.293,19.258 16.957,18.017 L18.971,20.029 C19.117,20.176 19.309,20.249 19.501,20.249 C19.693,20.249 19.885,20.176 20.031,20.029 C20.324,19.736 20.324,19.262 20.031,18.969" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,1.5 C15.687,1.5 19.5,5.313 19.5,10 C19.5,11.782 18.946,13.436 18.006,14.804 L19.078,15.877 C20.281,14.226 21,12.199 21,10 C21,4.478 16.522,0 11,0 C8.801,0 6.774,0.719 5.124,1.922 L6.196,2.994 C7.564,2.054 9.218,1.5 11,1.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..ec608cdf67dd --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.2502,0.2637 L12.2502,1.8127 C15.8472,2.8017 18.5002,6.0927 18.5002,9.9997 C18.5002,14.6867 14.6872,18.4997 10.0002,18.4997 C5.3132,18.4997 1.5002,14.6867 1.5002,9.9997 C1.5002,6.0927 4.1532,2.8017 7.7502,1.8127 L7.7502,0.2637 C3.3122,1.2847 0.0002,5.2517 0.0002,9.9997 C0.0002,15.5227 4.4772,19.9997 10.0002,19.9997 C15.5222,19.9997 20.0002,15.5227 20.0002,9.9997 C20.0002,5.2517 16.6872,1.2847 12.2502,0.2637" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.0304,9.9697 C14.7374,9.6767 14.2624,9.6767 13.9694,9.9697 L10.7504,13.1897 L10.7504,0.7387 C10.7504,0.3307 10.4144,-0.0003 10.0004,-0.0003 C9.5864,-0.0003 9.2504,0.3307 9.2504,0.7387 L9.2504,13.1897 L6.0304,9.9697 C5.7374,9.6767 5.2624,9.6767 4.9694,9.9697 C4.6764,10.2627 4.6764,10.7377 4.9694,11.0307 L9.4694,15.5307 C9.6164,15.6767 9.8074,15.7497 10.0004,15.7497 C10.1924,15.7497 10.3844,15.6767 10.5304,15.5307 L15.0304,11.0307 C15.3234,10.7377 15.3234,10.2627 15.0304,9.9697" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..e9a07cc3b988 --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="3.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M16.7178,12.626 C17.2378,11.522 17.5288,10.291 17.5288,9 C17.5288,6.119 16.1088,3.539 13.8488,2 L15.7588,2 C16.1578,2 16.4988,1.659 16.4988,1.25 C16.4988,0.84 16.1578,0.5 15.7488,0.5 L10.7488,0.5 C10.3388,0.5 9.9988,0.84 9.9988,1.25 L9.9988,6.25 C9.9988,6.659 10.3388,7 10.7488,7 C11.1578,7 11.4988,6.659 11.4988,6.25 L11.4988,2.47 C14.1978,3.489 16.0188,6.039 16.0188,9 C16.0188,9.785 15.8828,10.542 15.6438,11.252 C15.0498,10.788 14.3108,10.5 13.4988,10.5 C11.5658,10.5 9.9988,12.066 9.9988,14 C9.9988,15.933 11.5658,17.5 13.4988,17.5 C15.4318,17.5 16.9988,15.933 16.9988,14 C16.9988,13.512 16.8978,13.048 16.7178,12.626 L16.7178,12.626 Z M13.4988,16.5 C13.2228,16.5 12.9988,16.275 12.9988,16 C12.9988,15.723 13.2228,15.5 13.4988,15.5 C13.7748,15.5 13.9988,15.723 13.9988,16 C13.9988,16.275 13.7748,16.5 13.4988,16.5 L13.4988,16.5 Z M13.9988,14 C13.9988,14.275 13.7748,14.5 13.4988,14.5 C13.2228,14.5 12.9988,14.275 12.9988,14 L12.9988,12 C12.9988,11.723 13.2228,11.5 13.4988,11.5 C13.7748,11.5 13.9988,11.723 13.9988,12 L13.9988,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M7.0811,0.7197 C3.1901,1.6097 0.4801,5.0097 0.4801,8.9997 C0.4801,11.8797 1.9011,14.4587 4.1611,15.9987 L2.2511,15.9987 C1.8411,15.9987 1.5011,16.3397 1.5011,16.7497 C1.5011,17.1577 1.8411,17.4997 2.2511,17.4997 L7.2511,17.4997 C7.6621,17.4997 8.0011,17.1577 8.0011,16.7497 L8.0011,11.7487 C8.0011,11.3397 7.6621,10.9997 7.2511,10.9997 C6.8411,10.9997 6.5021,11.3397 6.5021,11.7487 L6.5021,15.5287 C3.8011,14.5107 1.9811,11.9587 1.9811,8.9997 C1.9811,5.7197 4.2111,2.9097 7.4211,2.1807 C7.8221,2.0907 8.0811,1.6797 7.9801,1.2797 C7.9041,0.9347 7.5961,0.7017 7.2491,0.7017 C7.1941,0.7017 7.1381,0.7067 7.0811,0.7197" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index c7f415422781..1873de53867e 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -297,7 +297,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } public boolean canReceiveEventsLocked() { - return (mEventTypes != 0 && mFeedbackType != 0 && mService != null); + return (mEventTypes != 0 && mService != null); } @Override diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 3764ca4b7906..988db6a87100 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -2924,6 +2924,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (sVerbose) { Slog.v(TAG, "Adding autofillable view with id " + id + " and state " + state); } + viewState.setCurrentValue(findValueLocked(id)); mViewStates.put(id, viewState); } if ((state & ViewState.STATE_AUTOFILLED) != 0) { diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java index e1b089cf28b2..84886f83027d 100644 --- a/services/autofill/java/com/android/server/autofill/ViewState.java +++ b/services/autofill/java/com/android/server/autofill/ViewState.java @@ -227,6 +227,7 @@ final class ViewState { if (mVirtualBounds != null) { builder.append(", virtualBounds:" ).append(mVirtualBounds); } + builder.append("]"); return builder.toString(); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index f0321c190b5f..4f7900eefee2 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2579,8 +2579,8 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai.everConnected) { loge("ERROR: cannot call explicitlySelected on already-connected network"); } - nai.networkMisc.explicitlySelected = (msg.arg1 == 1); - nai.networkMisc.acceptUnvalidated = (msg.arg1 == 1) && (msg.arg2 == 1); + nai.networkMisc.explicitlySelected = toBool(msg.arg1); + nai.networkMisc.acceptUnvalidated = toBool(msg.arg1) && toBool(msg.arg2); // Mark the network as temporarily accepting partial connectivity so that it // will be validated (and possibly become default) even if it only provides // partial internet access. Note that if user connects to partial connectivity @@ -2588,7 +2588,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // out of wifi coverage) and if the same wifi is available again, the device // will auto connect to this wifi even though the wifi has "no internet". // TODO: Evaluate using a separate setting in IpMemoryStore. - nai.networkMisc.acceptPartialConnectivity = (msg.arg2 == 1); + nai.networkMisc.acceptPartialConnectivity = toBool(msg.arg2); break; } case NetworkAgent.EVENT_SOCKET_KEEPALIVE: { diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index a3f26ad64f39..3ebe70266c71 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -1098,12 +1098,9 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") public void sendExtraCommandLocked(String command, Bundle extras) { if (mProvider != null) { - long identity = Binder.clearCallingIdentity(); - try { - mProvider.sendExtraCommand(command, extras); - } finally { - Binder.restoreCallingIdentity(identity); - } + // intentionally do not clear binder identity so that providers can evaluate who + // is sending the extra command + mProvider.sendExtraCommand(command, extras); } } diff --git a/services/core/java/com/android/server/OldNetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java index 068b83d7732e..b0b45f411d34 100644 --- a/services/core/java/com/android/server/OldNetworkTimeUpdateService.java +++ b/services/core/java/com/android/server/NetworkTimeUpdateServiceImpl.java @@ -55,7 +55,7 @@ import java.io.PrintWriter; * available. * </p> */ -public class OldNetworkTimeUpdateService extends Binder implements NetworkTimeUpdateService { +public class NetworkTimeUpdateServiceImpl extends Binder implements NetworkTimeUpdateService { private static final String TAG = "NetworkTimeUpdateService"; private static final boolean DBG = false; @@ -98,7 +98,7 @@ public class OldNetworkTimeUpdateService extends Binder implements NetworkTimeUp // connection to happen. private int mTryAgainCounter; - public OldNetworkTimeUpdateService(Context context) { + public NetworkTimeUpdateServiceImpl(Context context) { mContext = context; mTime = NtpTrustedTime.getInstance(context); mAlarmManager = mContext.getSystemService(AlarmManager.class); diff --git a/services/core/java/com/android/server/NewNetworkTimeUpdateService.java b/services/core/java/com/android/server/NewNetworkTimeUpdateService.java deleted file mode 100644 index d21741ad356a..000000000000 --- a/services/core/java/com/android/server/NewNetworkTimeUpdateService.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (C) 2010 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; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.database.ContentObserver; -import android.net.ConnectivityManager; -import android.net.ConnectivityManager.NetworkCallback; -import android.net.Network; -import android.os.Binder; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Looper; -import android.os.Message; -import android.os.PowerManager; -import android.os.SystemClock; -import android.provider.Settings; -import android.util.Log; -import android.util.NtpTrustedTime; -import android.util.TimeUtils; - -import com.android.internal.telephony.TelephonyIntents; -import com.android.internal.util.DumpUtils; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * Monitors the network time and updates the system time if it is out of sync - * and there hasn't been any NITZ update from the carrier recently. - * If looking up the network time fails for some reason, it tries a few times with a short - * interval and then resets to checking on longer intervals. - * <p> - * If the user enables AUTO_TIME, it will check immediately for the network time, if NITZ wasn't - * available. - * </p> - */ -public class NewNetworkTimeUpdateService extends Binder implements NetworkTimeUpdateService { - - private static final String TAG = "NetworkTimeUpdateService"; - private static final boolean DBG = false; - - private static final int EVENT_AUTO_TIME_CHANGED = 1; - private static final int EVENT_POLL_NETWORK_TIME = 2; - private static final int EVENT_NETWORK_CHANGED = 3; - - private static final String ACTION_POLL = - "com.android.server.NetworkTimeUpdateService.action.POLL"; - - private static final int POLL_REQUEST = 0; - - private static final long NOT_SET = -1; - private long mNitzTimeSetTime = NOT_SET; - private Network mDefaultNetwork = null; - - private final Context mContext; - private final NtpTrustedTime mTime; - private final AlarmManager mAlarmManager; - private final ConnectivityManager mCM; - private final PendingIntent mPendingPollIntent; - private final PowerManager.WakeLock mWakeLock; - - // NTP lookup is done on this thread and handler - private Handler mHandler; - private SettingsObserver mSettingsObserver; - private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback; - - // Normal polling frequency - private final long mPollingIntervalMs; - // Try-again polling interval, in case the network request failed - private final long mPollingIntervalShorterMs; - // Number of times to try again - private final int mTryAgainTimesMax; - // If the time difference is greater than this threshold, then update the time. - private final int mTimeErrorThresholdMs; - // Keeps track of how many quick attempts were made to fetch NTP time. - // During bootup, the network may not have been up yet, or it's taking time for the - // connection to happen. - private int mTryAgainCounter; - - public NewNetworkTimeUpdateService(Context context) { - mContext = context; - mTime = NtpTrustedTime.getInstance(context); - mAlarmManager = mContext.getSystemService(AlarmManager.class); - mCM = mContext.getSystemService(ConnectivityManager.class); - - Intent pollIntent = new Intent(ACTION_POLL, null); - mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0); - - mPollingIntervalMs = mContext.getResources().getInteger( - com.android.internal.R.integer.config_ntpPollingInterval); - mPollingIntervalShorterMs = mContext.getResources().getInteger( - com.android.internal.R.integer.config_ntpPollingIntervalShorter); - mTryAgainTimesMax = mContext.getResources().getInteger( - com.android.internal.R.integer.config_ntpRetry); - mTimeErrorThresholdMs = mContext.getResources().getInteger( - com.android.internal.R.integer.config_ntpThreshold); - - mWakeLock = context.getSystemService(PowerManager.class).newWakeLock( - PowerManager.PARTIAL_WAKE_LOCK, TAG); - } - - @Override - public void systemRunning() { - registerForTelephonyIntents(); - registerForAlarms(); - - HandlerThread thread = new HandlerThread(TAG); - thread.start(); - mHandler = new MyHandler(thread.getLooper()); - mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback(); - mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler); - - mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED); - mSettingsObserver.observe(mContext); - } - - private void registerForTelephonyIntents() { - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME); - mContext.registerReceiver(mNitzReceiver, intentFilter); - } - - private void registerForAlarms() { - mContext.registerReceiver( - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget(); - } - }, new IntentFilter(ACTION_POLL)); - } - - private void onPollNetworkTime(int event) { - // If Automatic time is not set, don't bother. Similarly, if we don't - // have any default network, don't bother. - if (mDefaultNetwork == null) return; - mWakeLock.acquire(); - try { - onPollNetworkTimeUnderWakeLock(event); - } finally { - mWakeLock.release(); - } - } - - private void onPollNetworkTimeUnderWakeLock(int event) { - // Force an NTP fix when outdated - if (mTime.getCacheAge() >= mPollingIntervalMs) { - if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh"); - mTime.forceRefresh(); - } - - if (mTime.getCacheAge() < mPollingIntervalMs) { - // Obtained fresh fix; schedule next normal update - resetAlarm(mPollingIntervalMs); - if (isAutomaticTimeRequested()) { - updateSystemClock(event); - } - - } else { - // No fresh fix; schedule retry - mTryAgainCounter++; - if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) { - resetAlarm(mPollingIntervalShorterMs); - } else { - // Try much later - mTryAgainCounter = 0; - resetAlarm(mPollingIntervalMs); - } - } - } - - private long getNitzAge() { - if (mNitzTimeSetTime == NOT_SET) { - return Long.MAX_VALUE; - } else { - return SystemClock.elapsedRealtime() - mNitzTimeSetTime; - } - } - - /** - * Consider updating system clock based on current NTP fix, if requested by - * user, significant enough delta, and we don't have a recent NITZ. - */ - private void updateSystemClock(int event) { - final boolean forceUpdate = (event == EVENT_AUTO_TIME_CHANGED); - if (!forceUpdate) { - if (getNitzAge() < mPollingIntervalMs) { - if (DBG) Log.d(TAG, "Ignoring NTP update due to recent NITZ"); - return; - } - - final long skew = Math.abs(mTime.currentTimeMillis() - System.currentTimeMillis()); - if (skew < mTimeErrorThresholdMs) { - if (DBG) Log.d(TAG, "Ignoring NTP update due to low skew"); - return; - } - } - - SystemClock.setCurrentTimeMillis(mTime.currentTimeMillis()); - } - - /** - * Cancel old alarm and starts a new one for the specified interval. - * - * @param interval when to trigger the alarm, starting from now. - */ - private void resetAlarm(long interval) { - mAlarmManager.cancel(mPendingPollIntent); - long now = SystemClock.elapsedRealtime(); - long next = now + interval; - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mPendingPollIntent); - } - - /** - * Checks if the user prefers to automatically set the time. - */ - private boolean isAutomaticTimeRequested() { - return Settings.Global.getInt( - mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0) != 0; - } - - /** Receiver for Nitz time events */ - private BroadcastReceiver mNitzReceiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (DBG) Log.d(TAG, "Received " + action); - if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) { - mNitzTimeSetTime = SystemClock.elapsedRealtime(); - } - } - }; - - /** Handler to do the network accesses on */ - private class MyHandler extends Handler { - - public MyHandler(Looper l) { - super(l); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case EVENT_AUTO_TIME_CHANGED: - case EVENT_POLL_NETWORK_TIME: - case EVENT_NETWORK_CHANGED: - onPollNetworkTime(msg.what); - break; - } - } - } - - private class NetworkTimeUpdateCallback extends NetworkCallback { - @Override - public void onAvailable(Network network) { - Log.d(TAG, String.format("New default network %s; checking time.", network)); - mDefaultNetwork = network; - // Running on mHandler so invoke directly. - onPollNetworkTime(EVENT_NETWORK_CHANGED); - } - - @Override - public void onLost(Network network) { - if (network.equals(mDefaultNetwork)) mDefaultNetwork = null; - } - } - - /** Observer to watch for changes to the AUTO_TIME setting */ - private static class SettingsObserver extends ContentObserver { - - private int mMsg; - private Handler mHandler; - - SettingsObserver(Handler handler, int msg) { - super(handler); - mHandler = handler; - mMsg = msg; - } - - void observe(Context context) { - ContentResolver resolver = context.getContentResolver(); - resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME), - false, this); - } - - @Override - public void onChange(boolean selfChange) { - mHandler.obtainMessage(mMsg).sendToTarget(); - } - } - - @Override - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; - pw.print("PollingIntervalMs: "); - TimeUtils.formatDuration(mPollingIntervalMs, pw); - pw.print("\nPollingIntervalShorterMs: "); - TimeUtils.formatDuration(mPollingIntervalShorterMs, pw); - pw.println("\nTryAgainTimesMax: " + mTryAgainTimesMax); - pw.print("TimeErrorThresholdMs: "); - TimeUtils.formatDuration(mTimeErrorThresholdMs, pw); - pw.println("\nTryAgainCounter: " + mTryAgainCounter); - pw.println("NTP cache age: " + mTime.getCacheAge()); - pw.println("NTP cache certainty: " + mTime.getCacheCertainty()); - pw.println(); - } -} diff --git a/services/core/java/com/android/server/WiredAccessoryManager.java b/services/core/java/com/android/server/WiredAccessoryManager.java index 9bbc3158757c..8e5c73bfc022 100644 --- a/services/core/java/com/android/server/WiredAccessoryManager.java +++ b/services/core/java/com/android/server/WiredAccessoryManager.java @@ -16,33 +16,33 @@ package com.android.server; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; + import android.content.Context; +import android.media.AudioManager; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.UEventObserver; +import android.util.Log; import android.util.Pair; import android.util.Slog; -import android.media.AudioManager; -import android.util.Log; import android.view.InputDevice; import com.android.internal.R; import com.android.server.input.InputManagerService; import com.android.server.input.InputManagerService.WiredAccessoryCallbacks; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; - import java.io.File; -import java.io.FileReader; import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -538,7 +538,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks { synchronized (mLock) { int mask = maskAndState.first; int state = maskAndState.second; - updateLocked(name, mHeadsetState | (mask & state) & ~(mask & ~state)); + updateLocked(name, mHeadsetState & ~(mask & ~state) | (mask & state)); return; } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f0243c3cb848..8cd675c04e7c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -271,8 +271,8 @@ import android.os.WorkSource; import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.provider.DeviceConfig; -import android.provider.Settings; import android.provider.DeviceConfig.Properties; +import android.provider.Settings; import android.server.ServerProtoEnums; import android.sysprop.VoldProperties; import android.text.TextUtils; @@ -2890,6 +2890,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (mIsolatedAppBindArgs == null) { mIsolatedAppBindArgs = new ArrayMap<>(1); addServiceToMap(mIsolatedAppBindArgs, "package"); + addServiceToMap(mIsolatedAppBindArgs, "permissionmgr"); } return mIsolatedAppBindArgs; } @@ -2901,6 +2902,7 @@ public class ActivityManagerService extends IActivityManager.Stub // IMPORTANT: Before adding services here, make sure ephemeral apps can access them too. // Enable the check in ApplicationThread.bindApplication() to make sure. addServiceToMap(mAppBindArgs, "package"); + addServiceToMap(mAppBindArgs, "permissionmgr"); addServiceToMap(mAppBindArgs, Context.WINDOW_SERVICE); addServiceToMap(mAppBindArgs, Context.ALARM_SERVICE); addServiceToMap(mAppBindArgs, Context.DISPLAY_SERVICE); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 05264af988d3..9239d0389f1c 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -108,7 +108,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub .replaceWith("?"); private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); - private static final int MAX_LOW_POWER_STATS_SIZE = 2048; + private static final int MAX_LOW_POWER_STATS_SIZE = 4096; /** * Replaces the information in the given rpmStats with up-to-date information. diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index 30a297e221ae..421b75586224 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -54,9 +54,9 @@ option java_package com.android.server.am # An activity has been relaunched: 30020 am_relaunch_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3) # The activity's onPause has been called. -30021 am_on_paused_called (User|1|5),(Component Name|3),(Reason|3) +30021 am_on_paused_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onResume has been called. -30022 am_on_resume_called (User|1|5),(Component Name|3),(Reason|3) +30022 am_on_resume_called (Token|1|5),(Component Name|3),(Reason|3) # Kill a process to reclaim memory. 30023 am_kill (User|1|5),(PID|1|5),(Process Name|3),(OomAdj|1|5),(Reason|3) # Discard an undelivered serialized broadcast (timeout/ANR/crash) @@ -104,7 +104,7 @@ option java_package com.android.server.am # Attempting to stop an activity 30048 am_stop_activity (User|1|5),(Token|1|5),(Component Name|3) # The activity's onStop has been called. -30049 am_on_stop_called (User|1|5),(Component Name|3),(Reason|3) +30049 am_on_stop_called (Token|1|5),(Component Name|3),(Reason|3) # Report changing memory conditions (Values are ProcessStats.ADJ_MEM_FACTOR* constants) 30050 am_mem_factor (Current|1|5),(Previous|1|5) @@ -124,15 +124,15 @@ option java_package com.android.server.am 30056 am_stop_idle_service (UID|1|5),(Component Name|3) # The activity's onCreate has been called. -30057 am_on_create_called (User|1|5),(Component Name|3),(Reason|3) +30057 am_on_create_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onRestart has been called. -30058 am_on_restart_called (User|1|5),(Component Name|3),(Reason|3) +30058 am_on_restart_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onStart has been called. -30059 am_on_start_called (User|1|5),(Component Name|3),(Reason|3) +30059 am_on_start_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onDestroy has been called. -30060 am_on_destroy_called (User|1|5),(Component Name|3),(Reason|3) +30060 am_on_destroy_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onActivityResult has been called. -30062 am_on_activity_result_called (User|1|5),(Component Name|3),(Reason|3) +30062 am_on_activity_result_called (Token|1|5),(Component Name|3),(Reason|3) # The task is being removed from its parent stack 30061 am_remove_task (Task ID|1|5), (Stack ID|1|5) @@ -141,9 +141,9 @@ option java_package com.android.server.am 30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(DeltaRssTotal|2|2),(DeltaRssFile|2|2),(DeltaRssAnon|2|2),(DeltaRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2),(BeforeZRAMFree|2|2),(DeltaZRAMFree|2|2) # The activity's onTopResumedActivityChanged(true) has been called. -30064 am_on_top_resumed_gained_called (User|1|5),(Component Name|3),(Reason|3) +30064 am_on_top_resumed_gained_called (Token|1|5),(Component Name|3),(Reason|3) # The activity's onTopResumedActivityChanged(false) has been called. -30065 am_on_top_resumed_lost_called (User|1|5),(Component Name|3),(Reason|3) +30065 am_on_top_resumed_lost_called (Token|1|5),(Component Name|3),(Reason|3) # An activity been add into stopping list 30066 am_add_to_stopping (User|1|5),(Token|1|5),(Component Name|3),(Reason|3)
\ No newline at end of file diff --git a/services/core/java/com/android/server/am/LmkdConnection.java b/services/core/java/com/android/server/am/LmkdConnection.java new file mode 100644 index 000000000000..d1e09db39e41 --- /dev/null +++ b/services/core/java/com/android/server/am/LmkdConnection.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.am; + +import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_ERROR; +import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; + +import android.net.LocalSocket; +import android.net.LocalSocketAddress; +import android.os.MessageQueue; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; + +import libcore.io.IoUtils; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.TimeUnit; + +/** + * Lmkd connection to communicate with lowmemorykiller daemon. + */ +public class LmkdConnection { + private static final String TAG = TAG_WITH_CLASS_NAME ? "LmkdConnection" : TAG_AM; + + // lmkd reply max size in bytes + private static final int LMKD_REPLY_MAX_SIZE = 8; + + // connection listener interface + interface LmkdConnectionListener { + public boolean onConnect(OutputStream ostream); + public void onDisconnect(); + /** + * Check if received reply was expected (reply to an earlier request) + * + * @param replyBuf The buffer provided in exchange() to receive the reply. + * It can be used by exchange() caller to store reply-specific + * tags for later use in isReplyExpected() to verify if + * received packet is the expected reply. + * @param dataReceived The buffer holding received data + * @param receivedLen Size of the data received + */ + public boolean isReplyExpected(ByteBuffer replyBuf, ByteBuffer dataReceived, + int receivedLen); + } + + private final MessageQueue mMsgQueue; + + // lmkd connection listener + private final LmkdConnectionListener mListener; + + // mutex to synchronize access to the socket + private final Object mLmkdSocketLock = new Object(); + + // socket to communicate with lmkd + @GuardedBy("mLmkdSocketLock") + private LocalSocket mLmkdSocket = null; + + // socket I/O streams + @GuardedBy("mLmkdSocketLock") + private OutputStream mLmkdOutputStream = null; + @GuardedBy("mLmkdSocketLock") + private InputStream mLmkdInputStream = null; + + // buffer to store incoming data + private final ByteBuffer mInputBuf = + ByteBuffer.allocate(LMKD_REPLY_MAX_SIZE); + + // object to protect mReplyBuf and to wait/notify when reply is received + private final Object mReplyBufLock = new Object(); + + // reply buffer + @GuardedBy("mReplyBufLock") + private ByteBuffer mReplyBuf = null; + + //////////////////// END FIELDS //////////////////// + + LmkdConnection(MessageQueue msgQueue, LmkdConnectionListener listener) { + mMsgQueue = msgQueue; + mListener = listener; + } + + public boolean connect() { + synchronized (mLmkdSocketLock) { + if (mLmkdSocket != null) { + return true; + } + // temporary sockets and I/O streams + final LocalSocket socket = openSocket(); + + if (socket == null) { + Slog.w(TAG, "Failed to connect to lowmemorykiller, retry later"); + return false; + } + + final OutputStream ostream; + final InputStream istream; + try { + ostream = socket.getOutputStream(); + istream = socket.getInputStream(); + } catch (IOException ex) { + IoUtils.closeQuietly(socket); + return false; + } + // execute onConnect callback + if (mListener != null && !mListener.onConnect(ostream)) { + Slog.w(TAG, "Failed to communicate with lowmemorykiller, retry later"); + IoUtils.closeQuietly(socket); + return false; + } + // connection established + mLmkdSocket = socket; + mLmkdOutputStream = ostream; + mLmkdInputStream = istream; + mMsgQueue.addOnFileDescriptorEventListener(mLmkdSocket.getFileDescriptor(), + EVENT_INPUT | EVENT_ERROR, + new MessageQueue.OnFileDescriptorEventListener() { + public int onFileDescriptorEvents(FileDescriptor fd, int events) { + return fileDescriptorEventHandler(fd, events); + } + } + ); + mLmkdSocketLock.notifyAll(); + } + return true; + } + + private int fileDescriptorEventHandler(FileDescriptor fd, int events) { + if (mListener == null) { + return 0; + } + if ((events & EVENT_INPUT) != 0) { + processIncomingData(); + } + if ((events & EVENT_ERROR) != 0) { + synchronized (mLmkdSocketLock) { + // stop listening on this socket + mMsgQueue.removeOnFileDescriptorEventListener( + mLmkdSocket.getFileDescriptor()); + IoUtils.closeQuietly(mLmkdSocket); + mLmkdSocket = null; + } + // wake up reply waiters if any + synchronized (mReplyBufLock) { + if (mReplyBuf != null) { + mReplyBuf = null; + mReplyBufLock.notifyAll(); + } + } + // notify listener + mListener.onDisconnect(); + return 0; + } + return (EVENT_INPUT | EVENT_ERROR); + } + + private void processIncomingData() { + int len = read(mInputBuf); + if (len > 0) { + synchronized (mReplyBufLock) { + if (mReplyBuf != null) { + if (mListener.isReplyExpected(mReplyBuf, mInputBuf, len)) { + // copy into reply buffer + mReplyBuf.put(mInputBuf.array(), 0, len); + mReplyBuf.rewind(); + // wakeup the waiting thread + mReplyBufLock.notifyAll(); + } else { + // received asynchronous or unexpected packet + // treat this as an error + mReplyBuf = null; + mReplyBufLock.notifyAll(); + Slog.e(TAG, "Received unexpected packet from lmkd"); + } + } else { + // received asynchronous communication from lmkd + // we don't support this yet + Slog.w(TAG, "Received an asynchronous packet from lmkd"); + } + } + } + } + + public boolean isConnected() { + synchronized (mLmkdSocketLock) { + return (mLmkdSocket != null); + } + } + + public boolean waitForConnection(long timeoutMs) { + synchronized (mLmkdSocketLock) { + if (mLmkdSocket != null) { + return true; + } + try { + mLmkdSocketLock.wait(timeoutMs); + return (mLmkdSocket != null); + } catch (InterruptedException e) { + return false; + } + } + } + + private LocalSocket openSocket() { + final LocalSocket socket; + + try { + socket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); + socket.connect( + new LocalSocketAddress("lmkd", + LocalSocketAddress.Namespace.RESERVED)); + } catch (IOException ex) { + Slog.e(TAG, "Connection failed: " + ex.toString()); + return null; + } + return socket; + } + + private boolean write(ByteBuffer buf) { + synchronized (mLmkdSocketLock) { + try { + mLmkdOutputStream.write(buf.array(), 0, buf.position()); + } catch (IOException ex) { + return false; + } + return true; + } + } + + private int read(ByteBuffer buf) { + synchronized (mLmkdSocketLock) { + try { + return mLmkdInputStream.read(buf.array(), 0, buf.array().length); + } catch (IOException ex) { + } + return -1; + } + } + + /** + * Exchange a request/reply packets with lmkd + * + * @param req The buffer holding the request data to be sent + * @param repl The buffer to receive the reply + */ + public boolean exchange(ByteBuffer req, ByteBuffer repl) { + if (repl == null) { + return write(req); + } + + boolean result = false; + // set reply buffer to user-defined one to fill it + synchronized (mReplyBufLock) { + mReplyBuf = repl; + + if (write(req)) { + try { + // wait for the reply + mReplyBufLock.wait(); + result = (mReplyBuf != null); + } catch (InterruptedException ie) { + result = false; + } + } + + // reset reply buffer + mReplyBuf = null; + } + return result; + } +} diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 9346ab54f396..ffbc6b314776 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -57,8 +57,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.res.Resources; import android.graphics.Point; -import android.net.LocalSocket; -import android.net.LocalSocketAddress; import android.os.AppZygote; import android.os.Binder; import android.os.Build; @@ -67,6 +65,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.MessageQueue; import android.os.Process; import android.os.RemoteException; import android.os.StrictMode; @@ -117,11 +116,6 @@ import java.util.List; /** * Activity manager code dealing with processes. - * - * Method naming convention: - * <ul> - * <li> Methods suffixed with "LS" should be called within the {@link #sLmkdSocketLock} lock. - * </ul> */ public final class ProcessList { static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM; @@ -268,6 +262,9 @@ public final class ProcessList { static final byte LMK_PROCPURGE = 3; static final byte LMK_GETKILLCNT = 4; + // lmkd reconnect delay in msecs + private final static long LMDK_RECONNECT_DELAY_MS = 1000; + ActivityManagerService mService = null; // To kill process groups asynchronously @@ -302,16 +299,9 @@ public final class ProcessList { private boolean mHaveDisplaySize; - private static Object sLmkdSocketLock = new Object(); - - @GuardedBy("sLmkdSocketLock") - private static LocalSocket sLmkdSocket; + private static LmkdConnection sLmkdConnection = null; - @GuardedBy("sLmkdSocketLock") - private static OutputStream sLmkdOutputStream; - - @GuardedBy("sLmkdSocketLock") - private static InputStream sLmkdInputStream; + private boolean mOomLevelsSet = false; /** * Temporary to avoid allocations. Protected by main lock. @@ -536,6 +526,7 @@ public final class ProcessList { final class KillHandler extends Handler { static final int KILL_PROCESS_GROUP_MSG = 4000; + static final int LMDK_RECONNECT_MSG = 4001; public KillHandler(Looper looper) { super(looper, null, true); @@ -549,6 +540,15 @@ public final class ProcessList { Process.killProcessGroup(msg.arg1 /* uid */, msg.arg2 /* pid */); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; + case LMDK_RECONNECT_MSG: + if (!sLmkdConnection.connect()) { + Slog.i(TAG, "Failed to connect to lmkd, retry after " + + LMDK_RECONNECT_DELAY_MS + " ms"); + // retry after LMDK_RECONNECT_DELAY_MS + sKillHandler.sendMessageDelayed(sKillHandler.obtainMessage( + KillHandler.LMDK_RECONNECT_MSG), LMDK_RECONNECT_DELAY_MS); + } + break; default: super.handleMessage(msg); @@ -574,6 +574,30 @@ public final class ProcessList { THREAD_PRIORITY_BACKGROUND, true /* allowIo */); sKillThread.start(); sKillHandler = new KillHandler(sKillThread.getLooper()); + sLmkdConnection = new LmkdConnection(sKillThread.getLooper().getQueue(), + new LmkdConnection.LmkdConnectionListener() { + @Override + public boolean onConnect(OutputStream ostream) { + Slog.i(TAG, "Connection with lmkd established"); + return onLmkdConnect(ostream); + } + @Override + public void onDisconnect() { + Slog.w(TAG, "Lost connection to lmkd"); + // start reconnection after delay to let lmkd restart + sKillHandler.sendMessageDelayed(sKillHandler.obtainMessage( + KillHandler.LMDK_RECONNECT_MSG), LMDK_RECONNECT_DELAY_MS); + } + @Override + public boolean isReplyExpected(ByteBuffer replyBuf, + ByteBuffer dataReceived, int receivedLen) { + // compare the preambule (currently one integer) to check if + // this is the reply packet we are waiting for + return (receivedLen == replyBuf.array().length && + dataReceived.getInt(0) == replyBuf.getInt(0)); + } + } + ); } } @@ -679,6 +703,7 @@ public final class ProcessList { writeLmkd(buf, null); SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); + mOomLevelsSet = true; } // GB: 2048,3072,4096,6144,7168,8192 // HC: 8192,10240,12288,14336,16384,20480 @@ -1218,93 +1243,50 @@ public final class ProcessList { buf.putInt(LMK_GETKILLCNT); buf.putInt(min_oom_adj); buf.putInt(max_oom_adj); - if (writeLmkd(buf, repl)) { - int i = repl.getInt(); - if (i != LMK_GETKILLCNT) { - Slog.e("ActivityManager", "Failed to get kill count, code mismatch"); - return null; - } + // indicate what we are waiting for + repl.putInt(LMK_GETKILLCNT); + repl.rewind(); + if (writeLmkd(buf, repl) && repl.getInt() == LMK_GETKILLCNT) { return new Integer(repl.getInt()); } return null; } - @GuardedBy("sLmkdSocketLock") - private static boolean openLmkdSocketLS() { - try { - sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); - sLmkdSocket.connect( - new LocalSocketAddress("lmkd", - LocalSocketAddress.Namespace.RESERVED)); - sLmkdOutputStream = sLmkdSocket.getOutputStream(); - sLmkdInputStream = sLmkdSocket.getInputStream(); - } catch (IOException ex) { - Slog.w(TAG, "lowmemorykiller daemon socket open failed"); - sLmkdSocket = null; - return false; - } - - return true; - } - - // Never call directly, use writeLmkd() instead - @GuardedBy("sLmkdSocketLock") - private static boolean writeLmkdCommandLS(ByteBuffer buf) { + public boolean onLmkdConnect(OutputStream ostream) { try { - sLmkdOutputStream.write(buf.array(), 0, buf.position()); + // Purge any previously registered pids + ByteBuffer buf = ByteBuffer.allocate(4); + buf.putInt(LMK_PROCPURGE); + ostream.write(buf.array(), 0, buf.position()); + if (mOomLevelsSet) { + // Reset oom_adj levels + buf = ByteBuffer.allocate(4 * (2 * mOomAdj.length + 1)); + buf.putInt(LMK_TARGET); + for (int i = 0; i < mOomAdj.length; i++) { + buf.putInt((mOomMinFree[i] * 1024)/PAGE_SIZE); + buf.putInt(mOomAdj[i]); + } + ostream.write(buf.array(), 0, buf.position()); + } } catch (IOException ex) { - Slog.w(TAG, "Error writing to lowmemorykiller socket"); - IoUtils.closeQuietly(sLmkdSocket); - sLmkdSocket = null; return false; } return true; } - // Never call directly, use writeLmkd() instead - @GuardedBy("sLmkdSocketLock") - private static boolean readLmkdReplyLS(ByteBuffer buf) { - int len; - try { - len = sLmkdInputStream.read(buf.array(), 0, buf.array().length); - if (len == buf.array().length) { - return true; - } - } catch (IOException ex) { - Slog.w(TAG, "Error reading from lowmemorykiller socket"); - } - - IoUtils.closeQuietly(sLmkdSocket); - sLmkdSocket = null; - return false; - } - private static boolean writeLmkd(ByteBuffer buf, ByteBuffer repl) { - synchronized (sLmkdSocketLock) { - for (int i = 0; i < 3; i++) { - if (sLmkdSocket == null) { - if (openLmkdSocketLS() == false) { - try { - Thread.sleep(1000); - } catch (InterruptedException ie) { - } - continue; - } + if (!sLmkdConnection.isConnected()) { + // try to connect immediately and then keep retrying + sKillHandler.sendMessage( + sKillHandler.obtainMessage(KillHandler.LMDK_RECONNECT_MSG)); - // Purge any previously registered pids - ByteBuffer purge_buf = ByteBuffer.allocate(4); - purge_buf.putInt(LMK_PROCPURGE); - if (writeLmkdCommandLS(purge_buf) == false) { - // Write failed, skip the rest and retry - continue; - } - } - if (writeLmkdCommandLS(buf) && (repl == null || readLmkdReplyLS(repl))) { - return true; - } + // wait for connection retrying 3 times (up to 3 seconds) + if (!sLmkdConnection.waitForConnection(3 * LMDK_RECONNECT_DELAY_MS)) { + return false; } } - return false; + + return sLmkdConnection.exchange(buf, repl); } static void killProcessGroup(int uid, int pid) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d3cafb7556fa..8ef5b07531ce 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1917,8 +1917,8 @@ public class AudioService extends IAudioService.Stub if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { final long ident = Binder.clearCallingIdentity(); try { - mHdmiPlaybackClient.sendKeyEvent(keyCode, true); - mHdmiPlaybackClient.sendKeyEvent(keyCode, false); + mHdmiPlaybackClient.sendVolumeKeyEvent(keyCode, true); + mHdmiPlaybackClient.sendVolumeKeyEvent(keyCode, false); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java index 5d31dbe93cf9..5c5096251e79 100644 --- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java +++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java @@ -86,6 +86,12 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin return mIsActive && mConfig != null; } + void release() { + if (mDeathHandler != null) { + mDeathHandler.release(); + } + } + // returns true if status of an active recording has changed boolean setActive(boolean active) { if (mIsActive == active) return false; @@ -417,6 +423,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin break; case AudioManager.RECORD_CONFIG_EVENT_RELEASE: configChanged = state.isActiveConfiguration(); + state.release(); mRecordStates.remove(stateIndex); break; default: @@ -519,6 +526,10 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin return false; } } + + void release() { + mRecorderToken.unlinkToDeath(this, 0); + } } /** diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java index 9e4c1cb57dca..5584dcf69f50 100644 --- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.hardware.display.DisplayManager; import android.hardware.display.WifiDisplay; import android.hardware.display.WifiDisplaySessionInfo; @@ -95,6 +96,12 @@ final class WifiDisplayAdapter extends DisplayAdapter { Context context, Handler handler, Listener listener, PersistentDataStore persistentDataStore) { super(syncRoot, context, handler, listener, TAG); + + if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)) { + throw new RuntimeException("WiFi display was requested, " + + "but there is no WiFi Direct feature"); + } + mHandler = new WifiDisplayHandler(handler.getLooper()); mPersistentDataStore = persistentDataStore; mSupportsProtectedBuffers = context.getResources().getBoolean( diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java index dd3876d8768b..02ec10e2d49d 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java @@ -356,13 +356,15 @@ public class DisplayWhiteBalanceController implements float ambientBrightness = mBrightnessFilter.getEstimate(time); - if (mLowLightAmbientBrightnessToBiasSpline != null) { + if (ambientColorTemperature != -1.0f && + mLowLightAmbientBrightnessToBiasSpline != null) { float bias = mLowLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); ambientColorTemperature = bias * ambientColorTemperature + (1.0f - bias) * mLowLightAmbientColorTemperature; } - if (mHighLightAmbientBrightnessToBiasSpline != null) { + if (ambientColorTemperature != -1.0f && + mHighLightAmbientBrightnessToBiasSpline != null) { float bias = mHighLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); ambientColorTemperature = (1.0f - bias) * ambientColorTemperature + bias diff --git a/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java index 137833cc9551..6d2693476842 100644 --- a/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/ArcInitiationActionFromAvr.java @@ -27,9 +27,6 @@ public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction { // the required maximum response time specified in CEC 9.2 private static final int TIMEOUT_MS = 1000; - private static final int MAX_RETRY_COUNT = 5; - - private int mSendRequestActiveSourceRetryCount = 0; ArcInitiationActionFromAvr(HdmiCecLocalDevice source) { super(source); @@ -64,12 +61,7 @@ public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction { return true; case Constants.MESSAGE_REPORT_ARC_INITIATED: mState = STATE_ARC_INITIATED; - if (audioSystem().getActiveSource().physicalAddress != getSourcePath() - && audioSystem().isSystemAudioActivated()) { - sendRequestActiveSource(); - } else { - finish(); - } + finish(); return true; } return false; @@ -99,24 +91,8 @@ public class ArcInitiationActionFromAvr extends HdmiCecFeatureAction { } private void handleInitiateArcTimeout() { + // Keep ARC status as what it is when TV does not respond to ARC init HdmiLogger.debug("handleInitiateArcTimeout"); - audioSystem().setArcStatus(false); finish(); } - - protected void sendRequestActiveSource() { - sendCommand(HdmiCecMessageBuilder.buildRequestActiveSource(getSourceAddress()), - result -> { - if (result != SendMessageResult.SUCCESS) { - if (mSendRequestActiveSourceRetryCount < MAX_RETRY_COUNT) { - mSendRequestActiveSourceRetryCount++; - sendRequestActiveSource(); - } else { - finish(); - } - } else { - finish(); - } - }); - } } diff --git a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java index eb7c0cd61132..dedf2e28a573 100644 --- a/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/ArcTerminationActionFromAvr.java @@ -76,6 +76,11 @@ public class ArcTerminationActionFromAvr extends HdmiCecFeatureAction { sendCommand(HdmiCecMessageBuilder.buildTerminateArc(getSourceAddress(), Constants.ADDR_TV), result -> { if (result != SendMessageResult.SUCCESS) { + // If the physical connection is already off or TV does not handle + // Terminate ARC, turn off ARC internally. + if (result == SendMessageResult.NACK) { + audioSystem().setArcStatus(false); + } HdmiLogger.debug("Terminate ARC was not successfully sent."); finish(); } diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 7c42cc2465e0..cfbf8bcd6433 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -86,6 +86,82 @@ final class Constants { /** Logical address used to indicate the source comes from internal device. */ public static final int ADDR_INTERNAL = HdmiDeviceInfo.ADDR_INTERNAL; + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + MESSAGE_FEATURE_ABORT, + MESSAGE_IMAGE_VIEW_ON, + MESSAGE_TUNER_STEP_INCREMENT, + MESSAGE_TUNER_STEP_DECREMENT, + MESSAGE_TUNER_DEVICE_STATUS, + MESSAGE_GIVE_TUNER_DEVICE_STATUS, + MESSAGE_RECORD_ON, + MESSAGE_RECORD_STATUS, + MESSAGE_RECORD_OFF, + MESSAGE_TEXT_VIEW_ON, + MESSAGE_RECORD_TV_SCREEN, + MESSAGE_GIVE_DECK_STATUS, + MESSAGE_DECK_STATUS, + MESSAGE_SET_MENU_LANGUAGE, + MESSAGE_CLEAR_ANALOG_TIMER, + MESSAGE_SET_ANALOG_TIMER, + MESSAGE_TIMER_STATUS, + MESSAGE_STANDBY, + MESSAGE_PLAY, + MESSAGE_DECK_CONTROL, + MESSAGE_TIMER_CLEARED_STATUS, + MESSAGE_USER_CONTROL_PRESSED, + MESSAGE_USER_CONTROL_RELEASED, + MESSAGE_GIVE_OSD_NAME, + MESSAGE_SET_OSD_NAME, + MESSAGE_SET_OSD_STRING, + MESSAGE_SET_TIMER_PROGRAM_TITLE, + MESSAGE_SYSTEM_AUDIO_MODE_REQUEST, + MESSAGE_GIVE_AUDIO_STATUS, + MESSAGE_SET_SYSTEM_AUDIO_MODE, + MESSAGE_REPORT_AUDIO_STATUS, + MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS, + MESSAGE_SYSTEM_AUDIO_MODE_STATUS, + MESSAGE_ROUTING_CHANGE, + MESSAGE_ROUTING_INFORMATION, + MESSAGE_ACTIVE_SOURCE, + MESSAGE_GIVE_PHYSICAL_ADDRESS, + MESSAGE_REPORT_PHYSICAL_ADDRESS, + MESSAGE_REQUEST_ACTIVE_SOURCE, + MESSAGE_SET_STREAM_PATH, + MESSAGE_DEVICE_VENDOR_ID, + MESSAGE_VENDOR_COMMAND, + MESSAGE_VENDOR_REMOTE_BUTTON_DOWN, + MESSAGE_VENDOR_REMOTE_BUTTON_UP, + MESSAGE_GIVE_DEVICE_VENDOR_ID, + MESSAGE_MENU_REQUEST, + MESSAGE_MENU_STATUS, + MESSAGE_GIVE_DEVICE_POWER_STATUS, + MESSAGE_REPORT_POWER_STATUS, + MESSAGE_GET_MENU_LANGUAGE, + MESSAGE_SELECT_ANALOG_SERVICE, + MESSAGE_SELECT_DIGITAL_SERVICE, + MESSAGE_SET_DIGITAL_TIMER, + MESSAGE_CLEAR_DIGITAL_TIMER, + MESSAGE_SET_AUDIO_RATE, + MESSAGE_INACTIVE_SOURCE, + MESSAGE_CEC_VERSION, + MESSAGE_GET_CEC_VERSION, + MESSAGE_VENDOR_COMMAND_WITH_ID, + MESSAGE_CLEAR_EXTERNAL_TIMER, + MESSAGE_SET_EXTERNAL_TIMER, + MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR, + MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, + MESSAGE_INITIATE_ARC, + MESSAGE_REPORT_ARC_INITIATED, + MESSAGE_REPORT_ARC_TERMINATED, + MESSAGE_REQUEST_ARC_INITIATION, + MESSAGE_REQUEST_ARC_TERMINATION, + MESSAGE_TERMINATE_ARC, + MESSAGE_CDC_MESSAGE, + MESSAGE_ABORT, + }) + public @interface FeatureOpcode {} + static final int MESSAGE_FEATURE_ABORT = 0x00; static final int MESSAGE_IMAGE_VIEW_ON = 0x04; static final int MESSAGE_TUNER_STEP_INCREMENT = 0x05; @@ -163,6 +239,18 @@ final class Constants { static final int TRUE = 1; static final int FALSE = 0; + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + ABORT_NO_ERROR, + ABORT_UNRECOGNIZED_OPCODE, + ABORT_NOT_IN_CORRECT_MODE, + ABORT_CANNOT_PROVIDE_SOURCE, + ABORT_INVALID_OPERAND, + ABORT_REFUSED, + ABORT_UNABLE_TO_DETERMINE, + }) + public @interface AbortReason {} + // Internal abort error code. It's the same as success. static final int ABORT_NO_ERROR = -1; // Constants related to operands of HDMI CEC commands. diff --git a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java index 15ec486f989b..46b4f48165f9 100644 --- a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java +++ b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java @@ -64,7 +64,7 @@ final class DelayedMessageBuffer { } } - private void removeActiveSource() { + protected void removeActiveSource() { // Uses iterator to remove elements while looping through the list. for (Iterator<HdmiCecMessage> iter = mBuffer.iterator(); iter.hasNext(); ) { HdmiCecMessage message = iter.next(); diff --git a/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java b/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java index 71873198d798..dc53688a91c8 100644 --- a/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java +++ b/services/core/java/com/android/server/hdmi/DetectTvSystemAudioModeSupportAction.java @@ -26,9 +26,11 @@ public class DetectTvSystemAudioModeSupportAction extends HdmiCecFeatureAction { // State that waits for <Active Source> once send <Request Active Source>. private static final int STATE_WAITING_FOR_FEATURE_ABORT = 1; + private static final int STATE_WAITING_FOR_SET_SAM = 2; + private int mSendSetSystemAudioModeRetryCount = 0; + static final int MAX_RETRY_COUNT = 5; private TvSystemAudioModeSupportedCallback mCallback; - private int mState; DetectTvSystemAudioModeSupportAction(HdmiCecLocalDevice source, TvSystemAudioModeSupportedCallback callback) { @@ -50,8 +52,18 @@ public class DetectTvSystemAudioModeSupportAction extends HdmiCecFeatureAction { if (mState != STATE_WAITING_FOR_FEATURE_ABORT) { return false; } - if ((cmd.getParams()[0] & 0xFF) == Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE) { - finishAction(false); + if (HdmiUtils.getAbortFeatureOpcode(cmd) == Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE) { + if (HdmiUtils.getAbortReason(cmd) == Constants.ABORT_NOT_IN_CORRECT_MODE) { + mActionTimer.clearTimerMessage(); + mState = STATE_WAITING_FOR_SET_SAM; + // Outgoing User Control Press commands, when in 'Press and Hold' mode, should + // be this much apart from the adjacent one so as not to place unnecessarily + // heavy load on the CEC line. We also wait this much time to send the next + // retry of the System Audio Mode support detection message. + addTimer(mState, HdmiConfig.IRT_MS); + } else { + finishAction(false); + } return true; } } @@ -68,6 +80,18 @@ public class DetectTvSystemAudioModeSupportAction extends HdmiCecFeatureAction { case STATE_WAITING_FOR_FEATURE_ABORT: finishAction(true); break; + case STATE_WAITING_FOR_SET_SAM: + mSendSetSystemAudioModeRetryCount++; + if (mSendSetSystemAudioModeRetryCount < MAX_RETRY_COUNT) { + mState = STATE_WAITING_FOR_FEATURE_ABORT; + addTimer(mState, HdmiConfig.TIMEOUT_MS); + sendSetSystemAudioMode(); + } else { + finishAction(false); + } + break; + default: + return; } } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java index 86be585e5d23..6174e5418caf 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecController.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java @@ -580,7 +580,9 @@ final class HdmiCecController { @ServiceThreadOnly private void onReceiveCommand(HdmiCecMessage message) { assertRunOnServiceThread(); - if (isAcceptableAddress(message.getDestination()) && mService.handleCecCommand(message)) { + if ((isAcceptableAddress(message.getDestination()) + || !mService.isAddressAllocated()) + && mService.handleCecCommand(message)) { return; } // Not handled message, so we will reply it with <Feature Abort>. diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 78b091e436ac..a358707a4346 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.input.InputManager; +import android.hardware.tv.cec.V1_0.SendMessageResult; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -426,15 +427,26 @@ abstract class HdmiCecLocalDevice { assertRunOnServiceThread(); // Note that since this method is called after logical address allocation is done, // mDeviceInfo should not be null. + buildAndSendSetOsdName(message.getSource()); + return true; + } + + protected void buildAndSendSetOsdName(int dest) { HdmiCecMessage cecMessage = - HdmiCecMessageBuilder.buildSetOsdNameCommand( - mAddress, message.getSource(), mDeviceInfo.getDisplayName()); + HdmiCecMessageBuilder.buildSetOsdNameCommand( + mAddress, dest, mDeviceInfo.getDisplayName()); if (cecMessage != null) { - mService.sendCecCommand(cecMessage); + mService.sendCecCommand(cecMessage, new SendMessageCallback() { + @Override + public void onSendCompleted(int error) { + if (error != SendMessageResult.SUCCESS) { + HdmiLogger.debug("Failed to send cec command " + cecMessage); + } + } + }); } else { Slog.w(TAG, "Failed to build <Get Osd Name>:" + mDeviceInfo.getDisplayName()); } - return true; } // Audio System device with no Playback device type @@ -864,7 +876,7 @@ abstract class HdmiCecLocalDevice { } ActiveSource getActiveSource() { - return mService.getActiveSource(); + return mService.getLocalActiveSource(); } void setActiveSource(ActiveSource newActive) { diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 82aacfee7f3f..b6f3e7db90e8 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -110,6 +110,12 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { // device id is used as key of container. private final SparseArray<HdmiDeviceInfo> mDeviceInfos = new SparseArray<>(); + // Message buffer used to buffer selected messages to process later. <Active Source> + // from a source device, for instance, needs to be buffered if the device is not + // discovered yet. The buffered commands are taken out and when they are ready to + // handle. + private final DelayedMessageBuffer mDelayedMessageBuffer = new DelayedMessageBuffer(this); + protected HdmiCecLocalDeviceAudioSystem(HdmiControlService service) { super(service, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM); mRoutingControlFeatureEnabled = @@ -151,6 +157,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } mPortIdToTvInputs.put(info.getPortId(), inputId); mTvInputsToDeviceInfo.put(inputId, info); + if (info.isCecDevice()) { + processDelayedActiveSource(info.getLogicalAddress()); + } } } @@ -167,6 +176,15 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } } + @Override + @ServiceThreadOnly + protected boolean isInputReady(int portId) { + assertRunOnServiceThread(); + String tvInputId = mPortIdToTvInputs.get(portId); + HdmiDeviceInfo info = mTvInputsToDeviceInfo.get(tvInputId); + return info != null; + } + /** * Called when a device is newly added or a new device is detected or * an existing device is updated. @@ -233,6 +251,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { @VisibleForTesting protected HdmiDeviceInfo addDeviceInfo(HdmiDeviceInfo deviceInfo) { assertRunOnServiceThread(); + mService.checkLogicalAddressConflictAndReallocate(deviceInfo.getLogicalAddress()); HdmiDeviceInfo oldDeviceInfo = getCecDeviceInfo(deviceInfo.getLogicalAddress()); if (oldDeviceInfo != null) { removeDeviceInfo(deviceInfo.getId()); @@ -304,6 +323,15 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) { mCecMessageCache.flushAll(); + if (!connected) { + if (isSystemAudioActivated()) { + mTvSystemAudioModeSupport = null; + checkSupportAndSetSystemAudioMode(false); + } + if (isArcEnabled()) { + setArcStatus(false); + } + } } else if (!connected && mPortIdToTvInputs.get(portId) != null) { String tvInputId = mPortIdToTvInputs.get(portId); HdmiDeviceInfo info = mTvInputsToDeviceInfo.get(tvInputId); @@ -329,6 +357,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void onStandby(boolean initiatedByCec, int standbyAction) { assertRunOnServiceThread(); + // Invalidate the internal active source record when goes to standby + // This set will also update mIsActiveSource + mService.setActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS); mTvSystemAudioModeSupport = null; // Record the last state of System Audio Control before going to standby synchronized (mLock) { @@ -403,6 +434,32 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM, String.valueOf(addr)); } + @ServiceThreadOnly + void processDelayedActiveSource(int address) { + assertRunOnServiceThread(); + mDelayedMessageBuffer.processActiveSource(address); + } + + @Override + @ServiceThreadOnly + protected boolean handleActiveSource(HdmiCecMessage message) { + assertRunOnServiceThread(); + int logicalAddress = message.getSource(); + int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); + HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress); + if (info == null) { + HdmiLogger.debug("Device info %X not found; buffering the command", logicalAddress); + mDelayedMessageBuffer.add(message); + } else if (!isInputReady(info.getPortId())){ + HdmiLogger.debug("Input not ready for device: %X; buffering the command", info.getId()); + mDelayedMessageBuffer.add(message); + } else { + mDelayedMessageBuffer.removeActiveSource(); + super.handleActiveSource(message); + } + return true; + } + @Override @ServiceThreadOnly protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { @@ -783,6 +840,29 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mService.sendCecCommand( HdmiCecMessageBuilder.buildSetSystemAudioMode( mAddress, Constants.ADDR_BROADCAST, systemAudioStatusOn)); + + if (systemAudioStatusOn) { + int sourcePhysicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); + if (sourcePhysicalAddress != getActiveSource().physicalAddress) { + // If the Active Source recorded by the current device is not synced up with TV, + // update the Active Source internally. + for (HdmiDeviceInfo info : HdmiUtils.sparseArrayToList(mDeviceInfos)) { + if (info.getPhysicalAddress() == sourcePhysicalAddress) { + setActiveSource(info.getLogicalAddress(), info.getPhysicalAddress()); + break; + } + } + // If the Active path from TV's System Audio Mode request does not belong to any + // device in the local device list, record the new Active physicalAddress with an + // unregistered logical address first. Then query the Active Source again. + if (sourcePhysicalAddress != getActiveSource().physicalAddress) { + setActiveSource(Constants.ADDR_UNREGISTERED, sourcePhysicalAddress); + mService.sendCecCommand( + HdmiCecMessageBuilder.buildRequestActiveSource(mAddress)); + } + } + switchInputOnReceivingNewActivePath(sourcePhysicalAddress); + } return true; } @@ -918,17 +998,25 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mService.announceSystemAudioModeChange(newSystemAudioMode); } } + // Since ARC is independent from System Audio Mode control, when the TV requests + // System Audio Mode off, it does not need to terminate ARC at the same time. + // When the current audio device is using ARC as a TV input and disables muting, + // it needs to automatically switch to the previous active input source when System + // Audio Mode is off even without terminating the ARC. This can stop the current + // audio device from playing audio when system audio mode is off. + if (mArcIntentUsed + && !mService.readBooleanSystemProperty( + Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE, true) + && !newSystemAudioMode + && getLocalActivePort() == Constants.CEC_SWITCH_ARC) { + routeToInputFromPortId(getRoutingPort()); + } // Init arc whenever System Audio Mode is on - // Terminate arc when System Audio Mode is off // Since some TVs don't request ARC on with System Audio Mode on request if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true) && isDirectConnectToTv()) { - if (newSystemAudioMode && !isArcEnabled() - && !hasAction(ArcInitiationActionFromAvr.class)) { + if (!hasAction(ArcInitiationActionFromAvr.class)) { addAndStartAction(new ArcInitiationActionFromAvr(this)); - } else if (!newSystemAudioMode && isArcEnabled()) { - removeAction(ArcTerminationActionFromAvr.class); - addAndStartAction(new ArcTerminationActionFromAvr(this)); } } } @@ -1101,6 +1189,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } private void initArcOnFromAvr() { + removeAction(ArcTerminationActionFromAvr.class); if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true) && isDirectConnectToTv() && !isArcEnabled()) { removeAction(ArcInitiationActionFromAvr.class); @@ -1142,6 +1231,11 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { } // Wake up if the current device if ready to route. mService.wakeUp(); + if (getLocalActivePort() == portId) { + HdmiLogger.debug("Not switching to the same port " + portId); + return; + } + // Switch to HOME if the current active port is not HOME yet if (portId == Constants.CEC_SWITCH_HOME && mService.isPlaybackDevice()) { switchToHomeTvInput(); } else if (portId == Constants.CEC_SWITCH_ARC) { diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 560f7a03b20f..413e7a087434 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -87,6 +87,10 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { mAddress, mService.getPhysicalAddress(), mDeviceType)); mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); + // Actively send out an OSD name to the TV to update the TV panel in case the TV + // does not query the OSD name on time. This is not a required behavior by the spec. + // It is used for some TVs that need the OSD name update but don't query it themselves. + buildAndSendSetOsdName(Constants.ADDR_TV); if (mService.audioSystem() == null) { // If current device is not a functional audio system device, // send message to potential audio system device in the system to get the system @@ -159,7 +163,17 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @ServiceThreadOnly protected void onStandby(boolean initiatedByCec, int standbyAction) { assertRunOnServiceThread(); - if (!mService.isControlEnabled() || initiatedByCec || !mAutoTvOff) { + if (!mService.isControlEnabled()) { + return; + } + if (mIsActiveSource) { + mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource( + mAddress, mService.getPhysicalAddress())); + } + // Invalidate the internal active source record when goes to standby + // This set will also update mIsActiveSource + mService.setActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS); + if (initiatedByCec || !mAutoTvOff) { return; } switch (standbyAction) { @@ -342,11 +356,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { super.disableDevice(initiatedByCec, callback); assertRunOnServiceThread(); - if (!initiatedByCec && mIsActiveSource && mService.isControlEnabled()) { - mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource( - mAddress, mService.getPhysicalAddress())); - } - setIsActiveSource(false); checkIfPendingActionsCleared(); } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 440676a3ae8f..b1516ec490a1 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -380,6 +380,9 @@ public class HdmiControlService extends SystemService { case Constants.MESSAGE_TEXT_VIEW_ON: bufferImageOrTextViewOn(message); return true; + case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST: + bufferSystemAudioModeRequest(message); + return true; // Add here if new message that needs to buffer default: // Do not need to buffer messages other than above @@ -412,6 +415,12 @@ public class HdmiControlService extends SystemService { } } + private void bufferSystemAudioModeRequest(HdmiCecMessage message) { + if (!replaceMessageIfBuffered(message, Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST)) { + mBuffer.add(message); + } + } + // Returns true if the message is replaced private boolean replaceMessageIfBuffered(HdmiCecMessage message, int opcode) { for (int i = 0; i < mBuffer.size(); i++) { @@ -1163,6 +1172,29 @@ public class HdmiControlService extends SystemService { return mCecController.getLocalDeviceList(); } + /** + * Check if a logical address is conflict with the current device's. Reallocate the logical + * address of the current device if there is conflict. + * + * Android HDMI CEC 1.4 is handling logical address allocation in the framework side. This could + * introduce delay between the logical address allocation and notifying the driver that the + * address is occupied. Adding this check to avoid such case. + * + * @param logicalAddress logical address of the remote device that might have the same logical + * address as the current device. + */ + protected void checkLogicalAddressConflictAndReallocate(int logicalAddress) { + for (HdmiCecLocalDevice device : getAllLocalDevices()) { + if (device.getDeviceInfo().getLogicalAddress() == logicalAddress) { + HdmiLogger.debug("allocate logical address for " + device.getDeviceInfo()); + ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>(); + localDevices.add(device); + allocateLogicalAddress(localDevices, HdmiControlService.INITIATED_BY_HOTPLUG); + return; + } + } + } + Object getServiceLock() { return mLock; } @@ -1452,25 +1484,34 @@ public class HdmiControlService extends SystemService { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list - ActiveSource activeSource = mActiveSource; - // If the active source is not set yet, return null - if (!activeSource.isValid()) { + ActiveSource activeSource = getLocalActiveSource(); + // If the physical address is not set yet, return null + if (activeSource.physicalAddress == Constants.INVALID_PHYSICAL_ADDRESS) { return null; } if (audioSystem() != null) { HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem(); for (HdmiDeviceInfo info : audioSystem.getSafeCecDevicesLocked()) { - if (info.getLogicalAddress() == activeSource.logicalAddress) { + if (info.getPhysicalAddress() == activeSource.physicalAddress) { return info; } } } // If the device info is not in the list yet, return a device info with minimum // information from mActiveSource. - return new HdmiDeviceInfo(activeSource.logicalAddress, - activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress), - HdmiUtils.getTypeFromAddress(activeSource.logicalAddress), 0, - HdmiUtils.getDefaultDeviceName(activeSource.logicalAddress)); + // If the Active Source has unregistered logical address, return with an + // HdmiDeviceInfo built from physical address information only. + return HdmiUtils.isValidAddress(activeSource.logicalAddress) + ? + new HdmiDeviceInfo(activeSource.logicalAddress, + activeSource.physicalAddress, + pathToPortId(activeSource.physicalAddress), + HdmiUtils.getTypeFromAddress(activeSource.logicalAddress), 0, + HdmiUtils.getDefaultDeviceName(activeSource.logicalAddress)) + : + new HdmiDeviceInfo(activeSource.physicalAddress, + pathToPortId(activeSource.physicalAddress)); + } return null; } @@ -1498,6 +1539,11 @@ public class HdmiControlService extends SystemService { Slog.e(TAG, "Callback cannot be null"); return; } + if (isPowerStandby()) { + Slog.e(TAG, "Device is in standby. Not handling deviceSelect"); + invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE); + return; + } HdmiCecLocalDeviceTv tv = tv(); if (tv == null) { if (!mAddressAllocated) { @@ -1540,6 +1586,11 @@ public class HdmiControlService extends SystemService { Slog.e(TAG, "Callback cannot be null"); return; } + if (isPowerStandby()) { + Slog.e(TAG, "Device is in standby. Not handling portSelect"); + invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE); + return; + } HdmiCecLocalDeviceTv tv = tv(); if (tv != null) { tv.doManualPortSwitching(portId, callback); @@ -2789,7 +2840,7 @@ public class HdmiControlService extends SystemService { setLastInputForMhl(Constants.INVALID_PORT_ID); } - ActiveSource getActiveSource() { + ActiveSource getLocalActiveSource() { synchronized (mLock) { return mActiveSource; } @@ -2800,6 +2851,21 @@ public class HdmiControlService extends SystemService { mActiveSource.logicalAddress = logicalAddress; mActiveSource.physicalAddress = physicalAddress; } + // If the current device is a source device, check if the current Active Source matches + // the local device info. Set mIsActiveSource of the local device accordingly. + for (HdmiCecLocalDevice device : getAllLocalDevices()) { + // mIsActiveSource only exists in source device, ignore this setting if the current + // device is not an HdmiCecLocalDeviceSource. + if (!(device instanceof HdmiCecLocalDeviceSource)) { + continue; + } + if (logicalAddress == device.getDeviceInfo().getLogicalAddress() + && physicalAddress == getPhysicalAddress()) { + ((HdmiCecLocalDeviceSource) device).setIsActiveSource(true); + } else { + ((HdmiCecLocalDeviceSource) device).setIsActiveSource(false); + } + } } // This method should only be called when the device can be the active source diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java index e44f1d1522ec..cd65db6055af 100644 --- a/services/core/java/com/android/server/hdmi/HdmiUtils.java +++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java @@ -24,8 +24,10 @@ import android.util.Xml; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; -import com.android.server.hdmi.Constants.AudioCodec; +import com.android.server.hdmi.Constants.AbortReason; +import com.android.server.hdmi.Constants.AudioCodec; +import com.android.server.hdmi.Constants.FeatureOpcode; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -457,6 +459,28 @@ final class HdmiUtils { return port; } + /** + * Parse the Feature Abort CEC message parameter into a [Feature Opcode]. + * + * @param cmd the CEC message to parse + * @return the original opcode of the cec message that got aborted. + */ + @FeatureOpcode + static int getAbortFeatureOpcode(HdmiCecMessage cmd) { + return cmd.getParams()[0] & 0xFF; + } + + /** + * Parse the Feature Abort CEC message parameter into an [Abort Reason]. + * + * @param cmd the CEC message to parse + * @return The reason to abort the feature. + */ + @AbortReason + static int getAbortReason(HdmiCecMessage cmd) { + return cmd.getParams()[1]; + } + public static class ShortAudioDescriptorXmlParser { // We don't use namespaces private static final String NS = null; diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java index 354d8d1e43e0..c8fc5fc96e59 100644 --- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java +++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java @@ -87,14 +87,13 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { HdmiCecLocalDeviceSource source = source(); source.mService.setAndBroadcastActiveSourceFromOneDeviceType( mTargetAddress, getSourcePath()); - // Set local active port to HOME when One Touch Play. - // Active Port and Current Input are handled by the switch functionality device. + // When OneTouchPlay is called, client side should be responsible to send out the intent + // of which internal source, for example YouTube, it would like to switch to. + // Here we only update the active port and the active source records in the local + // device as well as claiming Active Source. if (source.mService.audioSystem() != null) { source = source.mService.audioSystem(); } - if (source.getLocalActivePort() != Constants.CEC_SWITCH_HOME) { - source.switchInputOnReceivingNewActivePath(getSourcePath()); - } source.setRoutingPort(Constants.CEC_SWITCH_HOME); source.setLocalActivePort(Constants.CEC_SWITCH_HOME); } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java index b6ebcd7c3ec2..0907e5d03c78 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java @@ -46,6 +46,7 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction { addTimer(mState, HdmiConfig.TIMEOUT_MS); sendRequestActiveSource(); } else { + mState = STATE_WAITING_FOR_TV_SUPPORT; queryTvSystemAudioModeSupport(); } return true; diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 8181900177ef..bf6708b77096 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -187,6 +187,9 @@ public class JobSchedulerService extends com.android.server.SystemService private final StorageController mStorageController; /** Need directly for sending uid state changes */ private final DeviceIdleJobsController mDeviceIdleJobsController; + /** Needed to get remaining quota time. */ + private final QuotaController mQuotaController; + /** Need directly for receiving thermal events */ private IThermalService mThermalService; /** Thermal constraint. */ @@ -1338,7 +1341,8 @@ public class JobSchedulerService extends com.android.server.SystemService mControllers.add(new ContentObserverController(this)); mDeviceIdleJobsController = new DeviceIdleJobsController(this); mControllers.add(mDeviceIdleJobsController); - mControllers.add(new QuotaController(this)); + mQuotaController = new QuotaController(this); + mControllers.add(mQuotaController); // If the job store determined that it can't yet reschedule persisted jobs, // we need to start watching the clock. @@ -1494,16 +1498,16 @@ public class JobSchedulerService extends com.android.server.SystemService } /** - * Called when we want to remove a JobStatus object that we've finished executing. Returns the - * object removed. + * Called when we want to remove a JobStatus object that we've finished executing. + * @return true if the job was removed. */ private boolean stopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob, - boolean writeBack) { + boolean removeFromPersisted) { // Deal with any remaining work items in the old job. jobStatus.stopTrackingJobLocked(ActivityManager.getService(), incomingJob); // Remove from store as well as controllers. - final boolean removed = mJobs.remove(jobStatus, writeBack); + final boolean removed = mJobs.remove(jobStatus, removeFromPersisted); if (removed && mReadyToRock) { for (int i=0; i<mControllers.size(); i++) { StateController controller = mControllers.get(i); @@ -2397,6 +2401,17 @@ public class JobSchedulerService extends com.android.server.SystemService return isComponentUsable(job); } + /** Returns the maximum amount of time this job could run for. */ + public long getMaxJobExecutionTimeMs(JobStatus job) { + synchronized (mLock) { + if (mConstants.USE_HEARTBEATS) { + return JobServiceContext.EXECUTING_TIMESLICE_MILLIS; + } + return Math.min(mQuotaController.getMaxJobExecutionTimeMsLocked(job), + JobServiceContext.EXECUTING_TIMESLICE_MILLIS); + } + } + /** * Reconcile jobs in the pending queue against available execution contexts. * A controller can force a job into the pending queue even if it's already running, but diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index 4ef37a2e484d..d69faf37397c 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -235,10 +235,11 @@ public final class JobStore { /** * Remove the provided job. Will also delete the job if it was persisted. - * @param writeBack If true, the job will be deleted (if it was persisted) immediately. + * @param removeFromPersisted If true, the job will be removed from the persisted job list + * immediately (if it was persisted). * @return Whether or not the job existed to be removed. */ - public boolean remove(JobStatus jobStatus, boolean writeBack) { + public boolean remove(JobStatus jobStatus, boolean removeFromPersisted) { boolean removed = mJobSet.remove(jobStatus); if (!removed) { if (DEBUG) { @@ -246,7 +247,7 @@ public final class JobStore { } return false; } - if (writeBack && jobStatus.isPersisted()) { + if (removeFromPersisted && jobStatus.isPersisted()) { maybeWriteStatusToDiskAsync(); } return removed; @@ -344,6 +345,19 @@ public final class JobStore { new ReadJobMapFromDiskRunnable(jobSet, rtcGood).run(); } + /** Write persisted JobStore state to disk synchronously. Should only be used for testing. */ + @VisibleForTesting + public void writeStatusToDiskForTesting() { + synchronized (mWriteScheduleLock) { + if (mWriteScheduled) { + throw new IllegalStateException("An asynchronous write is already scheduled."); + } + + mWriteScheduled = mWriteInProgress = true; + mWriteRunnable.run(); + } + } + /** * Wait for any pending write to the persistent store to clear * @param maxWaitMillis Maximum time from present to wait @@ -1049,7 +1063,9 @@ public final class JobStore { } } - static final class JobSet { + /** Set of all tracked jobs. */ + @VisibleForTesting + public static final class JobSet { @VisibleForTesting // Key is the getUid() originator of the jobs in each sheaf final SparseArray<ArraySet<JobStatus>> mJobs; diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java index 490e87f9d103..f8cf6ae04950 100644 --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java @@ -88,8 +88,11 @@ public final class ConnectivityController extends StateController implements @GuardedBy("mLock") private final ArraySet<Network> mAvailableNetworks = new ArraySet<>(); + private boolean mUseQuotaLimit; + private static final int MSG_DATA_SAVER_TOGGLED = 0; private static final int MSG_UID_RULES_CHANGES = 1; + private static final int MSG_REEVALUATE_JOBS = 2; private final Handler mHandler; @@ -107,6 +110,8 @@ public final class ConnectivityController extends StateController implements mConnManager.registerNetworkCallback(request, mNetworkCallback); mNetPolicyManager.registerListener(mNetPolicyListener); + + mUseQuotaLimit = !mConstants.USE_HEARTBEATS; } @GuardedBy("mLock") @@ -149,6 +154,10 @@ public final class ConnectivityController extends StateController implements } mRequestedWhitelistJobs.clear(); } + if (mUseQuotaLimit == mConstants.USE_HEARTBEATS) { + mUseQuotaLimit = !mConstants.USE_HEARTBEATS; + mHandler.obtainMessage(MSG_REEVALUATE_JOBS).sendToTarget(); + } } /** @@ -318,9 +327,12 @@ public final class ConnectivityController extends StateController implements * connection, it would take 10.4 minutes, and has no chance of succeeding * before the job times out, so we'd be insane to try running it. */ - @SuppressWarnings("unused") - private static boolean isInsane(JobStatus jobStatus, Network network, + private boolean isInsane(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { + final long maxJobExecutionTimeMs = mUseQuotaLimit + ? mService.getMaxJobExecutionTimeMs(jobStatus) + : JobServiceContext.EXECUTING_TIMESLICE_MILLIS; + final long downloadBytes = jobStatus.getEstimatedNetworkDownloadBytes(); if (downloadBytes != JobInfo.NETWORK_BYTES_UNKNOWN) { final long bandwidth = capabilities.getLinkDownstreamBandwidthKbps(); @@ -329,10 +341,11 @@ public final class ConnectivityController extends StateController implements // Divide by 8 to convert bits to bytes. final long estimatedMillis = ((downloadBytes * DateUtils.SECOND_IN_MILLIS) / (DataUnit.KIBIBYTES.toBytes(bandwidth) / 8)); - if (estimatedMillis > JobServiceContext.EXECUTING_TIMESLICE_MILLIS) { + if (estimatedMillis > maxJobExecutionTimeMs) { // If we'd never finish before the timeout, we'd be insane! Slog.w(TAG, "Estimated " + downloadBytes + " download bytes over " + bandwidth - + " kbps network would take " + estimatedMillis + "ms; that's insane!"); + + " kbps network would take " + estimatedMillis + "ms and job has " + + maxJobExecutionTimeMs + "ms to run; that's insane!"); return true; } } @@ -346,10 +359,11 @@ public final class ConnectivityController extends StateController implements // Divide by 8 to convert bits to bytes. final long estimatedMillis = ((uploadBytes * DateUtils.SECOND_IN_MILLIS) / (DataUnit.KIBIBYTES.toBytes(bandwidth) / 8)); - if (estimatedMillis > JobServiceContext.EXECUTING_TIMESLICE_MILLIS) { + if (estimatedMillis > maxJobExecutionTimeMs) { // If we'd never finish before the timeout, we'd be insane! Slog.w(TAG, "Estimated " + uploadBytes + " upload bytes over " + bandwidth - + " kbps network would take " + estimatedMillis + "ms; that's insane!"); + + " kbps network would take " + estimatedMillis + "ms and job has " + + maxJobExecutionTimeMs + "ms to run; that's insane!"); return true; } } @@ -358,7 +372,6 @@ public final class ConnectivityController extends StateController implements return false; } - @SuppressWarnings("unused") private static boolean isCongestionDelayed(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { // If network is congested, and job is less than 50% through the @@ -370,14 +383,12 @@ public final class ConnectivityController extends StateController implements } } - @SuppressWarnings("unused") private static boolean isStrictSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { return jobStatus.getJob().getRequiredNetwork().networkCapabilities .satisfiedByNetworkCapabilities(capabilities); } - @SuppressWarnings("unused") private static boolean isRelaxedSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { // Only consider doing this for prefetching jobs @@ -398,7 +409,7 @@ public final class ConnectivityController extends StateController implements } @VisibleForTesting - static boolean isSatisfied(JobStatus jobStatus, Network network, + boolean isSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { // Zeroth, we gotta have a network to think about being satisfied if (network == null || capabilities == null) return false; @@ -594,6 +605,9 @@ public final class ConnectivityController extends StateController implements case MSG_UID_RULES_CHANGES: updateTrackedJobs(msg.arg1, null); break; + case MSG_REEVALUATE_JOBS: + updateTrackedJobs(-1, null); + break; } } } @@ -603,6 +617,8 @@ public final class ConnectivityController extends StateController implements @Override public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) { + pw.print("mUseQuotaLimit="); pw.println(mUseQuotaLimit); + if (mRequestedWhitelistJobs.size() > 0) { pw.print("Requested standby exceptions:"); for (int i = 0; i < mRequestedWhitelistJobs.size(); i++) { diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java index a628b17a3289..9df77cb2ea7a 100644 --- a/services/core/java/com/android/server/job/controllers/JobStatus.java +++ b/services/core/java/com/android/server/job/controllers/JobStatus.java @@ -24,7 +24,6 @@ import android.app.job.JobInfo; import android.app.job.JobWorkItem; import android.content.ClipData; import android.content.ComponentName; -import android.content.pm.PackageManagerInternal; import android.net.Network; import android.net.Uri; import android.os.RemoteException; @@ -131,7 +130,6 @@ public final class JobStatus { * that underly Sync Manager operation. */ final int callingUid; - final int targetSdkVersion; final String batteryName; /** @@ -344,7 +342,6 @@ public final class JobStatus { * @param job The actual requested parameters for the job * @param callingUid Identity of the app that is scheduling the job. This may not be the * app in which the job is implemented; such as with sync jobs. - * @param targetSdkVersion The targetSdkVersion of the app in which the job will run. * @param sourcePackageName The package name of the app in which the job will run. * @param sourceUserId The user in which the job will run * @param standbyBucket The standby bucket that the source package is currently assigned to, @@ -363,13 +360,12 @@ public final class JobStatus { * @param lastFailedRunTime When did we last run this job only to have it stop incomplete? * @param internalFlags Non-API property flags about this job */ - private JobStatus(JobInfo job, int callingUid, int targetSdkVersion, String sourcePackageName, + private JobStatus(JobInfo job, int callingUid, String sourcePackageName, int sourceUserId, int standbyBucket, long heartbeat, String tag, int numFailures, long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis, long lastSuccessfulRunTime, long lastFailedRunTime, int internalFlags) { this.job = job; this.callingUid = callingUid; - this.targetSdkVersion = targetSdkVersion; this.standbyBucket = standbyBucket; this.baseHeartbeat = heartbeat; @@ -439,7 +435,7 @@ public final class JobStatus { /** Copy constructor: used specifically when cloning JobStatus objects for persistence, * so we preserve RTC window bounds if the source object has them. */ public JobStatus(JobStatus jobStatus) { - this(jobStatus.getJob(), jobStatus.getUid(), jobStatus.targetSdkVersion, + this(jobStatus.getJob(), jobStatus.getUid(), jobStatus.getSourcePackageName(), jobStatus.getSourceUserId(), jobStatus.getStandbyBucket(), jobStatus.getBaseHeartbeat(), jobStatus.getSourceTag(), jobStatus.getNumFailures(), @@ -468,7 +464,7 @@ public final class JobStatus { long lastSuccessfulRunTime, long lastFailedRunTime, Pair<Long, Long> persistedExecutionTimesUTC, int innerFlags) { - this(job, callingUid, resolveTargetSdkVersion(job), sourcePkgName, sourceUserId, + this(job, callingUid, sourcePkgName, sourceUserId, standbyBucket, baseHeartbeat, sourceTag, 0, earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, @@ -491,7 +487,7 @@ public final class JobStatus { long newEarliestRuntimeElapsedMillis, long newLatestRuntimeElapsedMillis, int backoffAttempt, long lastSuccessfulRunTime, long lastFailedRunTime) { - this(rescheduling.job, rescheduling.getUid(), resolveTargetSdkVersion(rescheduling.job), + this(rescheduling.job, rescheduling.getUid(), rescheduling.getSourcePackageName(), rescheduling.getSourceUserId(), rescheduling.getStandbyBucket(), newBaseHeartbeat, rescheduling.getSourceTag(), backoffAttempt, newEarliestRuntimeElapsedMillis, @@ -533,7 +529,7 @@ public final class JobStatus { long currentHeartbeat = js != null ? js.baseHeartbeatForApp(jobPackage, sourceUserId, standbyBucket) : 0; - return new JobStatus(job, callingUid, resolveTargetSdkVersion(job), sourcePkg, sourceUserId, + return new JobStatus(job, callingUid, sourcePkg, sourceUserId, standbyBucket, currentHeartbeat, tag, 0, earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, 0 /* lastSuccessfulRunTime */, 0 /* lastFailedRunTime */, @@ -681,10 +677,6 @@ public final class JobStatus { return job.getId(); } - public int getTargetSdkVersion() { - return targetSdkVersion; - } - public void printUniqueId(PrintWriter pw) { UserHandle.formatUid(pw, callingUid); pw.print("/"); @@ -1441,11 +1433,6 @@ public final class JobStatus { } } - private static int resolveTargetSdkVersion(JobInfo job) { - return LocalServices.getService(PackageManagerInternal.class) - .getPackageTargetSdkVersion(job.getService().getPackageName()); - } - // Dumpsys infrastructure public void dump(PrintWriter pw, String prefix, boolean full, long elapsedRealtimeMillis) { pw.print(prefix); UserHandle.formatUid(pw, callingUid); diff --git a/services/core/java/com/android/server/job/controllers/QuotaController.java b/services/core/java/com/android/server/job/controllers/QuotaController.java index 18d193ac68ec..b8cfac4d4206 100644 --- a/services/core/java/com/android/server/job/controllers/QuotaController.java +++ b/services/core/java/com/android/server/job/controllers/QuotaController.java @@ -68,6 +68,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.job.ConstantsProto; import com.android.server.job.JobSchedulerService; +import com.android.server.job.JobServiceContext; import com.android.server.job.StateControllerProto; import java.util.ArrayList; @@ -737,6 +738,18 @@ public final class QuotaController extends StateController { return mTopStartedJobs.contains(jobStatus); } + /** Returns the maximum amount of time this job could run for. */ + public long getMaxJobExecutionTimeMsLocked(@NonNull final JobStatus jobStatus) { + // If quota is currently "free", then the job can run for the full amount of time. + if (mChargeTracker.isCharging() + || mInParole + || isTopStartedJobLocked(jobStatus) + || isUidInForeground(jobStatus.getSourceUid())) { + return JobServiceContext.EXECUTING_TIMESLICE_MILLIS; + } + return getRemainingExecutionTimeLocked(jobStatus); + } + /** * Returns an appropriate standby bucket for the job, taking into account any standby * exemptions. @@ -2278,8 +2291,10 @@ public final class QuotaController extends StateController { mAllowedTimeIntoQuotaMs = mAllowedTimePerPeriodMs - mQuotaBufferMs; changed = true; } - long newQuotaBufferMs = Math.max(0, - Math.min(5 * MINUTE_IN_MILLIS, IN_QUOTA_BUFFER_MS)); + // Make sure quota buffer is non-negative, not greater than allowed time per period, + // and no more than 5 minutes. + long newQuotaBufferMs = Math.max(0, Math.min(mAllowedTimePerPeriodMs, + Math.min(5 * MINUTE_IN_MILLIS, IN_QUOTA_BUFFER_MS))); if (mQuotaBufferMs != newQuotaBufferMs) { mQuotaBufferMs = newQuotaBufferMs; mAllowedTimeIntoQuotaMs = mAllowedTimePerPeriodMs - mQuotaBufferMs; diff --git a/services/core/java/com/android/server/location/AbstractLocationProvider.java b/services/core/java/com/android/server/location/AbstractLocationProvider.java index 0edd17b1f777..8107e9fe3e67 100644 --- a/services/core/java/com/android/server/location/AbstractLocationProvider.java +++ b/services/core/java/com/android/server/location/AbstractLocationProvider.java @@ -142,6 +142,9 @@ public abstract class AbstractLocationProvider { return 0; } - /** Sends a custom command to this provider. */ + /** + * Sends a custom command to this provider. Called with the original binder identity of the + * caller. + */ public abstract void sendExtraCommand(String command, Bundle extras); } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 7991c0a53edf..41806cabef3f 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -1187,14 +1187,22 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } - // Traffic occurring on stacked interfaces is usually clatd, - // which is already accounted against its final egress interface - // by the kernel. Thus, we only need to collect stacked - // interface stats at the UID level. + // Traffic occurring on stacked interfaces is usually clatd. + // UID stats are always counted on the stacked interface and never + // on the base interface, because the packets on the base interface + // do not actually match application sockets until they are translated. + // + // Interface stats are more complicated. Packets subject to BPF offload + // never appear on the base interface and only appear on the stacked + // interface, so to ensure those packets increment interface stats, interface + // stats from stacked interfaces must be collected. final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks(); for (LinkProperties stackedLink : stackedLinks) { final String stackedIface = stackedLink.getInterfaceName(); if (stackedIface != null) { + if (mUseBpfTrafficStats) { + findOrCreateNetworkIdentitySet(mActiveIfaces, stackedIface).add(ident); + } findOrCreateNetworkIdentitySet(mActiveUidIfaces, stackedIface).add(ident); if (isMobile) { mobileIfaces.add(stackedIface); diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index c2e559a8a96b..6748f80b4f77 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -618,11 +618,11 @@ public final class NotificationRecord { public final String toString() { return String.format( "NotificationRecord(0x%08x: pkg=%s user=%s id=%d tag=%s importance=%d key=%s" + - "appImportanceLocked=%s: %s)", + ": %s)", System.identityHashCode(this), this.sbn.getPackageName(), this.sbn.getUser(), this.sbn.getId(), this.sbn.getTag(), this.mImportance, this.sbn.getKey(), - mIsAppImportanceLocked, this.sbn.getNotification()); + this.sbn.getNotification()); } public boolean hasAdjustment(String key) { diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 3a74798a2ad8..03224d1939b9 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -117,7 +117,7 @@ class ApexManager { for (ApexInfo ai : allPkgs) { // If the device is using flattened APEX, don't report any APEX // packages since they won't be managed or updated by PackageManager. - if ((new File(ai.packagePath)).isDirectory()) { + if ((new File(ai.modulePath)).isDirectory()) { break; } try { @@ -131,7 +131,7 @@ class ApexManager { "Two active packages have the same name: " + pkg.packageName); } - activePackagesSet.add(ai.packageName); + activePackagesSet.add(pkg.packageName); } if (ai.isFactory) { if (factoryPackagesSet.contains(pkg.packageName)) { @@ -139,7 +139,7 @@ class ApexManager { "Two factory packages have the same name: " + pkg.packageName); } - factoryPackagesSet.add(ai.packageName); + factoryPackagesSet.add(pkg.packageName); } } catch (PackageParserException pe) { throw new IllegalStateException("Unable to parse: " + ai, pe); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b0f73c30503d..deaca8476a45 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -238,6 +238,7 @@ import android.os.storage.StorageManager; import android.os.storage.StorageManagerInternal; import android.os.storage.VolumeInfo; import android.os.storage.VolumeRecord; +import android.permission.IPermissionManager; import android.provider.DeviceConfig; import android.provider.MediaStore; import android.provider.Settings.Global; @@ -961,7 +962,10 @@ public class PackageManagerService extends IPackageManager.Stub // TODO remove this and go through mPermissonManager directly final DefaultPermissionGrantPolicy mDefaultPermissionPolicy; + // Internal interface for permission manager private final PermissionManagerServiceInternal mPermissionManager; + // Public interface for permission manager + private final IPermissionManager mPermissionManagerService; private final ComponentResolver mComponentResolver; // List of packages names to keep cached, even if they are uninstalled for all users @@ -2419,6 +2423,8 @@ public class PackageManagerService extends IPackageManager.Stub mPackages); mPermissionManager = PermissionManagerService.create(context, mPackages /*externalLock*/); + mPermissionManagerService = + (IPermissionManager) ServiceManager.getService("permissionmgr"); mDefaultPermissionPolicy = mPermissionManager.getDefaultPermissionGrantPolicy(); mSettings = new Settings(Environment.getDataDirectory(), mPermissionManager.getPermissionSettings(), mPackages); @@ -6567,7 +6573,12 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] getAppOpPermissionPackages(String permName) { - return mPermissionManager.getAppOpPermissionPackages(permName); + try { + // NOTE: Because this is defined in the package manager service AIDL, we want + // ensure we also go through the permission manager service AIDL + return mPermissionManagerService.getAppOpPermissionPackages(permName); + } catch (RemoteException ignore) { } + return null; } @Override @@ -25286,7 +25297,8 @@ public class PackageManagerService extends IPackageManager.Stub return false; } String appOpPermission = Manifest.permission.REQUEST_INSTALL_PACKAGES; - String[] packagesDeclaringPermission = getAppOpPermissionPackages(appOpPermission); + String[] packagesDeclaringPermission = + mPermissionManager.getAppOpPermissionPackages(appOpPermission, callingUid); if (!ArrayUtils.contains(packagesDeclaringPermission, packageName)) { if (throwIfPermNotDeclared) { throw new SecurityException("Need to declare " + appOpPermission diff --git a/services/core/java/com/android/server/pm/ShareTargetInfo.java b/services/core/java/com/android/server/pm/ShareTargetInfo.java index 9e8b73e36f69..fdfee773ea74 100644 --- a/services/core/java/com/android/server/pm/ShareTargetInfo.java +++ b/services/core/java/com/android/server/pm/ShareTargetInfo.java @@ -15,12 +15,36 @@ */ package com.android.server.pm; +import android.annotation.NonNull; import android.text.TextUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.util.ArrayList; + /** * Represents a Share Target definition, read from the application's manifest (shortcuts.xml) */ class ShareTargetInfo { + + private static final String TAG_SHARE_TARGET = "share-target"; + private static final String ATTR_TARGET_CLASS = "targetClass"; + + private static final String TAG_DATA = "data"; + private static final String ATTR_SCHEME = "scheme"; + private static final String ATTR_HOST = "host"; + private static final String ATTR_PORT = "port"; + private static final String ATTR_PATH = "path"; + private static final String ATTR_PATH_PATTERN = "pathPattern"; + private static final String ATTR_PATH_PREFIX = "pathPrefix"; + private static final String ATTR_MIME_TYPE = "mimeType"; + + private static final String TAG_CATEGORY = "category"; + private static final String ATTR_NAME = "name"; + static class TargetData { final String mScheme; final String mHost; @@ -98,4 +122,72 @@ class ShareTargetInfo { return strBuilder.toString(); } + + void saveToXml(@NonNull XmlSerializer out) throws IOException { + out.startTag(null, TAG_SHARE_TARGET); + + ShortcutService.writeAttr(out, ATTR_TARGET_CLASS, mTargetClass); + + for (int i = 0; i < mTargetData.length; i++) { + out.startTag(null, TAG_DATA); + ShortcutService.writeAttr(out, ATTR_SCHEME, mTargetData[i].mScheme); + ShortcutService.writeAttr(out, ATTR_HOST, mTargetData[i].mHost); + ShortcutService.writeAttr(out, ATTR_PORT, mTargetData[i].mPort); + ShortcutService.writeAttr(out, ATTR_PATH, mTargetData[i].mPath); + ShortcutService.writeAttr(out, ATTR_PATH_PATTERN, mTargetData[i].mPathPattern); + ShortcutService.writeAttr(out, ATTR_PATH_PREFIX, mTargetData[i].mPathPrefix); + ShortcutService.writeAttr(out, ATTR_MIME_TYPE, mTargetData[i].mMimeType); + out.endTag(null, TAG_DATA); + } + + for (int i = 0; i < mCategories.length; i++) { + out.startTag(null, TAG_CATEGORY); + ShortcutService.writeAttr(out, ATTR_NAME, mCategories[i]); + out.endTag(null, TAG_CATEGORY); + } + + out.endTag(null, TAG_SHARE_TARGET); + } + + static ShareTargetInfo loadFromXml(XmlPullParser parser) + throws IOException, XmlPullParserException { + final String targetClass = ShortcutService.parseStringAttribute(parser, ATTR_TARGET_CLASS); + final ArrayList<ShareTargetInfo.TargetData> targetData = new ArrayList<>(); + final ArrayList<String> categories = new ArrayList<>(); + + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (type == XmlPullParser.START_TAG) { + switch (parser.getName()) { + case TAG_DATA: + targetData.add(parseTargetData(parser)); + break; + case TAG_CATEGORY: + categories.add(ShortcutService.parseStringAttribute(parser, ATTR_NAME)); + break; + } + } else if (type == XmlPullParser.END_TAG && parser.getName().equals(TAG_SHARE_TARGET)) { + break; + } + } + if (targetData.isEmpty() || targetClass == null || categories.isEmpty()) { + return null; + } + return new ShareTargetInfo( + targetData.toArray(new ShareTargetInfo.TargetData[targetData.size()]), + targetClass, categories.toArray(new String[categories.size()])); + } + + private static ShareTargetInfo.TargetData parseTargetData(XmlPullParser parser) { + final String scheme = ShortcutService.parseStringAttribute(parser, ATTR_SCHEME); + final String host = ShortcutService.parseStringAttribute(parser, ATTR_HOST); + final String port = ShortcutService.parseStringAttribute(parser, ATTR_PORT); + final String path = ShortcutService.parseStringAttribute(parser, ATTR_PATH); + final String pathPattern = ShortcutService.parseStringAttribute(parser, ATTR_PATH_PATTERN); + final String pathPrefix = ShortcutService.parseStringAttribute(parser, ATTR_PATH_PREFIX); + final String mimeType = ShortcutService.parseStringAttribute(parser, ATTR_MIME_TYPE); + + return new ShareTargetInfo.TargetData(scheme, host, port, path, pathPattern, pathPrefix, + mimeType); + } } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index d6e87aab35fe..06c71baade42 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -73,6 +73,7 @@ class ShortcutPackage extends ShortcutPackageItem { private static final String TAG_INTENT = "intent"; private static final String TAG_EXTRAS = "extras"; private static final String TAG_SHORTCUT = "shortcut"; + private static final String TAG_SHARE_TARGET = "share-target"; private static final String TAG_CATEGORIES = "categories"; private static final String TAG_PERSON = "person"; @@ -1453,8 +1454,9 @@ class ShortcutPackage extends ShortcutPackageItem { public void saveToXml(@NonNull XmlSerializer out, boolean forBackup) throws IOException, XmlPullParserException { final int size = mShortcuts.size(); + final int shareTargetSize = mShareTargets.size(); - if (size == 0 && mApiCallCount == 0) { + if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0) { return; // nothing to write. } @@ -1470,6 +1472,12 @@ class ShortcutPackage extends ShortcutPackageItem { getPackageInfo().isBackupAllowed()); } + if (!forBackup) { + for (int j = 0; j < shareTargetSize; j++) { + mShareTargets.get(j).saveToXml(out); + } + } + out.endTag(null, TAG_ROOT); } @@ -1627,6 +1635,9 @@ class ShortcutPackage extends ShortcutPackageItem { // Don't use addShortcut(), we don't need to save the icon. ret.mShortcuts.put(si.getId(), si); continue; + case TAG_SHARE_TARGET: + ret.mShareTargets.add(ShareTargetInfo.loadFromXml(parser)); + continue; } } ShortcutService.warnForInvalidTag(depth, tag); diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 18bbfed3364f..f9a019703f4d 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -170,7 +170,7 @@ public class StagingManager { PackageManager.GET_META_DATA); } catch (PackageParserException e) { throw new PackageManagerException(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "Failed to parse APEX package " + newPackage.packagePath, e); + "Failed to parse APEX package " + newPackage.modulePath, e); } final PackageInfo activePackage = mApexManager.getPackageInfo(pkg.packageName, ApexManager.MATCH_ACTIVE_PACKAGE); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index f4ba4492dcbb..8a3b3e3f627c 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -90,6 +90,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IAppOpsService; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.BackgroundThread; +import com.android.internal.os.RoSystemProperties; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; @@ -2216,11 +2217,10 @@ public class UserManagerService extends IUserManager.Stub { @GuardedBy({"mPackagesLock", "mRestrictionsLock"}) private void fallbackToSingleUserLP() { - int flags = UserInfo.FLAG_INITIALIZED; - // In split system user mode, the admin and primary flags are assigned to the first human - // user. - if (!UserManager.isSplitSystemUser()) { - flags |= UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY; + int flags = UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN; + // In headless system user mode, the primary flag is assigned to the first human user. + if (!RoSystemProperties.MULTIUSER_HEADLESS_SYSTEM_USER) { + flags |= UserInfo.FLAG_PRIMARY; } // Create the system user UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, null, null, flags); @@ -2734,9 +2734,9 @@ public class UserManagerService extends IUserManager.Stub { return null; } } - // In split system user mode, we assign the first human user the primary flag. + // In headless system user mode, we assign the first human user the primary flag. // And if there is no device owner, we also assign the admin flag to primary user. - if (UserManager.isSplitSystemUser() + if (RoSystemProperties.MULTIUSER_HEADLESS_SYSTEM_USER && !isGuest && !isManagedProfile && getPrimaryUser() == null) { flags |= UserInfo.FLAG_PRIMARY; synchronized (mUsersLock) { diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 12870850e417..4035d0d11a66 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -63,12 +63,14 @@ import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; +import android.os.ServiceManager; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; import android.os.storage.StorageManager; import android.os.storage.StorageManagerInternal; +import android.permission.IPermissionManager; import android.permission.PermissionControllerManager; import android.permission.PermissionManager; import android.permission.PermissionManagerInternal; @@ -122,7 +124,7 @@ import java.util.concurrent.TimeoutException; /** * Manages all permissions and handles permissions related tasks. */ -public class PermissionManagerService { +public class PermissionManagerService extends IPermissionManager.Stub { private static final String TAG = "PackageManager"; /** Permission grant: not grant the permission. */ @@ -283,7 +285,13 @@ public class PermissionManagerService { if (permMgrInt != null) { return permMgrInt; } - new PermissionManagerService(context, externalLock); + PermissionManagerService permissionService = + (PermissionManagerService) ServiceManager.getService("permissionmgr"); + if (permissionService == null) { + permissionService = + new PermissionManagerService(context, externalLock); + ServiceManager.addService("permissionmgr", permissionService); + } return LocalServices.getService(PermissionManagerServiceInternal.class); } @@ -293,6 +301,24 @@ public class PermissionManagerService { } } + @Override + public String[] getAppOpPermissionPackages(String permName) { + return getAppOpPermissionPackagesInternal(permName, getCallingUid()); + } + + private String[] getAppOpPermissionPackagesInternal(String permName, int callingUid) { + if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) { + return null; + } + synchronized (mLock) { + final ArraySet<String> pkgs = mSettings.mAppOpPermissionPackages.get(permName); + if (pkgs == null) { + return null; + } + return pkgs.toArray(new String[pkgs.size()]); + } + } + private int checkPermission(String permName, String pkgName, int callingUid, int userId) { if (!mUserManagerInt.exists(userId)) { return PackageManager.PERMISSION_DENIED; @@ -2327,12 +2353,8 @@ public class PermissionManagerService { final String permissionName = pkg.requestedPermissions.get(i); final BasePermission bp = mSettings.getPermissionLocked(permissionName); - if (bp == null) { - Slog.w(TAG, "Cannot whitelist unknown permission: " + permissionName); - continue; - } - if (!bp.isHardOrSoftRestricted()) { + if (bp == null || !bp.isHardOrSoftRestricted()) { continue; } @@ -2497,19 +2519,6 @@ public class PermissionManagerService { return runtimePermissionChangedUserIds; } - private String[] getAppOpPermissionPackages(String permName) { - if (mPackageManagerInt.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - synchronized (mLock) { - final ArraySet<String> pkgs = mSettings.mAppOpPermissionPackages.get(permName); - if (pkgs == null) { - return null; - } - return pkgs.toArray(new String[pkgs.size()]); - } - } - private int getPermissionFlags( String permName, String packageName, int callingUid, int userId) { if (!mUserManagerInt.exists(userId)) { @@ -3200,8 +3209,9 @@ public class PermissionManagerService { volumeUuid, sdkUpdated, allPackages, callback); } @Override - public String[] getAppOpPermissionPackages(String permName) { - return PermissionManagerService.this.getAppOpPermissionPackages(permName); + public String[] getAppOpPermissionPackages(String permName, int callingUid) { + return PermissionManagerService.this + .getAppOpPermissionPackagesInternal(permName, callingUid); } @Override public int getPermissionFlags(String permName, String packageName, int callingUid, diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 0f7d07a3108e..8cc6d76256d4 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -155,7 +155,9 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void removeDynamicPermission(@NonNull String permName, int callingUid, @Nullable PermissionCallback callback); - public abstract @Nullable String[] getAppOpPermissionPackages(@NonNull String permName); + /** Retrieve the packages that have requested the given app op permission */ + public abstract @Nullable String[] getAppOpPermissionPackages( + @NonNull String permName, int callingUid); public abstract int getPermissionFlags(@NonNull String permName, @NonNull String packageName, int callingUid, int userId); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 602cc553f870..ab531899b496 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2524,11 +2524,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } final int resource; - if (onWallpaper) { - resource = R.anim.lock_screen_behind_enter_wallpaper; - } else if (subtleAnimation) { + if (subtleAnimation) { resource = R.anim.lock_screen_behind_enter_subtle; - } else { + } else if (onWallpaper) { + resource = R.anim.lock_screen_behind_enter_wallpaper; + } else { resource = R.anim.lock_screen_behind_enter; } diff --git a/services/core/java/com/android/server/policy/TEST_MAPPING b/services/core/java/com/android/server/policy/TEST_MAPPING index c7e241b35e9a..9f64039e01a1 100644 --- a/services/core/java/com/android/server/policy/TEST_MAPPING +++ b/services/core/java/com/android/server/policy/TEST_MAPPING @@ -46,6 +46,14 @@ "include-filter": "android.permission.cts.BackgroundPermissionsTest" } ] + }, + { + "name": "CtsBackupTestCases", + "options": [ + { + "include-filter": "android.backup.cts.PermissionTest" + } + ] } ], "postsubmit": [ diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index f5639a9f76f1..de3e89f031d8 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -325,7 +325,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } @Override - public ParceledListSlice<RollbackInfo> getRecentlyExecutedRollbacks() { + public ParceledListSlice<RollbackInfo> getRecentlyCommittedRollbacks() { enforceManageRollbacks("getRecentlyCommittedRollbacks"); synchronized (mLock) { @@ -344,7 +344,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { @Override public void commitRollback(int rollbackId, ParceledListSlice causePackages, String callerPackageName, IntentSender statusReceiver) { - enforceManageRollbacks("executeRollback"); + enforceManageRollbacks("commitRollback"); final int callingUid = Binder.getCallingUid(); AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); @@ -690,8 +690,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { /** * Load rollback data from storage if it has not already been loaded. - * After calling this funciton, mAvailableRollbacks and - * mRecentlyExecutedRollbacks will be non-null. + * After calling this function, mRollbacks will be non-null. */ private void ensureRollbackDataLoaded() { synchronized (mLock) { diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 8b332d271a3a..55f062bca2d1 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -1032,11 +1032,13 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { // must always grant permissions on behalf of someone explicit. final int callingAppId = UserHandle.getAppId(callingUid); if ((callingAppId == SYSTEM_UID) || (callingAppId == ROOT_UID)) { - if ("com.android.settings.files".equals(grantUri.uri.getAuthority())) { + if ("com.android.settings.files".equals(grantUri.uri.getAuthority()) + || "com.android.settings.module_licenses".equals(grantUri.uri.getAuthority())) { // Exempted authority for // 1. cropping user photos and sharing a generated license html // file in Settings app // 2. sharing a generated license html file in TvSettings app + // 3. Sharing module license files from Settings app } else { Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission" + " grant to " + grantUri + "; use startActivityAsCaller() instead"); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index ba610557919f..6665381bf99d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3160,7 +3160,7 @@ final class ActivityRecord extends ConfigurationContainer { boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow) { return ensureActivityConfiguration(globalChanges, preserveWindow, - false /* ignoreStopState */); + false /* ignoreVisibility */); } /** @@ -3170,15 +3170,15 @@ final class ActivityRecord extends ConfigurationContainer { * @param globalChanges The changes to the global configuration. * @param preserveWindow If the activity window should be preserved on screen if the activity * is relaunched. - * @param ignoreStopState If we should try to relaunch the activity even if it is in the stopped - * state. This is useful for the case where we know the activity will be - * visible soon and we want to ensure its configuration before we make it - * visible. + * @param ignoreVisibility If we should try to relaunch the activity even if it is invisible + * (stopped state). This is useful for the case where we know the + * activity will be visible soon and we want to ensure its configuration + * before we make it visible. * @return False if the activity was relaunched and true if it wasn't relaunched because we * can't or the app handles the specific configuration that is changing. */ boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow, - boolean ignoreStopState) { + boolean ignoreVisibility) { final ActivityStack stack = getActivityStack(); if (stack.mConfigWillChange) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, @@ -3194,15 +3194,9 @@ final class ActivityRecord extends ConfigurationContainer { return true; } - if (!ignoreStopState && (mState == STOPPING || mState == STOPPED)) { + if (!ignoreVisibility && (mState == STOPPING || mState == STOPPED || !shouldBeVisible())) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Skipping config check stopped or stopping: " + this); - return true; - } - - if (!shouldBeVisible()) { - if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Skipping config check invisible stack: " + this); + "Skipping config check invisible: " + this); return true; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 156fb983e7b9..da7a61bc059b 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -164,6 +164,8 @@ import com.android.server.am.AppTimeTracker; import com.android.server.am.EventLogTags; import com.android.server.am.PendingIntentRecord; +import com.google.android.collect.Sets; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -1302,6 +1304,11 @@ class ActivityStack extends ConfigurationContainer { return; } + getDisplay().positionChildAtBottom(this, reason); + if (task != null) { + insertTaskAtBottom(task); + } + /** * The intent behind moving a primary split screen stack to the back is usually to hide * behind the home stack. Exit split screen in this case. @@ -1309,11 +1316,6 @@ class ActivityStack extends ConfigurationContainer { if (getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { setWindowingMode(WINDOWING_MODE_UNDEFINED); } - - getDisplay().positionChildAtBottom(this, reason); - if (task != null) { - insertTaskAtBottom(task); - } } boolean isFocusable() { @@ -1388,13 +1390,12 @@ class ActivityStack extends ConfigurationContainer { } if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Comparing existing cls=" - + taskIntent.getComponent().flattenToShortString() + + (task.realActivity != null ? task.realActivity.flattenToShortString() : "") + "/aff=" + r.getTaskRecord().rootAffinity + " to new cls=" + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity); // TODO Refactor to remove duplications. Check if logic can be simplified. - if (taskIntent != null && taskIntent.getComponent() != null && - taskIntent.getComponent().compareTo(cls) == 0 && - Objects.equals(documentData, taskDocumentData)) { + if (task.realActivity != null && task.realActivity.compareTo(cls) == 0 + && Objects.equals(documentData, taskDocumentData)) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!"); //dump(); if (DEBUG_TASKS) Slog.d(TAG_TASKS, @@ -1881,8 +1882,7 @@ class ActivityStack extends ConfigurationContainer { mRootActivityContainer.ensureActivitiesVisible(resuming, 0, !PRESERVE_WINDOWS); } - private void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed, - String reason) { + void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed, String reason) { if (!mStackSupervisor.mStoppingActivities.contains(r)) { EventLog.writeEvent(EventLogTags.AM_ADD_TO_STOPPING, r.mUserId, System.identityHashCode(r), r.shortComponentName, reason); @@ -2177,7 +2177,7 @@ class ActivityStack extends ConfigurationContainer { // sure it matches the current configuration. if (r != starting && notifyClients) { r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindows, - true /* ignoreStopState */); + true /* ignoreVisibility */); } if (!r.attachedToProcess()) { @@ -3146,8 +3146,10 @@ class ActivityStack extends ConfigurationContainer { boolean newTask, boolean keepCurTransition, ActivityOptions options) { TaskRecord rTask = r.getTaskRecord(); final int taskId = rTask.taskId; + final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); // mLaunchTaskBehind tasks get placed at the back of the task stack. - if (!r.mLaunchTaskBehind && (taskForIdLocked(taskId) == null || newTask)) { + if (!r.mLaunchTaskBehind && allowMoveToFront + && (taskForIdLocked(taskId) == null || newTask)) { // Last activity in task had been removed or ActivityManagerService is reusing task. // Insert or replace. // Might not even be in. @@ -3206,7 +3208,9 @@ class ActivityStack extends ConfigurationContainer { task.setFrontOfTask(); - if (!isHomeOrRecentsStack() || numActivities() > 0) { + // The transition animation and starting window are not needed if {@code allowMoveToFront} + // is false, because the activity won't be visible. + if ((!isHomeOrRecentsStack() || numActivities() > 0) && allowMoveToFront) { final DisplayContent dc = getDisplay().mDisplayContent; if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare open transition: starting " + r); @@ -4029,6 +4033,14 @@ class ActivityStack extends ConfigurationContainer { } getDisplay().mDisplayContent.prepareAppTransition(transit, false); + // When finishing the activity pre-emptively take the snapshot before the app window + // is marked as hidden and any configuration changes take place + if (mWindowManager.mTaskSnapshotController != null) { + final ArraySet<Task> tasks = Sets.newArraySet(task.mTask); + mWindowManager.mTaskSnapshotController.snapshotTasks(tasks); + mWindowManager.mTaskSnapshotController.addSkipClosingAppSnapshotTasks(tasks); + } + // Tell window manager to prepare for this one to be removed. r.setVisibility(false); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 0a88eef86ea8..eda9d24ef3c5 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2307,12 +2307,12 @@ class ActivityStarter { // isLockTaskModeViolation fails below. if (mReuseTask == null) { + final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront; final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, - mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity, mSourceRecord, - mOptions); + mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions); addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask"); updateBounds(mStartActivity.getTaskRecord(), mLaunchParams.mBounds); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 16dd5552d693..a55513317fee 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1447,9 +1447,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .execute(); } + /** + * Start the recents activity to perform the recents animation. + * + * @param intent The intent to start the recents activity. + * @param recentsAnimationRunner Pass {@code null} to only preload the activity. + */ @Override - public void startRecentsActivity(Intent intent, IAssistDataReceiver assistDataReceiver, - IRecentsAnimationRunner recentsAnimationRunner) { + public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused, + @Nullable IRecentsAnimationRunner recentsAnimationRunner) { enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()"); final int callingPid = Binder.getCallingPid(); final long origId = Binder.clearCallingIdentity(); @@ -1460,9 +1466,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Start a new recents animation final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor, - getActivityStartController(), mWindowManager, callingPid); - anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent, - recentsUid, assistDataReceiver); + getActivityStartController(), mWindowManager, intent, recentsComponent, + recentsUid, callingPid); + if (recentsAnimationRunner == null) { + anim.preloadRecentsActivity(); + } else { + anim.startRecentsActivity(recentsAnimationRunner); + } } } finally { Binder.restoreCallingIdentity(origId); @@ -3918,10 +3928,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Caller wants the current split-screen primary stack to be the top stack after // it goes fullscreen, so move it to the front. stack.moveToFront("dismissSplitScreenMode"); - } else if (mRootActivityContainer.isTopDisplayFocusedStack(stack)) { + } else { // In this case the current split-screen primary stack shouldn't be the top - // stack after it goes fullscreen, but it current has focus, so we move the - // focus to the top-most split-screen secondary stack next to it. + // stack after it goes fullscreen, so we move the focus to the top-most + // split-screen secondary stack next to it. final ActivityStack otherStack = stack.getDisplay().getTopStackInWindowingMode( WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); if (otherStack != null) { @@ -4750,18 +4760,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private void applyUpdateVrModeLocked(ActivityRecord r) { // VR apps are expected to run in a main display. If an app is turning on VR for - // itself, but lives in a dynamic stack, then make sure that it is moved to the main - // fullscreen stack before enabling VR Mode. - // TODO: The goal of this code is to keep the VR app on the main display. When the - // stack implementation changes in the future, keep in mind that the use of the fullscreen - // stack is a means to move the activity to the main display and a moveActivityToDisplay() - // option would be a better choice here. + // itself, but isn't on the main display, then move it there before enabling VR Mode. if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) { - Slog.i(TAG, "Moving " + r.shortComponentName + " from stack " + r.getStackId() - + " to main stack for VR"); - final ActivityStack stack = mRootActivityContainer.getDefaultDisplay().getOrCreateStack( - WINDOWING_MODE_FULLSCREEN, r.getActivityType(), true /* toTop */); - moveTaskToStack(r.getTaskRecord().taskId, stack.mStackId, true /* toTop */); + Slog.i(TAG, "Moving " + r.shortComponentName + " from display " + r.getDisplayId() + + " to main display for VR"); + mRootActivityContainer.moveStackToDisplay( + r.getStackId(), DEFAULT_DISPLAY, true /* toTop */); } mH.post(() -> { if (!mVrController.onVrModeChanged(r)) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 4a9a3f71f90e..03cae429904f 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1322,7 +1322,15 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (prevDc == null || prevDc == mDisplayContent) { return; } - if (prevDc.mChangingApps.contains(this)) { + + if (prevDc.mOpeningApps.remove(this)) { + // Transfer opening transition to new display. + mDisplayContent.mOpeningApps.add(this); + mDisplayContent.prepareAppTransition(prevDc.mAppTransition.getAppTransition(), true); + mDisplayContent.executeAppTransition(); + } + + if (prevDc.mChangingApps.remove(this)) { // This gets called *after* the AppWindowToken has been reparented to the new display. // That reparenting resulted in this window changing modes (eg. FREEFORM -> FULLSCREEN), // so this token is now "frozen" while waiting for the animation to start on prevDc @@ -1331,6 +1339,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // so we need to cancel the change transition here. clearChangeLeash(getPendingTransaction(), true /* cancel */); } + prevDc.mClosingApps.remove(this); + if (prevDc.mFocusedApp == this) { prevDc.setFocusedApp(null); final TaskStack stack = dc.getTopStack(); @@ -3216,16 +3226,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree true /* topToBottom */); } - void removeFromPendingTransition() { - if (isWaitingForTransitionStart() && mDisplayContent != null) { - mDisplayContent.mOpeningApps.remove(this); - if (mDisplayContent.mChangingApps.remove(this)) { - clearChangeLeash(getPendingTransaction(), true /* cancel */); - } - mDisplayContent.mClosingApps.remove(this); - } - } - private void updateColorTransform() { if (mSurfaceControl != null && mLastAppSaturationInfo != null) { getPendingTransaction().setColorTransform(mSurfaceControl, diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 72a7fcfe1e29..4d548bf5ea63 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2397,9 +2397,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo + " to its current displayId=" + mDisplayId); } - // Clean up all pending transitions when stack reparent to another display. - stack.forAllAppWindows(AppWindowToken::removeFromPendingTransition); - prevDc.mTaskStackContainers.removeChild(stack); mTaskStackContainers.addStackToDisplay(stack, onTop); } diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index 6127303141f4..553b0ffa6999 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -176,6 +176,8 @@ class DragState { mTransaction.transferTouchFocus(mTransferTouchFromToken, h.token); mTransferTouchFromToken = null; + // syncInputWindows here to ensure the input channel isn't removed before the transfer. + mTransaction.syncInputWindows(); mTransaction.apply(); } diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index 434239f6ecf7..bf627ec5680c 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -34,7 +34,6 @@ import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_T import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RECENTS_ANIMATIONS; import android.app.ActivityOptions; -import android.app.IAssistDataReceiver; import android.content.ComponentName; import android.content.Intent; import android.os.RemoteException; @@ -58,7 +57,12 @@ class RecentsAnimation implements RecentsAnimationCallbacks, private final ActivityStartController mActivityStartController; private final WindowManagerService mWindowManager; private final ActivityDisplay mDefaultDisplay; + private final Intent mTargetIntent; + private final ComponentName mRecentsComponent; + private final int mRecentsUid; private final int mCallingPid; + private final int mUserId; + private final int mTargetActivityType; /** * The activity which has been launched behind. We need to remember the activity because the @@ -66,27 +70,90 @@ class RecentsAnimation implements RecentsAnimationCallbacks, * for the exact activity. */ private ActivityRecord mLaunchedTargetActivity; - private int mTargetActivityType; // The stack to restore the target stack behind when the animation is finished private ActivityStack mRestoreTargetBehindStack; RecentsAnimation(ActivityTaskManagerService atm, ActivityStackSupervisor stackSupervisor, ActivityStartController activityStartController, WindowManagerService wm, - int callingPid) { + Intent targetIntent, ComponentName recentsComponent, int recentsUid, int callingPid) { mService = atm; mStackSupervisor = stackSupervisor; mDefaultDisplay = mService.mRootActivityContainer.getDefaultDisplay(); mActivityStartController = activityStartController; mWindowManager = wm; + mTargetIntent = targetIntent; + mRecentsComponent = recentsComponent; + mRecentsUid = recentsUid; mCallingPid = callingPid; + mUserId = atm.getCurrentUserId(); + mTargetActivityType = targetIntent.getComponent() != null + && recentsComponent.equals(targetIntent.getComponent()) + ? ACTIVITY_TYPE_RECENTS + : ACTIVITY_TYPE_HOME; + } + + /** + * Starts the recents activity in background without animation if the record doesn't exist or + * the client isn't launched. If the recents activity is already alive, ensure its configuration + * is updated to the current one. + */ + void preloadRecentsActivity() { + if (DEBUG) Slog.d(TAG, "Preload recents with " + mTargetIntent); + ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, + mTargetActivityType); + ActivityRecord targetActivity = getTargetActivity(targetStack); + if (targetActivity != null) { + if (targetActivity.visible || targetActivity.isTopRunningActivity()) { + // The activity is ready. + return; + } + if (targetActivity.attachedToProcess()) { + // The activity may be relaunched if it cannot handle the current configuration + // changes. The activity will be paused state if it is relaunched, otherwise it + // keeps the original stopped state. + targetActivity.ensureActivityConfiguration(0 /* globalChanges */, + false /* preserveWindow */, true /* ignoreVisibility */); + if (DEBUG) Slog.d(TAG, "Updated config=" + targetActivity.getConfiguration()); + } + } else { + // Create the activity record. Because the activity is invisible, this doesn't really + // start the client. + startRecentsActivityInBackground("preloadRecents"); + targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); + targetActivity = getTargetActivity(targetStack); + if (targetActivity == null) { + Slog.w(TAG, "Cannot start " + mTargetIntent); + return; + } + } + + if (!targetActivity.attachedToProcess()) { + if (DEBUG) Slog.d(TAG, "Real start recents"); + mStackSupervisor.startSpecificActivityLocked(targetActivity, false /* andResume */, + false /* checkConfig */); + // Make sure the activity won't be involved in transition. + if (targetActivity.mAppWindowToken != null) { + targetActivity.mAppWindowToken.getDisplayContent().mUnknownAppVisibilityController + .appRemovedOrHidden(targetActivity.mAppWindowToken); + } + } + + // Invisible activity should be stopped. If the recents activity is alive and its doesn't + // need to relaunch by current configuration, then it may be already in stopped state. + if (!targetActivity.isState(ActivityStack.ActivityState.STOPPING, + ActivityStack.ActivityState.STOPPED)) { + // Add to stopping instead of stop immediately. So the client has the chance to perform + // traversal in non-stopped state (ViewRootImpl.mStopped) that would initialize more + // things (e.g. the measure can be done earlier). The actual stop will be performed when + // it reports idle. + targetStack.addToStopping(targetActivity, true /* scheduleIdle */, + true /* idleDelayed */, "preloadRecents"); + } } - void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner, - ComponentName recentsComponent, int recentsUid, - @Deprecated IAssistDataReceiver assistDataReceiver) { - if (DEBUG) Slog.d(TAG, "startRecentsActivity(): intent=" + intent - + " assistDataReceiver=" + assistDataReceiver); + void startRecentsActivity(IRecentsAnimationRunner recentsAnimationRunner) { + if (DEBUG) Slog.d(TAG, "startRecentsActivity(): intent=" + mTargetIntent); Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "RecentsAnimation#startRecentsActivity"); // TODO(multi-display) currently only support recents animation in default display. @@ -100,15 +167,9 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } // If the activity is associated with the recents stack, then try and get that first - final int userId = mService.getCurrentUserId(); - mTargetActivityType = intent.getComponent() != null - && recentsComponent.equals(intent.getComponent()) - ? ACTIVITY_TYPE_RECENTS - : ACTIVITY_TYPE_HOME; ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); - ActivityRecord targetActivity = getTargetActivity(targetStack, intent.getComponent(), - userId); + ActivityRecord targetActivity = getTargetActivity(targetStack); final boolean hasExistingActivity = targetActivity != null; if (hasExistingActivity) { final ActivityDisplay display = targetActivity.getDisplay(); @@ -127,7 +188,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, true /* forceSend */, targetActivity); } - mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); + mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(mTargetIntent); mService.mH.post(() -> mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, true)); @@ -148,23 +209,12 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } } else { // No recents activity, create the new recents activity bottom most - ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchActivityType(mTargetActivityType); - options.setAvoidMoveToFront(); - intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); - - mActivityStartController - .obtainStarter(intent, "startRecentsActivity_noTargetActivity") - .setCallingUid(recentsUid) - .setCallingPackage(recentsComponent.getPackageName()) - .setActivityOptions(SafeActivityOptions.fromBundle(options.toBundle())) - .setMayWait(userId) - .execute(); + startRecentsActivityInBackground("startRecentsActivity_noTargetActivity"); // Move the recents activity into place for the animation targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); - targetActivity = getTargetActivity(targetStack, intent.getComponent(), userId); + targetActivity = getTargetActivity(targetStack); mDefaultDisplay.moveStackBehindBottomMostVisibleStack(targetStack); if (DEBUG) { Slog.d(TAG, "Moved stack=" + targetStack + " behind stack=" @@ -176,7 +226,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, // TODO: Maybe wait for app to draw in this particular case? - if (DEBUG) Slog.d(TAG, "Started intent=" + intent); + if (DEBUG) Slog.d(TAG, "Started intent=" + mTargetIntent); } // Mark the target activity as launch-behind to bump its visibility for the @@ -383,6 +433,21 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } } + private void startRecentsActivityInBackground(String reason) { + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setLaunchActivityType(mTargetActivityType); + options.setAvoidMoveToFront(); + mTargetIntent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); + + mActivityStartController + .obtainStarter(mTargetIntent, reason) + .setCallingUid(mRecentsUid) + .setCallingPackage(mRecentsComponent.getPackageName()) + .setActivityOptions(new SafeActivityOptions(options)) + .setMayWait(mUserId) + .execute(); + } + /** * Called only when the animation should be canceled prior to starting. */ @@ -412,15 +477,15 @@ class RecentsAnimation implements RecentsAnimationCallbacks, * @return the top activity in the {@param targetStack} matching the {@param component}, or just * the top activity of the top task if no task matches the component. */ - private ActivityRecord getTargetActivity(ActivityStack targetStack, ComponentName component, - int userId) { + private ActivityRecord getTargetActivity(ActivityStack targetStack) { if (targetStack == null) { return null; } for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { final TaskRecord task = targetStack.getChildAt(i); - if (task.userId == userId && task.getBaseIntent().getComponent().equals(component)) { + if (task.userId == mUserId + && task.getBaseIntent().getComponent().equals(mTargetIntent.getComponent())) { return task.getTopActivity(); } } diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index fe4c9a41a960..dc62877bca8d 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -279,7 +279,8 @@ class ScreenRotationAnimation { mService.mDisplayManagerInternal.screenshot(displayId); if (gb != null) { try { - surface.attachAndQueueBuffer(gb.getGraphicBuffer()); + surface.attachAndQueueBufferWithColorSpace(gb.getGraphicBuffer(), + gb.getColorSpace()); } catch (RuntimeException e) { Slog.w(TAG, "Failed to attach screenshot - " + e.getMessage()); } diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java index 8031cfdce7c3..1a571683de34 100644 --- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java +++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java @@ -68,7 +68,7 @@ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { if (buffer != null) { final Surface surface = new Surface(); surface.copyFrom(mSurfaceControl); - surface.attachAndQueueBuffer(buffer); + surface.attachAndQueueBufferWithColorSpace(buffer, screenshotBuffer.getColorSpace()); surface.release(); } getPendingTransaction().show(mSurfaceControl); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 2696977f68de..1b3e4c1743cf 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -284,7 +284,6 @@ class TaskSnapshotSurface implements StartingSurface { } private void drawSnapshot() { - final GraphicBuffer buffer = mSnapshot.getSnapshot(); mSurface.copyFrom(mSurfaceControl); if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Drawing snapshot surface sizeMismatch=" @@ -293,9 +292,9 @@ class TaskSnapshotSurface implements StartingSurface { // The dimensions of the buffer and the window don't match, so attaching the buffer // will fail. Better create a child window with the exact dimensions and fill the parent // window with the background color! - drawSizeMismatchSnapshot(buffer); + drawSizeMismatchSnapshot(); } else { - drawSizeMatchSnapshot(buffer); + drawSizeMatchSnapshot(); } synchronized (mService.mGlobalLock) { mShownTime = SystemClock.uptimeMillis(); @@ -307,15 +306,17 @@ class TaskSnapshotSurface implements StartingSurface { mSnapshot = null; } - private void drawSizeMatchSnapshot(GraphicBuffer buffer) { - mSurface.attachAndQueueBuffer(buffer); + private void drawSizeMatchSnapshot() { + mSurface.attachAndQueueBufferWithColorSpace(mSnapshot.getSnapshot(), + mSnapshot.getColorSpace()); mSurface.release(); } - private void drawSizeMismatchSnapshot(GraphicBuffer buffer) { + private void drawSizeMismatchSnapshot() { if (!mSurface.isValid()) { throw new IllegalStateException("mSurface does not hold a valid surface."); } + final GraphicBuffer buffer = mSnapshot.getSnapshot(); final SurfaceSession session = new SurfaceSession(); // We consider nearly matched dimensions as there can be rounding errors and the user won't // notice very minute differences from scaling one dimension more than the other @@ -355,7 +356,7 @@ class TaskSnapshotSurface implements StartingSurface { } finally { SurfaceControl.closeTransaction(); } - surface.attachAndQueueBuffer(buffer); + surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace()); surface.release(); if (aspectRatioMismatch) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 3ec8b2efa8a2..a04875f1a283 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1449,16 +1449,13 @@ public final class SystemServer { } t.traceEnd(); - final boolean useNewTimeServices = true; - if (useNewTimeServices) { - t.traceBegin("StartTimeDetectorService"); - try { - mSystemServiceManager.startService(TIME_DETECTOR_SERVICE_CLASS); - } catch (Throwable e) { - reportWtf("starting StartTimeDetectorService service", e); - } - t.traceEnd(); + t.traceBegin("StartTimeDetectorService"); + try { + mSystemServiceManager.startService(TIME_DETECTOR_SERVICE_CLASS); + } catch (Throwable e) { + reportWtf("starting StartTimeDetectorService service", e); } + t.traceEnd(); if (!isWatch) { t.traceBegin("StartSearchManagerService"); @@ -1656,12 +1653,7 @@ public final class SystemServer { if (!isWatch && !disableNetworkTime) { t.traceBegin("StartNetworkTimeUpdateService"); try { - if (useNewTimeServices) { - networkTimeUpdater = new NewNetworkTimeUpdateService(context); - } else { - networkTimeUpdater = new OldNetworkTimeUpdateService(context); - } - Slog.d(TAG, "Using networkTimeUpdater class=" + networkTimeUpdater.getClass()); + networkTimeUpdater = new NetworkTimeUpdateServiceImpl(context); ServiceManager.addService("network_time_update_service", networkTimeUpdater); } catch (Throwable e) { reportWtf("starting NetworkTimeUpdate service", e); @@ -1893,6 +1885,10 @@ public final class SystemServer { mSystemServiceManager.startService(IncidentCompanionService.class); t.traceEnd(); + if (safeMode) { + mActivityManagerService.enterSafeMode(); + } + // MMS service broker t.traceBegin("StartMmsService"); mmsService = mSystemServiceManager.startService(MmsServiceBroker.class); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java index 823cc66975dd..328e8f41f5e2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java @@ -59,6 +59,7 @@ import android.util.DataUnit; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; import com.android.server.job.JobSchedulerService.Constants; +import com.android.server.job.JobServiceContext; import com.android.server.net.NetworkPolicyManagerInternal; import org.junit.Before; @@ -138,22 +139,53 @@ public class ConnectivityControllerTest { DataUnit.MEBIBYTES.toBytes(1)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); + final ConnectivityController controller = new ConnectivityController(mService); + when(mService.getMaxJobExecutionTimeMs(any())) + .thenReturn(JobServiceContext.EXECUTING_TIMESLICE_MILLIS); + // Slow network is too slow - assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), net, + assertFalse(controller.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1) .setLinkDownstreamBandwidthKbps(1), mConstants)); // Slow downstream - assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), net, + assertFalse(controller.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1024) .setLinkDownstreamBandwidthKbps(1), mConstants)); // Slow upstream - assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), net, + assertFalse(controller.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1) .setLinkDownstreamBandwidthKbps(1024), mConstants)); // Fast network looks great - assertTrue(ConnectivityController.isSatisfied(createJobStatus(job), net, + assertTrue(controller.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1024) .setLinkDownstreamBandwidthKbps(1024), mConstants)); + // Slow network still good given time + assertTrue(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(130) + .setLinkDownstreamBandwidthKbps(130), mConstants)); + + when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(60_000L); + + // Slow network is too slow + assertFalse(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(1) + .setLinkDownstreamBandwidthKbps(1), mConstants)); + // Slow downstream + assertFalse(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(137) + .setLinkDownstreamBandwidthKbps(1), mConstants)); + // Slow upstream + assertFalse(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(1) + .setLinkDownstreamBandwidthKbps(137), mConstants)); + // Network good enough + assertTrue(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(137) + .setLinkDownstreamBandwidthKbps(137), mConstants)); + // Network slightly too slow given reduced time + assertFalse(controller.isSatisfied(createJobStatus(job), net, + createCapabilities().setLinkUpstreamBandwidthKbps(130) + .setLinkDownstreamBandwidthKbps(130), mConstants)); } @Test @@ -166,21 +198,23 @@ public class ConnectivityControllerTest { final JobStatus early = createJobStatus(job, now - 1000, now + 2000); final JobStatus late = createJobStatus(job, now - 2000, now + 1000); + final ConnectivityController controller = new ConnectivityController(mService); + // Uncongested network is whenever { final Network net = new Network(101); final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED); - assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); + assertTrue(controller.isSatisfied(early, net, caps, mConstants)); + assertTrue(controller.isSatisfied(late, net, caps, mConstants)); } // Congested network is more selective { final Network net = new Network(101); final NetworkCapabilities caps = createCapabilities(); - assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); + assertFalse(controller.isSatisfied(early, net, caps, mConstants)); + assertTrue(controller.isSatisfied(late, net, caps, mConstants)); } } @@ -198,16 +232,18 @@ public class ConnectivityControllerTest { final JobStatus earlyPrefetch = createJobStatus(job, now - 1000, now + 2000); final JobStatus latePrefetch = createJobStatus(job, now - 2000, now + 1000); + final ConnectivityController controller = new ConnectivityController(mService); + // Unmetered network is whenever { final Network net = new Network(101); final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED) .addCapability(NET_CAPABILITY_NOT_METERED); - assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants)); + assertTrue(controller.isSatisfied(early, net, caps, mConstants)); + assertTrue(controller.isSatisfied(late, net, caps, mConstants)); + assertTrue(controller.isSatisfied(earlyPrefetch, net, caps, mConstants)); + assertTrue(controller.isSatisfied(latePrefetch, net, caps, mConstants)); } // Metered network is only when prefetching and late @@ -215,10 +251,10 @@ public class ConnectivityControllerTest { final Network net = new Network(101); final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED); - assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants)); - assertFalse(ConnectivityController.isSatisfied(late, net, caps, mConstants)); - assertFalse(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants)); - assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants)); + assertFalse(controller.isSatisfied(early, net, caps, mConstants)); + assertFalse(controller.isSatisfied(late, net, caps, mConstants)); + assertFalse(controller.isSatisfied(earlyPrefetch, net, caps, mConstants)); + assertTrue(controller.isSatisfied(latePrefetch, net, caps, mConstants)); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java index 9f312891fbd0..2d702312a62b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java @@ -28,6 +28,7 @@ import static com.android.server.job.JobSchedulerService.FREQUENT_INDEX; import static com.android.server.job.JobSchedulerService.NEVER_INDEX; import static com.android.server.job.JobSchedulerService.RARE_INDEX; import static com.android.server.job.JobSchedulerService.WORKING_INDEX; +import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -73,6 +74,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; import com.android.server.job.JobSchedulerService.Constants; +import com.android.server.job.JobServiceContext; import com.android.server.job.JobStore; import com.android.server.job.controllers.QuotaController.ExecutionStats; import com.android.server.job.controllers.QuotaController.TimingSession; @@ -975,6 +977,37 @@ public class QuotaControllerTest { assertEquals(expectedStats, newStatsRare); } + @Test + public void testGetMaxJobExecutionTimeLocked() { + mQuotaController.saveTimingSession(0, SOURCE_PACKAGE, + createTimingSession(sElapsedRealtimeClock.millis() - (6 * MINUTE_IN_MILLIS), + 3 * MINUTE_IN_MILLIS, 5)); + JobStatus job = createJobStatus("testGetMaxJobExecutionTimeLocked", 0); + job.setStandbyBucket(RARE_INDEX); + + setCharging(); + assertEquals(JobServiceContext.EXECUTING_TIMESLICE_MILLIS, + mQuotaController.getMaxJobExecutionTimeMsLocked((job))); + + setDischarging(); + setProcessState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); + assertEquals(JobServiceContext.EXECUTING_TIMESLICE_MILLIS, + mQuotaController.getMaxJobExecutionTimeMsLocked((job))); + + // Top-started job + setProcessState(ActivityManager.PROCESS_STATE_TOP); + mQuotaController.maybeStartTrackingJobLocked(job, null); + mQuotaController.prepareForExecutionLocked(job); + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + assertEquals(JobServiceContext.EXECUTING_TIMESLICE_MILLIS, + mQuotaController.getMaxJobExecutionTimeMsLocked((job))); + mQuotaController.maybeStopTrackingJobLocked(job, null, false); + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + assertEquals(7 * MINUTE_IN_MILLIS, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + } + /** * Test getTimeUntilQuotaConsumedLocked when the determination is based within the bucket * window. @@ -1892,6 +1925,16 @@ public class QuotaControllerTest { assertEquals(1, mQuotaController.getBucketMaxSessionCounts()[RARE_INDEX]); assertEquals(0, mQuotaController.getTimingSessionCoalescingDurationMs()); + // Invalid configurations. + // In_QUOTA_BUFFER should never be greater than ALLOWED_TIME_PER_PERIOD + mQcConstants.ALLOWED_TIME_PER_PERIOD_MS = 2 * MINUTE_IN_MILLIS; + mQcConstants.IN_QUOTA_BUFFER_MS = 5 * MINUTE_IN_MILLIS; + + mQcConstants.updateConstants(); + + assertTrue(mQuotaController.getInQuotaBufferMs() + <= mQuotaController.getAllowedTimePerPeriodMs()); + // Test larger than a day. Controller should cap at one day. mQcConstants.ALLOWED_TIME_PER_PERIOD_MS = 25 * HOUR_IN_MILLIS; mQcConstants.IN_QUOTA_BUFFER_MS = 25 * HOUR_IN_MILLIS; diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java new file mode 100644 index 000000000000..a4267b86b359 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java @@ -0,0 +1,797 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.accessibility; + +import static android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_HOME; +import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_CONTROL_MAGNIFICATION; +import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_PERFORM_GESTURES; +import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS; +import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION; +import static android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT; +import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT; +import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_HAPTIC; +import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_SPOKEN; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST_FINGERPRINT_GESTURES; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS; +import static android.content.pm.PackageManager.FEATURE_FINGERPRINT; +import static android.view.View.FOCUS_DOWN; +import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_CLICKED; +import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_LONG_CLICKED; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK; +import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import static android.view.accessibility.AccessibilityNodeInfo.FOCUS_INPUT; +import static android.view.accessibility.AccessibilityNodeInfo.ROOT_NODE_ID; + +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.accessibilityservice.IAccessibilityServiceClient; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.graphics.Region; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.IPowerManager; +import android.os.PowerManager; +import android.os.Process; +import android.os.RemoteException; +import android.testing.DexmakerShareClassLoaderRule; +import android.view.KeyEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityWindowInfo; +import android.view.accessibility.IAccessibilityInteractionConnection; +import android.view.accessibility.IAccessibilityInteractionConnectionCallback; + +import com.android.server.accessibility.AccessibilityWindowManager.RemoteAccessibilityConnection; +import com.android.server.wm.WindowManagerInternal; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; + +/** + * Tests for the AbstractAccessibilityServiceConnection + */ +public class AbstractAccessibilityServiceConnectionTest { + private static final ComponentName COMPONENT_NAME = new ComponentName( + "com.android.server.accessibility", ".AbstractAccessibilityServiceConnectionTest"); + private static final String PACKAGE_NAME1 = "com.android.server.accessibility1"; + private static final String PACKAGE_NAME2 = "com.android.server.accessibility2"; + private static final String VIEWID_RESOURCE_NAME = "test_viewid_resource_name"; + private static final String VIEW_TEXT = "test_view_text"; + private static final int WINDOWID = 12; + private static final int PIP_WINDOWID = 13; + private static final int SERVICE_ID = 42; + private static final int A11Y_SERVICE_CAPABILITY = CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT + | CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION + | CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS + | CAPABILITY_CAN_CONTROL_MAGNIFICATION + | CAPABILITY_CAN_PERFORM_GESTURES; + private static final int A11Y_SERVICE_FLAG = DEFAULT + | FLAG_INCLUDE_NOT_IMPORTANT_VIEWS + | FLAG_REPORT_VIEW_IDS + | FLAG_REQUEST_TOUCH_EXPLORATION_MODE + | FLAG_REQUEST_FILTER_KEY_EVENTS + | FLAG_REQUEST_FINGERPRINT_GESTURES + | FLAG_REQUEST_ACCESSIBILITY_BUTTON + | FLAG_RETRIEVE_INTERACTIVE_WINDOWS; + private static final int USER_ID = 1; + private static final int USER_ID2 = 2; + private static final int INTERACTION_ID = 199; + private static final int PID = Process.myPid(); + private static final long TID = Process.myTid(); + private static final int UID = Process.myUid(); + + private AbstractAccessibilityServiceConnection mServiceConnection; + private MessageCapturingHandler mHandler = new MessageCapturingHandler(null); + private final List<AccessibilityWindowInfo> mA11yWindowInfos = new ArrayList<>(); + private Callable[] mFindA11yNodesFunctions; + private Callable<Boolean> mPerformA11yAction; + + // To mock package-private class. + @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = + new DexmakerShareClassLoaderRule(); + + @Mock private Context mMockContext; + @Mock private IPowerManager mMockIPowerManager; + @Mock private PackageManager mMockPackageManager; + @Spy private AccessibilityServiceInfo mSpyServiceInfo = new AccessibilityServiceInfo(); + @Mock private AccessibilitySecurityPolicy mMockSecurityPolicy; + @Mock private AccessibilityWindowManager mMockA11yWindowManager; + @Mock private AbstractAccessibilityServiceConnection.SystemSupport mMockSystemSupport; + @Mock private WindowManagerInternal mMockWindowManagerInternal; + @Mock private GlobalActionPerformer mMockGlobalActionPerformer; + @Mock private IBinder mMockService; + @Mock private IAccessibilityServiceClient mMockServiceInterface; + @Mock private KeyEventDispatcher mMockKeyEventDispatcher; + @Mock private IAccessibilityInteractionConnection mMockIA11yInteractionConnection; + @Mock private IAccessibilityInteractionConnectionCallback mMockCallback; + @Mock private FingerprintGestureDispatcher mMockFingerprintGestureDispatcher; + @Mock private MagnificationController mMockMagnificationController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID); + when(mMockSystemSupport.getKeyEventDispatcher()).thenReturn(mMockKeyEventDispatcher); + when(mMockSystemSupport.getFingerprintGestureDispatcher()) + .thenReturn(mMockFingerprintGestureDispatcher); + when(mMockSystemSupport.getMagnificationController()) + .thenReturn(mMockMagnificationController); + + PowerManager powerManager = + new PowerManager(mMockContext, mMockIPowerManager, mHandler); + when(mMockContext.getSystemService(Context.POWER_SERVICE)).thenReturn(powerManager); + when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); + when(mMockPackageManager.hasSystemFeature(FEATURE_FINGERPRINT)).thenReturn(true); + + // Fake a11yWindowInfo and remote a11y connection for tests. + addA11yWindowInfo(mA11yWindowInfos, WINDOWID, false); + addA11yWindowInfo(mA11yWindowInfos, PIP_WINDOWID, true); + when(mMockA11yWindowManager.getWindowListLocked()).thenReturn(mA11yWindowInfos); + when(mMockA11yWindowManager.findA11yWindowInfoById(WINDOWID)) + .thenReturn(mA11yWindowInfos.get(0)); + when(mMockA11yWindowManager.findA11yWindowInfoById(PIP_WINDOWID)) + .thenReturn(mA11yWindowInfos.get(1)); + final RemoteAccessibilityConnection conn = getRemoteA11yConnection( + WINDOWID, mMockIA11yInteractionConnection, PACKAGE_NAME1); + final RemoteAccessibilityConnection connPip = getRemoteA11yConnection( + PIP_WINDOWID, mMockIA11yInteractionConnection, PACKAGE_NAME2); + when(mMockA11yWindowManager.getConnectionLocked(USER_ID, WINDOWID)).thenReturn(conn); + when(mMockA11yWindowManager.getConnectionLocked(USER_ID, PIP_WINDOWID)).thenReturn(connPip); + when(mMockA11yWindowManager.getPictureInPictureActionReplacingConnection()) + .thenReturn(connPip); + + // Update a11yServiceInfo to full capability, full flags and target sdk jelly bean + final ResolveInfo mockResolveInfo = mock(ResolveInfo.class); + mockResolveInfo.serviceInfo = mock(ServiceInfo.class); + mockResolveInfo.serviceInfo.applicationInfo = mock(ApplicationInfo.class); + mockResolveInfo.serviceInfo.applicationInfo.targetSdkVersion = + Build.VERSION_CODES.JELLY_BEAN; + doReturn(mockResolveInfo).when(mSpyServiceInfo).getResolveInfo(); + mSpyServiceInfo.setCapabilities(A11Y_SERVICE_CAPABILITY); + updateServiceInfo(mSpyServiceInfo, 0, 0, A11Y_SERVICE_FLAG, null, 0); + + mServiceConnection = new TestAccessibilityServiceConnection(mMockContext, COMPONENT_NAME, + mSpyServiceInfo, SERVICE_ID, mHandler, new Object(), mMockSecurityPolicy, + mMockSystemSupport, mMockWindowManagerInternal, mMockGlobalActionPerformer, + mMockA11yWindowManager); + // Assume that the service is connected + mServiceConnection.mService = mMockService; + mServiceConnection.mServiceInterface = mMockServiceInterface; + + // Update security policy for this service + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.canRetrieveWindowsLocked(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.canGetAccessibilityNodeInfoLocked( + eq(USER_ID), eq(mServiceConnection), anyInt())).thenReturn(true); + when(mMockSecurityPolicy.canControlMagnification(mServiceConnection)).thenReturn(true); + + // init test functions for accessAccessibilityNodeInfo test case. + initTestFunctions(); + } + + @Test + public void getCapabilities() { + assertThat(mServiceConnection.getCapabilities(), is(A11Y_SERVICE_CAPABILITY)); + } + + @Test + public void onKeyEvent() throws RemoteException { + final int sequenceNumber = 100; + final KeyEvent mockKeyEvent = mock(KeyEvent.class); + + mServiceConnection.onKeyEvent(mockKeyEvent, sequenceNumber); + verify(mMockServiceInterface).onKeyEvent(mockKeyEvent, sequenceNumber); + } + + @Test + public void setServiceInfo_invokeOnClientChange() { + final AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo(); + updateServiceInfo(serviceInfo, + TYPE_VIEW_CLICKED | TYPE_VIEW_LONG_CLICKED, + FEEDBACK_SPOKEN | FEEDBACK_HAPTIC, + A11Y_SERVICE_FLAG, + new String[] {PACKAGE_NAME1, PACKAGE_NAME2}, + 1000); + + mServiceConnection.setServiceInfo(serviceInfo); + verify(mMockSystemSupport).onClientChangeLocked(true); + } + + @Test + public void canReceiveEvents_hasEventType_returnTrue() { + final AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo(); + updateServiceInfo(serviceInfo, + TYPE_VIEW_CLICKED | TYPE_VIEW_LONG_CLICKED, 0, + 0, null, 0); + + mServiceConnection.setServiceInfo(serviceInfo); + assertThat(mServiceConnection.canReceiveEventsLocked(), is(true)); + } + + @Test + public void setOnKeyEventResult() { + final int sequenceNumber = 100; + final boolean handled = true; + mServiceConnection.setOnKeyEventResult(handled, sequenceNumber); + + verify(mMockKeyEventDispatcher).setOnKeyEventResult( + mServiceConnection, handled, sequenceNumber); + } + + @Test + public void getWindows() { + assertThat(mServiceConnection.getWindows(), is(mA11yWindowInfos)); + } + + @Test + public void getWindows_returnNull() { + // no canRetrieveWindows, should return null + when(mMockSecurityPolicy.canRetrieveWindowsLocked(mServiceConnection)).thenReturn(false); + assertThat(mServiceConnection.getWindows(), is(nullValue())); + + // no checkAccessibilityAccess, should return null + when(mMockSecurityPolicy.canRetrieveWindowsLocked(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(false); + assertThat(mServiceConnection.getWindows(), is(nullValue())); + } + + @Test + public void getWindows_notTrackingWindows_invokeOnClientChange() { + when(mMockA11yWindowManager.getWindowListLocked()).thenReturn(null); + when(mMockA11yWindowManager.isTrackingWindowsLocked()).thenReturn(false); + + mServiceConnection.getWindows(); + verify(mMockSystemSupport).onClientChangeLocked(false); + } + + @Test + public void getWindow() { + assertThat(mServiceConnection.getWindow(WINDOWID), is(mA11yWindowInfos.get(0))); + } + + @Test + public void getWindow_returnNull() { + // no canRetrieveWindows, should return null + when(mMockSecurityPolicy.canRetrieveWindowsLocked(mServiceConnection)).thenReturn(false); + assertThat(mServiceConnection.getWindow(WINDOWID), is(nullValue())); + + // no checkAccessibilityAccess, should return null + when(mMockSecurityPolicy.canRetrieveWindowsLocked(mServiceConnection)).thenReturn(true); + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(false); + assertThat(mServiceConnection.getWindow(WINDOWID), is(nullValue())); + } + + @Test + public void getWindow_notTrackingWindows_invokeOnClientChange() { + when(mMockA11yWindowManager.getWindowListLocked()).thenReturn(null); + when(mMockA11yWindowManager.isTrackingWindowsLocked()).thenReturn(false); + + mServiceConnection.getWindow(WINDOWID); + verify(mMockSystemSupport).onClientChangeLocked(false); + } + + @Test + public void accessAccessibilityNodeInfo_whenCantGetInfo_returnNullOrFalse() + throws Exception { + when(mMockSecurityPolicy.canGetAccessibilityNodeInfoLocked( + USER_ID, mServiceConnection, WINDOWID)).thenReturn(false); + for (int i = 0; i < mFindA11yNodesFunctions.length; i++) { + assertThat(mFindA11yNodesFunctions[i].call(), is(nullValue())); + } + assertThat(mPerformA11yAction.call(), is(false)); + + verifyNoMoreInteractions(mMockIA11yInteractionConnection); + verify(mMockSecurityPolicy, never()).computeValidReportedPackages(any(), anyInt()); + } + + @Test + public void accessAccessibilityNodeInfo_whenNoA11yAccess_returnNullOrFalse() + throws Exception { + when(mMockSecurityPolicy.checkAccessibilityAccess(mServiceConnection)).thenReturn(false); + for (int i = 0; i < mFindA11yNodesFunctions.length; i++) { + assertThat(mFindA11yNodesFunctions[i].call(), is(nullValue())); + } + assertThat(mPerformA11yAction.call(), is(false)); + + verifyNoMoreInteractions(mMockIA11yInteractionConnection); + verify(mMockSecurityPolicy, never()).computeValidReportedPackages(any(), anyInt()); + } + + @Test + public void accessAccessibilityNodeInfo_whenNoRemoteA11yConnection_returnNullOrFalse() + throws Exception { + when(mMockA11yWindowManager.getConnectionLocked(USER_ID, WINDOWID)).thenReturn(null); + for (int i = 0; i < mFindA11yNodesFunctions.length; i++) { + assertThat(mFindA11yNodesFunctions[i].call(), is(nullValue())); + } + assertThat(mPerformA11yAction.call(), is(false)); + + verifyNoMoreInteractions(mMockIA11yInteractionConnection); + verify(mMockSecurityPolicy, never()).computeValidReportedPackages(any(), anyInt()); + } + + @Test + public void findAccessibilityNodeInfosByViewId_withPipWindow_shouldReplaceCallback() + throws RemoteException { + final ArgumentCaptor<IAccessibilityInteractionConnectionCallback> captor = + ArgumentCaptor.forClass(IAccessibilityInteractionConnectionCallback.class); + mServiceConnection.findAccessibilityNodeInfosByViewId(PIP_WINDOWID, ROOT_NODE_ID, + VIEWID_RESOURCE_NAME, INTERACTION_ID, mMockCallback, TID); + verify(mMockIA11yInteractionConnection).findAccessibilityNodeInfosByViewId( + eq(ROOT_NODE_ID), eq(VIEWID_RESOURCE_NAME), any(), eq(INTERACTION_ID), + captor.capture(), anyInt(), eq(PID), eq(TID), any()); + verify(mMockSecurityPolicy).computeValidReportedPackages(any(), anyInt()); + verifyReplaceActions(captor.getValue()); + } + + @Test + public void findAccessibilityNodeInfosByText_withPipWindow_shouldReplaceCallback() + throws RemoteException { + final ArgumentCaptor<IAccessibilityInteractionConnectionCallback> captor = + ArgumentCaptor.forClass(IAccessibilityInteractionConnectionCallback.class); + mServiceConnection.findAccessibilityNodeInfosByText(PIP_WINDOWID, ROOT_NODE_ID, + VIEW_TEXT, INTERACTION_ID, mMockCallback, TID); + verify(mMockIA11yInteractionConnection).findAccessibilityNodeInfosByText( + eq(ROOT_NODE_ID), eq(VIEW_TEXT), any(), eq(INTERACTION_ID), + captor.capture(), anyInt(), eq(PID), eq(TID), any()); + verify(mMockSecurityPolicy).computeValidReportedPackages(any(), anyInt()); + verifyReplaceActions(captor.getValue()); + } + + @Test + public void findAccessibilityNodeInfoByAccessibilityId_withPipWindow_shouldReplaceCallback() + throws RemoteException { + final ArgumentCaptor<IAccessibilityInteractionConnectionCallback> captor = + ArgumentCaptor.forClass(IAccessibilityInteractionConnectionCallback.class); + mServiceConnection.findAccessibilityNodeInfoByAccessibilityId(PIP_WINDOWID, ROOT_NODE_ID, + INTERACTION_ID, mMockCallback, 0, TID, null); + verify(mMockIA11yInteractionConnection).findAccessibilityNodeInfoByAccessibilityId( + eq(ROOT_NODE_ID), any(), eq(INTERACTION_ID), captor.capture(), anyInt(), + eq(PID), eq(TID), any(), any()); + verify(mMockSecurityPolicy).computeValidReportedPackages(any(), anyInt()); + verifyReplaceActions(captor.getValue()); + } + + @Test + public void findFocus_withPipWindow_shouldReplaceCallback() + throws RemoteException { + final ArgumentCaptor<IAccessibilityInteractionConnectionCallback> captor = + ArgumentCaptor.forClass(IAccessibilityInteractionConnectionCallback.class); + mServiceConnection.findFocus(PIP_WINDOWID, ROOT_NODE_ID, FOCUS_INPUT, INTERACTION_ID, + mMockCallback, TID); + verify(mMockIA11yInteractionConnection).findFocus(eq(ROOT_NODE_ID), eq(FOCUS_INPUT), + any(), eq(INTERACTION_ID), captor.capture(), anyInt(), eq(PID), eq(TID), any()); + verify(mMockSecurityPolicy).computeValidReportedPackages(any(), anyInt()); + verifyReplaceActions(captor.getValue()); + } + + @Test + public void focusSearch_withPipWindow_shouldReplaceCallback() + throws RemoteException { + final ArgumentCaptor<IAccessibilityInteractionConnectionCallback> captor = + ArgumentCaptor.forClass(IAccessibilityInteractionConnectionCallback.class); + mServiceConnection.focusSearch(PIP_WINDOWID, ROOT_NODE_ID, FOCUS_DOWN, INTERACTION_ID, + mMockCallback, TID); + verify(mMockIA11yInteractionConnection).focusSearch(eq(ROOT_NODE_ID), eq(FOCUS_DOWN), + any(), eq(INTERACTION_ID), captor.capture(), anyInt(), eq(PID), eq(TID), any()); + verify(mMockSecurityPolicy).computeValidReportedPackages(any(), anyInt()); + verifyReplaceActions(captor.getValue()); + } + + @Test + public void performAccessibilityAction_withPipWindow_invokeGetPipReplacingConnection() + throws RemoteException { + mServiceConnection.performAccessibilityAction(PIP_WINDOWID, ROOT_NODE_ID, + ACTION_ACCESSIBILITY_FOCUS, null, INTERACTION_ID, mMockCallback, TID); + + verify(mMockIPowerManager).userActivity(anyLong(), anyInt(), anyInt()); + verify(mMockIA11yInteractionConnection).performAccessibilityAction(eq(ROOT_NODE_ID), + eq(ACTION_ACCESSIBILITY_FOCUS), any(), eq(INTERACTION_ID), eq(mMockCallback), + anyInt(), eq(PID), eq(TID)); + verify(mMockA11yWindowManager).getPictureInPictureActionReplacingConnection(); + } + + @Test + public void performAccessibilityAction_withClick_shouldNotifyOutsideTouch() + throws RemoteException { + mServiceConnection.performAccessibilityAction(WINDOWID, ROOT_NODE_ID, + ACTION_CLICK, null, INTERACTION_ID, mMockCallback, TID); + mServiceConnection.performAccessibilityAction(PIP_WINDOWID, ROOT_NODE_ID, + ACTION_LONG_CLICK, null, INTERACTION_ID, mMockCallback, TID); + verify(mMockA11yWindowManager).notifyOutsideTouch(eq(USER_ID), eq(WINDOWID)); + verify(mMockA11yWindowManager).notifyOutsideTouch(eq(USER_ID), eq(PIP_WINDOWID)); + } + + @Test + public void performGlobalAction() { + mServiceConnection.performGlobalAction(GLOBAL_ACTION_HOME); + verify(mMockGlobalActionPerformer).performGlobalAction(GLOBAL_ACTION_HOME); + } + + @Test + public void isFingerprintGestureDetectionAvailable_hasFingerPrintSupport_returnTrue() { + when(mMockFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable()) + .thenReturn(true); + final boolean result = mServiceConnection.isFingerprintGestureDetectionAvailable(); + assertThat(result, is(true)); + } + + @Test + public void isFingerprintGestureDetectionAvailable_noFingerPrintSupport_returnFalse() { + when(mMockFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable()) + .thenReturn(true); + + // Return false if device does not support fingerprint + when(mMockPackageManager.hasSystemFeature(FEATURE_FINGERPRINT)).thenReturn(false); + boolean result = mServiceConnection.isFingerprintGestureDetectionAvailable(); + assertThat(result, is(false)); + + // Return false if service does not have flag + when(mMockPackageManager.hasSystemFeature(FEATURE_FINGERPRINT)).thenReturn(true); + mSpyServiceInfo.flags = A11Y_SERVICE_FLAG & ~FLAG_REQUEST_FINGERPRINT_GESTURES; + mServiceConnection.setServiceInfo(mSpyServiceInfo); + result = mServiceConnection.isFingerprintGestureDetectionAvailable(); + assertThat(result, is(false)); + } + + @Test + public void getMagnificationScale() { + final int displayId = 1; + final float scale = 2.0f; + when(mMockMagnificationController.getScale(displayId)).thenReturn(scale); + + final float result = mServiceConnection.getMagnificationScale(displayId); + assertThat(result, is(scale)); + } + + @Test + public void getMagnificationScale_serviceNotBelongCurrentUser_returnNoScale() { + final int displayId = 1; + final float scale = 2.0f; + when(mMockMagnificationController.getScale(displayId)).thenReturn(scale); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final float result = mServiceConnection.getMagnificationScale(displayId); + assertThat(result, is(1.0f)); + } + + @Test + public void getMagnificationRegion_notRegistered_shouldRegisterThenUnregister() { + final int displayId = 1; + final Region region = new Region(10, 20, 100, 200); + doAnswer((invocation) -> { + ((Region) invocation.getArguments()[1]).set(region); + return null; + }).when(mMockMagnificationController).getMagnificationRegion(eq(displayId), any()); + when(mMockMagnificationController.isRegistered(displayId)).thenReturn(false); + + final Region result = mServiceConnection.getMagnificationRegion(displayId); + assertThat(result, is(region)); + verify(mMockMagnificationController).register(displayId); + verify(mMockMagnificationController).unregister(displayId); + } + + @Test + public void getMagnificationRegion_serviceNotBelongCurrentUser_returnEmptyRegion() { + final int displayId = 1; + final Region region = new Region(10, 20, 100, 200); + doAnswer((invocation) -> { + ((Region) invocation.getArguments()[1]).set(region); + return null; + }).when(mMockMagnificationController).getMagnificationRegion(eq(displayId), any()); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final Region result = mServiceConnection.getMagnificationRegion(displayId); + assertThat(result.isEmpty(), is(true)); + } + + @Test + public void getMagnificationCenterX_notRegistered_shouldRegisterThenUnregister() { + final int displayId = 1; + final float centerX = 480.0f; + when(mMockMagnificationController.getCenterX(displayId)).thenReturn(centerX); + when(mMockMagnificationController.isRegistered(displayId)).thenReturn(false); + + final float result = mServiceConnection.getMagnificationCenterX(displayId); + assertThat(result, is(centerX)); + verify(mMockMagnificationController).register(displayId); + verify(mMockMagnificationController).unregister(displayId); + } + + @Test + public void getMagnificationCenterX_serviceNotBelongCurrentUser_returnZero() { + final int displayId = 1; + final float centerX = 480.0f; + when(mMockMagnificationController.getCenterX(displayId)).thenReturn(centerX); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final float result = mServiceConnection.getMagnificationCenterX(displayId); + assertThat(result, is(0.0f)); + } + + @Test + public void getMagnificationCenterY_notRegistered_shouldRegisterThenUnregister() { + final int displayId = 1; + final float centerY = 640.0f; + when(mMockMagnificationController.getCenterY(displayId)).thenReturn(centerY); + when(mMockMagnificationController.isRegistered(displayId)).thenReturn(false); + + final float result = mServiceConnection.getMagnificationCenterY(displayId); + assertThat(result, is(centerY)); + verify(mMockMagnificationController).register(displayId); + verify(mMockMagnificationController).unregister(displayId); + } + + @Test + public void getMagnificationCenterY_serviceNotBelongCurrentUser_returnZero() { + final int displayId = 1; + final float centerY = 640.0f; + when(mMockMagnificationController.getCenterY(displayId)).thenReturn(centerY); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final float result = mServiceConnection.getMagnificationCenterY(displayId); + assertThat(result, is(0.0f)); + } + + @Test + public void resetMagnification() { + final int displayId = 1; + when(mMockMagnificationController.reset(displayId, true)).thenReturn(true); + + final boolean result = mServiceConnection.resetMagnification(displayId, true); + assertThat(result, is(true)); + } + + @Test + public void resetMagnification_cantControlMagnification_returnFalse() { + final int displayId = 1; + when(mMockMagnificationController.reset(displayId, true)).thenReturn(true); + when(mMockSecurityPolicy.canControlMagnification(mServiceConnection)).thenReturn(false); + + final boolean result = mServiceConnection.resetMagnification(displayId, true); + assertThat(result, is(false)); + } + + @Test + public void resetMagnification_serviceNotBelongCurrentUser_returnFalse() { + final int displayId = 1; + when(mMockMagnificationController.reset(displayId, true)).thenReturn(true); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final boolean result = mServiceConnection.resetMagnification(displayId, true); + assertThat(result, is(false)); + } + + @Test + public void setMagnificationScaleAndCenter_notRegistered_shouldRegister() { + final int displayId = 1; + final float scale = 1.8f; + final float centerX = 50.5f; + final float centerY = 100.5f; + when(mMockMagnificationController.setScaleAndCenter(displayId, + scale, centerX, centerY, true, SERVICE_ID)).thenReturn(true); + when(mMockMagnificationController.isRegistered(displayId)).thenReturn(false); + + final boolean result = mServiceConnection.setMagnificationScaleAndCenter( + displayId, scale, centerX, centerY, true); + assertThat(result, is(true)); + verify(mMockMagnificationController).register(displayId); + } + + @Test + public void setMagnificationScaleAndCenter_cantControlMagnification_returnFalse() { + final int displayId = 1; + final float scale = 1.8f; + final float centerX = 50.5f; + final float centerY = 100.5f; + when(mMockMagnificationController.setScaleAndCenter(displayId, + scale, centerX, centerY, true, SERVICE_ID)).thenReturn(true); + when(mMockSecurityPolicy.canControlMagnification(mServiceConnection)).thenReturn(false); + + final boolean result = mServiceConnection.setMagnificationScaleAndCenter( + displayId, scale, centerX, centerY, true); + assertThat(result, is(false)); + } + + @Test + public void setMagnificationScaleAndCenter_serviceNotBelongCurrentUser_returnFalse() { + final int displayId = 1; + final float scale = 1.8f; + final float centerX = 50.5f; + final float centerY = 100.5f; + when(mMockMagnificationController.setScaleAndCenter(displayId, + scale, centerX, centerY, true, SERVICE_ID)).thenReturn(true); + when(mMockSystemSupport.getCurrentUserIdLocked()).thenReturn(USER_ID2); + + final boolean result = mServiceConnection.setMagnificationScaleAndCenter( + displayId, scale, centerX, centerY, true); + assertThat(result, is(false)); + } + + private void updateServiceInfo(AccessibilityServiceInfo serviceInfo, int eventType, + int feedbackType, int flags, String[] packageNames, int notificationTimeout) { + serviceInfo.eventTypes = eventType; + serviceInfo.feedbackType = feedbackType; + serviceInfo.flags = flags; + serviceInfo.packageNames = packageNames; + serviceInfo.notificationTimeout = notificationTimeout; + } + + private AccessibilityWindowInfo addA11yWindowInfo(List<AccessibilityWindowInfo> infos, + int windowId, boolean isPip) { + final AccessibilityWindowInfo info = AccessibilityWindowInfo.obtain(); + info.setId(windowId); + info.setPictureInPicture(isPip); + infos.add(info); + return info; + } + + private RemoteAccessibilityConnection getRemoteA11yConnection(int windowId, + IAccessibilityInteractionConnection connection, + String packageName) { + return mMockA11yWindowManager.new RemoteAccessibilityConnection( + windowId, connection, packageName, UID, USER_ID); + } + + private void initTestFunctions() { + // Init functions for accessibility nodes finding and searching by different filter rules. + // We group them together for the tests because they have similar implementation. + mFindA11yNodesFunctions = new Callable[] { + // findAccessibilityNodeInfosByViewId + () -> mServiceConnection.findAccessibilityNodeInfosByViewId(WINDOWID, + ROOT_NODE_ID, VIEWID_RESOURCE_NAME, INTERACTION_ID, + mMockCallback, TID), + // findAccessibilityNodeInfosByText + () -> mServiceConnection.findAccessibilityNodeInfosByText(WINDOWID, + ROOT_NODE_ID, VIEW_TEXT, INTERACTION_ID, mMockCallback, TID), + // findAccessibilityNodeInfoByAccessibilityId + () -> mServiceConnection.findAccessibilityNodeInfoByAccessibilityId(WINDOWID, + ROOT_NODE_ID, INTERACTION_ID, mMockCallback, 0, TID, null), + // findFocus + () -> mServiceConnection.findFocus(WINDOWID, ROOT_NODE_ID, FOCUS_INPUT, + INTERACTION_ID, mMockCallback, TID), + // focusSearch + () -> mServiceConnection.focusSearch(WINDOWID, ROOT_NODE_ID, FOCUS_DOWN, + INTERACTION_ID, mMockCallback, TID) + }; + // performAccessibilityAction + mPerformA11yAction = () -> mServiceConnection.performAccessibilityAction(WINDOWID, + ROOT_NODE_ID, ACTION_ACCESSIBILITY_FOCUS, null, INTERACTION_ID, + mMockCallback, TID); + } + + private void verifyReplaceActions(IAccessibilityInteractionConnectionCallback replacedCallback) + throws RemoteException { + final AccessibilityNodeInfo nodeFromApp = AccessibilityNodeInfo.obtain(); + nodeFromApp.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, WINDOWID); + + final AccessibilityNodeInfo nodeFromReplacer = AccessibilityNodeInfo.obtain(); + nodeFromReplacer.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, + AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID); + nodeFromReplacer.addAction(AccessibilityAction.ACTION_CLICK); + nodeFromReplacer.addAction(AccessibilityAction.ACTION_EXPAND); + final List<AccessibilityNodeInfo> replacerList = Arrays.asList(nodeFromReplacer); + + replacedCallback.setFindAccessibilityNodeInfoResult(nodeFromApp, INTERACTION_ID); + replacedCallback.setFindAccessibilityNodeInfosResult(replacerList, INTERACTION_ID + 1); + + final ArgumentCaptor<AccessibilityNodeInfo> captor = + ArgumentCaptor.forClass(AccessibilityNodeInfo.class); + verify(mMockCallback).setFindAccessibilityNodeInfoResult(captor.capture(), + eq(INTERACTION_ID)); + assertThat(captor.getValue().getActionList(), + hasItems(AccessibilityAction.ACTION_CLICK, AccessibilityAction.ACTION_EXPAND)); + } + + private static class TestAccessibilityServiceConnection + extends AbstractAccessibilityServiceConnection { + int mResolvedUserId; + + TestAccessibilityServiceConnection(Context context, ComponentName componentName, + AccessibilityServiceInfo accessibilityServiceInfo, int id, Handler mainHandler, + Object lock, AccessibilitySecurityPolicy securityPolicy, + SystemSupport systemSupport, WindowManagerInternal windowManagerInternal, + GlobalActionPerformer globalActionPerfomer, + AccessibilityWindowManager a11yWindowManager) { + super(context, componentName, accessibilityServiceInfo, id, mainHandler, lock, + securityPolicy, systemSupport, windowManagerInternal, globalActionPerfomer, + a11yWindowManager); + mResolvedUserId = USER_ID; + } + + @Override + protected boolean isCalledForCurrentUserLocked() { + return mResolvedUserId == mSystemSupport.getCurrentUserIdLocked(); + } + + @Override + public void disableSelf() throws RemoteException {} + + @Override + public boolean setSoftKeyboardShowMode(int showMode) throws RemoteException { + return false; + } + + @Override + public int getSoftKeyboardShowMode() throws RemoteException { + return 0; + } + + @Override + public boolean isAccessibilityButtonAvailable() throws RemoteException { + return false; + } + + @Override + public void onServiceConnected(ComponentName name, IBinder service) {} + + @Override + public void onServiceDisconnected(ComponentName name) {} + + @Override + public void binderDied() {} + + @Override + public boolean isCapturingFingerprintGestures() { + return mCaptureFingerprintGestures; + } + + @Override + public void onFingerprintGestureDetectionActiveChanged(boolean active) {} + + @Override + public void onFingerprintGesture(int gesture) {} + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java index 424142c56b3a..6b0798bdce22 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +++ b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java @@ -359,6 +359,33 @@ public final class AmbientLuxTest { } } + @Test + public void testLowLight_DefaultAmbient() throws Exception { + final float lowerBrightness = 10.0f; + final float upperBrightness = 50.0f; + setBrightnesses(lowerBrightness, upperBrightness); + setBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = -1.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + setEstimatedBrightnessAndUpdate(controller, + mix(lowerBrightness, upperBrightness, t)); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, + 0.001); + } + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + + setEstimatedBrightnessAndUpdate(controller, upperBrightness + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + void mockThrottler() { when(mResourcesSpy.getInteger( R.integer.config_displayWhiteBalanceDecreaseDebounce)).thenReturn(0); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 7e6b7da4a058..6c917b7f8636 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -97,16 +97,25 @@ import android.os.UserHandle; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import android.util.SparseArray; +import android.util.Xml; import com.android.frameworks.servicestests.R; +import com.android.internal.util.FastXmlSerializer; import com.android.server.pm.ShortcutService.ConfigConstants; import com.android.server.pm.ShortcutService.FileOutputStreamWithPath; import com.android.server.pm.ShortcutUser.PackageWithUser; import org.mockito.ArgumentCaptor; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -8089,4 +8098,70 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } } + + public void testShareTargetInfo_saveToXml() throws IOException, XmlPullParserException { + List<ShareTargetInfo> expectedValues = new ArrayList<>(); + expectedValues.add(new ShareTargetInfo( + new ShareTargetInfo.TargetData[]{new ShareTargetInfo.TargetData( + "http", "www.google.com", "1234", "somePath", "somePathPattern", + "somePathPrefix", "text/plain")}, "com.test.directshare.TestActivity1", + new String[]{"com.test.category.CATEGORY1", "com.test.category.CATEGORY2"})); + expectedValues.add(new ShareTargetInfo(new ShareTargetInfo.TargetData[]{ + new ShareTargetInfo.TargetData(null, null, null, null, null, null, "video/mp4"), + new ShareTargetInfo.TargetData("content", null, null, null, null, null, "video/*")}, + "com.test.directshare.TestActivity5", + new String[]{"com.test.category.CATEGORY5", "com.test.category.CATEGORY6"})); + + // Write ShareTargets to Xml + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + final XmlSerializer outXml = new FastXmlSerializer(); + outXml.setOutput(outStream, StandardCharsets.UTF_8.name()); + outXml.startDocument(null, true); + for (int i = 0; i < expectedValues.size(); i++) { + expectedValues.get(i).saveToXml(outXml); + } + outXml.endDocument(); + outXml.flush(); + + // Read ShareTargets from Xml + ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray()); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(new InputStreamReader(inStream)); + List<ShareTargetInfo> shareTargets = new ArrayList<>(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (type == XmlPullParser.START_TAG && parser.getName().equals("share-target")) { + shareTargets.add(ShareTargetInfo.loadFromXml(parser)); + } + } + + // Assert two lists are equal + assertNotNull(shareTargets); + assertEquals(expectedValues.size(), shareTargets.size()); + + for (int i = 0; i < expectedValues.size(); i++) { + ShareTargetInfo expected = expectedValues.get(i); + ShareTargetInfo actual = shareTargets.get(i); + + assertEquals(expected.mTargetData.length, actual.mTargetData.length); + for (int j = 0; j < expected.mTargetData.length; j++) { + assertEquals(expected.mTargetData[j].mScheme, actual.mTargetData[j].mScheme); + assertEquals(expected.mTargetData[j].mHost, actual.mTargetData[j].mHost); + assertEquals(expected.mTargetData[j].mPort, actual.mTargetData[j].mPort); + assertEquals(expected.mTargetData[j].mPath, actual.mTargetData[j].mPath); + assertEquals(expected.mTargetData[j].mPathPrefix, + actual.mTargetData[j].mPathPrefix); + assertEquals(expected.mTargetData[j].mPathPattern, + actual.mTargetData[j].mPathPattern); + assertEquals(expected.mTargetData[j].mMimeType, actual.mTargetData[j].mMimeType); + } + + assertEquals(expected.mTargetClass, actual.mTargetClass); + + assertEquals(expected.mCategories.length, actual.mCategories.length); + for (int j = 0; j < expected.mCategories.length; j++) { + assertEquals(expected.mCategories[j], actual.mCategories[j]); + } + } + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 757267e56fa2..bde0ef6aa39e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -262,6 +262,35 @@ public class ActivityStackTests extends ActivityTestsBase { } @Test + public void testFindTaskAlias() { + final String targetActivity = "target.activity"; + final String aliasActivity = "alias.activity"; + final ComponentName target = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME, + targetActivity); + final ComponentName alias = new ComponentName(DEFAULT_COMPONENT_PACKAGE_NAME, + aliasActivity); + final TaskRecord task = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build(); + task.origActivity = alias; + task.realActivity = target; + new ActivityBuilder(mService).setComponent(target).setTask(task).setTargetActivity( + targetActivity).build(); + + // Using target activity to find task. + final ActivityRecord r1 = new ActivityBuilder(mService).setComponent( + target).setTargetActivity(targetActivity).build(); + RootActivityContainer.FindTaskResult result = new RootActivityContainer.FindTaskResult(); + mStack.findTaskLocked(r1, result); + assertThat(result.mRecord).isNotNull(); + + // Using alias activity to find task. + final ActivityRecord r2 = new ActivityBuilder(mService).setComponent( + alias).setTargetActivity(targetActivity).build(); + result = new RootActivityContainer.FindTaskResult(); + mStack.findTaskLocked(r2, result); + assertThat(result.mRecord).isNotNull(); + } + + @Test public void testMoveStackToBackIncludingParent() { final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP); final ActivityStack stack1 = createStackForShouldBeVisibleTest(display, diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 4986a6d5bd0d..ecf3acd32d4f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -85,6 +85,7 @@ import org.mockito.invocation.InvocationOnMock; import java.io.File; import java.util.List; +import java.util.function.Consumer; /** * A base class to handle common operations in activity related unit tests. @@ -169,8 +170,12 @@ class ActivityTestsBase { * Delegates task creation to {@link #TaskBuilder} to avoid the dependency of window hierarchy * when starting activity in unit tests. */ - void mockTaskRecordFactory() { - final TaskRecord task = new TaskBuilder(mSupervisor).setCreateStack(false).build(); + void mockTaskRecordFactory(Consumer<TaskBuilder> taskBuilderSetup) { + final TaskBuilder taskBuilder = new TaskBuilder(mSupervisor).setCreateStack(false); + if (taskBuilderSetup != null) { + taskBuilderSetup.accept(taskBuilder); + } + final TaskRecord task = taskBuilder.build(); final TaskRecordFactory factory = mock(TaskRecordFactory.class); TaskRecord.setTaskRecordFactory(factory); doReturn(task).when(factory).create(any() /* service */, anyInt() /* taskId */, @@ -178,6 +183,10 @@ class ActivityTestsBase { any() /* voiceInteractor */); } + void mockTaskRecordFactory() { + mockTaskRecordFactory(null /* taskBuilderSetup */); + } + /** * Builder for creating new activities. */ diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 1f8b33eb5bb4..9630b7d46e3c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -42,8 +42,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import android.app.IApplicationThread; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.platform.test.annotations.Presubmit; import android.view.IRecentsAnimationRunner; @@ -111,6 +114,57 @@ public class RecentsAnimationTest extends ActivityTestsBase { } @Test + public void testPreloadRecentsActivity() { + // Ensure that the fake recent component can be resolved by the recents intent. + mockTaskRecordFactory(builder -> builder.setComponent(mRecentsComponent)); + ActivityInfo aInfo = new ActivityInfo(); + aInfo.applicationInfo = new ApplicationInfo(); + aInfo.applicationInfo.uid = 10001; + aInfo.applicationInfo.targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion; + aInfo.packageName = aInfo.applicationInfo.packageName = mRecentsComponent.getPackageName(); + aInfo.processName = "recents"; + doReturn(aInfo).when(mSupervisor).resolveActivity(any() /* intent */, any() /* rInfo */, + anyInt() /* startFlags */, any() /* profilerInfo */); + + // Assume its process is alive because the caller should be the recents service. + WindowProcessController wpc = new WindowProcessController(mService, aInfo.applicationInfo, + aInfo.processName, aInfo.applicationInfo.uid, 0 /* userId */, + mock(Object.class) /* owner */, mock(WindowProcessListener.class)); + wpc.setThread(mock(IApplicationThread.class)); + doReturn(wpc).when(mService).getProcessController(eq(wpc.mName), eq(wpc.mUid)); + + Intent recentsIntent = new Intent().setComponent(mRecentsComponent); + // Null animation indicates to preload. + mService.startRecentsActivity(recentsIntent, null /* assistDataReceiver */, + null /* recentsAnimationRunner */); + + ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); + ActivityStack recentsStack = display.getStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_RECENTS); + assertThat(recentsStack).isNotNull(); + + ActivityRecord recentsActivity = recentsStack.getTopActivity(); + // The activity is started in background so it should be invisible and will be stopped. + assertThat(recentsActivity).isNotNull(); + assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity); + assertFalse(recentsActivity.visible); + + // Assume it is stopped to test next use case. + recentsActivity.activityStoppedLocked(null /* newIcicle */, null /* newPersistentState */, + null /* description */); + mSupervisor.mStoppingActivities.remove(recentsActivity); + + spyOn(recentsActivity); + // Start when the recents activity exists. It should ensure the configuration. + mService.startRecentsActivity(recentsIntent, null /* assistDataReceiver */, + null /* recentsAnimationRunner */); + + verify(recentsActivity).ensureActivityConfiguration(anyInt() /* globalChanges */, + anyBoolean() /* preserveWindow */, eq(true) /* ignoreVisibility */); + assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity); + } + + @Test public void testRestartRecentsActivity() throws Exception { // Have a recents activity that is not attached to its process (ActivityRecord.app = null). ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 86f299da2879..91bea5ff479b 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -852,6 +852,19 @@ public class CarrierConfigManager { "carrier_metered_roaming_apn_types_strings"; /** + * APN types that are not allowed on cellular + * @hide + */ + public static final String KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY = + "carrier_wwan_disallowed_apn_types_string_array"; + + /** + * APN types that are not allowed on IWLAN + * @hide + */ + public static final String KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY = + "carrier_wlan_disallowed_apn_types_string_array"; + /** * CDMA carrier ERI (Enhanced Roaming Indicator) file name * @hide */ @@ -3172,6 +3185,10 @@ public class CarrierConfigManager { new String[]{"default", "mms", "dun", "supl"}); sDefaults.putStringArray(KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS, new String[]{"default", "mms", "dun", "supl"}); + sDefaults.putStringArray(KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, + new String[]{""}); + sDefaults.putStringArray(KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY, + new String[]{""}); sDefaults.putIntArray(KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY, new int[]{ 4, /* IS95A */ diff --git a/tests/JobSchedulerPerfTests/Android.bp b/tests/JobSchedulerPerfTests/Android.bp new file mode 100644 index 000000000000..22308076d4ff --- /dev/null +++ b/tests/JobSchedulerPerfTests/Android.bp @@ -0,0 +1,25 @@ +// 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. + +android_test { + name: "JobSchedulerPerfTests", + srcs: ["src/**/*.java"], + static_libs: [ + "androidx.test.rules", + "apct-perftests-utils", + "services", + ], + platform_apis: true, + certificate: "platform", +} diff --git a/tests/JobSchedulerPerfTests/AndroidManifest.xml b/tests/JobSchedulerPerfTests/AndroidManifest.xml new file mode 100644 index 000000000000..39e751ca2a0c --- /dev/null +++ b/tests/JobSchedulerPerfTests/AndroidManifest.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.frameworks.perftests.job"> + <uses-sdk + android:minSdkVersion="21" /> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.frameworks.perftests.job"/> +</manifest> diff --git a/tests/JobSchedulerPerfTests/AndroidTest.xml b/tests/JobSchedulerPerfTests/AndroidTest.xml new file mode 100644 index 000000000000..ca4b6c83f788 --- /dev/null +++ b/tests/JobSchedulerPerfTests/AndroidTest.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 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. +--> +<configuration description="Runs JobScheduler Performance Tests"> + <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> + <option name="test-file-name" value="JobSchedulerPerfTests.apk"/> + <option name="cleanup-apks" value="true"/> + </target_preparer> + + <option name="test-suite-tag" value="apct"/> + <option name="test-tag" value="JobSchedulerPerfTests"/> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.frameworks.perftests.job"/> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/> + </test> +</configuration> diff --git a/tests/JobSchedulerPerfTests/src/com/android/frameworks/perftests/job/JobStorePerfTests.java b/tests/JobSchedulerPerfTests/src/com/android/frameworks/perftests/job/JobStorePerfTests.java new file mode 100644 index 000000000000..e956be339bc4 --- /dev/null +++ b/tests/JobSchedulerPerfTests/src/com/android/frameworks/perftests/job/JobStorePerfTests.java @@ -0,0 +1,156 @@ +/* + * 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.frameworks.perftests.job; + + +import android.app.job.JobInfo; +import android.content.ComponentName; +import android.content.Context; +import android.os.SystemClock; +import android.perftests.utils.ManualBenchmarkState; +import android.perftests.utils.PerfManualStatusReporter; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.LargeTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.server.job.JobStore; +import com.android.server.job.JobStore.JobSet; +import com.android.server.job.controllers.JobStatus; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class JobStorePerfTests { + private static final String SOURCE_PACKAGE = "com.android.frameworks.perftests.job"; + private static final int SOURCE_USER_ID = 0; + private static final int CALLING_UID = 10079; + + private static Context sContext; + private static File sTestDir; + private static JobStore sJobStore; + + private static List<JobStatus> sFewJobs = new ArrayList<>(); + private static List<JobStatus> sManyJobs = new ArrayList<>(); + + @Rule + public PerfManualStatusReporter mPerfManualStatusReporter = new PerfManualStatusReporter(); + + @BeforeClass + public static void setUpOnce() { + sContext = InstrumentationRegistry.getTargetContext(); + sTestDir = new File(sContext.getFilesDir(), "JobStorePerfTests"); + sJobStore = JobStore.initAndGetForTesting(sContext, sTestDir); + + for (int i = 0; i < 50; i++) { + sFewJobs.add(createJobStatus("fewJobs", i)); + } + for (int i = 0; i < 500; i++) { + sManyJobs.add(createJobStatus("manyJobs", i)); + } + } + + @AfterClass + public static void tearDownOnce() { + sTestDir.deleteOnExit(); + } + + private void runPersistedJobWriting(List<JobStatus> jobList) { + final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState(); + + long elapsedTimeNs = 0; + while (benchmarkState.keepRunning(elapsedTimeNs)) { + sJobStore.clear(); + for (JobStatus job : jobList) { + sJobStore.add(job); + } + sJobStore.waitForWriteToCompleteForTesting(10_000); + + final long startTime = SystemClock.elapsedRealtimeNanos(); + sJobStore.writeStatusToDiskForTesting(); + final long endTime = SystemClock.elapsedRealtimeNanos(); + elapsedTimeNs = endTime - startTime; + } + } + + @Test + public void testPersistedJobWriting_fewJobs() { + runPersistedJobWriting(sFewJobs); + } + + @Test + public void testPersistedJobWriting_manyJobs() { + runPersistedJobWriting(sManyJobs); + } + + private void runPersistedJobReading(List<JobStatus> jobList, boolean rtcIsGood) { + final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState(); + + long elapsedTimeNs = 0; + while (benchmarkState.keepRunning(elapsedTimeNs)) { + sJobStore.clear(); + for (JobStatus job : jobList) { + sJobStore.add(job); + } + sJobStore.waitForWriteToCompleteForTesting(10_000); + + JobSet jobSet = new JobSet(); + + final long startTime = SystemClock.elapsedRealtimeNanos(); + sJobStore.readJobMapFromDisk(jobSet, rtcIsGood); + final long endTime = SystemClock.elapsedRealtimeNanos(); + elapsedTimeNs = endTime - startTime; + } + } + + @Test + public void testPersistedJobReading_fewJobs_goodRTC() { + runPersistedJobReading(sFewJobs, true); + } + + @Test + public void testPersistedJobReading_fewJobs_badRTC() { + runPersistedJobReading(sFewJobs, false); + } + + @Test + public void testPersistedJobReading_manyJobs_goodRTC() { + runPersistedJobReading(sManyJobs, true); + } + + @Test + public void testPersistedJobReading_manyJobs_badRTC() { + runPersistedJobReading(sManyJobs, false); + } + + private static JobStatus createJobStatus(String testTag, int jobId) { + JobInfo jobInfo = new JobInfo.Builder(jobId, + new ComponentName(sContext, "JobStorePerfTestJobService")) + .setPersisted(true) + .build(); + return JobStatus.createFromJobInfo( + jobInfo, CALLING_UID, SOURCE_PACKAGE, SOURCE_USER_ID, testTag); + } +} diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java index a67bf3ca0b5d..1f1eac1fd46e 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java @@ -26,6 +26,7 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageInstaller; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; @@ -33,6 +34,7 @@ import androidx.test.InstrumentationRegistry; import com.android.cts.install.lib.Install; import com.android.cts.install.lib.InstallUtils; +import com.android.cts.install.lib.LocalIntentSender; import com.android.cts.install.lib.TestApp; import com.android.cts.install.lib.Uninstall; import com.android.cts.rollback.lib.Rollback; @@ -207,4 +209,40 @@ public class StagedRollbackTest { InstrumentationRegistry.getContext().getPackageManager(), 0); return comp.getPackageName(); } -} + + @Test + public void testPreviouslyAbandonedRollbacksEnableRollback() throws Exception { + Uninstall.packages(TestApp.A); + Install.single(TestApp.A1).commit(); + assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1); + + int sessionId = Install.single(TestApp.A2).setStaged().setEnableRollback().commit(); + PackageInstaller pi = InstrumentationRegistry.getContext().getPackageManager() + .getPackageInstaller(); + pi.abandonSession(sessionId); + + // Remove the first intent sender result, so that the next staged install session does not + // erroneously think that it has itself been abandoned. + // TODO(b/136260017): Restructure LocalIntentSender to negate the need for this step. + LocalIntentSender.getIntentSenderResult(); + Install.single(TestApp.A2).setStaged().setEnableRollback().commit(); + } + + @Test + public void testPreviouslyAbandonedRollbacksCommitRollback() throws Exception { + assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2); + InstallUtils.processUserData(TestApp.A); + + RollbackManager rm = RollbackUtils.getRollbackManager(); + RollbackInfo rollback = getUniqueRollbackInfoForPackage( + rm.getAvailableRollbacks(), TestApp.A); + RollbackUtils.rollback(rollback.getRollbackId()); + } + + @Test + public void testPreviouslyAbandonedRollbacksCheckUserdataRollback() throws Exception { + assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1); + InstallUtils.processUserData(TestApp.A); + Uninstall.packages(TestApp.A); + } +}
\ No newline at end of file diff --git a/tests/RollbackTest/SecondaryUserRollbackTest.xml b/tests/RollbackTest/SecondaryUserRollbackTest.xml index ad3761018a25..6b3f05c42983 100644 --- a/tests/RollbackTest/SecondaryUserRollbackTest.xml +++ b/tests/RollbackTest/SecondaryUserRollbackTest.xml @@ -19,6 +19,10 @@ <option name="cleanup-apks" value="true" /> <option name="test-file-name" value="RollbackTest.apk" /> </target_preparer> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.A" /> + <option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.B" /> + </target_preparer> <test class="com.android.tradefed.testtype.HostTest" > <option name="class" value="com.android.tests.rollback.host.SecondaryUserRollbackTest" /> </test> diff --git a/tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java b/tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java index 11fe964229d7..11a0fbb93366 100644 --- a/tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java +++ b/tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java @@ -43,8 +43,8 @@ public class SecondaryUserRollbackTest extends BaseHostJUnit4Test { @After public void tearDown() throws Exception { getDevice().switchUser(mOriginalUser); - getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.A"); - getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.B"); + getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A"); + getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.B"); removeSecondaryUserIfNecessary(); } diff --git a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java index bad294794337..ddef4b92441d 100644 --- a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java +++ b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java @@ -165,4 +165,16 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { // Verify rollback was not executed after health check deadline runPhase("assertNoNetworkStackRollbackCommitted"); } + + /** + * Tests rolling back user data where there are multiple rollbacks for that package. + */ + @Test + public void testPreviouslyAbandonedRollbacks() throws Exception { + runPhase("testPreviouslyAbandonedRollbacksEnableRollback"); + getDevice().reboot(); + runPhase("testPreviouslyAbandonedRollbacksCommitRollback"); + getDevice().reboot(); + runPhase("testPreviouslyAbandonedRollbacksCheckUserdataRollback"); + } } diff --git a/tests/net/Android.bp b/tests/net/Android.bp index 135bf90a48f1..5260b30acdfa 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -3,22 +3,6 @@ //######################################################################## java_defaults { name: "FrameworksNetTests-jni-defaults", - static_libs: [ - "FrameworksNetCommonTests", - "frameworks-base-testutils", - "framework-protos", - "androidx.test.rules", - "mockito-target-minus-junit4", - "net-tests-utils", - "platform-test-annotations", - "services.core", - "services.net", - ], - libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", - ], jni_libs: [ "ld-android", "libartbase", @@ -44,20 +28,20 @@ java_defaults { "libnativehelper", "libnetdbpf", "libnetdutils", + "libnetworkstatsfactorytestjni", "libpackagelistparser", "libpcre2", "libprocessgroup", "libselinux", - "libui", - "libutils", - "libvndksupport", "libtinyxml2", + "libui", "libunwindstack", + "libutils", "libutilscallstack", + "libvndksupport", "libziparchive", "libz", "netd_aidl_interface-V2-cpp", - "libnetworkstatsfactorytestjni", ], } @@ -68,4 +52,20 @@ android_test { platform_apis: true, test_suites: ["device-tests"], certificate: "platform", + static_libs: [ + "androidx.test.rules", + "FrameworksNetCommonTests", + "frameworks-base-testutils", + "framework-protos", + "mockito-target-minus-junit4", + "net-tests-utils", + "platform-test-annotations", + "services.core", + "services.net", + ], + libs: [ + "android.test.runner", + "android.test.base", + "android.test.mock", + ], } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 2ce6b13c3c31..1b2a12887aa5 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -71,6 +71,7 @@ import static android.net.RouteInfo.RTN_UNREACHABLE; import static com.android.testutils.ConcurrentUtilsKt.await; import static com.android.testutils.ConcurrentUtilsKt.durationOf; +import static com.android.testutils.ExceptionUtils.ignoreExceptions; import static com.android.testutils.HandlerUtilsKt.waitForIdleSerialExecutor; import static com.android.testutils.MiscAssertsKt.assertContainsExactly; import static com.android.testutils.MiscAssertsKt.assertEmpty; @@ -205,8 +206,8 @@ import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; import com.android.server.net.NetworkPinner; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.testutils.ExceptionUtils; import com.android.testutils.HandlerUtilsKt; -import com.android.testutils.ThrowingConsumer; import org.junit.After; import org.junit.Before; @@ -227,7 +228,6 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -417,7 +417,7 @@ public class ConnectivityServiceTest { } @Test - public void testWaitForIdle() { + public void testWaitForIdle() throws Exception { final int attempts = 50; // Causes the test to take about 200ms on bullhead-eng. // Tests that waitForIdle returns immediately if the service is already idle. @@ -444,7 +444,7 @@ public class ConnectivityServiceTest { // This test has an inherent race condition in it, and cannot be enabled for continuous testing // or presubmit tests. It is kept for manual runs and documentation purposes. @Ignore - public void verifyThatNotWaitingForIdleCausesRaceConditions() { + public void verifyThatNotWaitingForIdleCausesRaceConditions() throws Exception { // Bring up a network that we can use to send messages to ConnectivityService. ConditionVariable cv = waitForConnectivityBroadcasts(1); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -524,11 +524,11 @@ public class ConnectivityServiceTest { mNmValidationRedirectUrl = null; } - MockNetworkAgent(int transport) { + MockNetworkAgent(int transport) throws Exception { this(transport, new LinkProperties()); } - MockNetworkAgent(int transport, LinkProperties linkProperties) { + MockNetworkAgent(int transport, LinkProperties linkProperties) throws Exception { final int type = transportToLegacyType(transport); final String typeName = ConnectivityManager.getNetworkTypeName(type); mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); @@ -559,16 +559,12 @@ public class ConnectivityServiceTest { mNetworkMonitor = mock(INetworkMonitor.class); final Answer validateAnswer = inv -> { - new Thread(this::onValidationRequested).start(); + new Thread(ignoreExceptions(this::onValidationRequested)).start(); return null; }; - try { - doAnswer(validateAnswer).when(mNetworkMonitor).notifyNetworkConnected(any(), any()); - doAnswer(validateAnswer).when(mNetworkMonitor).forceReevaluation(anyInt()); - } catch (RemoteException e) { - fail(e.getMessage()); - } + doAnswer(validateAnswer).when(mNetworkMonitor).notifyNetworkConnected(any(), any()); + doAnswer(validateAnswer).when(mNetworkMonitor).forceReevaluation(anyInt()); final ArgumentCaptor<Network> nmNetworkCaptor = ArgumentCaptor.forClass(Network.class); final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor = @@ -623,35 +619,27 @@ public class ConnectivityServiceTest { assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId); mNmCallbacks = nmCbCaptor.getValue(); - try { - mNmCallbacks.onNetworkMonitorCreated(mNetworkMonitor); - } catch (RemoteException e) { - fail(e.getMessage()); - } + mNmCallbacks.onNetworkMonitorCreated(mNetworkMonitor); // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. waitForIdle(); } - private void onValidationRequested() { - try { - if (mNmProvNotificationRequested - && ((mNmValidationResult & NETWORK_VALIDATION_RESULT_VALID) != 0)) { - mNmCallbacks.hideProvisioningNotification(); - mNmProvNotificationRequested = false; - } + private void onValidationRequested() throws Exception { + if (mNmProvNotificationRequested + && ((mNmValidationResult & NETWORK_VALIDATION_RESULT_VALID) != 0)) { + mNmCallbacks.hideProvisioningNotification(); + mNmProvNotificationRequested = false; + } - mNmCallbacks.notifyNetworkTested( - mNmValidationResult, mNmValidationRedirectUrl); + mNmCallbacks.notifyNetworkTested( + mNmValidationResult, mNmValidationRedirectUrl); - if (mNmValidationRedirectUrl != null) { - mNmCallbacks.showProvisioningNotification( - "test_provisioning_notif_action", "com.android.test.package"); - mNmProvNotificationRequested = true; - } - } catch (RemoteException e) { - fail(e.getMessage()); + if (mNmValidationRedirectUrl != null) { + mNmCallbacks.showProvisioningNotification( + "test_provisioning_notif_action", "com.android.test.package"); + mNmProvNotificationRequested = true; } } @@ -664,8 +652,8 @@ public class ConnectivityServiceTest { return mScore; } - public void explicitlySelected(boolean acceptUnvalidated) { - mNetworkAgent.explicitlySelected(acceptUnvalidated); + public void explicitlySelected(boolean explicitlySelected, boolean acceptUnvalidated) { + mNetworkAgent.explicitlySelected(explicitlySelected, acceptUnvalidated); } public void addCapability(int capability) { @@ -768,6 +756,11 @@ public class ConnectivityServiceTest { connect(false); } + public void connectWithPartialValidConnectivity() { + setNetworkPartialValid(); + connect(false); + } + public void suspend() { mNetworkInfo.setDetailedState(DetailedState.SUSPENDED, null, null); mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -1249,18 +1242,13 @@ public class ConnectivityServiceTest { waitForIdle(TIMEOUT_MS); } - public void setUidRulesChanged(int uidRules) { - try { - mPolicyListener.onUidRulesChanged(Process.myUid(), uidRules); - } catch (RemoteException ignored) { - } + public void setUidRulesChanged(int uidRules) throws RemoteException { + mPolicyListener.onUidRulesChanged(Process.myUid(), uidRules); } - public void setRestrictBackgroundChanged(boolean restrictBackground) { - try { - mPolicyListener.onRestrictBackgroundChanged(restrictBackground); - } catch (RemoteException ignored) { - } + public void setRestrictBackgroundChanged(boolean restrictBackground) + throws RemoteException { + mPolicyListener.onRestrictBackgroundChanged(restrictBackground); } } @@ -1815,12 +1803,9 @@ public class ConnectivityServiceTest { return mLastAvailableNetwork; } - CallbackInfo nextCallback(int timeoutMs) { + CallbackInfo nextCallback(int timeoutMs) throws InterruptedException { CallbackInfo cb = null; - try { - cb = mCallbacks.poll(timeoutMs, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - } + cb = mCallbacks.poll(timeoutMs, TimeUnit.MILLISECONDS); if (cb == null) { // LinkedBlockingQueue.poll() returns null if it timeouts. fail("Did not receive callback after " + timeoutMs + "ms"); @@ -1828,7 +1813,8 @@ public class ConnectivityServiceTest { return cb; } - CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent, int timeoutMs) { + CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent, int timeoutMs) + throws Exception { final Network expectedNetwork = (agent != null) ? agent.getNetwork() : null; CallbackInfo expected = new CallbackInfo(state, expectedNetwork, 0); CallbackInfo actual = nextCallback(timeoutMs); @@ -1845,15 +1831,16 @@ public class ConnectivityServiceTest { return actual; } - CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent) { + CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent) throws Exception { return expectCallback(state, agent, TEST_CALLBACK_TIMEOUT_MS); } - CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn) { + CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn) throws Exception { return expectCallbackLike(fn, TEST_CALLBACK_TIMEOUT_MS); } - CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn, int timeoutMs) { + CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn, int timeoutMs) + throws Exception { int timeLeft = timeoutMs; while (timeLeft > 0) { long start = SystemClock.elapsedRealtime(); @@ -1879,7 +1866,7 @@ public class ConnectivityServiceTest { // onCapabilitiesChanged callback. // @param timeoutMs how long to wait for the callbacks. void expectAvailableCallbacks(MockNetworkAgent agent, boolean expectSuspended, - boolean expectValidated, boolean expectBlocked, int timeoutMs) { + boolean expectValidated, boolean expectBlocked, int timeoutMs) throws Exception { expectCallback(CallbackState.AVAILABLE, agent, timeoutMs); if (expectSuspended) { expectCallback(CallbackState.SUSPENDED, agent, timeoutMs); @@ -1894,23 +1881,26 @@ public class ConnectivityServiceTest { } // Expects the available callbacks (validated), plus onSuspended. - void expectAvailableAndSuspendedCallbacks(MockNetworkAgent agent, boolean expectValidated) { + void expectAvailableAndSuspendedCallbacks(MockNetworkAgent agent, boolean expectValidated) + throws Exception { expectAvailableCallbacks(agent, true, expectValidated, false, TEST_CALLBACK_TIMEOUT_MS); } - void expectAvailableCallbacksValidated(MockNetworkAgent agent) { + void expectAvailableCallbacksValidated(MockNetworkAgent agent) + throws Exception { expectAvailableCallbacks(agent, false, true, false, TEST_CALLBACK_TIMEOUT_MS); } - void expectAvailableCallbacksValidatedAndBlocked(MockNetworkAgent agent) { + void expectAvailableCallbacksValidatedAndBlocked(MockNetworkAgent agent) throws Exception { expectAvailableCallbacks(agent, false, true, true, TEST_CALLBACK_TIMEOUT_MS); } - void expectAvailableCallbacksUnvalidated(MockNetworkAgent agent) { + void expectAvailableCallbacksUnvalidated(MockNetworkAgent agent) throws Exception { expectAvailableCallbacks(agent, false, false, false, TEST_CALLBACK_TIMEOUT_MS); } - void expectAvailableCallbacksUnvalidatedAndBlocked(MockNetworkAgent agent) { + void expectAvailableCallbacksUnvalidatedAndBlocked(MockNetworkAgent agent) + throws Exception { expectAvailableCallbacks(agent, false, false, true, TEST_CALLBACK_TIMEOUT_MS); } @@ -1918,7 +1908,7 @@ public class ConnectivityServiceTest { // VALIDATED capability), plus another onCapabilitiesChanged which is identical to the // one we just sent. // TODO: this is likely a bug. Fix it and remove this method. - void expectAvailableDoubleValidatedCallbacks(MockNetworkAgent agent) { + void expectAvailableDoubleValidatedCallbacks(MockNetworkAgent agent) throws Exception { expectCallback(CallbackState.AVAILABLE, agent, TEST_CALLBACK_TIMEOUT_MS); NetworkCapabilities nc1 = expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); expectCallback(CallbackState.LINK_PROPERTIES, agent, TEST_CALLBACK_TIMEOUT_MS); @@ -1932,48 +1922,53 @@ public class ConnectivityServiceTest { // Expects the available callbacks where the onCapabilitiesChanged must not have validated, // then expects another onCapabilitiesChanged that has the validated bit set. This is used // when a network connects and satisfies a callback, and then immediately validates. - void expectAvailableThenValidatedCallbacks(MockNetworkAgent agent) { + void expectAvailableThenValidatedCallbacks(MockNetworkAgent agent) throws Exception { expectAvailableCallbacksUnvalidated(agent); expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); } - NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent) { + NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent) + throws Exception { return expectCapabilitiesWith(capability, agent, TEST_CALLBACK_TIMEOUT_MS); } NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent, - int timeoutMs) { + int timeoutMs) throws Exception { CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs); NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; assertTrue(nc.hasCapability(capability)); return nc; } - NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent) { + NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent) + throws Exception { return expectCapabilitiesWithout(capability, agent, TEST_CALLBACK_TIMEOUT_MS); } NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent, - int timeoutMs) { + int timeoutMs) throws Exception { CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs); NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; assertFalse(nc.hasCapability(capability)); return nc; } - void expectCapabilitiesLike(Predicate<NetworkCapabilities> fn, MockNetworkAgent agent) { + void expectCapabilitiesLike(Predicate<NetworkCapabilities> fn, MockNetworkAgent agent) + throws Exception { CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent); assertTrue("Received capabilities don't match expectations : " + cbi.arg, fn.test((NetworkCapabilities) cbi.arg)); } - void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) { + void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) + throws Exception { CallbackInfo cbi = expectCallback(CallbackState.LINK_PROPERTIES, agent); assertTrue("Received LinkProperties don't match expectations : " + cbi.arg, fn.test((LinkProperties) cbi.arg)); } - void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) { + void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) + throws Exception { CallbackInfo cbi = expectCallback(CallbackState.BLOCKED_STATUS, agent); boolean actualBlocked = (boolean) cbi.arg; assertEquals(expectBlocked, actualBlocked); @@ -2085,7 +2080,7 @@ public class ConnectivityServiceTest { } @Test - public void testMultipleLingering() { + public void testMultipleLingering() throws Exception { // This test would be flaky with the default 120ms timer: that is short enough that // lingered networks are torn down before assertions can be run. We don't want to mock the // lingering timer to keep the WakeupMessage logic realistic: this has already proven useful @@ -2340,7 +2335,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkGoesIntoBackgroundAfterLinger() { + public void testNetworkGoesIntoBackgroundAfterLinger() throws Exception { setAlwaysOnNetworks(true); NetworkRequest request = new NetworkRequest.Builder() .clearCapabilities() @@ -2385,7 +2380,7 @@ public class ConnectivityServiceTest { } @Test - public void testExplicitlySelected() { + public void testExplicitlySelected() throws Exception { NetworkRequest request = new NetworkRequest.Builder() .clearCapabilities().addCapability(NET_CAPABILITY_INTERNET) .build(); @@ -2399,7 +2394,7 @@ public class ConnectivityServiceTest { // Bring up unvalidated wifi with explicitlySelected=true. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.explicitlySelected(false); + mWiFiNetworkAgent.explicitlySelected(true, false); mWiFiNetworkAgent.connect(false); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); @@ -2422,7 +2417,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.explicitlySelected(false); + mWiFiNetworkAgent.explicitlySelected(true, false); mWiFiNetworkAgent.connect(false); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); @@ -2433,7 +2428,7 @@ public class ConnectivityServiceTest { // Reconnect, again with explicitlySelected=true, but this time validate. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.explicitlySelected(false); + mWiFiNetworkAgent.explicitlySelected(true, false); mWiFiNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); @@ -2448,14 +2443,36 @@ public class ConnectivityServiceTest { assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); callback.assertNoCallback(); + // Disconnect wifi, and then reconnect as if the user had selected "yes, don't ask again" + // (i.e., with explicitlySelected=true and acceptUnvalidated=true). Expect to switch to + // wifi immediately. + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.explicitlySelected(true, true); + mWiFiNetworkAgent.connect(false); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + callback.expectCallback(CallbackState.LOSING, mEthernetNetworkAgent); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + mEthernetNetworkAgent.disconnect(); + callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); + + // Disconnect and reconnect with explicitlySelected=false and acceptUnvalidated=true. + // Check that the network is not scored specially and that the device prefers cell data. + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.explicitlySelected(false, true); + mWiFiNetworkAgent.connect(false); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + // Clean up. mWiFiNetworkAgent.disconnect(); mCellNetworkAgent.disconnect(); - mEthernetNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); } private int[] makeIntArray(final int size, final int value) { @@ -2666,7 +2683,7 @@ public class ConnectivityServiceTest { } @Test - public void testPartialConnectivity() { + public void testPartialConnectivity() throws Exception { // Register network callback. NetworkRequest request = new NetworkRequest.Builder() .clearCapabilities().addCapability(NET_CAPABILITY_INTERNET) @@ -2699,11 +2716,8 @@ public class ConnectivityServiceTest { // If user accepts partial connectivity network, // NetworkMonitor#setAcceptPartialConnectivity() should be called too. waitForIdle(); - try { - verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); - } catch (RemoteException e) { - fail(e.getMessage()); - } + verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); + // Need a trigger point to let NetworkMonitor tell ConnectivityService that network is // validated. mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); @@ -2734,62 +2748,72 @@ public class ConnectivityServiceTest { // NET_CAPABILITY_PARTIAL_CONNECTIVITY. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); // acceptUnvalidated is also used as setting for accepting partial networks. - mWiFiNetworkAgent.explicitlySelected(true /* acceptUnvalidated */); + mWiFiNetworkAgent.explicitlySelected(true /* explicitlySelected */, + true /* acceptUnvalidated */); mWiFiNetworkAgent.connect(true); + // If user accepted partial connectivity network before, // NetworkMonitor#setAcceptPartialConnectivity() will be called in // ConnectivityService#updateNetworkInfo(). waitForIdle(); - try { - verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); - } catch (RemoteException e) { - fail(e.getMessage()); - } + verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); nc = callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertFalse(nc.hasCapability(NET_CAPABILITY_PARTIAL_CONNECTIVITY)); + // Wifi should be the default network. assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - // If user accepted partial connectivity before, and now the device reconnects to the - // partial connectivity network. The network should be valid and contain - // NET_CAPABILITY_PARTIAL_CONNECTIVITY. + // The user accepted partial connectivity and selected "don't ask again". Now the user + // reconnects to the partial connectivity network. Switch to wifi as soon as partial + // connectivity is detected. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - mWiFiNetworkAgent.explicitlySelected(true /* acceptUnvalidated */); - // Current design cannot send multi-testResult from NetworkMonitor to ConnectivityService. - // So, if user accepts partial connectivity, NetworkMonitor will send PARTIAL_CONNECTIVITY - // to ConnectivityService first then send VALID. Once NetworkMonitor support - // multi-testResult, this test case also need to be changed to meet the new design. + mWiFiNetworkAgent.explicitlySelected(true /* explicitlySelected */, + true /* acceptUnvalidated */); mWiFiNetworkAgent.connectWithPartialConnectivity(); // If user accepted partial connectivity network before, // NetworkMonitor#setAcceptPartialConnectivity() will be called in // ConnectivityService#updateNetworkInfo(). waitForIdle(); - try { - verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); - } catch (RemoteException e) { - fail(e.getMessage()); - } + verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); - // TODO: If the user accepted partial connectivity, we shouldn't switch to wifi until - // NetworkMonitor detects partial connectivity assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); callback.expectCapabilitiesWith(NET_CAPABILITY_PARTIAL_CONNECTIVITY, mWiFiNetworkAgent); mWiFiNetworkAgent.setNetworkValid(); + // Need a trigger point to let NetworkMonitor tell ConnectivityService that network is // validated. mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + + // If the user accepted partial connectivity, and the device auto-reconnects to the partial + // connectivity network, it should contain both PARTIAL_CONNECTIVITY and VALIDATED. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.explicitlySelected(false /* explicitlySelected */, + true /* acceptUnvalidated */); + + // NetworkMonitor will immediately (once the HTTPS probe fails...) report the network as + // valid, because ConnectivityService calls setAcceptPartialConnectivity before it calls + // notifyNetworkConnected. + mWiFiNetworkAgent.connectWithPartialValidConnectivity(); + waitForIdle(); + verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCapabilitiesWith( + NET_CAPABILITY_PARTIAL_CONNECTIVITY | NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } @Test - public void testCaptivePortalOnPartialConnectivity() throws RemoteException { + public void testCaptivePortalOnPartialConnectivity() throws Exception { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); @@ -2838,7 +2862,7 @@ public class ConnectivityServiceTest { } @Test - public void testCaptivePortal() { + public void testCaptivePortal() throws Exception { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); @@ -2890,7 +2914,7 @@ public class ConnectivityServiceTest { } @Test - public void testCaptivePortalApp() throws RemoteException { + public void testCaptivePortalApp() throws Exception { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); @@ -2948,7 +2972,7 @@ public class ConnectivityServiceTest { } @Test - public void testAvoidOrIgnoreCaptivePortals() { + public void testAvoidOrIgnoreCaptivePortals() throws Exception { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); @@ -2988,7 +3012,7 @@ public class ConnectivityServiceTest { * does work. */ @Test - public void testNetworkSpecifier() { + public void testNetworkSpecifier() throws Exception { // A NetworkSpecifier subclass that matches all networks but must not be visible to apps. class ConfidentialMatchAllNetworkSpecifier extends NetworkSpecifier implements Parcelable { @@ -3177,7 +3201,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkSpecifierUidSpoofSecurityException() { + public void testNetworkSpecifierUidSpoofSecurityException() throws Exception { class UidAwareNetworkSpecifier extends NetworkSpecifier implements Parcelable { @Override public boolean satisfiedBy(NetworkSpecifier other) { @@ -3790,7 +3814,7 @@ public class ConnectivityServiceTest { * time-out period expires. */ @Test - public void testSatisfiedNetworkRequestDoesNotTriggerOnUnavailable() { + public void testSatisfiedNetworkRequestDoesNotTriggerOnUnavailable() throws Exception { NetworkRequest nr = new NetworkRequest.Builder().addTransportType( NetworkCapabilities.TRANSPORT_WIFI).build(); final TestNetworkCallback networkCallback = new TestNetworkCallback(); @@ -3810,7 +3834,7 @@ public class ConnectivityServiceTest { * not trigger onUnavailable() once the time-out period expires. */ @Test - public void testSatisfiedThenLostNetworkRequestDoesNotTriggerOnUnavailable() { + public void testSatisfiedThenLostNetworkRequestDoesNotTriggerOnUnavailable() throws Exception { NetworkRequest nr = new NetworkRequest.Builder().addTransportType( NetworkCapabilities.TRANSPORT_WIFI).build(); final TestNetworkCallback networkCallback = new TestNetworkCallback(); @@ -3833,7 +3857,7 @@ public class ConnectivityServiceTest { * (somehow) satisfied - the callback isn't called later. */ @Test - public void testTimedoutNetworkRequest() { + public void testTimedoutNetworkRequest() throws Exception { NetworkRequest nr = new NetworkRequest.Builder().addTransportType( NetworkCapabilities.TRANSPORT_WIFI).build(); final TestNetworkCallback networkCallback = new TestNetworkCallback(); @@ -3854,7 +3878,7 @@ public class ConnectivityServiceTest { * trigger the callback. */ @Test - public void testNoCallbackAfterUnregisteredNetworkRequest() { + public void testNoCallbackAfterUnregisteredNetworkRequest() throws Exception { NetworkRequest nr = new NetworkRequest.Builder().addTransportType( NetworkCapabilities.TRANSPORT_WIFI).build(); final TestNetworkCallback networkCallback = new TestNetworkCallback(); @@ -3946,7 +3970,7 @@ public class ConnectivityServiceTest { private static class TestKeepaliveCallback extends PacketKeepaliveCallback { - public static enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR }; + public enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR } private class CallbackValue { public CallbackType callbackType; @@ -3994,25 +4018,19 @@ public class ConnectivityServiceTest { mCallbacks.add(new CallbackValue(CallbackType.ON_ERROR, error)); } - private void expectCallback(CallbackValue callbackValue) { - try { - assertEquals( - callbackValue, - mCallbacks.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - } catch (InterruptedException e) { - fail(callbackValue.callbackType + " callback not seen after " + TIMEOUT_MS + " ms"); - } + private void expectCallback(CallbackValue callbackValue) throws InterruptedException { + assertEquals(callbackValue, mCallbacks.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } - public void expectStarted() { + public void expectStarted() throws Exception { expectCallback(new CallbackValue(CallbackType.ON_STARTED)); } - public void expectStopped() { + public void expectStopped() throws Exception { expectCallback(new CallbackValue(CallbackType.ON_STOPPED)); } - public void expectError(int error) { + public void expectError(int error) throws Exception { expectCallback(new CallbackValue(CallbackType.ON_ERROR, error)); } } @@ -4073,25 +4091,20 @@ public class ConnectivityServiceTest { mCallbacks.add(new CallbackValue(CallbackType.ON_ERROR, error)); } - private void expectCallback(CallbackValue callbackValue) { - try { - assertEquals( - callbackValue, - mCallbacks.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - } catch (InterruptedException e) { - fail(callbackValue.callbackType + " callback not seen after " + TIMEOUT_MS + " ms"); - } + private void expectCallback(CallbackValue callbackValue) throws InterruptedException { + assertEquals(callbackValue, mCallbacks.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + } - public void expectStarted() { + public void expectStarted() throws InterruptedException { expectCallback(new CallbackValue(CallbackType.ON_STARTED)); } - public void expectStopped() { + public void expectStopped() throws InterruptedException { expectCallback(new CallbackValue(CallbackType.ON_STOPPED)); } - public void expectError(int error) { + public void expectError(int error) throws InterruptedException { expectCallback(new CallbackValue(CallbackType.ON_ERROR, error)); } @@ -4102,7 +4115,7 @@ public class ConnectivityServiceTest { } } - private Network connectKeepaliveNetwork(LinkProperties lp) { + private Network connectKeepaliveNetwork(LinkProperties lp) throws Exception { // Ensure the network is disconnected before we do anything. if (mWiFiNetworkAgent != null) { assertNull(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork())); @@ -4236,7 +4249,8 @@ public class ConnectivityServiceTest { } // Helper method to prepare the executor and run test - private void runTestWithSerialExecutors(ThrowingConsumer<Executor> functor) throws Exception { + private void runTestWithSerialExecutors(ExceptionUtils.ThrowingConsumer<Executor> functor) + throws Exception { final ExecutorService executorSingleThread = Executors.newSingleThreadExecutor(); final Executor executorInline = (Runnable r) -> r.run(); functor.accept(executorSingleThread); @@ -4554,7 +4568,7 @@ public class ConnectivityServiceTest { private static boolean isUdpPortInUse(int port) { try (DatagramSocket ignored = new DatagramSocket(port)) { return false; - } catch (IOException ignored) { + } catch (IOException alreadyInUse) { return true; } } @@ -4566,23 +4580,19 @@ public class ConnectivityServiceTest { } private static class TestNetworkPinner extends NetworkPinner { - public static boolean awaitPin(int timeoutMs) { + public static boolean awaitPin(int timeoutMs) throws InterruptedException { synchronized(sLock) { if (sNetwork == null) { - try { - sLock.wait(timeoutMs); - } catch (InterruptedException e) {} + sLock.wait(timeoutMs); } return sNetwork != null; } } - public static boolean awaitUnpin(int timeoutMs) { + public static boolean awaitUnpin(int timeoutMs) throws InterruptedException { synchronized(sLock) { if (sNetwork != null) { - try { - sLock.wait(timeoutMs); - } catch (InterruptedException e) {} + sLock.wait(timeoutMs); } return sNetwork == null; } @@ -4605,7 +4615,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkPinner() { + public void testNetworkPinner() throws Exception { NetworkRequest wifiRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_WIFI) .build(); @@ -4757,7 +4767,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkInfoOfTypeNone() { + public void testNetworkInfoOfTypeNone() throws Exception { ConditionVariable broadcastCV = waitForConnectivityBroadcasts(1); verifyNoNetwork(); @@ -4818,7 +4828,7 @@ public class ConnectivityServiceTest { } @Test - public void testLinkPropertiesEnsuresDirectlyConnectedRoutes() { + public void testLinkPropertiesEnsuresDirectlyConnectedRoutes() throws Exception { final NetworkRequest networkRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_WIFI).build(); final TestNetworkCallback networkCallback = new TestNetworkCallback(); @@ -5226,7 +5236,7 @@ public class ConnectivityServiceTest { } @Test - public void testVpnNetworkActive() { + public void testVpnNetworkActive() throws Exception { final int uid = Process.myUid(); final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback(); @@ -5338,7 +5348,7 @@ public class ConnectivityServiceTest { } @Test - public void testVpnWithoutInternet() { + public void testVpnWithoutInternet() throws Exception { final int uid = Process.myUid(); final TestNetworkCallback defaultCallback = new TestNetworkCallback(); @@ -5368,7 +5378,7 @@ public class ConnectivityServiceTest { } @Test - public void testVpnWithInternet() { + public void testVpnWithInternet() throws Exception { final int uid = Process.myUid(); final TestNetworkCallback defaultCallback = new TestNetworkCallback(); @@ -5451,7 +5461,7 @@ public class ConnectivityServiceTest { } @Test - public void testVpnSetUnderlyingNetworks() { + public void testVpnSetUnderlyingNetworks() throws Exception { final int uid = Process.myUid(); final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); @@ -5549,7 +5559,7 @@ public class ConnectivityServiceTest { } @Test - public void testNullUnderlyingNetworks() { + public void testNullUnderlyingNetworks() throws Exception { final int uid = Process.myUid(); final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); @@ -5613,7 +5623,7 @@ public class ConnectivityServiceTest { } @Test - public void testIsActiveNetworkMeteredOverWifi() { + public void testIsActiveNetworkMeteredOverWifi() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -5625,7 +5635,7 @@ public class ConnectivityServiceTest { } @Test - public void testIsActiveNetworkMeteredOverCell() { + public void testIsActiveNetworkMeteredOverCell() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -5637,7 +5647,7 @@ public class ConnectivityServiceTest { } @Test - public void testIsActiveNetworkMeteredOverVpnTrackingPlatformDefault() { + public void testIsActiveNetworkMeteredOverVpnTrackingPlatformDefault() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -5691,7 +5701,7 @@ public class ConnectivityServiceTest { } @Test - public void testIsActiveNetworkMeteredOverVpnSpecifyingUnderlyingNetworks() { + public void testIsActiveNetworkMeteredOverVpnSpecifyingUnderlyingNetworks() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -5762,7 +5772,7 @@ public class ConnectivityServiceTest { } @Test - public void testIsActiveNetworkMeteredOverAlwaysMeteredVpn() { + public void testIsActiveNetworkMeteredOverAlwaysMeteredVpn() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -5809,7 +5819,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkBlockedStatus() { + public void testNetworkBlockedStatus() throws Exception { final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); final NetworkRequest cellRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR) @@ -5860,7 +5870,7 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkBlockedStatusBeforeAndAfterConnect() { + public void testNetworkBlockedStatusBeforeAndAfterConnect() throws Exception { final TestNetworkCallback defaultCallback = new TestNetworkCallback(); mCm.registerDefaultNetworkCallback(defaultCallback); @@ -5929,7 +5939,7 @@ public class ConnectivityServiceTest { } @Test - public void testStackedLinkProperties() throws UnknownHostException, RemoteException { + public void testStackedLinkProperties() throws Exception { final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24"); final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64"); final String kNat64PrefixString = "2001:db8:64:64:64:64::"; @@ -6092,7 +6102,7 @@ public class ConnectivityServiceTest { } @Test - public void testDataActivityTracking() throws RemoteException { + public void testDataActivityTracking() throws Exception { final TestNetworkCallback networkCallback = new TestNetworkCallback(); final NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_INTERNET) @@ -6167,21 +6177,17 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(networkCallback); } - private void verifyTcpBufferSizeChange(String tcpBufferSizes) { + private void verifyTcpBufferSizeChange(String tcpBufferSizes) throws Exception { String[] values = tcpBufferSizes.split(","); String rmemValues = String.join(" ", values[0], values[1], values[2]); String wmemValues = String.join(" ", values[3], values[4], values[5]); waitForIdle(); - try { - verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues); - } catch (RemoteException e) { - fail("mMockNetd should never throw RemoteException"); - } + verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues); reset(mMockNetd); } @Test - public void testTcpBufferReset() { + public void testTcpBufferReset() throws Exception { final String testTcpBufferSizes = "1,2,3,4,5,6"; mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); @@ -6198,7 +6204,7 @@ public class ConnectivityServiceTest { } @Test - public void testGetGlobalProxyForNetwork() { + public void testGetGlobalProxyForNetwork() throws Exception { final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); final Network wifiNetwork = mWiFiNetworkAgent.getNetwork(); @@ -6207,7 +6213,7 @@ public class ConnectivityServiceTest { } @Test - public void testGetProxyForActiveNetwork() { + public void testGetProxyForActiveNetwork() throws Exception { final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); @@ -6224,7 +6230,7 @@ public class ConnectivityServiceTest { } @Test - public void testGetProxyForVPN() { + public void testGetProxyForVPN() throws Exception { final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); // Set up a WiFi network with no proxy @@ -6410,7 +6416,7 @@ public class ConnectivityServiceTest { private MockNetworkAgent establishVpn(LinkProperties lp, int establishingUid, - Set<UidRange> vpnRange) { + Set<UidRange> vpnRange) throws Exception { final MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN, lp); vpnNetworkAgent.getNetworkCapabilities().setEstablishingVpnAppUid(establishingUid); mMockVpn.setNetworkAgent(vpnNetworkAgent); diff --git a/tests/net/smoketest/Android.bp b/tests/net/smoketest/Android.bp index ef1ad2cba804..84ae2b5d845e 100644 --- a/tests/net/smoketest/Android.bp +++ b/tests/net/smoketest/Android.bp @@ -14,4 +14,9 @@ android_test { defaults: ["FrameworksNetTests-jni-defaults"], srcs: ["java/SmokeTest.java"], test_suites: ["device-tests"], -} + static_libs: [ + "androidx.test.rules", + "mockito-target-minus-junit4", + "services.core", + ], +}
\ No newline at end of file diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index b13731f75629..1be4ea8eccda 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -56,7 +56,7 @@ cc_defaults { "libziparchive", "libpng", "libbase", - "libprotobuf-cpp-lite", + "libprotobuf-cpp-full", "libz", "libbuildversion", ], diff --git a/tools/aapt2/Configuration.proto b/tools/aapt2/Configuration.proto index fc636a43ec40..8a4644c9a219 100644 --- a/tools/aapt2/Configuration.proto +++ b/tools/aapt2/Configuration.proto @@ -19,7 +19,6 @@ syntax = "proto3"; package aapt.pb; option java_package = "com.android.aapt"; -option optimize_for = LITE_RUNTIME; // A description of the requirements a device must have in order for a // resource to be matched and selected. diff --git a/tools/aapt2/Resources.proto b/tools/aapt2/Resources.proto index 65f465240d7d..7498e132d943 100644 --- a/tools/aapt2/Resources.proto +++ b/tools/aapt2/Resources.proto @@ -21,7 +21,6 @@ import "frameworks/base/tools/aapt2/Configuration.proto"; package aapt.pb; option java_package = "com.android.aapt"; -option optimize_for = LITE_RUNTIME; // A string pool that wraps the binary form of the C++ class android::ResStringPool. message StringPool { diff --git a/tools/aapt2/ResourcesInternal.proto b/tools/aapt2/ResourcesInternal.proto index 520b242ee509..b0ed3da33368 100644 --- a/tools/aapt2/ResourcesInternal.proto +++ b/tools/aapt2/ResourcesInternal.proto @@ -22,7 +22,6 @@ import "frameworks/base/tools/aapt2/Resources.proto"; package aapt.pb.internal; option java_package = "android.aapt.pb.internal"; -option optimize_for = LITE_RUNTIME; // The top level message representing an external resource file (layout XML, PNG, etc). // This is used to represent a compiled file before it is linked. Only useful to aapt2. diff --git a/tools/aapt2/io/Util.cpp b/tools/aapt2/io/Util.cpp index ce6d9352180d..bb925c9b3f8e 100644 --- a/tools/aapt2/io/Util.cpp +++ b/tools/aapt2/io/Util.cpp @@ -58,7 +58,7 @@ bool CopyFileToArchivePreserveCompression(IAaptContext* context, io::IFile* file return CopyFileToArchive(context, file, out_path, compression_flags, writer); } -bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg, +bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::Message* proto_msg, const std::string& out_path, uint32_t compression_flags, IArchiveWriter* writer) { TRACE_CALL(); diff --git a/tools/aapt2/io/Util.h b/tools/aapt2/io/Util.h index 5f978a8e2c35..5cb8206db23c 100644 --- a/tools/aapt2/io/Util.h +++ b/tools/aapt2/io/Util.h @@ -19,7 +19,7 @@ #include <string> -#include "google/protobuf/message_lite.h" +#include "google/protobuf/message.h" #include "google/protobuf/io/coded_stream.h" #include "format/Archive.h" @@ -39,7 +39,7 @@ bool CopyFileToArchive(IAaptContext* context, IFile* file, const std::string& ou bool CopyFileToArchivePreserveCompression(IAaptContext* context, IFile* file, const std::string& out_path, IArchiveWriter* writer); -bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg, +bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::Message* proto_msg, const std::string& out_path, uint32_t compression_flags, IArchiveWriter* writer); @@ -127,13 +127,13 @@ class ProtoInputStreamReader { public: explicit ProtoInputStreamReader(io::InputStream* in) : in_(in) { } - /** Deserializes a MessageLite proto from the current position in the input stream.*/ - template <typename T> bool ReadMessage(T *message_lite) { + /** Deserializes a Message proto from the current position in the input stream.*/ + template <typename T> bool ReadMessage(T *message) { ZeroCopyInputAdaptor adapter(in_); google::protobuf::io::CodedInputStream coded_stream(&adapter); coded_stream.SetTotalBytesLimit(std::numeric_limits<int32_t>::max(), coded_stream.BytesUntilTotalBytesLimit()); - return message_lite->ParseFromCodedStream(&coded_stream); + return message->ParseFromCodedStream(&coded_stream); } private: diff --git a/tools/dump-coverage/Android.bp b/tools/dump-coverage/Android.bp new file mode 100644 index 000000000000..4519ce3636bf --- /dev/null +++ b/tools/dump-coverage/Android.bp @@ -0,0 +1,29 @@ +// +// 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. +// + +// Build variants {target,host} x {32,64} +cc_library { + name: "libdumpcoverage", + srcs: ["dump_coverage.cc"], + header_libs: [ + "libopenjdkjvmti_headers", + ], + + host_supported: true, + shared_libs: [ + "libbase", + ], +} diff --git a/tools/dump-coverage/README.md b/tools/dump-coverage/README.md new file mode 100644 index 000000000000..2bab4bc8c984 --- /dev/null +++ b/tools/dump-coverage/README.md @@ -0,0 +1,50 @@ +# dumpcoverage + +libdumpcoverage.so is a JVMTI agent designed to dump coverage information for a process, where the binaries have been instrumented by JaCoCo. JaCoCo automatically starts recording data on process start, and we need a way to trigger the resetting or dumping of this data. + +The JVMTI agent is used to make the calls to JaCoCo in its process. + +# Usage + +Note that these examples assume you have an instrumented build (userdebug_coverage). Here is, for example, how to dump coverage information regarding the default clock app. First some setup is necessary: + +``` +adb root # necessary to copy files in/out of the /data/data/{package} folder +adb shell 'mkdir /data/data/com.android.deskclock/folder-to-use' +``` + +Then we can run the command to dump the data: + +``` +adb shell 'am attach-agent com.android.deskclock /system/lib/libdumpcoverage.so=dump:/data/data/com.android.deskclock/folder-to-use' +``` + +We can also reset the coverage information with + +``` +adb shell 'am attach-agent com.android.deskclock /system/lib/libdumpcoverage.so=reset' +``` + +then perform more actions, then dump the data again. To get the files, we can get + +``` +adb pull /data/data/com.android.deskclock/folder-to-use ~/path-on-your-computer +``` + +And you should have timestamped `.exec` files on your machine under the folder `~/path-on-your-computer` + +# Details + +In dump mode, the agent makes JNI calls equivalent to + +``` +Agent.getInstance().getExecutionData(/*reset = */ false); +``` + +and then saves the result to a file specified by the passed in directory + +In reset mode, it makes a JNI call equivalent to + +``` +Agent.getInstance().reset(); +``` diff --git a/tools/dump-coverage/dump_coverage.cc b/tools/dump-coverage/dump_coverage.cc new file mode 100644 index 000000000000..3de1865b8018 --- /dev/null +++ b/tools/dump-coverage/dump_coverage.cc @@ -0,0 +1,239 @@ +// Copyright (C) 2018 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. +// + +#include <android-base/logging.h> +#include <jni.h> +#include <jvmti.h> +#include <string.h> + +#include <atomic> +#include <ctime> +#include <fstream> +#include <iomanip> +#include <iostream> +#include <istream> +#include <memory> +#include <sstream> +#include <string> +#include <vector> + +using std::get; +using std::tuple; +using std::chrono::system_clock; + +namespace dump_coverage { + +#define CHECK_JVMTI(x) CHECK_EQ((x), JVMTI_ERROR_NONE) +#define CHECK_NOTNULL(x) CHECK((x) != nullptr) +#define CHECK_NO_EXCEPTION(env) CHECK(!(env)->ExceptionCheck()); + +static JavaVM* java_vm = nullptr; + +// Get the current JNI environment. +static JNIEnv* GetJNIEnv() { + JNIEnv* env = nullptr; + CHECK_EQ(java_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6), + JNI_OK); + return env; +} + +// Get the JaCoCo Agent class and an instance of the class, given a JNI +// environment. +// Will crash if the Agent isn't found or if any Java Exception occurs. +static tuple<jclass, jobject> GetJavaAgent(JNIEnv* env) { + jclass java_agent_class = + env->FindClass("org/jacoco/agent/rt/internal/Agent"); + CHECK_NOTNULL(java_agent_class); + + jmethodID java_agent_get_instance = + env->GetStaticMethodID(java_agent_class, "getInstance", + "()Lorg/jacoco/agent/rt/internal/Agent;"); + CHECK_NOTNULL(java_agent_get_instance); + + jobject java_agent_instance = + env->CallStaticObjectMethod(java_agent_class, java_agent_get_instance); + CHECK_NO_EXCEPTION(env); + CHECK_NOTNULL(java_agent_instance); + + return tuple(java_agent_class, java_agent_instance); +} + +// Runs equivalent of Agent.getInstance().getExecutionData(false) and returns +// the result. +// Will crash if the Agent isn't found or if any Java Exception occurs. +static jbyteArray GetExecutionData(JNIEnv* env) { + auto java_agent = GetJavaAgent(env); + jmethodID java_agent_get_execution_data = + env->GetMethodID(get<0>(java_agent), "getExecutionData", "(Z)[B"); + CHECK_NO_EXCEPTION(env); + CHECK_NOTNULL(java_agent_get_execution_data); + + jbyteArray java_result_array = (jbyteArray)env->CallObjectMethod( + get<1>(java_agent), java_agent_get_execution_data, false); + CHECK_NO_EXCEPTION(env); + + return java_result_array; +} + +// Gets the filename to write execution data to +// dirname: the directory in which to place the file +// outputs <dirname>/YYYY-MM-DD-HH-MM-SS.SSS.exec +static std::string GetFilename(const std::string& dirname) { + system_clock::time_point time_point = system_clock::now(); + auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(time_point); + auto fractional_time = time_point - seconds; + auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(fractional_time); + + std::time_t time = system_clock::to_time_t(time_point); + auto tm = *std::gmtime(&time); + + std::ostringstream oss; + oss + << dirname + << "/" + << std::put_time(&tm, "%Y-%m-%d-%H-%M-%S.") + << std::setfill('0') << std::setw(3) << millis.count() + << ".ec"; + return oss.str(); +} + +// Writes the execution data to a file +// data, length: represent the data, as a sequence of bytes +// dirname: directory name to contain the file +// returns JNI_ERR if there is an error in writing the file, otherwise JNI_OK. +static jint WriteFile(const char* data, int length, const std::string& dirname) { + auto filename = GetFilename(dirname); + + LOG(INFO) << "Writing file of length " << length << " to '" << filename + << "'"; + std::ofstream file(filename, std::ios::binary); + + if (!file.is_open()) { + LOG(ERROR) << "Could not open file: '" << filename << "'"; + return JNI_ERR; + } + file.write(data, length); + file.close(); + + if (!file) { + LOG(ERROR) << "I/O error in reading file"; + return JNI_ERR; + } + + LOG(INFO) << "Done writing file"; + return JNI_OK; +} + +// Grabs execution data and writes it to a file +// dirname: directory name to contain the file +// returns JNI_ERR if there is an error writing the file. +// Will crash if the Agent isn't found or if any Java Exception occurs. +static jint Dump(const std::string& dirname) { + LOG(INFO) << "Dumping file"; + + JNIEnv* env = GetJNIEnv(); + jbyteArray java_result_array = GetExecutionData(env); + CHECK_NOTNULL(java_result_array); + + jbyte* result_ptr = env->GetByteArrayElements(java_result_array, 0); + CHECK_NOTNULL(result_ptr); + + int result_len = env->GetArrayLength(java_result_array); + + return WriteFile((const char*) result_ptr, result_len, dirname); +} + +// Resets execution data, performing the equivalent of +// Agent.getInstance().reset(); +// args: should be empty +// returns JNI_ERR if the arguments are invalid. +// Will crash if the Agent isn't found or if any Java Exception occurs. +static jint Reset(const std::string& args) { + if (args != "") { + LOG(ERROR) << "reset takes no arguments, but received '" << args << "'"; + return JNI_ERR; + } + + JNIEnv* env = GetJNIEnv(); + auto java_agent = GetJavaAgent(env); + + jmethodID java_agent_reset = + env->GetMethodID(get<0>(java_agent), "reset", "()V"); + CHECK_NOTNULL(java_agent_reset); + + env->CallVoidMethod(get<1>(java_agent), java_agent_reset); + CHECK_NO_EXCEPTION(env); + return JNI_OK; +} + +// Given a string of the form "<a>:<b>" returns (<a>, <b>). +// Given a string <a> that doesn't contain a colon, returns (<a>, ""). +static tuple<std::string, std::string> SplitOnColon(const std::string& options) { + size_t loc_delim = options.find(':'); + std::string command, args; + + if (loc_delim == std::string::npos) { + command = options; + } else { + command = options.substr(0, loc_delim); + args = options.substr(loc_delim + 1, options.length()); + } + return tuple(command, args); +} + +// Parses and executes a command specified by options of the form +// "<command>:<args>" where <command> is either "dump" or "reset". +static jint ParseOptionsAndExecuteCommand(const std::string& options) { + auto split = SplitOnColon(options); + auto command = get<0>(split), args = get<1>(split); + + LOG(INFO) << "command: '" << command << "' args: '" << args << "'"; + + if (command == "dump") { + return Dump(args); + } + + if (command == "reset") { + return Reset(args); + } + + LOG(ERROR) << "Invalid command: expected 'dump' or 'reset' but was '" + << command << "'"; + return JNI_ERR; +} + +static jint AgentStart(JavaVM* vm, char* options) { + android::base::InitLogging(/* argv= */ nullptr); + java_vm = vm; + + return ParseOptionsAndExecuteCommand(options); +} + +// Late attachment (e.g. 'am attach-agent'). +extern "C" JNIEXPORT jint JNICALL +Agent_OnAttach(JavaVM* vm, char* options, void* reserved ATTRIBUTE_UNUSED) { + return AgentStart(vm, options); +} + +// Early attachment. +extern "C" JNIEXPORT jint JNICALL +Agent_OnLoad(JavaVM* jvm ATTRIBUTE_UNUSED, char* options ATTRIBUTE_UNUSED, void* reserved ATTRIBUTE_UNUSED) { + LOG(ERROR) + << "The dumpcoverage agent will not work on load," + << " as it does not have access to the runtime."; + return JNI_ERR; +} + +} // namespace dump_coverage |