diff options
Diffstat (limited to 'core')
65 files changed, 648 insertions, 385 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index dd7c6db5d8fb..a0799394177d 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1421,6 +1421,7 @@ package android.media { method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int abandonAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String); method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int); method @IntRange(from=0) @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public long getFadeOutDurationOnFocusLossMillis(@NonNull android.media.AudioAttributes); + method @NonNull public java.util.List<java.lang.Integer> getReportedSurroundFormats(); method @NonNull public java.util.Map<java.lang.Integer,java.lang.Boolean> getSurroundFormats(); method public boolean hasRegisteredDynamicPolicy(); method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE}) public boolean isFullVolumeDevice(); diff --git a/core/java/Android.bp b/core/java/Android.bp index 6c001f305ce7..26c83eeca508 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -112,6 +112,8 @@ filegroup { srcs: [ "android/os/Temperature.aidl", "android/os/CoolingDevice.aidl", + "android/os/IHintManager.aidl", + "android/os/IHintSession.aidl", "android/os/IThermalEventListener.aidl", "android/os/IThermalStatusListener.aidl", "android/os/IThermalService.aidl", diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 91e2d88ad7cb..4376d225e676 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -406,6 +406,12 @@ public class ActivityManager { public static final int BROADCAST_FAILED_USER_STOPPED = -2; /** + * Type for IActivityManaqer.getIntentSender: this PendingIntent type is unknown. + * @hide + */ + public static final int INTENT_SENDER_UNKNOWN = 0; + + /** * Type for IActivityManaqer.getIntentSender: this PendingIntent is * for a sendBroadcast operation. * @hide @@ -4860,12 +4866,12 @@ public class ActivityManager { */ public static final class PendingIntentInfo implements Parcelable { - private final String mCreatorPackage; + @Nullable private final String mCreatorPackage; private final int mCreatorUid; private final boolean mImmutable; private final int mIntentSenderType; - public PendingIntentInfo(String creatorPackage, int creatorUid, boolean immutable, + public PendingIntentInfo(@Nullable String creatorPackage, int creatorUid, boolean immutable, int intentSenderType) { mCreatorPackage = creatorPackage; mCreatorUid = creatorUid; @@ -4873,6 +4879,7 @@ public class ActivityManager { mIntentSenderType = intentSenderType; } + @Nullable public String getCreatorPackage() { return mCreatorPackage; } diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java index 363b5a75b214..4d6e4aedba66 100644 --- a/core/java/android/app/AppOpsManagerInternal.java +++ b/core/java/android/app/AppOpsManagerInternal.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.app.AppOpsManager.AttributionFlags; import android.content.AttributionSource; import android.os.IBinder; +import android.os.UserHandle; import android.util.SparseArray; import android.util.SparseIntArray; @@ -215,4 +216,11 @@ public abstract class AppOpsManagerInternal { * Sets a global restriction on an op code. */ public abstract void setGlobalRestriction(int code, boolean restricted, IBinder token); + + /** + * Gets the number of tokens restricting the given appop for a user, package, and + * attributionTag. + */ + public abstract int getOpRestrictionCount(int code, UserHandle user, String pkg, + String attributionTag); } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 871d48b07a20..32ea41b2c75f 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -158,7 +158,6 @@ import android.os.IBatteryPropertiesRegistrar; import android.os.IBinder; import android.os.IDumpstate; import android.os.IHardwarePropertiesManager; -import android.os.IHintManager; import android.os.IPowerManager; import android.os.IRecoverySystem; import android.os.ISystemUpdateManager; @@ -600,10 +599,7 @@ public final class SystemServiceRegistry { @Override public PerformanceHintManager createService(ContextImpl ctx) throws ServiceNotFoundException { - IBinder hintBinder = ServiceManager.getServiceOrThrow( - Context.PERFORMANCE_HINT_SERVICE); - IHintManager hintService = IHintManager.Stub.asInterface(hintBinder); - return new PerformanceHintManager(hintService); + return PerformanceHintManager.create(); }}); registerService(Context.RECOVERY_SERVICE, RecoverySystem.class, diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 444cc4eedcb1..85758a92fa98 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -28,11 +28,13 @@ import android.content.LocusId; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Point; +import android.graphics.Rect; import android.os.Build; import android.os.IBinder; import android.os.Parcel; import android.os.RemoteException; import android.util.Log; +import android.view.DisplayCutout; import android.window.TaskSnapshot; import android.window.WindowContainerToken; @@ -174,6 +176,15 @@ public class TaskInfo { public PictureInPictureParams pictureInPictureParams; /** + * The {@link Rect} copied from {@link DisplayCutout#getSafeInsets()} if the cutout is not of + * (LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS), + * {@code null} otherwise. + * @hide + */ + @Nullable + public Rect displayCutoutInsets; + + /** * The activity type of the top activity in this task. * @hide */ @@ -332,6 +343,7 @@ public class TaskInfo { && supportsMultiWindow == that.supportsMultiWindow && Objects.equals(positionInParent, that.positionInParent) && Objects.equals(pictureInPictureParams, that.pictureInPictureParams) + && Objects.equals(displayCutoutInsets, that.displayCutoutInsets) && getWindowingMode() == that.getWindowingMode() && Objects.equals(taskDescription, that.taskDescription) && isFocused == that.isFocused @@ -382,6 +394,7 @@ public class TaskInfo { token = WindowContainerToken.CREATOR.createFromParcel(source); topActivityType = source.readInt(); pictureInPictureParams = source.readTypedObject(PictureInPictureParams.CREATOR); + displayCutoutInsets = source.readTypedObject(Rect.CREATOR); topActivityInfo = source.readTypedObject(ActivityInfo.CREATOR); isResizeable = source.readBoolean(); source.readBinderList(launchCookies); @@ -419,6 +432,7 @@ public class TaskInfo { token.writeToParcel(dest, flags); dest.writeInt(topActivityType); dest.writeTypedObject(pictureInPictureParams, flags); + dest.writeTypedObject(displayCutoutInsets, flags); dest.writeTypedObject(topActivityInfo, flags); dest.writeBoolean(isResizeable); dest.writeBinderList(launchCookies); @@ -447,6 +461,7 @@ public class TaskInfo { + " token=" + token + " topActivityType=" + topActivityType + " pictureInPictureParams=" + pictureInPictureParams + + " displayCutoutSafeInsets=" + displayCutoutInsets + " topActivityInfo=" + topActivityInfo + " launchCookies=" + launchCookies + " positionInParent=" + positionInParent diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 6bc331d323ac..549ab6e2df83 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -10151,8 +10151,8 @@ public class DevicePolicyManager { * An example of a supported preferential network service is the Enterprise * slice on 5G networks. * - * By default, preferential network service is enabled on the work profile on supported - * carriers and devices. Admins can explicitly disable it with this API. + * By default, preferential network service is disabled on the work profile on supported + * carriers and devices. Admins can explicitly enable it with this API. * On fully-managed devices this method is unsupported because all traffic is considered * work traffic. * diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index cf9a6dc5cb96..019bd4493120 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -3740,22 +3740,22 @@ public final class BluetoothAdapter { } /** - * Determines whether a String Bluetooth address, such as "00:43:A8:23:10:F0" + * Determines whether a String Bluetooth address, such as "F0:43:A8:23:10:00" * is a RANDOM STATIC address. * - * RANDOM STATIC: (addr & 0b11) == 0b11 - * RANDOM RESOLVABLE: (addr & 0b11) == 0b10 - * RANDOM non-RESOLVABLE: (addr & 0b11) == 0b00 + * RANDOM STATIC: (addr & 0xC0) == 0xC0 + * RANDOM RESOLVABLE: (addr & 0xC0) == 0x40 + * RANDOM non-RESOLVABLE: (addr & 0xC0) == 0x00 * * @param address Bluetooth address as string - * @return true if the 2 Least Significant Bits of the address equals 0b11. + * @return true if the 2 Most Significant Bits of the address equals 0xC0. * * @hide */ public static boolean isAddressRandomStatic(@NonNull String address) { requireNonNull(address); return checkBluetoothAddress(address) - && (Integer.parseInt(address.split(":")[5], 16) & 0b11) == 0b11; + && (Integer.parseInt(address.split(":")[0], 16) & 0xC0) == 0xC0; } /** {@hide} */ diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java index 0e22705146af..bdb7900b5bb9 100644 --- a/core/java/android/content/AttributionSource.java +++ b/core/java/android/content/AttributionSource.java @@ -252,7 +252,8 @@ public final class AttributionSource implements Parcelable { */ public boolean checkCallingUid() { final int callingUid = Binder.getCallingUid(); - if (callingUid != Process.SYSTEM_UID + if (callingUid != Process.ROOT_UID + && callingUid != Process.SYSTEM_UID && callingUid != mAttributionSourceState.uid) { return false; } diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 9501994fe38a..d9fa56e1cbaa 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -991,13 +991,27 @@ public abstract class CameraMetadata<TKey> { * camera's crop region is set to maximum size, the FOV of the physical streams for the * ultrawide lens will be the same as the logical stream, by making the crop region * smaller than its active array size to compensate for the smaller focal length.</p> - * <p>Even if the underlying physical cameras have different RAW characteristics (such as - * size or CFA pattern), a logical camera can still advertise RAW capability. In this - * 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>There are two ways for the application to capture RAW images from a logical camera + * with RAW capability:</p> + * <ul> + * <li>Because the underlying physical cameras may have different RAW capabilities (such + * as resolution or CFA pattern), to maintain backward compatibility, when a RAW stream + * is configured, the camera device makes sure the default active physical camera remains + * active and does not switch to other physical cameras. (One exception is that, if the + * logical camera consists of identical image sensors and advertises multiple focalLength + * due to different lenses, the camera device may generate RAW images from different + * physical cameras based on the focalLength being set by the application.) This + * backward-compatible approach usually results in loss of optical zoom, to telephoto + * lens or to ultrawide lens.</li> + * <li>Alternatively, to take advantage of the full zoomRatio range of the logical camera, + * the application should use {@link android.hardware.camera2.MultiResolutionImageReader } + * to capture RAW images from the currently active physical camera. Because different + * physical camera may have different RAW characteristics, the application needs to use + * the characteristics and result metadata of the active physical camera for the + * relevant RAW metadata.</li> + * </ul> * <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 + * functionalities will be solely based on the logical camera capability. 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, diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index de32adb1f545..e13a7b6eac65 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -72,9 +72,6 @@ public final class DisplayManager { * {@link #EXTRA_WIFI_DISPLAY_STATUS} extra. * </p><p> * This broadcast is only sent to registered receivers and can only be sent by the system. - * </p><p> - * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission is required to - * receive this broadcast. * </p> * @hide */ diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 12557f9b73eb..c2a2c4c0678c 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -74,7 +74,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan private final IFaceService mService; private final Context mContext; - private IBinder mToken = new Binder(); + private final IBinder mToken = new Binder(); @Nullable private AuthenticationCallback mAuthenticationCallback; @Nullable private FaceDetectionCallback mFaceDetectionCallback; @Nullable private EnrollmentCallback mEnrollmentCallback; @@ -86,7 +86,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan private Face mRemovalFace; private Handler mHandler; - private IFaceServiceReceiver mServiceReceiver = new IFaceServiceReceiver.Stub() { + private final IFaceServiceReceiver mServiceReceiver = new IFaceServiceReceiver.Stub() { @Override // binder call public void onEnrollResult(Face face, int remaining) { @@ -293,7 +293,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan /** * Defaults to {@link FaceManager#enroll(int, byte[], CancellationSignal, EnrollmentCallback, - * int[], Surface)} with {@code surface} set to null. + * int[], Surface)} with {@code previewSurface} set to null. * * @see FaceManager#enroll(int, byte[], CancellationSignal, EnrollmentCallback, int[], Surface) * @hide @@ -301,8 +301,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan @RequiresPermission(MANAGE_BIOMETRIC) public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, EnrollmentCallback callback, int[] disabledFeatures) { - enroll(userId, hardwareAuthToken, cancel, callback, disabledFeatures, null /* surface */, - false /* debugConsent */); + enroll(userId, hardwareAuthToken, cancel, callback, disabledFeatures, + null /* previewSurface */, false /* debugConsent */); } /** @@ -319,14 +319,14 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @param cancel an object that can be used to cancel enrollment * @param userId the user to whom this face will belong to * @param callback an object to receive enrollment events - * @param surface optional camera preview surface for a single-camera device. + * @param previewSurface optional camera preview surface for a single-camera device. * Must be null if not used. * @param debugConsent a feature flag that the user has consented to debug. * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, - EnrollmentCallback callback, int[] disabledFeatures, @Nullable Surface surface, + EnrollmentCallback callback, int[] disabledFeatures, @Nullable Surface previewSurface, boolean debugConsent) { if (callback == null) { throw new IllegalArgumentException("Must supply an enrollment callback"); @@ -346,7 +346,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan mEnrollmentCallback = callback; Trace.beginSection("FaceManager#enroll"); mService.enroll(userId, mToken, hardwareAuthToken, mServiceReceiver, - mContext.getOpPackageName(), disabledFeatures, surface, debugConsent); + mContext.getOpPackageName(), disabledFeatures, previewSurface, + debugConsent); } catch (RemoteException e) { Slog.w(TAG, "Remote exception in enroll: ", e); // Though this may not be a hardware issue, it will cause apps to give up or @@ -853,10 +854,10 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ public static class AuthenticationResult { - private Face mFace; - private CryptoObject mCryptoObject; - private int mUserId; - private boolean mIsStrongBiometric; + private final Face mFace; + private final CryptoObject mCryptoObject; + private final int mUserId; + private final boolean mIsStrongBiometric; /** * Authentication result @@ -1127,7 +1128,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } private class OnAuthenticationCancelListener implements OnCancelListener { - private CryptoObject mCrypto; + private final CryptoObject mCrypto; OnAuthenticationCancelListener(CryptoObject crypto) { mCrypto = crypto; diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 270d662a02a0..b9a49c6ced09 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -75,7 +75,7 @@ interface IFaceService { // Start face enrollment void enroll(int userId, IBinder token, in byte [] hardwareAuthToken, IFaceServiceReceiver receiver, - String opPackageName, in int [] disabledFeatures, in Surface surface, boolean debugConsent); + String opPackageName, in int [] disabledFeatures, in Surface previewSurface, boolean debugConsent); // Start remote face enrollment void enrollRemotely(int userId, IBinder token, in byte [] hardwareAuthToken, IFaceServiceReceiver receiver, diff --git a/core/java/android/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java index 5a25cfc00cd4..ae8d0101947d 100644 --- a/core/java/android/net/nsd/NsdManager.java +++ b/core/java/android/net/nsd/NsdManager.java @@ -23,6 +23,9 @@ import static com.android.internal.util.Preconditions.checkStringNotEmpty; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemService; +import android.app.compat.CompatChanges; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledSince; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; @@ -126,6 +129,24 @@ public final class NsdManager { private static final boolean DBG = false; /** + * When enabled, apps targeting < Android 12 are considered legacy for + * the NSD native daemon. + * The platform will only keep the daemon running as long as there are + * any legacy apps connected. + * + * After Android 12, directly communicate with native daemon might not + * work since the native damon won't always stay alive. + * Use the NSD APIs from NsdManager as the replacement is recommended. + * An another alternative could be bundling your own mdns solutions instead of + * depending on the system mdns native daemon. + * + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.S) + public static final long RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS = 191844585L; + + /** * Broadcast intent action to indicate whether network service discovery is * enabled or disabled. An extra {@link #EXTRA_NSD_STATE} provides the state * information as int. @@ -203,6 +224,9 @@ public final class NsdManager { public static final int DAEMON_CLEANUP = BASE + 21; /** @hide */ + public static final int DAEMON_STARTUP = BASE + 22; + + /** @hide */ public static final int ENABLE = BASE + 24; /** @hide */ public static final int DISABLE = BASE + 25; @@ -232,6 +256,8 @@ public final class NsdManager { EVENT_NAMES.put(RESOLVE_SERVICE, "RESOLVE_SERVICE"); EVENT_NAMES.put(RESOLVE_SERVICE_FAILED, "RESOLVE_SERVICE_FAILED"); EVENT_NAMES.put(RESOLVE_SERVICE_SUCCEEDED, "RESOLVE_SERVICE_SUCCEEDED"); + EVENT_NAMES.put(DAEMON_CLEANUP, "DAEMON_CLEANUP"); + EVENT_NAMES.put(DAEMON_STARTUP, "DAEMON_STARTUP"); EVENT_NAMES.put(ENABLE, "ENABLE"); EVENT_NAMES.put(DISABLE, "DISABLE"); EVENT_NAMES.put(NATIVE_DAEMON_EVENT, "NATIVE_DAEMON_EVENT"); @@ -494,6 +520,12 @@ public final class NsdManager { } catch (InterruptedException e) { fatal("Interrupted wait at init"); } + if (CompatChanges.isChangeEnabled(RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS)) { + return; + } + // Only proactively start the daemon if the target SDK < S, otherwise the internal service + // would automatically start/stop the native daemon as needed. + mAsyncChannel.sendMessage(DAEMON_STARTUP); } private static void fatal(String msg) { diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index d90e129d36f7..b4930fa931eb 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2599,11 +2599,11 @@ public final class Debug public static native long getIonPoolsSizeKb(); /** - * Return GPU DMA buffer usage in kB or -1 on error. + * Returns the global total GPU-private memory in kB or -1 on error. * * @hide */ - public static native long getGpuDmaBufUsageKb(); + public static native long getGpuPrivateMemoryKb(); /** * Return DMA-BUF memory mapped by processes in kB. diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java index 575fc4c8931f..f38271aad867 100644 --- a/core/java/android/os/DropBoxManager.java +++ b/core/java/android/os/DropBoxManager.java @@ -72,7 +72,7 @@ public class DropBoxManager { /** Flag value: Content is human-readable UTF-8 text (can be combined with IS_GZIPPED). */ public static final int IS_TEXT = 2; - /** Flag value: Content can be decompressed with {@link java.util.zip.GZIPOutputStream}. */ + /** Flag value: Content can be decompressed with java.util.zip.GZIPOutputStream. */ public static final int IS_GZIPPED = 4; /** Flag value for serialization only: Value is a byte array, not a file descriptor */ diff --git a/core/java/android/os/PerformanceHintManager.java b/core/java/android/os/PerformanceHintManager.java index 6791844a2a00..a75b5ef6d65e 100644 --- a/core/java/android/os/PerformanceHintManager.java +++ b/core/java/android/os/PerformanceHintManager.java @@ -24,24 +24,23 @@ import android.content.Context; import com.android.internal.util.Preconditions; import java.io.Closeable; -import java.util.ArrayList; /** The PerformanceHintManager allows apps to send performance hint to system. */ @SystemService(Context.PERFORMANCE_HINT_SERVICE) public final class PerformanceHintManager { - private static final String TAG = "PerformanceHintManager"; - private final IHintManager mService; - // HAL preferred update rate - private final long mPreferredRate; + private final long mNativeManagerPtr; /** @hide */ - public PerformanceHintManager(IHintManager service) { - mService = service; - try { - mPreferredRate = mService.getHintSessionPreferredRate(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + public static PerformanceHintManager create() throws ServiceManager.ServiceNotFoundException { + long nativeManagerPtr = nativeAcquireManager(); + if (nativeManagerPtr == 0) { + throw new ServiceManager.ServiceNotFoundException(Context.PERFORMANCE_HINT_SERVICE); } + return new PerformanceHintManager(nativeManagerPtr); + } + + private PerformanceHintManager(long nativeManagerPtr) { + mNativeManagerPtr = nativeManagerPtr; } /** @@ -57,16 +56,13 @@ public final class PerformanceHintManager { */ @Nullable public Session createHintSession(@NonNull int[] tids, long initialTargetWorkDurationNanos) { - try { - IBinder token = new Binder(); - IHintSession session = mService.createHintSession(token, tids, - initialTargetWorkDurationNanos); - if (session == null) return null; - return new Session(session, sNanoClock, mPreferredRate, - initialTargetWorkDurationNanos); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + Preconditions.checkNotNull(tids, "tids cannot be null"); + Preconditions.checkArgumentPositive(initialTargetWorkDurationNanos, + "the hint target duration should be positive."); + long nativeSessionPtr = nativeCreateSession(mNativeManagerPtr, tids, + initialTargetWorkDurationNanos); + if (nativeSessionPtr == 0) return null; + return new Session(nativeSessionPtr); } /** @@ -75,7 +71,7 @@ public final class PerformanceHintManager { * @return the preferred update rate supported by device software. */ public long getPreferredUpdateRateNanos() { - return mPreferredRate; + return nativeGetPreferredUpdateRateNanos(mNativeManagerPtr); } /** @@ -101,28 +97,21 @@ public final class PerformanceHintManager { * <p>All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.</p> */ public static class Session implements Closeable { - private final IHintSession mSession; - private final NanoClock mElapsedRealtimeClock; - // Target duration for choosing update rate - private long mTargetDurationInNanos; - // HAL preferred update rate - private long mPreferredRate; - // Last update timestamp - private long mLastUpdateTimeStamp = -1L; - // Cached samples - private final ArrayList<Long> mActualDurationNanos; - private final ArrayList<Long> mTimeStampNanos; + private long mNativeSessionPtr; + + /** @hide */ + public Session(long nativeSessionPtr) { + mNativeSessionPtr = nativeSessionPtr; + } /** @hide */ - public Session(IHintSession session, NanoClock elapsedRealtimeClock, long preferredRate, - long durationNanos) { - mSession = session; - mElapsedRealtimeClock = elapsedRealtimeClock; - mTargetDurationInNanos = durationNanos; - mPreferredRate = preferredRate; - mActualDurationNanos = new ArrayList<Long>(); - mTimeStampNanos = new ArrayList<Long>(); - mLastUpdateTimeStamp = mElapsedRealtimeClock.nanos(); + @Override + protected void finalize() throws Throwable { + try { + close(); + } finally { + super.finalize(); + } } /** @@ -133,19 +122,7 @@ public final class PerformanceHintManager { public void updateTargetWorkDuration(long targetDurationNanos) { Preconditions.checkArgumentPositive(targetDurationNanos, "the hint target duration" + " should be positive."); - try { - mSession.updateTargetWorkDuration(targetDurationNanos); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - mTargetDurationInNanos = targetDurationNanos; - /** - * Most of the workload is target_duration dependent, so now clear the cached samples - * as they are most likely obsolete. - */ - mActualDurationNanos.clear(); - mTimeStampNanos.clear(); - mLastUpdateTimeStamp = mElapsedRealtimeClock.nanos(); + nativeUpdateTargetWorkDuration(mNativeSessionPtr, targetDurationNanos); } /** @@ -161,38 +138,7 @@ public final class PerformanceHintManager { public void reportActualWorkDuration(long actualDurationNanos) { Preconditions.checkArgumentPositive(actualDurationNanos, "the actual duration should" + " be positive."); - final long now = mElapsedRealtimeClock.nanos(); - mActualDurationNanos.add(actualDurationNanos); - mTimeStampNanos.add(now); - - /** - * Use current sample to determine the rate limit. We can pick a shorter rate limit - * if any sample underperformed, however, it could be the lower level system is slow - * to react. So here we explicitly choose the rate limit with the latest sample. - */ - long rateLimit = - actualDurationNanos > mTargetDurationInNanos ? mPreferredRate - : 10 * mPreferredRate; - - if (now - mLastUpdateTimeStamp <= rateLimit) { - return; - } - Preconditions.checkState(mActualDurationNanos.size() == mTimeStampNanos.size()); - final int size = mActualDurationNanos.size(); - long[] actualDurationArray = new long[size]; - long[] timeStampArray = new long[size]; - for (int i = 0; i < size; i++) { - actualDurationArray[i] = mActualDurationNanos.get(i); - timeStampArray[i] = mTimeStampNanos.get(i); - } - try { - mSession.reportActualWorkDuration(actualDurationArray, timeStampArray); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - mActualDurationNanos.clear(); - mTimeStampNanos.clear(); - mLastUpdateTimeStamp = now; + nativeReportActualWorkDuration(mNativeSessionPtr, actualDurationNanos); } /** @@ -201,26 +147,20 @@ public final class PerformanceHintManager { * <p>Once called, you should not call anything else on this object.</p> */ public void close() { - try { - mSession.close(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + if (mNativeSessionPtr != 0) { + nativeCloseSession(mNativeSessionPtr); + mNativeSessionPtr = 0; } } } - /** - * The interface is to make the FakeClock for testing. - * @hide - */ - public interface NanoClock { - /** Gets the current nanosecond instant of the clock. */ - long nanos(); - } - - private static final NanoClock sNanoClock = new NanoClock() { - public long nanos() { - return SystemClock.elapsedRealtimeNanos(); - } - }; + private static native long nativeAcquireManager(); + private static native long nativeGetPreferredUpdateRateNanos(long nativeManagerPtr); + private static native long nativeCreateSession(long nativeManagerPtr, + int[] tids, long initialTargetWorkDurationNanos); + private static native void nativeUpdateTargetWorkDuration(long nativeSessionPtr, + long targetDurationNanos); + private static native void nativeReportActualWorkDuration(long nativeSessionPtr, + long actualDurationNanos); + private static native void nativeCloseSession(long nativeSessionPtr); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 75e334277ddb..636911c5bd15 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9671,13 +9671,6 @@ public final class Settings { public static final String QS_AUTO_ADDED_TILES = "qs_auto_tiles"; /** - * Whether the Lockdown button should be shown in the power menu. - * @hide - */ - @Readable - public static final String LOCKDOWN_IN_POWER_MENU = "lockdown_in_power_menu"; - - /** * Backup manager behavioral parameters. * This is encoded as a key=value list, separated by commas. Ex: * diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index a6ec399e7d30..362ea8c87f7f 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -115,18 +115,14 @@ public abstract class RecognitionService extends Service { @NonNull AttributionSource attributionSource) { try { if (mCurrentCallback == null) { - Context attributionContext = createContext(new ContextParams.Builder() - .setNextAttributionSource(attributionSource) - .build()); boolean preflightPermissionCheckPassed = checkPermissionForPreflight( - attributionContext.getAttributionSource()); + attributionSource); if (preflightPermissionCheckPassed) { if (DBG) { Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder()); } - mCurrentCallback = new Callback(listener, attributionSource, - attributionContext); + mCurrentCallback = new Callback(listener, attributionSource); RecognitionService.this.onStartListening(intent, mCurrentCallback); } @@ -293,15 +289,8 @@ public abstract class RecognitionService extends Service { private Callback(IRecognitionListener listener, @NonNull AttributionSource attributionSource) { - this(listener, attributionSource, null); - } - - private Callback(IRecognitionListener listener, - @NonNull AttributionSource attributionSource, - @Nullable Context attributionContext) { mListener = listener; mCallingAttributionSource = attributionSource; - mAttributionContext = attributionContext; } /** diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index 4b18c5aae614..bedad7344e9d 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -111,7 +111,12 @@ public class TelephonyRegistryManager { IOnSubscriptionsChangedListener callback = new IOnSubscriptionsChangedListener.Stub() { @Override public void onSubscriptionsChanged () { - executor.execute(() -> listener.onSubscriptionsChanged()); + final long identity = Binder.clearCallingIdentity(); + try { + executor.execute(() -> listener.onSubscriptionsChanged()); + } finally { + Binder.restoreCallingIdentity(identity); + } } }; mSubscriptionChangedListenerMap.put(listener, callback); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 2cefcc9db40e..283a0a1b11fa 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -1101,7 +1101,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall || mWindowSpaceTop != mLocation[1]; final boolean layoutSizeChanged = getWidth() != mScreenRect.width() || getHeight() != mScreenRect.height(); - final boolean hintChanged = viewRoot.getSurfaceTransformHint() != mTransformHint; + final boolean hintChanged = (viewRoot.getSurfaceTransformHint() != mTransformHint) + && mRequestedVisible; if (creating || formatChanged || sizeChanged || visibleChanged || (mUseAlpha && alphaChanged) || windowVisibleChanged || @@ -1247,7 +1248,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // Therefore, we must explicitly recreate the {@link Surface} in these // cases. if (mUseBlastAdapter) { - mSurface.transferFrom(mBlastBufferQueue.createSurfaceWithHandle()); + if (mBlastBufferQueue != null) { + mSurface.transferFrom(mBlastBufferQueue.createSurfaceWithHandle()); + } } else { mSurface.createFrom(mSurfaceControl); } @@ -1257,7 +1260,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private void setBufferSize(Transaction transaction) { if (mUseBlastAdapter) { mBlastSurfaceControl.setTransformHint(mTransformHint); - mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat); + if (mBlastBufferQueue != null) { + mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, + mFormat); + } } else { transaction.setBufferSize(mSurfaceControl, mSurfaceWidth, mSurfaceHeight); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7ec26b674310..a48cafcf74bb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10079,9 +10079,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo( AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i))); - ViewStructure child = structure.newChild(i); - populateVirtualStructure(child, provider, cinfo, forAutofill); - cinfo.recycle(); + if (cinfo != null) { + ViewStructure child = structure.newChild(i); + populateVirtualStructure(child, provider, cinfo, forAutofill); + cinfo.recycle(); + } } } } diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index f28c42a10978..8e7fae7aa061 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -251,7 +251,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener // 2. The session never begun. if (mBeginVsyncId == INVALID_ID) { cancel(REASON_CANCEL_NOT_BEGUN); - } else if (mEndVsyncId == mBeginVsyncId) { + } else if (mEndVsyncId <= mBeginVsyncId) { cancel(REASON_CANCEL_SAME_VSYNC); } else { if (DEBUG) { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index a68a007dad56..8c63f38494ea 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -1106,8 +1106,9 @@ public class BatteryStatsImpl extends BatteryStats { @VisibleForTesting protected PowerProfile mPowerProfile; + @VisibleForTesting @GuardedBy("this") - final Constants mConstants; + protected final Constants mConstants; /* * Holds a SamplingTimer associated with each Resource Power Manager state and voter, diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index a8dcbaffeeb5..6cbace4c65ba 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -241,7 +241,11 @@ public class SystemConfig { private final ArraySet<String> mRollbackWhitelistedPackages = new ArraySet<>(); private final ArraySet<String> mWhitelistedStagedInstallers = new ArraySet<>(); - private final ArraySet<String> mAllowedVendorApexes = new ArraySet<>(); + // A map from package name of vendor APEXes that can be updated to an installer package name + // allowed to install updates for it. + private final ArrayMap<String, String> mAllowedVendorApexes = new ArrayMap<>(); + + private String mModulesInstallerPackageName; /** * Map of system pre-defined, uniquely named actors; keys are namespace, @@ -412,10 +416,14 @@ public class SystemConfig { return mWhitelistedStagedInstallers; } - public Set<String> getAllowedVendorApexes() { + public Map<String, String> getAllowedVendorApexes() { return mAllowedVendorApexes; } + public String getModulesInstallerPackageName() { + return mModulesInstallerPackageName; + } + public ArraySet<String> getAppDataIsolationWhitelistedApps() { return mAppDataIsolationWhitelistedApps; } @@ -1210,12 +1218,21 @@ public class SystemConfig { case "whitelisted-staged-installer": { if (allowAppConfigs) { String pkgname = parser.getAttributeValue(null, "package"); + boolean isModulesInstaller = XmlUtils.readBooleanAttribute( + parser, "isModulesInstaller", false); if (pkgname == null) { Slog.w(TAG, "<" + name + "> without package in " + permFile + " at " + parser.getPositionDescription()); } else { mWhitelistedStagedInstallers.add(pkgname); } + if (isModulesInstaller) { + if (mModulesInstallerPackageName != null) { + throw new IllegalStateException( + "Multiple modules installers"); + } + mModulesInstallerPackageName = pkgname; + } } else { logNotAllowedInPartition(name, permFile, parser); } @@ -1224,11 +1241,18 @@ public class SystemConfig { case "allowed-vendor-apex": { if (allowVendorApex) { String pkgName = parser.getAttributeValue(null, "package"); + String installerPkgName = parser.getAttributeValue( + null, "installerPackage"); if (pkgName == null) { Slog.w(TAG, "<" + name + "> without package in " + permFile + " at " + parser.getPositionDescription()); - } else { - mAllowedVendorApexes.add(pkgName); + } + if (installerPkgName == null) { + Slog.w(TAG, "<" + name + "> without installerPackage in " + permFile + + " at " + parser.getPositionDescription()); + } + if (pkgName != null && installerPkgName != null) { + mAllowedVendorApexes.put(pkgName, installerPkgName); } } else { logNotAllowedInPartition(name, permFile, parser); diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 15122a1ade7b..7b825298acde 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -148,6 +148,7 @@ cc_library_shared { "android_os_MemoryFile.cpp", "android_os_MessageQueue.cpp", "android_os_Parcel.cpp", + "android_os_PerformanceHintManager.cpp", "android_os_SELinux.cpp", "android_os_ServiceManager.cpp", "android_os_SharedMemory.cpp", @@ -239,7 +240,6 @@ cc_library_shared { ], shared_libs: [ - "android.hardware.memtrack-V1-ndk_platform", "audioclient-types-aidl-cpp", "audioflinger-aidl-cpp", "av-types-aidl-cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 5ec6af15c452..268e462704b8 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -144,6 +144,7 @@ extern int register_android_os_NativeHandle(JNIEnv *env); extern int register_android_os_ServiceManager(JNIEnv *env); extern int register_android_os_MessageQueue(JNIEnv* env); extern int register_android_os_Parcel(JNIEnv* env); +extern int register_android_os_PerformanceHintManager(JNIEnv* env); extern int register_android_os_SELinux(JNIEnv* env); extern int register_android_os_VintfObject(JNIEnv *env); extern int register_android_os_VintfRuntimeInfo(JNIEnv *env); @@ -1521,6 +1522,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_SystemProperties), REG_JNI(register_android_os_Binder), REG_JNI(register_android_os_Parcel), + REG_JNI(register_android_os_PerformanceHintManager), REG_JNI(register_android_os_HidlMemory), REG_JNI(register_android_os_HidlSupport), REG_JNI(register_android_os_HwBinder), diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 6e2b9cf250c6..16ee6a745e1d 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1242,6 +1242,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, jstring jDeviceName = NULL; jobject jAudioProfiles = NULL; jobject jAudioDescriptors = nullptr; + ScopedLocalRef<jobject> jPcmFloatProfileFromExtendedInteger(env, nullptr); + bool hasFloat = false; bool useInMask; ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", @@ -1338,6 +1340,25 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, goto exit; } env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, jAudioProfile.get()); + if (nAudioPort->audio_profiles[i].format == AUDIO_FORMAT_PCM_FLOAT) { + hasFloat = true; + } else if (jPcmFloatProfileFromExtendedInteger.get() == nullptr && + audio_is_linear_pcm(nAudioPort->audio_profiles[i].format) && + audio_bytes_per_sample(nAudioPort->audio_profiles[i].format) > 2) { + jPcmFloatProfileFromExtendedInteger.reset( + env->NewObject(gAudioProfileClass, gAudioProfileCstor, + audioFormatFromNative(AUDIO_FORMAT_PCM_FLOAT), + jSamplingRates.get(), jChannelMasks.get(), + jChannelIndexMasks.get(), encapsulationType)); + } + } + if (!hasFloat && jPcmFloatProfileFromExtendedInteger.get() != nullptr) { + // R and earlier compatibility - add ENCODING_PCM_FLOAT to the end + // (replacing the zero pad). This ensures pre-S apps that look + // for ENCODING_PCM_FLOAT continue to see that encoding if the device supports + // extended precision integers. + env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, + jPcmFloatProfileFromExtendedInteger.get()); } jAudioDescriptors = env->NewObject(gArrayListClass, gArrayListMethods.cstor); diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 41804480122c..4c2b114c724a 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -33,7 +33,6 @@ #include <string> #include <vector> -#include <aidl/android/hardware/memtrack/DeviceInfo.h> #include <android-base/logging.h> #include <bionic/malloc.h> #include <debuggerd/client.h> @@ -46,7 +45,6 @@ #include "jni.h" #include <dmabufinfo/dmabuf_sysfs_stats.h> #include <dmabufinfo/dmabufinfo.h> -#include <dmabufinfo/dmabuf_sysfs_stats.h> #include <meminfo/procmeminfo.h> #include <meminfo/sysmeminfo.h> #include <memtrack/memtrack.h> @@ -861,29 +859,24 @@ static jlong android_os_Debug_getDmabufHeapPoolsSizeKb(JNIEnv* env, jobject claz return poolsSizeKb; } -static jlong android_os_Debug_getGpuDmaBufUsageKb(JNIEnv* env, jobject clazz) { - std::vector<aidl::android::hardware::memtrack::DeviceInfo> gpu_device_info; - if (!memtrack_gpu_device_info(&gpu_device_info)) { +static jlong android_os_Debug_getGpuPrivateMemoryKb(JNIEnv* env, jobject clazz) { + struct memtrack_proc* p = memtrack_proc_new(); + if (p == nullptr) { + LOG(ERROR) << "getGpuPrivateMemoryKb: Failed to create memtrack_proc"; return -1; } - dmabufinfo::DmabufSysfsStats stats; - if (!GetDmabufSysfsStats(&stats)) { + // Memtrack hal defines PID 0 as global total for GPU-private (GL) memory. + if (memtrack_proc_get(p, 0) != 0) { + // The memtrack HAL may not be available, avoid flooding the log. + memtrack_proc_destroy(p); return -1; } - jlong sizeKb = 0; - const auto& importer_stats = stats.importer_info(); - for (const auto& dev_info : gpu_device_info) { - const auto& importer_info = importer_stats.find(dev_info.name); - if (importer_info == importer_stats.end()) { - continue; - } - - sizeKb += importer_info->second.size / 1024; - } + ssize_t gpuPrivateMem = memtrack_proc_gl_pss(p); - return sizeKb; + memtrack_proc_destroy(p); + return gpuPrivateMem / 1024; } static jlong android_os_Debug_getDmabufMappedSizeKb(JNIEnv* env, jobject clazz) { @@ -994,8 +987,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_getIonHeapsSizeKb }, { "getDmabufTotalExportedKb", "()J", (void*)android_os_Debug_getDmabufTotalExportedKb }, - { "getGpuDmaBufUsageKb", "()J", - (void*)android_os_Debug_getGpuDmaBufUsageKb }, + { "getGpuPrivateMemoryKb", "()J", + (void*)android_os_Debug_getGpuPrivateMemoryKb }, { "getDmabufHeapTotalExportedKb", "()J", (void*)android_os_Debug_getDmabufHeapTotalExportedKb }, { "getIonPoolsSizeKb", "()J", diff --git a/core/jni/android_os_PerformanceHintManager.cpp b/core/jni/android_os_PerformanceHintManager.cpp new file mode 100644 index 000000000000..d05a24fe7c6e --- /dev/null +++ b/core/jni/android_os_PerformanceHintManager.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "PerfHint-jni" + +#include "jni.h" + +#include <dlfcn.h> +#include <nativehelper/JNIHelp.h> +#include <nativehelper/ScopedPrimitiveArray.h> +#include <utils/Log.h> +#include <vector> + +#include "core_jni_helpers.h" + +namespace android { + +namespace { + +struct APerformanceHintManager; +struct APerformanceHintSession; + +typedef APerformanceHintManager* (*APH_getManager)(); +typedef APerformanceHintSession* (*APH_createSession)(APerformanceHintManager*, const int32_t*, + size_t, int64_t); +typedef int64_t (*APH_getPreferredUpdateRateNanos)(APerformanceHintManager* manager); +typedef void (*APH_updateTargetWorkDuration)(APerformanceHintSession*, int64_t); +typedef void (*APH_reportActualWorkDuration)(APerformanceHintSession*, int64_t); +typedef void (*APH_closeSession)(APerformanceHintSession* session); + +bool gAPerformanceHintBindingInitialized = false; +APH_getManager gAPH_getManagerFn = nullptr; +APH_createSession gAPH_createSessionFn = nullptr; +APH_getPreferredUpdateRateNanos gAPH_getPreferredUpdateRateNanosFn = nullptr; +APH_updateTargetWorkDuration gAPH_updateTargetWorkDurationFn = nullptr; +APH_reportActualWorkDuration gAPH_reportActualWorkDurationFn = nullptr; +APH_closeSession gAPH_closeSessionFn = nullptr; + +void ensureAPerformanceHintBindingInitialized() { + if (gAPerformanceHintBindingInitialized) return; + + void* handle_ = dlopen("libandroid.so", RTLD_NOW | RTLD_NODELETE); + LOG_ALWAYS_FATAL_IF(handle_ == nullptr, "Failed to dlopen libandroid.so!"); + + gAPH_getManagerFn = (APH_getManager)dlsym(handle_, "APerformanceHint_getManager"); + LOG_ALWAYS_FATAL_IF(gAPH_getManagerFn == nullptr, + "Failed to find required symbol APerformanceHint_getManager!"); + + gAPH_createSessionFn = (APH_createSession)dlsym(handle_, "APerformanceHint_createSession"); + LOG_ALWAYS_FATAL_IF(gAPH_createSessionFn == nullptr, + "Failed to find required symbol APerformanceHint_createSession!"); + + gAPH_getPreferredUpdateRateNanosFn = + (APH_getPreferredUpdateRateNanos)dlsym(handle_, + "APerformanceHint_getPreferredUpdateRateNanos"); + LOG_ALWAYS_FATAL_IF(gAPH_getPreferredUpdateRateNanosFn == nullptr, + "Failed to find required symbol " + "APerformanceHint_getPreferredUpdateRateNanos!"); + + gAPH_updateTargetWorkDurationFn = + (APH_updateTargetWorkDuration)dlsym(handle_, + "APerformanceHint_updateTargetWorkDuration"); + LOG_ALWAYS_FATAL_IF(gAPH_updateTargetWorkDurationFn == nullptr, + "Failed to find required symbol " + "APerformanceHint_updateTargetWorkDuration!"); + + gAPH_reportActualWorkDurationFn = + (APH_reportActualWorkDuration)dlsym(handle_, + "APerformanceHint_reportActualWorkDuration"); + LOG_ALWAYS_FATAL_IF(gAPH_reportActualWorkDurationFn == nullptr, + "Failed to find required symbol " + "APerformanceHint_reportActualWorkDuration!"); + + gAPH_closeSessionFn = (APH_closeSession)dlsym(handle_, "APerformanceHint_closeSession"); + LOG_ALWAYS_FATAL_IF(gAPH_closeSessionFn == nullptr, + "Failed to find required symbol APerformanceHint_closeSession!"); + + gAPerformanceHintBindingInitialized = true; +} + +} // namespace + +static jlong nativeAcquireManager(JNIEnv* env, jclass clazz) { + ensureAPerformanceHintBindingInitialized(); + return reinterpret_cast<jlong>(gAPH_getManagerFn()); +} + +static jlong nativeGetPreferredUpdateRateNanos(JNIEnv* env, jclass clazz, jlong nativeManagerPtr) { + ensureAPerformanceHintBindingInitialized(); + return gAPH_getPreferredUpdateRateNanosFn( + reinterpret_cast<APerformanceHintManager*>(nativeManagerPtr)); +} + +static jlong nativeCreateSession(JNIEnv* env, jclass clazz, jlong nativeManagerPtr, jintArray tids, + jlong initialTargetWorkDurationNanos) { + ensureAPerformanceHintBindingInitialized(); + if (tids == nullptr) return 0; + std::vector<int32_t> tidsVector; + ScopedIntArrayRO tidsArray(env, tids); + for (size_t i = 0; i < tidsArray.size(); ++i) { + tidsVector.push_back(static_cast<int32_t>(tidsArray[i])); + } + return reinterpret_cast<jlong>( + gAPH_createSessionFn(reinterpret_cast<APerformanceHintManager*>(nativeManagerPtr), + tidsVector.data(), tidsVector.size(), + initialTargetWorkDurationNanos)); +} + +static void nativeUpdateTargetWorkDuration(JNIEnv* env, jclass clazz, jlong nativeSessionPtr, + jlong targetDurationNanos) { + ensureAPerformanceHintBindingInitialized(); + gAPH_updateTargetWorkDurationFn(reinterpret_cast<APerformanceHintSession*>(nativeSessionPtr), + targetDurationNanos); +} + +static void nativeReportActualWorkDuration(JNIEnv* env, jclass clazz, jlong nativeSessionPtr, + jlong actualDurationNanos) { + ensureAPerformanceHintBindingInitialized(); + gAPH_reportActualWorkDurationFn(reinterpret_cast<APerformanceHintSession*>(nativeSessionPtr), + actualDurationNanos); +} + +static void nativeCloseSession(JNIEnv* env, jclass clazz, jlong nativeSessionPtr) { + ensureAPerformanceHintBindingInitialized(); + gAPH_closeSessionFn(reinterpret_cast<APerformanceHintSession*>(nativeSessionPtr)); +} + +static const JNINativeMethod gPerformanceHintMethods[] = { + {"nativeAcquireManager", "()J", (void*)nativeAcquireManager}, + {"nativeGetPreferredUpdateRateNanos", "(J)J", (void*)nativeGetPreferredUpdateRateNanos}, + {"nativeCreateSession", "(J[IJ)J", (void*)nativeCreateSession}, + {"nativeUpdateTargetWorkDuration", "(JJ)V", (void*)nativeUpdateTargetWorkDuration}, + {"nativeReportActualWorkDuration", "(JJ)V", (void*)nativeReportActualWorkDuration}, + {"nativeCloseSession", "(J)V", (void*)nativeCloseSession}, +}; + +int register_android_os_PerformanceHintManager(JNIEnv* env) { + return RegisterMethodsOrDie(env, "android/os/PerformanceHintManager", gPerformanceHintMethods, + NELEM(gPerformanceHintMethods)); +} + +} // namespace android diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index ed0e0c5ea529..e28cbd8cf1a1 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -910,7 +910,7 @@ static void DetachDescriptors(JNIEnv* env, for (int fd : fds_to_close) { ALOGV("Switching descriptor %d to /dev/null", fd); - if (dup3(devnull_fd, fd, O_CLOEXEC) == -1) { + if (TEMP_FAILURE_RETRY(dup3(devnull_fd, fd, O_CLOEXEC)) == -1) { fail_fn(StringPrintf("Failed dup3() on descriptor %d: %s", fd, strerror(errno))); } } diff --git a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp index 5fe96ede202e..248db76da71d 100644 --- a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp +++ b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp @@ -426,7 +426,7 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly( tmp_pid >>= 8; } pid_buf[4] = 0; // Process is not wrapped. - int res = write(session_socket, pid_buf, 5); + int res = TEMP_FAILURE_RETRY(write(session_socket, pid_buf, 5)); if (res != 5) { if (res == -1) { (first_time ? fail_fn_1 : fail_fn_n) @@ -451,18 +451,18 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly( } // We've now seen either a disconnect or connect request. close(session_socket); - int new_fd = accept(zygote_socket_fd, nullptr, nullptr); + int new_fd = TEMP_FAILURE_RETRY(accept(zygote_socket_fd, nullptr, nullptr)); if (new_fd == -1) { fail_fn_z(CREATE_ERROR("Accept(%d) failed: %s", zygote_socket_fd, strerror(errno))); } if (new_fd != session_socket) { // Move new_fd back to the old value, so that we don't have to change Java-level data // structures to reflect a change. This implicitly closes the old one. - if (dup2(new_fd, session_socket) != session_socket) { + if (TEMP_FAILURE_RETRY(dup2(new_fd, session_socket)) != session_socket) { fail_fn_z(CREATE_ERROR("Failed to move fd %d to %d: %s", new_fd, session_socket, strerror(errno))); } - close(new_fd); + close(new_fd); // On Linux, fd is closed even if EINTR is returned. } // If we ever return, we effectively reuse the old Java ZygoteConnection. // None of its state needs to change. diff --git a/core/res/res/drawable/ic_lock.xml b/core/res/res/drawable/ic_lock.xml index c30f96330378..75845c69d284 100644 --- a/core/res/res/drawable/ic_lock.xml +++ b/core/res/res/drawable/ic_lock.xml @@ -14,23 +14,19 @@ Copyright (C) 2019 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="26dp" - android:height="36dp" - android:viewportWidth="26" - android:viewportHeight="36"> + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> <path - android:fillColor="#FF000000" - android:pathData="M13.75 27.5 C15.13,27.5 16.25,26.38 16.25,25 C16.25,23.62 15.13,22.5 13.75,22.5 C12.37,22.5 11.25,23.62 11.25,25 C11.25,26.38 12.37,27.5 13.75,27.5c " /> + android:pathData="M16,22C17.1046,22 18,21.1046 18,20C18,18.8954 17.1046,18 16,18C14.8954,18 14,18.8954 14,20C14,21.1046 14.8954,22 16,22Z" + android:fillColor="#FF000000"/> <path - android:strokeColor="#FF000000" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2.5" - android:pathData="M4.5 15 C4.5,15 23,15 23,15 C24.1,15 25,15.9 25,17 C25,17 25,33 25,33 C25,34.1 24.1,35 23,35 C23,35 4.5,35 4.5,35 C3.4,35 2.5,34.1 2.5,33 C2.5,33 2.5,17 2.5,17 C2.5,15.9 3.4,15 4.5,15c " /> + android:pathData="M9,12L23,12A2,2 0,0 1,25 14L25,26A2,2 0,0 1,23 28L9,28A2,2 0,0 1,7 26L7,14A2,2 0,0 1,9 12z" + android:strokeWidth="2" + android:strokeColor="#FF000000"/> <path - android:strokeColor="#FF000000" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2.5" - android:pathData="M7.5 15 C7.5,15 7.5,8.61 7.5,8.61 C7.5,5.24 10.3,2.5 13.75,2.5 C17.2,2.5 20,5.24 20,8.61 C20,8.61 20,15 20,15 " /> + android:pathData="M11,12V6.8889C11,4.1888 13.2386,2 16,2C18.7614,2 21,4.1888 21,6.8889V12" + android:strokeWidth="2" + android:strokeColor="#FF000000"/> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/ic_lock_open.xml b/core/res/res/drawable/ic_lock_open.xml index abe6ddebb845..7e386187ddae 100644 --- a/core/res/res/drawable/ic_lock_open.xml +++ b/core/res/res/drawable/ic_lock_open.xml @@ -14,23 +14,16 @@ Copyright (C) 2019 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="36dp" - android:width="34dp" - android:viewportHeight="36" - android:viewportWidth="34"> - <path - android:fillColor="#FF000000" - android:pathData="M13.75 27.5 C15.13,27.5 16.25,26.38 16.25,25 C16.25,23.62 15.13,22.5 13.75,22.5 C12.37,22.5 11.25,23.62 11.25,25 C11.25,26.38 12.37,27.5 13.75,27.5c " /> - <path - android:strokeColor="#FF000000" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2.5" - android:pathData=" M4.5 15 C4.5,15 23,15 23,15 C24.1,15 25,15.9 25,17 C25,17 25,33 25,33 C25,34.1 24.1,35 23,35 C23,35 4.5,35 4.5,35 C3.4,35 2.5,34.1 2.5,33 C2.5,33 2.5,17 2.5,17 C2.5,15.9 3.4,15 4.5,15c " /> - <path - android:strokeColor="#FF000000" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2.5" - android:pathData="M20 15 C20,15 20,8.61 20,8.61 C20,5.24 22.8,2.5 26.25,2.5 C29.7,2.5 32.5,5.24 32.5,8.61 C32.5,8.61 32.5,15 32.5,15 " /> -</vector>
\ No newline at end of file + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <group> + <clip-path + android:pathData="M0,0h32v32h-32z"/> + <path + android:pathData="M22.25,6.8889C22.25,4.9055 23.9023,3.25 26,3.25C28.0977,3.25 29.75,4.9055 29.75,6.8889V12H32.25V6.8889C32.25,3.4721 29.4251,0.75 26,0.75C22.5749,0.75 19.75,3.4721 19.75,6.8889V10.75H9C7.2051,10.75 5.75,12.2051 5.75,14V26C5.75,27.7949 7.2051,29.25 9,29.25H23C24.7949,29.25 26.25,27.7949 26.25,26V14C26.25,12.2051 24.7949,10.75 23,10.75H22.25V6.8889ZM9,13.25C8.5858,13.25 8.25,13.5858 8.25,14V26C8.25,26.4142 8.5858,26.75 9,26.75H23C23.4142,26.75 23.75,26.4142 23.75,26V14C23.75,13.5858 23.4142,13.25 23,13.25H9ZM16,22C17.1046,22 18,21.1046 18,20C18,18.8954 17.1046,18 16,18C14.8954,18 14,18.8954 14,20C14,21.1046 14.8954,22 16,22Z" + android:fillColor="#FF000000" + android:fillType="evenOdd"/> + </group> +</vector> diff --git a/core/res/res/layout/notification_template_conversation_header.xml b/core/res/res/layout/notification_template_conversation_header.xml index 2faff412565e..eec49fe97b9d 100644 --- a/core/res/res/layout/notification_template_conversation_header.xml +++ b/core/res/res/layout/notification_template_conversation_header.xml @@ -27,7 +27,6 @@ android:id="@+id/conversation_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title" android:textSize="16sp" android:singleLine="true" @@ -40,7 +39,6 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" - android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" android:text="@string/notification_header_divider_symbol" android:singleLine="true" android:visibility="gone" @@ -53,7 +51,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" - android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" android:singleLine="true" android:visibility="gone" /> @@ -64,7 +61,6 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" - android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" android:text="@string/notification_header_divider_symbol" android:singleLine="true" android:visibility="gone" @@ -96,7 +92,6 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" - android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" android:text="@string/notification_header_divider_symbol" android:singleLine="true" android:visibility="gone" @@ -106,7 +101,7 @@ android:id="@+id/verification_icon" android:layout_width="@dimen/notification_verification_icon_size" android:layout_height="@dimen/notification_verification_icon_size" - android:layout_marginStart="4dp" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" android:baseline="10dp" android:scaleType="fitCenter" android:src="@drawable/ic_notifications_alerted" @@ -142,7 +137,7 @@ android:id="@+id/phishing_alert" android:layout_width="@dimen/notification_phishing_alert_size" android:layout_height="@dimen/notification_phishing_alert_size" - android:layout_marginStart="4dp" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" android:baseline="10dp" android:scaleType="fitCenter" android:src="@drawable/ic_dialog_alert_material" @@ -154,7 +149,7 @@ android:id="@+id/profile_badge" android:layout_width="@dimen/notification_badge_size" android:layout_height="@dimen/notification_badge_size" - android:layout_marginStart="4dp" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" android:baseline="10dp" android:scaleType="fitCenter" android:visibility="gone" @@ -165,7 +160,7 @@ android:id="@+id/alerted_icon" android:layout_width="@dimen/notification_alerted_size" android:layout_height="@dimen/notification_alerted_size" - android:layout_marginStart="4dp" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" android:baseline="10dp" android:contentDescription="@string/notification_alerted_content_description" android:scaleType="fitCenter" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 7ea226b2b261..2f68cdab4a03 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1949,10 +1949,10 @@ <string name="maximize_button_text" msgid="4258922519914732645">"বড় করুন"</string> <string name="close_button_text" msgid="10603510034455258">"বন্ধ করুন"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"উত্তর"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"উত্তর দিন"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ভিডিও"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"বাতিল করুন"</string> - <string name="call_notification_hang_up_action" msgid="9130720590159188131">"কল কেটে দেওয়া"</string> + <string name="call_notification_hang_up_action" msgid="9130720590159188131">"কল কেটে দিন"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"ইনকামিং কল"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"চালু থাকা কল"</string> <string name="call_notification_screening_text" msgid="8396931408268940208">"ইনকামিং কল স্ক্রিনিং করা হচ্ছে"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 088495e9eee4..542387f2047e 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2012,7 +2012,7 @@ <string name="app_category_productivity" msgid="1844422703029557883">"Effizienz"</string> <string name="app_category_accessibility" msgid="6643521607848547683">"Bedienungshilfen"</string> <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Gerätespeicher"</string> - <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB-Fehlerbehebung"</string> + <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB-Debugging"</string> <string name="time_picker_hour_label" msgid="4208590187662336864">"Stunde"</string> <string name="time_picker_minute_label" msgid="8307452311269824553">"Minute"</string> <string name="time_picker_header_text" msgid="9073802285051516688">"Uhrzeit einstellen"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 2f8deaf97111..55fa1453caf8 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1955,7 +1955,7 @@ <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Raccrocher"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"Appel entrant"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"Appel en cours"</string> - <string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrer un appel entrant"</string> + <string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrage d\'un appel entrant"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 141da9c1c719..76f54ff26b09 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1949,7 +1949,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"Maximizar"</string> <string name="close_button_text" msgid="10603510034455258">"Pechar"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"Resposta"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"Contestar"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Vídeo"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"Rexeitar"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Colgar"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index f51a9a5c8fe0..5add36bd2005 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -815,7 +815,7 @@ <string name="phoneTypeTtyTdd" msgid="532038552105328779">"TTY TDD"</string> <string name="phoneTypeWorkMobile" msgid="7522314392003565121">"કાર્યાલય મોબાઇલ"</string> <string name="phoneTypeWorkPager" msgid="3748332310638505234">"કાર્ય પેજર"</string> - <string name="phoneTypeAssistant" msgid="757550783842231039">"Assistant"</string> + <string name="phoneTypeAssistant" msgid="757550783842231039">"આસિસ્ટંટ"</string> <string name="phoneTypeMms" msgid="1799747455131365989">"MMS"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"કસ્ટમ"</string> <string name="eventTypeBirthday" msgid="7770026752793912283">"જન્મદિવસ"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index cd8cb90ae608..716e97c70768 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2011,7 +2011,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"הגדלה"</string> <string name="close_button_text" msgid="10603510034455258">"סגירה"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"תשובה"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"מענה"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"וידאו"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"דחייה"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ניתוק"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index a9226379b446..30a62e3d8df0 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -437,7 +437,7 @@ <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"位置情報提供者の追加コマンドアクセス"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"位置情報提供元の追加のコマンドにアクセスすることをアプリに許可します。許可すると、アプリがGPSなどの位置情報源の動作を妨害する恐れがあります。"</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"フォアグラウンドでのみ正確な位置情報にアクセス"</string> - <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"このアプリは、使用中に、位置情報サービスからデバイスの正確な位置情報を取得できます。アプリが位置情報を取得するには、デバイスで位置情報サービスがオンになっている必要があります。この場合、バッテリー使用量が増えることがあります。"</string> + <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"このアプリは、使用中に、位置情報サービスからデバイスの正確な位置情報を取得できます。アプリが位置情報を取得するには、デバイスで位置情報サービスが ON になっている必要があります。この場合、バッテリー使用量が増えることがあります。"</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"フォアグラウンドでのみおおよその位置情報にアクセス"</string> <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"このアプリは、使用中に、位置情報サービスからデバイスのおおよその位置情報を取得できます。アプリが位置情報を取得するには、デバイスで位置情報サービスがオンになっている必要があります。"</string> <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"バックグラウンドでの位置情報へのアクセス"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 0a121539c5a9..ed2f964d29e7 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1952,7 +1952,7 @@ <string name="call_notification_answer_action" msgid="5999246836247132937">"ಉತ್ತರಿಸಿ"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ವೀಡಿಯೊ"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"ನಿರಾಕರಿಸಿ"</string> - <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ಹ್ಯಾಂಗ್ ಅಪ್"</string> + <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ಕರೆ ಕೊನೆಗೊಳಿಸಿ"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"ಒಳಬರುವ ಕರೆ"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string> <string name="call_notification_screening_text" msgid="8396931408268940208">"ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index f5d16fcb3f7f..ea8fe228896a 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1949,7 +1949,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"최대화"</string> <string name="close_button_text" msgid="10603510034455258">"닫기"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"답변"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"통화"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"동영상"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"거절"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"전화 끊기"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c64160c793da..44172ea0438e 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -815,7 +815,7 @@ <string name="phoneTypeTtyTdd" msgid="532038552105328779">"TTY TDD"</string> <string name="phoneTypeWorkMobile" msgid="7522314392003565121">"ഓഫീസ് മൊബൈല്"</string> <string name="phoneTypeWorkPager" msgid="3748332310638505234">"ഔദ്യോഗിക പേജര്"</string> - <string name="phoneTypeAssistant" msgid="757550783842231039">"Assistant"</string> + <string name="phoneTypeAssistant" msgid="757550783842231039">"അസിസ്റ്റന്റ്"</string> <string name="phoneTypeMms" msgid="1799747455131365989">"MMS"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"ഇഷ്ടാനുസൃതം"</string> <string name="eventTypeBirthday" msgid="7770026752793912283">"ജന്മദിനം"</string> @@ -1955,7 +1955,7 @@ <string name="call_notification_hang_up_action" msgid="9130720590159188131">"കോൾ നിർത്തുക"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"ഇൻകമിംഗ് കോൾ"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"സജീവമായ കോൾ"</string> - <string name="call_notification_screening_text" msgid="8396931408268940208">"ഇൻകമിംഗ് കോൾ സ്ക്രീൻ ചെയ്യൽ"</string> + <string name="call_notification_screening_text" msgid="8396931408268940208">"ഇൻകമിംഗ് കോൾ സ്ക്രീൻ ചെയ്യുന്നു"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> എണ്ണം തിരഞ്ഞെടുത്തു</item> <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> എണ്ണം തിരഞ്ഞെടുത്തു</item> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index c156c6a90596..0bf24d7bcc10 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1949,7 +1949,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"Maksimumkan"</string> <string name="close_button_text" msgid="10603510034455258">"Tutup"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"Jawapan"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"Jawab"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"Tolak"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Tamatkan Panggilan"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 36af211f07b3..12f8cd427d7f 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1949,7 +1949,7 @@ <string name="maximize_button_text" msgid="4258922519914732645">"ठुलो बनाउनुहोस्"</string> <string name="close_button_text" msgid="10603510034455258">"बन्द गर्नुहोस्"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"कलको जवाफ दिनु…"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"जवाफ दिनुहोस्"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"भिडियो"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"अस्वीकार गर्नुहोस्"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"फोन राख्नुहोस्"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 85464afadf56..11d6e7f4cfa1 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -266,7 +266,7 @@ <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"ସାଉଣ୍ଡ ଅଫ୍ ଅଛି"</string> <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"ସାଉଣ୍ଡ ଚାଲୁ ଅଛି"</string> <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string> - <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି"</string> + <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"ଏୟାରପ୍ଲେନ୍ ମୋଡ୍ ଚାଲୁ ଅଛି"</string> <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍ ଅଫ୍ ଅଛି"</string> <string name="global_action_settings" msgid="4671878836947494217">"ସେଟିଂସ୍"</string> <string name="global_action_assist" msgid="2517047220311505805">"ସହାୟକ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 209c6a1fb88c..264829636af7 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -306,7 +306,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"ਟਿਕਾਣਾ"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"ਕੈਲੰਡਰ"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string> @@ -815,7 +815,7 @@ <string name="phoneTypeTtyTdd" msgid="532038552105328779">"TTY TDD"</string> <string name="phoneTypeWorkMobile" msgid="7522314392003565121">"ਕੰਮ ਦਾ ਮੋਬਾਈਲ"</string> <string name="phoneTypeWorkPager" msgid="3748332310638505234">"ਦਫ਼ਤਰ ਦਾ ਪੇਜਰ"</string> - <string name="phoneTypeAssistant" msgid="757550783842231039">"Assistant"</string> + <string name="phoneTypeAssistant" msgid="757550783842231039">"ਸਹਾਇਕ"</string> <string name="phoneTypeMms" msgid="1799747455131365989">"MMS"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"ਵਿਉਂਂਤੀ"</string> <string name="eventTypeBirthday" msgid="7770026752793912283">"ਜਨਮਦਿਨ"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 57e1cb0e4e74..5a336ae237e5 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -266,8 +266,8 @@ <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"Som desativado"</string> <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"O som está ativado"</string> <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"Modo de avião"</string> - <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"O modo de voo está ativado"</string> - <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"O modo de voo está desativado"</string> + <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"Modo de avião ativado"</string> + <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"Modo de avião desativado"</string> <string name="global_action_settings" msgid="4671878836947494217">"Definições"</string> <string name="global_action_assist" msgid="2517047220311505805">"Assistência"</string> <string name="global_action_voice_assist" msgid="6655788068555086695">"Assist. de voz"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index afdf1d9a4b21..67b0ce0d50b1 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -26,7 +26,7 @@ <string name="gigabyteShort" msgid="7515809460261287991">"GB"</string> <string name="terabyteShort" msgid="1822367128583886496">"TB"</string> <string name="petabyteShort" msgid="5651571254228534832">"PB"</string> - <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g>U+00A0<xliff:g id="UNIT">%2$s</xliff:g>"</string> + <string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="untitled" msgid="3381766946944136678">"<Bez mena>"</string> <string name="emptyPhoneNumber" msgid="5812172618020360048">"(žiadne telefónne číslo)"</string> <string name="unknownName" msgid="7078697621109055330">"Bez názvu"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 3568871008cd..d68c088d5867 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1949,10 +1949,10 @@ <string name="maximize_button_text" msgid="4258922519914732645">"గరిష్టీకరించు"</string> <string name="close_button_text" msgid="10603510034455258">"మూసివేయి"</string> <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> - <string name="call_notification_answer_action" msgid="5999246836247132937">"సమాధానం ఇవ్వు"</string> + <string name="call_notification_answer_action" msgid="5999246836247132937">"పికప్ చేయండి"</string> <string name="call_notification_answer_video_action" msgid="2086030940195382249">"వీడియో కాల్"</string> - <string name="call_notification_decline_action" msgid="3700345945214000726">"తిరస్కరించండి"</string> - <string name="call_notification_hang_up_action" msgid="9130720590159188131">"కాల్ ముగించు"</string> + <string name="call_notification_decline_action" msgid="3700345945214000726">"కట్ చేయండి"</string> + <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ముగించండి"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"ఇన్కమింగ్ కాల్"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"కాల్ కొనసాగుతోంది"</string> <string name="call_notification_screening_text" msgid="8396931408268940208">"ఇన్కమింగ్ కాల్ను స్క్రీన్ చేయండి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index ed7ae5ba82df..379830a8a189 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1994,7 +1994,7 @@ <string name="pin_target" msgid="8036028973110156895">"ปักหมุด"</string> <string name="pin_specific_target" msgid="7824671240625957415">"ตรึง <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="unpin_target" msgid="3963318576590204447">"เลิกปักหมุด"</string> - <string name="unpin_specific_target" msgid="3859828252160908146">"เลิกตรึง <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="unpin_specific_target" msgid="3859828252160908146">"เลิกปักหมุด <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"ข้อมูลแอป"</string> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"กำลังเริ่มการสาธิต…"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index bc1c66447c25..3325e7e96d5e 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1953,8 +1953,8 @@ <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string> <string name="call_notification_decline_action" msgid="3700345945214000726">"Reddet"</string> <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Kapat"</string> - <string name="call_notification_incoming_text" msgid="6143109825406638201">"Gelen çağrı"</string> - <string name="call_notification_ongoing_text" msgid="3880832933933020875">"Devam eden çağrı"</string> + <string name="call_notification_incoming_text" msgid="6143109825406638201">"Gelen arama"</string> + <string name="call_notification_ongoing_text" msgid="3880832933933020875">"Devam eden arama"</string> <string name="call_notification_screening_text" msgid="8396931408268940208">"Gelen arama süzülüyor"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe seçildi</item> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 1b4598add33a..4912be887d9e 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -2017,7 +2017,7 @@ <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Завершити"</string> <string name="call_notification_incoming_text" msgid="6143109825406638201">"Вхідний виклик"</string> <string name="call_notification_ongoing_text" msgid="3880832933933020875">"Активний виклик"</string> - <string name="call_notification_screening_text" msgid="8396931408268940208">"Фільтрування вхідного виклику"</string> + <string name="call_notification_screening_text" msgid="8396931408268940208">"Вхідний виклик (Фільтр)"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> <item quantity="few">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 49d4a6a6b99c..a1031ebb7a7e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4427,14 +4427,14 @@ 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 + <!-- Attribution path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalAttributionPath" translatable="false"> + M20,10h2v8h-2z M20,20h2v2h-2z </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> + should be cut out to display config_signalAttributionPath. --> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">7</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">17</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 --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b578bcefcb3a..5ee7f74f31e8 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3387,7 +3387,7 @@ <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="string" name="config_signalAttributionPath" /> <java-symbol type="dimen" name="config_signalCutoutWidthFraction" /> <java-symbol type="dimen" name="config_signalCutoutHeightFraction" /> diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 6f17ea994699..fb820cb2f5e5 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -286,6 +286,7 @@ public class ActivityThreadTest { } @Test + @FlakyTest(bugId = 194242735) public void testHandleActivityConfigurationChanged_EnsureUpdatesProcessedInOrder() throws Exception { final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); diff --git a/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java b/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java index d51004c08585..07e4333e74b1 100644 --- a/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java +++ b/core/tests/coretests/src/android/app/appsearch/AppSearchSessionUnitTest.java @@ -16,6 +16,8 @@ package android.app.appsearch; +import static android.app.appsearch.SearchSpec.TERM_MATCH_PREFIX; + import static com.google.common.truth.Truth.assertThat; import static org.testng.Assert.expectThrows; @@ -30,6 +32,8 @@ import com.android.server.appsearch.testing.AppSearchEmail; import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -100,4 +104,127 @@ public class AppSearchSessionUnitTest { .isEqualTo(AppSearchResult.RESULT_INTERNAL_ERROR); assertThat(appSearchException.getMessage()).startsWith("NullPointerException"); } + + @Test + public void testGetEmptyNextPage() throws Exception { + // Set the schema. + CompletableFuture<AppSearchResult<SetSchemaResponse>> schemaFuture = + new CompletableFuture<>(); + mSearchSession.setSchema( + new SetSchemaRequest.Builder() + .addSchemas(new AppSearchSchema.Builder("schema1").build()) + .setForceOverride(true).build(), + mExecutor, mExecutor, schemaFuture::complete); + schemaFuture.get().getResultValue(); + + // Create a document and index it. + GenericDocument document1 = new GenericDocument.Builder<>("namespace", "id1", + "schema1").build(); + CompletableFuture<AppSearchBatchResult<String, Void>> putDocumentsFuture = + new CompletableFuture<>(); + mSearchSession.put( + new PutDocumentsRequest.Builder().addGenericDocuments(document1).build(), + mExecutor, new BatchResultCallback<String, Void>() { + @Override + public void onResult(AppSearchBatchResult<String, Void> result) { + putDocumentsFuture.complete(result); + } + + @Override + public void onSystemError(Throwable throwable) { + putDocumentsFuture.completeExceptionally(throwable); + } + }); + putDocumentsFuture.get(); + + // Search and get the first page. + SearchSpec searchSpec = new SearchSpec.Builder() + .setTermMatch(TERM_MATCH_PREFIX) + .setResultCountPerPage(1) + .build(); + SearchResults searchResults = mSearchSession.search("", searchSpec); + + CompletableFuture<AppSearchResult<List<SearchResult>>> getNextPageFuture = + new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + List<SearchResult> results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(1); + assertThat(results.get(0).getGenericDocument()).isEqualTo(document1); + + // We get all documents, and it shouldn't fail if we keep calling getNextPage(). + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).isEmpty(); + } + + @Test + public void testGetEmptyNextPage_multiPages() throws Exception { + // Set the schema. + CompletableFuture<AppSearchResult<SetSchemaResponse>> schemaFuture = + new CompletableFuture<>(); + mSearchSession.setSchema( + new SetSchemaRequest.Builder() + .addSchemas(new AppSearchSchema.Builder("schema1").build()) + .setForceOverride(true).build(), + mExecutor, mExecutor, schemaFuture::complete); + schemaFuture.get().getResultValue(); + + // Create a document and insert 3 package1 documents + GenericDocument document1 = new GenericDocument.Builder<>("namespace", "id1", + "schema1").build(); + GenericDocument document2 = new GenericDocument.Builder<>("namespace", "id2", + "schema1").build(); + GenericDocument document3 = new GenericDocument.Builder<>("namespace", "id3", + "schema1").build(); + CompletableFuture<AppSearchBatchResult<String, Void>> putDocumentsFuture = + new CompletableFuture<>(); + mSearchSession.put( + new PutDocumentsRequest.Builder() + .addGenericDocuments(document1, document2, document3).build(), + mExecutor, new BatchResultCallback<String, Void>() { + @Override + public void onResult(AppSearchBatchResult<String, Void> result) { + putDocumentsFuture.complete(result); + } + + @Override + public void onSystemError(Throwable throwable) { + putDocumentsFuture.completeExceptionally(throwable); + } + }); + putDocumentsFuture.get(); + + // Search for only 2 result per page + SearchSpec searchSpec = new SearchSpec.Builder() + .setTermMatch(TERM_MATCH_PREFIX) + .setResultCountPerPage(2) + .build(); + SearchResults searchResults = mSearchSession.search("", searchSpec); + + // Get the first page, it contains 2 results. + List<GenericDocument> outDocs = new ArrayList<>(); + CompletableFuture<AppSearchResult<List<SearchResult>>> getNextPageFuture = + new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + List<SearchResult> results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(2); + outDocs.add(results.get(0).getGenericDocument()); + outDocs.add(results.get(1).getGenericDocument()); + + // Get the second page, it contains only 1 result. + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).hasSize(1); + outDocs.add(results.get(0).getGenericDocument()); + + assertThat(outDocs).containsExactly(document1, document2, document3); + + // We get all documents, and it shouldn't fail if we keep calling getNextPage(). + getNextPageFuture = new CompletableFuture<>(); + searchResults.getNextPage(mExecutor, getNextPageFuture::complete); + results = getNextPageFuture.get().getResultValue(); + assertThat(results).isEmpty(); + } } diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java index 6884f13d4cc9..3d820acf2d22 100644 --- a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java +++ b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java @@ -62,4 +62,18 @@ public class GenericDocumentTest { assertThat(outDoc.getPropertyDocument("propDocument").getPropertyBytesArray("propBytes")) .isEqualTo(new byte[][] {{3, 4}}); } + + @Test + public void testPutLargeDocument_exceedLimit() throws Exception { + // Create a String property that has a very large property. + char[] chars = new char[10_000_000]; + String property = new StringBuilder().append(chars).append("the end.").toString(); + + GenericDocument doc = + new GenericDocument.Builder<>("namespace", "id1", "schema1") + .setPropertyString("propString", property) + .build(); + + assertThat(doc.getPropertyString("propString")).isEqualTo(property); + } } diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java index 7dea82d7ee54..69eb13f7854a 100644 --- a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java +++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java @@ -22,12 +22,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeNotNull; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import android.os.PerformanceHintManager.Session; @@ -120,92 +114,9 @@ public class PerformanceHintManagerTest { } @Test - public void testRateLimitWithDurationFastEnough() throws Exception { - FakeClock fakeClock = new FakeClock(); - Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166); - - reset(mIHintSessionMock); - fakeClock.setNow(0); - s.updateTargetWorkDuration(TARGET_166); - - s.reportActualWorkDuration(TARGET_166 - 1); - s.reportActualWorkDuration(TARGET_166); - // we should not see update as the rate should be 10X for over-perform case. - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(10 * RATE_1000); - s.reportActualWorkDuration(TARGET_166); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(1); - s.reportActualWorkDuration(TARGET_166); - // we should see update after rate limit - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166 - 1, TARGET_166, TARGET_166, TARGET_166}), - eq(new long[] {0, 0, 10 * RATE_1000, 10 * RATE_1000 + 1})); - - reset(mIHintSessionMock); - s.reportActualWorkDuration(TARGET_166); - s.reportActualWorkDuration(TARGET_166 - 1); - s.reportActualWorkDuration(TARGET_166 - 2); - // we should not see update as the rate should be 10X for over-perform case. - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - fakeClock.incrementClock(10 * RATE_1000 + 1); - s.reportActualWorkDuration(TARGET_166); - s.reportActualWorkDuration(TARGET_166 - 1); - // we should see update now - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166, TARGET_166 - 1, TARGET_166 - 2, TARGET_166}), - eq(new long[] {10 * RATE_1000 + 1, 10 * RATE_1000 + 1, 10 * RATE_1000 + 1, - (10 * RATE_1000 + 1) * 2})); - } - - @Test - public void testRateLimitWithDurationTooSlow() throws Exception { - FakeClock fakeClock = new FakeClock(); - Session s = new Session(mIHintSessionMock, fakeClock, RATE_1000, TARGET_166); - - reset(mIHintSessionMock); - fakeClock.setNow(0); - s.updateTargetWorkDuration(TARGET_166); - - verify(mIHintSessionMock, times(1)).updateTargetWorkDuration(eq(TARGET_166)); - // shouldn't update before rate limit - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - - // shouldn't update when the time is exactly at rate limit - fakeClock.incrementClock(RATE_1000); - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, never()).reportActualWorkDuration(any(), any()); - - // should be ready for sending hint - fakeClock.incrementClock(1); - s.reportActualWorkDuration(TARGET_166 + 1); - verify(mIHintSessionMock, times(1)).reportActualWorkDuration( - eq(new long[] {TARGET_166 + 1, TARGET_166 + 1, TARGET_166 + 1}), - eq(new long[] {0 , RATE_1000, RATE_1000 + 1})); - } - - @Test public void testCloseHintSession() { Session s = createSession(); assumeNotNull(s); s.close(); } - - private static class FakeClock implements PerformanceHintManager.NanoClock { - private long mCurrentTime = 0L; - - @Override - public long nanos() { - return mCurrentTime; - } - - public void setNow(long nanos) { - mCurrentTime = nanos; - } - - public void incrementClock(long nanos) { - mCurrentTime += nanos; - } - } } diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index c8f8ca9fd5b0..96b4316ffafc 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -257,21 +257,14 @@ public class FrameTrackerTest { } @Test - public void testRemoveObserversWhenCancelledInEnd() { + public void testCancelIfEndVsyncIdEqualsToBeginVsyncId() { when(mChoreographer.getVsyncId()).thenReturn(100L); mTracker.begin(); verify(mRenderer, only()).addObserver(any()); - // send first frame - not janky - sendFrame(4, JANK_NONE, 100L); - - // send another frame - should be considered janky - sendFrame(40, JANK_APP_DEADLINE_MISSED, 101L); - // end the trace session when(mChoreographer.getVsyncId()).thenReturn(101L); mTracker.end(FrameTracker.REASON_END_NORMAL); - sendFrame(4, JANK_NONE, 102L); // Since the begin vsync id (101) equals to the end vsync id (101), will be treat as cancel. verify(mTracker).cancel(FrameTracker.REASON_CANCEL_SAME_VSYNC); @@ -284,6 +277,26 @@ public class FrameTrackerTest { } @Test + public void testCancelIfEndVsyncIdLessThanBeginVsyncId() { + when(mChoreographer.getVsyncId()).thenReturn(100L); + mTracker.begin(); + verify(mRenderer, only()).addObserver(any()); + + // end the trace session at the same vsync id, end vsync id will less than the begin one. + // Because the begin vsync id is supposed to the next frame, + mTracker.end(FrameTracker.REASON_END_NORMAL); + + // The begin vsync id (101) is larger than the end one (100), will be treat as cancel. + verify(mTracker).cancel(FrameTracker.REASON_CANCEL_SAME_VSYNC); + + // Observers should be removed in this case, or FrameTracker object will be leaked. + verify(mTracker).removeObservers(); + + // Should never trigger Perfetto since it is a cancel. + verify(mTracker, never()).triggerPerfetto(); + } + + @Test public void testCancelWhenSessionNeverBegun() { mTracker.cancel(FrameTracker.REASON_CANCEL_NORMAL); verify(mTracker).removeObservers(); diff --git a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java index 8ec1559861f3..c153b38d3f02 100644 --- a/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/InteractionJankMonitorTest.java @@ -99,6 +99,8 @@ public class InteractionJankMonitorTest { new FrameMetricsWrapper(), /*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1, null)); doReturn(tracker).when(monitor).createFrameTracker(any(), any()); + doNothing().when(tracker).triggerPerfetto(); + doNothing().when(tracker).postTraceStartMarker(); // Simulate a trace session and see if begin / end are invoked. assertThat(monitor.begin(mView, session.getCuj())).isTrue(); @@ -146,6 +148,8 @@ public class InteractionJankMonitorTest { new FrameMetricsWrapper(), /*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1, null)); doReturn(tracker).when(monitor).createFrameTracker(any(), any()); + doNothing().when(tracker).triggerPerfetto(); + doNothing().when(tracker).postTraceStartMarker(); assertThat(monitor.begin(mView, session.getCuj())).isTrue(); verify(tracker).begin(); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java index 24baa93337ba..cca66420c596 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java @@ -69,11 +69,11 @@ public class BatteryStatsImplTest { when(mKernelSingleUidTimeReader.singleUidCpuTimesAvailable()).thenReturn(true); mBatteryStatsImpl = new MockBatteryStatsImpl() .setKernelCpuUidFreqTimeReader(mKernelUidCpuFreqTimeReader) - .setKernelSingleUidTimeReader(mKernelSingleUidTimeReader); + .setKernelSingleUidTimeReader(mKernelSingleUidTimeReader) + .setTrackingCpuByProcStateEnabled(true); } @Test - @SkipPresubmit("b/180015146") public void testUpdateProcStateCpuTimes() { mBatteryStatsImpl.setOnBatteryInternal(true); mBatteryStatsImpl.updateTimeBasesLocked(false, Display.STATE_ON, 0, 0); @@ -231,7 +231,6 @@ public class BatteryStatsImplTest { } @Test - @SkipPresubmit("b/180015146") public void testCopyFromAllUidsCpuTimes() { mBatteryStatsImpl.setOnBatteryInternal(false); mBatteryStatsImpl.updateTimeBasesLocked(false, Display.STATE_ON, 0, 0); diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index 80def71ce812..99d576d259ec 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -174,6 +174,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return this; } + public MockBatteryStatsImpl setTrackingCpuByProcStateEnabled(boolean enabled) { + mConstants.TRACK_CPU_TIMES_BY_PROC_STATE = enabled; + return this; + } + public SparseIntArray getPendingUids() { return mPendingUids; } |