diff options
88 files changed, 1795 insertions, 1067 deletions
diff --git a/Android.bp b/Android.bp index 0dbe07c6b496..afd8bfd26ac4 100644 --- a/Android.bp +++ b/Android.bp @@ -64,278 +64,13 @@ license { } filegroup { - name: "framework-core-sources", - srcs: [ - "core/java/**/*.java", - "core/java/**/*.aidl", - ], - path: "core/java", -} - -// These are subset of framework-core-sources that are needed by the -// android.test.mock library. The implementation of android.test.mock references -// private members of various components to allow mocking of classes that cannot -// be mocked without access to those internal implementation details. -filegroup { - name: "framework-core-sources-for-test-mock", - srcs: [ - "core/java/android/accounts/AccountManagerCallback.java", - "core/java/android/accounts/AccountManagerFuture.java", - "core/java/android/accounts/AccountManager.java", - "core/java/android/accounts/AccountsException.java", - "core/java/android/accounts/AuthenticatorException.java", - "core/java/android/accounts/OperationCanceledException.java", - "core/java/android/annotation/AnimatorRes.java", - "core/java/android/annotation/AnimRes.java", - "core/java/android/annotation/AnyRes.java", - "core/java/android/annotation/ArrayRes.java", - "core/java/android/annotation/AttrRes.java", - "core/java/android/annotation/BoolRes.java", - "core/java/android/annotation/BroadcastBehavior.java", - "core/java/android/annotation/CallbackExecutor.java", - "core/java/android/annotation/CallSuper.java", - "core/java/android/annotation/CheckResult.java", - "core/java/android/annotation/ColorInt.java", - "core/java/android/annotation/ColorRes.java", - "core/java/android/annotation/DimenRes.java", - "core/java/android/annotation/DrawableRes.java", - "core/java/android/annotation/FontRes.java", - "core/java/android/annotation/FractionRes.java", - "core/java/android/annotation/IntDef.java", - "core/java/android/annotation/IntegerRes.java", - "core/java/android/annotation/IntRange.java", - "core/java/android/annotation/LayoutRes.java", - "core/java/android/annotation/NonNull.java", - "core/java/android/annotation/Nullable.java", - "core/java/android/annotation/PluralsRes.java", - "core/java/android/annotation/RawRes.java", - "core/java/android/annotation/RequiresPermission.java", - "core/java/android/annotation/SdkConstant.java", - "core/java/android/annotation/Size.java", - "core/java/android/annotation/StringDef.java", - "core/java/android/annotation/StringRes.java", - "core/java/android/annotation/StyleableRes.java", - "core/java/android/annotation/StyleRes.java", - "core/java/android/annotation/SuppressLint.java", - "core/java/android/annotation/SystemApi.java", - "core/java/android/annotation/SystemService.java", - "core/java/android/annotation/TestApi.java", - "core/java/android/annotation/UserIdInt.java", - "core/java/android/annotation/XmlRes.java", - "core/java/android/app/Application.java", - "core/java/android/app/IApplicationThread.aidl", - "core/java/android/app/IServiceConnection.aidl", - "core/java/android/app/PackageDeleteObserver.java", - "core/java/android/content/ComponentCallbacks2.java", - "core/java/android/content/ComponentCallbacks.java", - "core/java/android/content/ContentInterface.java", - "core/java/android/content/ContentProvider.java", - "core/java/android/content/ContentProviderNative.java", - "core/java/android/content/ContentResolver.java", - "core/java/android/content/Context.java", - "core/java/android/content/ContextWrapper.java", - "core/java/android/content/DialogInterface.java", - "core/java/android/content/IContentProvider.java", - "core/java/android/content/Intent.java", - "core/java/android/content/IntentSender.java", - "core/java/android/content/OperationApplicationException.java", - "core/java/android/content/pm/ActivityInfo.java", - "core/java/android/content/pm/ApplicationInfo.java", - "core/java/android/content/pm/InstantAppInfo.java", - "core/java/android/content/pm/IPackageDataObserver.aidl", - "core/java/android/content/pm/KeySet.java", - "core/java/android/content/pm/PackageManager.java", - "core/java/android/content/pm/VerifierDeviceIdentity.java", - "core/java/android/content/res/Resources.java", - "core/java/android/database/CrossProcessCursor.java", - "core/java/android/database/CrossProcessCursorWrapper.java", - "core/java/android/database/Cursor.java", - "core/java/android/database/CursorWrapper.java", - "core/java/android/os/Binder.java", - "core/java/android/os/Bundle.java", - "core/java/android/os/IBinder.java", - "core/java/android/os/IInterface.java", - "core/java/android/os/Parcelable.java", - "core/java/android/os/ParcelFileDescriptor.java", - "core/java/android/os/RemoteException.java", - "core/java/android/os/storage/VolumeInfo.java", - "core/java/android/util/AndroidException.java", - "core/java/android/view/DisplayAdjustments.java", - "core/java/android/view/ViewDebug.java", - "core/java/com/android/internal/annotations/VisibleForTesting.java", - ], - path: "core/java", - visibility: ["//frameworks/base/test-mock"], -} - -filegroup { - name: "framework-drm-sources", - srcs: [ - "drm/java/**/*.java", - ], - path: "drm/java", -} - -filegroup { - name: "framework-graphics-sources", - srcs: [ - "graphics/java/**/*.java", - "graphics/java/**/*.aidl", - ], - path: "graphics/java", -} - -filegroup { - name: "framework-identity-sources", - srcs: [ - "identity/java/**/*.java", - ], - path: "identity/java", -} - -filegroup { - name: "framework-keystore-sources", - srcs: [ - "keystore/java/**/*.java", - "keystore/java/**/*.aidl", - ], - path: "keystore/java", -} - -filegroup { - name: "framework-location-sources", - srcs: [ - "location/java/**/*.java", - "location/java/**/*.aidl", - ], - path: "location/java", -} - -filegroup { - name: "framework-lowpan-sources", - srcs: [ - "lowpan/java/**/*.java", - "lowpan/java/**/*.aidl", - ], - path: "lowpan/java", -} - -filegroup { - name: "framework-media-sources", - srcs: [ - "media/java/**/*.java", - "media/java/**/*.aidl", - ], - path: "media/java", -} - -filegroup { - name: "framework-mca-effect-sources", - srcs: [ - "media/mca/effect/java/**/*.java", - ], - path: "media/mca/effect/java", -} - -filegroup { - name: "framework-mca-filterfw-sources", - srcs: [ - "media/mca/filterfw/java/**/*.java", - ], - path: "media/mca/filterfw/java", -} - -filegroup { - name: "framework-mca-filterpacks-sources", - srcs: [ - "media/mca/filterpacks/java/**/*.java", - ], - path: "media/mca/filterpacks/java", -} - -filegroup { - name: "framework-mime-sources", - srcs: [ - "mime/java/**/*.java", - ], - path: "mime/java", -} - -filegroup { - name: "framework-opengl-sources", - srcs: [ - "opengl/java/**/*.java", - ], - path: "opengl/java", -} - -filegroup { - name: "framework-rs-sources", - srcs: [ - "rs/java/**/*.java", - ], - path: "rs/java", -} - -filegroup { - name: "framework-sax-sources", - srcs: [ - "sax/java/**/*.java", - ], - path: "sax/java", -} - -filegroup { - name: "framework-telecomm-sources", - srcs: [ - "telecomm/java/**/*.java", - "telecomm/java/**/*.aidl", - ], - path: "telecomm/java", -} - -filegroup { - name: "framework-telephony-sources", - srcs: [ - "telephony/java/**/*.java", - "telephony/java/**/*.aidl", - ], - path: "telephony/java", -} - -genrule { - name: "statslog-telephony-common-java-gen", - tools: ["stats-log-api-gen"], - cmd: "$(location stats-log-api-gen) --java $(out) --module telephony_common" + - " --javaPackage com.android.internal.telephony --javaClass TelephonyCommonStatsLog", - out: ["com/android/internal/telephony/TelephonyCommonStatsLog.java"], -} - -filegroup { - name: "framework-telephony-common-sources", - srcs: [ - "telephony/common/**/*.java", - ":statslog-telephony-common-java-gen", - ], -} - -filegroup { - name: "framework-mms-sources", - srcs: [ - "mms/java/**/*.java", - "mms/java/**/*.aidl", - ], - path: "mms/java", -} - -filegroup { name: "framework-non-updatable-sources", srcs: [ // Java/AIDL sources under frameworks/base ":framework-blobstore-sources", ":framework-core-sources", ":framework-drm-sources", - ":framework-graphics-sources", + ":framework-graphics-nonupdatable-sources", ":framework-jobscheduler-sources", // jobscheduler is not a module for R ":framework-keystore-sources", ":framework-identity-sources", @@ -399,22 +134,6 @@ filegroup { ], } -filegroup { - name: "framework-updatable-sources", - srcs: [ - ":framework-connectivity-sources", - ":framework-mediaprovider-sources", - ":framework-permission-sources", - ":framework-sdkextensions-sources", - ":framework-statsd-sources", - ":framework-tethering-srcs", - ":framework-wifi-updatable-sources", - ":ike-srcs", - ":updatable-media-srcs", - ], - visibility: ["//visibility:private"], -} - java_library { name: "framework-updatable-stubs-module_libs_api", static_libs: [ @@ -454,15 +173,6 @@ java_library { ], } -filegroup { - name: "framework-all-sources", - srcs: [ - ":framework-mime-sources", - ":framework-non-updatable-sources", - ":framework-updatable-sources", - ], -} - // AIDL files under these paths are mixture of public and private ones. // They shouldn't be exported across module boundaries. java_defaults { @@ -764,13 +474,21 @@ gensrcs { filegroup { name: "framework-annotations", srcs: [ + "core/java/android/annotation/AnyThread.java", + "core/java/android/annotation/AppIdInt.java", + "core/java/android/annotation/BytesLong.java", "core/java/android/annotation/CallbackExecutor.java", + "core/java/android/annotation/CallSuper.java", "core/java/android/annotation/CheckResult.java", "core/java/android/annotation/CurrentTimeMillisLong.java", + "core/java/android/annotation/CurrentTimeSecondsLong.java", + "core/java/android/annotation/DrawableRes.java", + "core/java/android/annotation/DurationMillisLong.java", "core/java/android/annotation/Hide.java", "core/java/android/annotation/IntDef.java", "core/java/android/annotation/IntRange.java", "core/java/android/annotation/LongDef.java", + "core/java/android/annotation/MainThread.java", "core/java/android/annotation/NonNull.java", "core/java/android/annotation/Nullable.java", "core/java/android/annotation/RequiresPermission.java", @@ -779,10 +497,11 @@ filegroup { "core/java/android/annotation/SystemApi.java", "core/java/android/annotation/SystemService.java", "core/java/android/annotation/TestApi.java", + "core/java/android/annotation/UserIdInt.java", "core/java/android/annotation/WorkerThread.java", "core/java/com/android/internal/annotations/GuardedBy.java", - "core/java/com/android/internal/annotations/VisibleForTesting.java", "core/java/com/android/internal/annotations/Immutable.java", + "core/java/com/android/internal/annotations/VisibleForTesting.java", ], } @@ -796,7 +515,6 @@ filegroup { name: "framework-ike-shared-srcs", visibility: ["//packages/modules/IPsec"], srcs: [ - "core/java/android/annotation/StringDef.java", "core/java/android/net/annotations/PolicyDirection.java", "core/java/com/android/internal/util/HexDump.java", "core/java/com/android/internal/util/IState.java", @@ -1207,36 +925,6 @@ python_binary_host { ], } -filegroup { - name: "framework-media-annotation-srcs", - srcs: [ - ":framework-annotations", - "core/java/android/annotation/CallbackExecutor.java", - "core/java/android/annotation/CallSuper.java", - "core/java/android/annotation/DrawableRes.java", - "core/java/android/annotation/LongDef.java", - "core/java/android/annotation/StringDef.java", - ], -} - -filegroup { - name: "framework-mediaprovider-annotation-sources", - srcs: [ - ":framework-annotations", - "core/java/android/annotation/BytesLong.java", - "core/java/android/annotation/CurrentTimeSecondsLong.java", - "core/java/android/annotation/DurationMillisLong.java", - ], -} - -// Creates an index of AIDL methods; used for adding UnsupportedAppUsage -// annotations to private apis -aidl_mapping { - name: "framework-aidl-mappings", - srcs: [":framework-all-sources"], - output: "framework-aidl-mappings.txt", -} - // Avoid including Parcelable classes as we don't want to have two copies of // Parcelable cross the libraries. This is used by telephony-common (frameworks/opt/telephony) // and TeleService app (packages/services/Telephony). @@ -1358,6 +1046,19 @@ metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.x "--api-lint-ignore-prefix junit. " + "--api-lint-ignore-prefix org. " +filegroup { + name: "framework-non-updatable-stub-sources", + srcs: [ + ":framework-mime-sources", // mimemap builds separately but has no separate droidstubs. + ":framework-non-updatable-sources", + ":opt-telephony-srcs", + ":opt-net-voip-srcs", + "core/java/**/*.logtags", + "**/package.html", + ], + visibility: ["//visibility:private"], +} + build = [ "StubLibraries.bp", "ApiDocs.bp", diff --git a/ApiDocs.bp b/ApiDocs.bp index ada80bbc9874..d3bef7f9046b 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -58,16 +58,24 @@ framework_docs_only_libs = [ stubs_defaults { name: "framework-doc-stubs-default", srcs: [ - ":framework-mime-sources", - ":framework-non-updatable-sources", - ":framework-updatable-sources", - "core/java/**/*.logtags", - "test-base/src/**/*.java", - ":opt-telephony-srcs", - ":opt-net-voip-srcs", + ":framework-non-updatable-stub-sources", + + // Module sources ":art.module.public.api{.public.stubs.source}", ":conscrypt.module.public.api{.public.stubs.source}", + ":framework-connectivity-sources", + ":framework-mediaprovider-sources", + ":framework-permission-sources", + ":framework-sdkextensions-sources", + ":framework-statsd-sources", + ":framework-tethering-srcs", + ":framework-wifi-updatable-sources", ":i18n.module.public.api{.public.stubs.source}", + ":ike-srcs", + ":updatable-media-srcs", + + // No longer part of the stubs, but are included in the docs. + "test-base/src/**/*.java", "test-mock/src/**/*.java", "test-runner/src/**/*.java", ], diff --git a/StubLibraries.bp b/StubLibraries.bp index 6316c4a6f19f..1644a550aca5 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -42,13 +42,7 @@ packages_to_document = [ stubs_defaults { name: "metalava-non-updatable-api-stubs-default", - srcs: [ - ":framework-non-updatable-sources", - "core/java/**/*.logtags", - ":opt-telephony-srcs", - ":opt-net-voip-srcs", - "**/package.html", - ], + srcs: [":framework-non-updatable-stub-sources"], sdk_version: "none", system_modules: "none", java_version: "1.8", diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java index 2f5f555817ec..26010ef6d55c 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java @@ -532,18 +532,23 @@ public final class JobStore { /** * Write out a tag with data identifying this job's constraints. If the constraint isn't here * it doesn't apply. + * TODO: b/183455312 Update this code to use proper serialization for NetworkRequest, + * because currently store is not including everything (like, UIDs, bandwidth, + * signal strength etc. are lost). */ private void writeConstraintsToXml(XmlSerializer out, JobStatus jobStatus) throws IOException { out.startTag(null, XML_TAG_PARAMS_CONSTRAINTS); if (jobStatus.hasConnectivityConstraint()) { final NetworkRequest network = jobStatus.getJob().getRequiredNetwork(); + // STOPSHIP b/183071974: improve the scheme for backward compatibility and + // mainline cleanliness. out.attribute(null, "net-capabilities", Long.toString( - BitUtils.packBits(network.networkCapabilities.getCapabilities()))); + BitUtils.packBits(network.getCapabilities()))); out.attribute(null, "net-unwanted-capabilities", Long.toString( - BitUtils.packBits(network.networkCapabilities.getUnwantedCapabilities()))); + BitUtils.packBits(network.getUnwantedCapabilities()))); out.attribute(null, "net-transport-types", Long.toString( - BitUtils.packBits(network.networkCapabilities.getTransportTypes()))); + BitUtils.packBits(network.getTransportTypes()))); } if (jobStatus.hasIdleConstraint()) { out.attribute(null, "idle", Boolean.toString(true)); @@ -967,18 +972,23 @@ public final class JobStore { null, "net-unwanted-capabilities"); final String netTransportTypes = parser.getAttributeValue(null, "net-transport-types"); if (netCapabilities != null && netTransportTypes != null) { - final NetworkRequest request = new NetworkRequest.Builder().build(); + final NetworkRequest.Builder builder = new NetworkRequest.Builder() + .clearCapabilities(); final long unwantedCapabilities = netUnwantedCapabilities != null ? Long.parseLong(netUnwantedCapabilities) - : BitUtils.packBits(request.networkCapabilities.getUnwantedCapabilities()); - + : BitUtils.packBits(builder.build().getUnwantedCapabilities()); // We're okay throwing NFE here; caught by caller - request.networkCapabilities.setCapabilities( - BitUtils.unpackBits(Long.parseLong(netCapabilities)), - BitUtils.unpackBits(unwantedCapabilities)); - request.networkCapabilities.setTransportTypes( - BitUtils.unpackBits(Long.parseLong(netTransportTypes))); - jobBuilder.setRequiredNetwork(request); + for (int capability : BitUtils.unpackBits(Long.parseLong(netCapabilities))) { + builder.addCapability(capability); + } + for (int unwantedCapability : BitUtils.unpackBits( + Long.parseLong(netUnwantedCapabilities))) { + builder.addUnwantedCapability(unwantedCapability); + } + for (int transport : BitUtils.unpackBits(Long.parseLong(netTransportTypes))) { + builder.addTransportType(transport); + } + jobBuilder.setRequiredNetwork(builder.build()); } else { // Read legacy values val = parser.getAttributeValue(null, "connectivity"); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java index 4f472dfc31dd..a52223792b7a 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java @@ -21,6 +21,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; import android.net.ConnectivityManager; @@ -373,15 +374,23 @@ public final class ConnectivityController extends RestrictingController implemen } } + private static NetworkCapabilities.Builder copyCapabilities( + @NonNull final NetworkRequest request) { + final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder(); + for (int transport : request.getTransportTypes()) builder.addTransportType(transport); + for (int capability : request.getCapabilities()) builder.addCapability(capability); + return builder; + } + private static boolean isStrictSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { // A restricted job that's out of quota MUST use an unmetered network. if (jobStatus.getEffectiveStandbyBucket() == RESTRICTED_INDEX && !jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)) { - final NetworkCapabilities required = new NetworkCapabilities.Builder( - jobStatus.getJob().getRequiredNetwork().networkCapabilities) - .addCapability(NET_CAPABILITY_NOT_METERED).build(); - return required.satisfiedByNetworkCapabilities(capabilities); + final NetworkCapabilities.Builder builder = + copyCapabilities(jobStatus.getJob().getRequiredNetwork()); + builder.addCapability(NET_CAPABILITY_NOT_METERED); + return builder.build().satisfiedByNetworkCapabilities(capabilities); } else { return jobStatus.getJob().getRequiredNetwork().canBeSatisfiedBy(capabilities); } @@ -395,10 +404,10 @@ public final class ConnectivityController extends RestrictingController implemen } // See if we match after relaxing any unmetered request - final NetworkCapabilities relaxed = new NetworkCapabilities.Builder( - jobStatus.getJob().getRequiredNetwork().networkCapabilities) - .removeCapability(NET_CAPABILITY_NOT_METERED).build(); - if (relaxed.satisfiedByNetworkCapabilities(capabilities)) { + final NetworkCapabilities.Builder builder = + copyCapabilities(jobStatus.getJob().getRequiredNetwork()); + builder.removeCapability(NET_CAPABILITY_NOT_METERED); + if (builder.build().satisfiedByNetworkCapabilities(capabilities)) { // TODO: treat this as "maybe" response; need to check quotas return jobStatus.getFractionRunTime() > constants.CONN_PREFETCH_RELAX_FRAC; } else { diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp index 3dd0da75d1a8..0501a45ef231 100644 --- a/apex/media/framework/Android.bp +++ b/apex/media/framework/Android.bp @@ -41,9 +41,7 @@ java_library { installable: true, sdk_version: "module_current", - libs: [ - "framework_media_annotation", - ], + libs: ["framework-annotations-lib"], static_libs: [ "exoplayer2-extractor" ], @@ -107,20 +105,9 @@ java_sdk_library { srcs: [ ":updatable-media-srcs", ], - - libs: [ - "framework_media_annotation", - ], impl_library_visibility: ["//frameworks/av/apex:__subpackages__"], } -java_library { - name: "framework_media_annotation", - srcs: [":framework-media-annotation-srcs"], - installable: false, - sdk_version: "core_current", -} - cc_library_shared { name: "libmediaparser-jni", srcs: [ diff --git a/core/api/current.txt b/core/api/current.txt index ef067858c530..bd6b5e877726 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -40412,6 +40412,7 @@ package android.telephony { public final class PreciseDataConnectionState implements android.os.Parcelable { method public int describeContents(); method @Nullable public android.telephony.data.ApnSetting getApnSetting(); + method public int getId(); method public int getLastCauseCode(); method @Nullable public android.net.LinkProperties getLinkProperties(); method public int getNetworkType(); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 4676523bbd6c..2928a0c59e8a 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -155,6 +155,7 @@ package android { field public static final String NETWORK_SIGNAL_STRENGTH_WAKEUP = "android.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP"; field public static final String NETWORK_STACK = "android.permission.NETWORK_STACK"; field public static final String NETWORK_STATS_PROVIDER = "android.permission.NETWORK_STATS_PROVIDER"; + field public static final String NFC_SET_CONTROLLER_ALWAYS_ON = "android.permission.NFC_SET_CONTROLLER_ALWAYS_ON"; field public static final String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP"; field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS"; field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; @@ -6442,9 +6443,11 @@ package android.net.netstats.provider { method public void notifyAlertReached(); method public void notifyLimitReached(); method public void notifyStatsUpdated(int, @NonNull android.net.NetworkStats, @NonNull android.net.NetworkStats); + method public void notifyWarningReached(); method public abstract void onRequestStatsUpdate(int); method public abstract void onSetAlert(long); method public abstract void onSetLimit(@NonNull String, long); + method public void onSetWarningAndLimit(@NonNull String, long, long); field public static final int QUOTA_UNLIMITED = -1; // 0xffffffff } @@ -6723,10 +6726,10 @@ package android.nfc { method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enable(); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableNdefPush(); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableSecureNfc(boolean); - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isAlwaysOnEnabled(); - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean isAlwaysOnSupported(); + method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOn(); + method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOnSupported(); method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler); - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setAlwaysOn(boolean); + method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean setControllerAlwaysOn(boolean); method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, int); field public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 1; // 0x1 } @@ -9431,7 +9434,14 @@ package android.telephony { method @NonNull public static android.os.PersistableBundle getDefaultConfig(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void updateConfigForPhoneId(int, String); + field public static final int GBA_DIGEST = 3; // 0x3 + field public static final int GBA_ME = 1; // 0x1 + field public static final int GBA_U = 2; // 0x2 field public static final String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string"; + field public static final String KEY_GBA_MODE_INT = "gba_mode_int"; + field public static final String KEY_GBA_UA_SECURITY_ORGANIZATION_INT = "gba_ua_security_organization_int"; + field public static final String KEY_GBA_UA_SECURITY_PROTOCOL_INT = "gba_ua_security_protocol_int"; + field public static final String KEY_GBA_UA_TLS_CIPHER_SUITE_INT = "gba_ua_tls_cipher_suite_int"; field public static final String KEY_SUPPORT_CDMA_1X_VOICE_CALLS_BOOL = "support_cdma_1x_voice_calls_bool"; } @@ -9785,7 +9795,6 @@ package android.telephony { method @Deprecated public int getDataConnectionApnTypeBitMask(); method @Deprecated public int getDataConnectionFailCause(); method @Deprecated public int getDataConnectionState(); - method public int getId(); } public final class PreciseDisconnectCause { @@ -12066,13 +12075,13 @@ package android.telephony.ims.feature { ctor @Deprecated public RcsFeature(); ctor public RcsFeature(@NonNull java.util.concurrent.Executor); method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method @NonNull public android.telephony.ims.stub.RcsCapabilityExchangeImplBase createCapabilityExchangeImpl(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.CapabilityExchangeEventListener); + method @NonNull public android.telephony.ims.stub.RcsCapabilityExchangeImplBase createCapabilityExchangeImpl(@NonNull android.telephony.ims.stub.CapabilityExchangeEventListener); + method public void destroyCapabilityExchangeImpl(@NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase); method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.RcsFeature.RcsImsCapabilities); method public void onFeatureReady(); method public void onFeatureRemoved(); method public boolean queryCapabilityConfiguration(int, int); method @NonNull public final android.telephony.ims.feature.RcsFeature.RcsImsCapabilities queryCapabilityStatus(); - method public void removeCapabilityExchangeImpl(@NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase); } public static class RcsFeature.RcsImsCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities { @@ -12284,7 +12293,7 @@ package android.telephony.ims.stub { } public class RcsCapabilityExchangeImplBase { - ctor public RcsCapabilityExchangeImplBase(@NonNull java.util.concurrent.Executor); + ctor public RcsCapabilityExchangeImplBase(); method public void publishCapabilities(@NonNull String, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.PublishResponseCallback); method public void sendOptionsCapabilityRequest(@NonNull android.net.Uri, @NonNull java.util.Set<java.lang.String>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.OptionsResponseCallback); method public void subscribeForCapabilities(@NonNull java.util.Collection<android.net.Uri>, @NonNull android.telephony.ims.stub.RcsCapabilityExchangeImplBase.SubscribeResponseCallback); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 1d094c3d7f40..0c57f4e3b557 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -9,8 +9,10 @@ package android { field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE"; field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE"; field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA"; + field public static final String CLEAR_FREEZE_PERIOD = "android.permission.CLEAR_FREEZE_PERIOD"; field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"; field public static final String CONTROL_DEVICE_LIGHTS = "android.permission.CONTROL_DEVICE_LIGHTS"; + field public static final String FORCE_DEVICE_POLICY_MANAGER_LOGS = "android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS"; field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES"; field public static final String KEEP_UNINSTALLED_PACKAGES = "android.permission.KEEP_UNINSTALLED_PACKAGES"; field public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS"; @@ -19,10 +21,11 @@ package android { field public static final String NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS"; field public static final String NETWORK_STACK = "android.permission.NETWORK_STACK"; field public static final String OVERRIDE_DISPLAY_MODE_REQUESTS = "android.permission.OVERRIDE_DISPLAY_MODE_REQUESTS"; - field public static final String QUERY_USERS = "android.permission.QUERY_USERS"; + field public static final String QUERY_AUDIO_STATE = "android.permission.QUERY_AUDIO_STATE"; field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS"; field public static final String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE"; field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS"; + field public static final String SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS = "android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS"; field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS"; field public static final String TEST_MANAGE_ROLLBACKS = "android.permission.TEST_MANAGE_ROLLBACKS"; field public static final String UPGRADE_RUNTIME_PERMISSIONS = "android.permission.UPGRADE_RUNTIME_PERMISSIONS"; @@ -1064,6 +1067,7 @@ package android.os { field public static final int FIRST_ISOLATED_UID = 99000; // 0x182b8 field public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999; // 0x182b7 field public static final int LAST_ISOLATED_UID = 99999; // 0x1869f + field public static final int NFC_UID = 1027; // 0x403 field public static final int NUM_UIDS_PER_APP_ZYGOTE = 100; // 0x64 } diff --git a/core/java/Android.bp b/core/java/Android.bp index 2fdf9c146ff6..919f1e2e85fb 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -10,6 +10,15 @@ package { } filegroup { + name: "framework-core-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} + +filegroup { name: "IKeyAttestationApplicationIdProvider.aidl", srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"], } @@ -23,3 +32,98 @@ filegroup { name: "ITracingServiceProxy.aidl", srcs: ["android/tracing/ITracingServiceProxy.aidl"], } + +// These are subset of framework-core-sources that are needed by the +// android.test.mock library. The implementation of android.test.mock references +// private members of various components to allow mocking of classes that cannot +// be mocked without access to those internal implementation details. +filegroup { + name: "framework-core-sources-for-test-mock", + srcs: [ + "android/accounts/AccountManagerCallback.java", + "android/accounts/AccountManagerFuture.java", + "android/accounts/AccountManager.java", + "android/accounts/AccountsException.java", + "android/accounts/AuthenticatorException.java", + "android/accounts/OperationCanceledException.java", + "android/annotation/AnimatorRes.java", + "android/annotation/AnimRes.java", + "android/annotation/AnyRes.java", + "android/annotation/ArrayRes.java", + "android/annotation/AttrRes.java", + "android/annotation/BoolRes.java", + "android/annotation/BroadcastBehavior.java", + "android/annotation/CallbackExecutor.java", + "android/annotation/CallSuper.java", + "android/annotation/CheckResult.java", + "android/annotation/ColorInt.java", + "android/annotation/ColorRes.java", + "android/annotation/DimenRes.java", + "android/annotation/DrawableRes.java", + "android/annotation/FontRes.java", + "android/annotation/FractionRes.java", + "android/annotation/IntDef.java", + "android/annotation/IntegerRes.java", + "android/annotation/IntRange.java", + "android/annotation/LayoutRes.java", + "android/annotation/NonNull.java", + "android/annotation/Nullable.java", + "android/annotation/PluralsRes.java", + "android/annotation/RawRes.java", + "android/annotation/RequiresPermission.java", + "android/annotation/SdkConstant.java", + "android/annotation/Size.java", + "android/annotation/StringDef.java", + "android/annotation/StringRes.java", + "android/annotation/StyleableRes.java", + "android/annotation/StyleRes.java", + "android/annotation/SuppressLint.java", + "android/annotation/SystemApi.java", + "android/annotation/SystemService.java", + "android/annotation/TestApi.java", + "android/annotation/UserIdInt.java", + "android/annotation/XmlRes.java", + "android/app/Application.java", + "android/app/IApplicationThread.aidl", + "android/app/IServiceConnection.aidl", + "android/app/PackageDeleteObserver.java", + "android/content/ComponentCallbacks2.java", + "android/content/ComponentCallbacks.java", + "android/content/ContentInterface.java", + "android/content/ContentProvider.java", + "android/content/ContentProviderNative.java", + "android/content/ContentResolver.java", + "android/content/Context.java", + "android/content/ContextWrapper.java", + "android/content/DialogInterface.java", + "android/content/IContentProvider.java", + "android/content/Intent.java", + "android/content/IntentSender.java", + "android/content/OperationApplicationException.java", + "android/content/pm/ActivityInfo.java", + "android/content/pm/ApplicationInfo.java", + "android/content/pm/InstantAppInfo.java", + "android/content/pm/IPackageDataObserver.aidl", + "android/content/pm/KeySet.java", + "android/content/pm/PackageManager.java", + "android/content/pm/VerifierDeviceIdentity.java", + "android/content/res/Resources.java", + "android/database/CrossProcessCursor.java", + "android/database/CrossProcessCursorWrapper.java", + "android/database/Cursor.java", + "android/database/CursorWrapper.java", + "android/os/Binder.java", + "android/os/Bundle.java", + "android/os/IBinder.java", + "android/os/IInterface.java", + "android/os/Parcelable.java", + "android/os/ParcelFileDescriptor.java", + "android/os/RemoteException.java", + "android/os/storage/VolumeInfo.java", + "android/util/AndroidException.java", + "android/view/DisplayAdjustments.java", + "android/view/ViewDebug.java", + "com/android/internal/annotations/VisibleForTesting.java", + ], + visibility: ["//frameworks/base/test-mock"], +} diff --git a/core/java/android/annotation/MainThread.java b/core/java/android/annotation/MainThread.java index 556fdb4e7742..a070246e5ef3 100644 --- a/core/java/android/annotation/MainThread.java +++ b/core/java/android/annotation/MainThread.java @@ -21,8 +21,6 @@ import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.SOURCE; -import android.os.Looper; - import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -40,8 +38,7 @@ import java.lang.annotation.Target; * </code> * </pre> * - * @memberDoc This method must be called from the - * {@linkplain Looper#getMainLooper() main thread} of your app. + * @memberDoc This method must be called from the main thread of your app. * @hide */ @Retention(SOURCE) diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 6ec11693d69b..ad9e31b6cbf4 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -2167,7 +2167,10 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return (flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0; } - /** @hide */ + /** + * True if the application is pre-installed on the OEM partition of the system image. + * @hide + */ @SystemApi public boolean isOem() { return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0; @@ -2215,13 +2218,19 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; } - /** @hide */ + /** + * True if the application is pre-installed on the vendor partition of the system image. + * @hide + */ @SystemApi public boolean isVendor() { return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0; } - /** @hide */ + /** + * True if the application is pre-installed on the product partition of the system image. + * @hide + */ @SystemApi public boolean isProduct() { return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0; diff --git a/core/java/android/net/netstats/provider/NetworkStatsProvider.java b/core/java/android/net/netstats/provider/NetworkStatsProvider.java index 65b336ad6fce..23fc06927ef9 100644 --- a/core/java/android/net/netstats/provider/NetworkStatsProvider.java +++ b/core/java/android/net/netstats/provider/NetworkStatsProvider.java @@ -147,10 +147,7 @@ public abstract class NetworkStatsProvider { /** * Notify system that the warning set by {@link #onSetWarningAndLimit} has been reached. - * - * @hide */ - // TODO: Expose as system API. public void notifyWarningReached() { try { // Reuse the code path to notify warning reached with limit reached @@ -198,7 +195,6 @@ public abstract class NetworkStatsProvider { * @param quotaBytes the quota defined as the number of bytes, starting from zero and counting * from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no limit. */ - // TODO: deprecate this once onSetWarningAndLimit is ready. public abstract void onSetLimit(@NonNull String iface, long quotaBytes); /** @@ -217,10 +213,7 @@ public abstract class NetworkStatsProvider { * there is no warning. * @param limitBytes the limit defined as the number of bytes, starting from zero and counting * from now. A value of {@link #QUOTA_UNLIMITED} indicates there is no limit. - * - * @hide */ - // TODO: Expose as system API. public void onSetWarningAndLimit(@NonNull String iface, long warningBytes, long limitBytes) { // Backward compatibility for those who didn't override this function. onSetLimit(iface, limitBytes); diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index bc3d5c4ab1ac..11445e9aec5a 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -72,7 +72,7 @@ interface INfcAdapter boolean deviceSupportsNfcSecure(); boolean setNfcSecure(boolean enable); - boolean setAlwaysOn(boolean value); - boolean isAlwaysOnEnabled(); - boolean isAlwaysOnSupported(); + boolean setControllerAlwaysOn(boolean value); + boolean isControllerAlwaysOn(); + boolean isControllerAlwaysOnSupported(); } diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index e85eb935a8e7..eed2c77b06b9 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -2254,13 +2254,13 @@ public final class NfcAdapter { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) - public boolean setAlwaysOn(boolean value) { + @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) + public boolean setControllerAlwaysOn(boolean value) { if (!sHasNfcFeature) { throw new UnsupportedOperationException(); } try { - return sService.setAlwaysOn(value); + return sService.setControllerAlwaysOn(value); } catch (RemoteException e) { attemptDeadServiceRecovery(e); // Try one more time @@ -2269,7 +2269,7 @@ public final class NfcAdapter { return false; } try { - return sService.setAlwaysOn(value); + return sService.setControllerAlwaysOn(value); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover NFC Service."); } @@ -2286,10 +2286,10 @@ public final class NfcAdapter { */ @SystemApi - @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) - public boolean isAlwaysOnEnabled() { + @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) + public boolean isControllerAlwaysOn() { try { - return sService.isAlwaysOnEnabled(); + return sService.isControllerAlwaysOn(); } catch (RemoteException e) { attemptDeadServiceRecovery(e); // Try one more time @@ -2298,7 +2298,7 @@ public final class NfcAdapter { return false; } try { - return sService.isAlwaysOnEnabled(); + return sService.isControllerAlwaysOn(); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover NFC Service."); } @@ -2315,13 +2315,13 @@ public final class NfcAdapter { */ @SystemApi - @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) - public boolean isAlwaysOnSupported() { + @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) + public boolean isControllerAlwaysOnSupported() { if (!sHasNfcFeature) { throw new UnsupportedOperationException(); } try { - return sService.isAlwaysOnSupported(); + return sService.isControllerAlwaysOnSupported(); } catch (RemoteException e) { attemptDeadServiceRecovery(e); // Try one more time @@ -2330,7 +2330,7 @@ public final class NfcAdapter { return false; } try { - return sService.isAlwaysOnSupported(); + return sService.isControllerAlwaysOnSupported(); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover NFC Service."); } diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 189a8ac55a10..03caafda2b13 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -115,15 +115,20 @@ public class Build { public static final String HARDWARE = getString("ro.hardware"); /** - * The SKU of the hardware (from the kernel command line). The SKU is reported by the bootloader - * to configure system software features. + * The SKU of the hardware (from the kernel command line). + * + * <p>The SKU is reported by the bootloader to configure system software features. + * If no value is supplied by the bootloader, this is reported as {@link #UNKNOWN}. + */ @NonNull public static final String SKU = getString("ro.boot.hardware.sku"); /** - * The SKU of the device as set by the original design manufacturer (ODM). This is a - * runtime-initialized property set during startup to configure device services. + * The SKU of the device as set by the original design manufacturer (ODM). + * + * <p>This is a runtime-initialized property set during startup to configure device + * services. If no value is set, this is reported as {@link #UNKNOWN}. * * <p>The ODM SKU may have multiple variants for the same system SKU in case a manufacturer * produces variants of the same design. For example, the same build may be released with diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 9d16f18ab848..9b29fb1dfaac 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -127,6 +127,7 @@ public class Process { * @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) + @TestApi public static final int NFC_UID = 1027; /** diff --git a/core/java/android/speech/OWNERS b/core/java/android/speech/OWNERS new file mode 100644 index 000000000000..32f482264103 --- /dev/null +++ b/core/java/android/speech/OWNERS @@ -0,0 +1,3 @@ +volnov@google.com +eugeniom@google.com +schfan@google.com diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index a785a1ab9f0e..51396dbb8204 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -4679,6 +4679,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE); mTouchMode = TOUCH_MODE_FLING; mSuppressIdleStateChangeCall = false; + removeCallbacks(this); postOnAnimation(this); if (PROFILE_FLINGING) { diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 0e35c84fa226..965971d18241 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -60,7 +60,6 @@ interface ITelephonyRegistry { void notifyDataConnectionForSubscriber( int phoneId, int subId, in PreciseDataConnectionState preciseState); // Uses CellIdentity which is Parcelable here; will convert to CellLocation in client. - void notifyCellLocation(in CellIdentity cellLocation); void notifyCellLocationForSubscriber(in int subId, in CellIdentity cellLocation); @UnsupportedAppUsage void notifyCellInfo(in List<CellInfo> cellInfo); diff --git a/core/jni/OWNERS b/core/jni/OWNERS index c0c4b7054674..07fb72905758 100644 --- a/core/jni/OWNERS +++ b/core/jni/OWNERS @@ -50,7 +50,6 @@ per-file fd_utils.* = file:/ZYGOTE_OWNERS per-file Android.bp = file:platform/build/soong:/OWNERS per-file android_animation_* = file:/core/java/android/animation/OWNERS per-file android_app_admin_* = file:/core/java/android/app/admin/OWNERS -per-file android_graphics_* = file:/graphics/java/android/graphics/OWNERS per-file android_hardware_Usb* = file:/services/usb/OWNERS per-file android_hardware_display_* = file:/core/java/android/hardware/display/OWNERS per-file android_hardware_input_* = file:/core/java/android/hardware/input/OWNERS @@ -63,3 +62,11 @@ per-file android_se_* = file:/core/java/android/se/OWNERS per-file android_security_* = file:/core/java/android/security/OWNERS per-file android_view_* = file:/core/java/android/view/OWNERS per-file com_android_internal_net_* = file:/services/core/java/com/android/server/net/OWNERS + +### Graphics ### +per-file android_graphics_* = file:/graphics/java/android/graphics/OWNERS +# These are highly common-use files +per-file Android.bp = file:/graphics/java/android/graphics/OWNERS +per-file AndroidRuntime.cpp = file:/graphics/java/android/graphics/OWNERS +# Although marked "view" this is mostly graphics stuff +per-file android_view_* = file:/graphics/java/android/graphics/OWNERS
\ No newline at end of file diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f65d7a7540e4..1f7695eb7fc0 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1882,6 +1882,12 @@ android:label="@string/permlab_preferredPaymentInfo" android:protectionLevel="normal" /> + <!-- @SystemApi Allows access to set NFC controller always on states. + <p>Protection level: signature|privileged + @hide --> + <permission android:name="android.permission.NFC_SET_CONTROLLER_ALWAYS_ON" + android:protectionLevel="signature|privileged" /> + <!-- @SystemApi Allows an internal user to use privileged SecureElement APIs. Applications holding this permission can access OMAPI reset system API and bypass OMAPI AccessControlEnforcer. @@ -2545,10 +2551,6 @@ <permission android:name="android.permission.CREATE_USERS" android:protectionLevel="signature" /> - <!-- @TestApi @hide Allows an application to query user info for all users on the device. --> - <permission android:name="android.permission.QUERY_USERS" - android:protectionLevel="signature" /> - <!-- @hide Allows an application to set the profile owners and the device owner. This permission is not available to third party applications.--> <permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" @@ -2556,6 +2558,16 @@ android:label="@string/permlab_manageProfileAndDeviceOwners" android:description="@string/permdesc_manageProfileAndDeviceOwners" /> + <!-- @TestApi @hide Allows an application to reset the record of previous system update freeze + periods. --> + <permission android:name="android.permission.CLEAR_FREEZE_PERIOD" + android:protectionLevel="signature" /> + + <!-- @TestApi @hide Allows an application to force available DevicePolicyManager logs to + DPC. --> + <permission android:name="android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS" + android:protectionLevel="signature" /> + <!-- Allows an application to get full detailed information about recently running tasks, with full fidelity to the real state. @hide --> @@ -4101,6 +4113,11 @@ <permission android:name="android.permission.MODIFY_AUDIO_ROUTING" android:protectionLevel="signature|privileged" /> + <!-- @TestApi Allows an application to query audio related state. + @hide --> + <permission android:name="android.permission.QUERY_AUDIO_STATE" + android:protectionLevel="signature" /> + <!-- Allows an application to modify what effects are applied to all audio (matching certain criteria) from any application. <p>Not for use by third-party applications.</p> @@ -4578,6 +4595,11 @@ <permission android:name="android.permission.SET_INITIAL_LOCK" android:protectionLevel="signature|setup"/> + <!-- @TestApi Allows applications to set and verify lockscreen credentials. + @hide --> + <permission android:name="android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS" + android:protectionLevel="signature"/> + <!-- Allows managing (adding, removing) fingerprint templates. Reserved for the system. @hide --> <permission android:name="android.permission.MANAGE_FINGERPRINT" android:protectionLevel="signature|privileged" /> diff --git a/data/etc/OWNERS b/data/etc/OWNERS index 549e074d297c..5aacfddab28c 100644 --- a/data/etc/OWNERS +++ b/data/etc/OWNERS @@ -13,3 +13,4 @@ toddke@google.com yamasani@google.com per-file preinstalled-packages* = file:/MULTIUSER_OWNERS +per-file services.core.protolog.json = file:/services/core/java/com/android/server/wm/OWNERS diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 653e690506bc..43fdedc41e9f 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -444,6 +444,8 @@ applications that come with the platform <permission name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" /> <!-- Permissions required for CTS test - CtsHdmiCecHostTestCases --> <permission name="android.permission.HDMI_CEC"/> + <!-- Permission required for CTS test - MediaPlayerTest --> + <permission name="android.permission.BIND_IMS_SERVICE" /> <!-- Permission needed for CTS test - WifiManagerTest --> <permission name="android.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS" /> <permission name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS" /> @@ -452,6 +454,10 @@ applications that come with the platform <permission name="android.permission.CAPTURE_AUDIO_HOTWORD" /> <permission name="android.permission.MODIFY_QUIET_MODE" /> <permission name="android.permission.MANAGE_APP_HIBERNATION"/> + <!-- Permission required for CTS test - ResourceObserverNativeTest --> + <permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" /> + <!-- Permission required for CTS test - CtsAlarmManagerTestCases --> + <permission name="android.permission.SCHEDULE_PRIORITIZED_ALARM" /> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index d2b47c6336c4..4c214b529b39 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -60,7 +60,7 @@ <alias name="sans-serif-condensed-medium" to="sans-serif-condensed" weight="500" /> <family name="serif"> - <font weight="400" style="normal">NotoSerif.ttf</font> + <font weight="400" style="normal">NotoSerif-Regular.ttf</font> <font weight="700" style="normal">NotoSerif-Bold.ttf</font> <font weight="400" style="italic">NotoSerif-Italic.ttf</font> <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font> @@ -112,33 +112,33 @@ <!-- fallback fonts --> <family lang="und-Arab" variant="elegant"> - <font weight="400" style="normal">NotoNaskhArabic.ttf</font> + <font weight="400" style="normal">NotoNaskhArabic-Regular.ttf</font> <font weight="700" style="normal">NotoNaskhArabic-Bold.ttf</font> </family> <family lang="und-Arab" variant="compact"> - <font weight="400" style="normal">NotoNaskhArabicUI.ttf</font> + <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font> <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> </family> <family lang="und-Ethi"> - <font weight="400" style="normal">NotoSansEthiopic.ttf</font> + <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font> <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font> <font weight="400" style="normal" fallbackFor="serif">NotoSerifEthiopic-Regular.otf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifEthiopic-Bold.otf</font> </family> <family lang="und-Hebr"> - <font weight="400" style="normal">NotoSansHebrew.ttf</font> + <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font> <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> <font weight="400" style="normal" fallbackFor="serif">NotoSerifHebrew-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifHebrew-Bold.ttf</font> </family> <family lang="und-Thai" variant="elegant"> - <font weight="400" style="normal">NotoSansThai.ttf</font> + <font weight="400" style="normal">NotoSansThai-Regular.ttf</font> <font weight="700" style="normal">NotoSansThai-Bold.ttf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifThai.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifThai-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifThai-Bold.ttf</font> </family> <family lang="und-Thai" variant="compact"> - <font weight="400" style="normal">NotoSansThaiUI.ttf</font> + <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> </family> <family lang="und-Armn"> @@ -149,28 +149,28 @@ <font weight="700" style="normal" fallbackFor="serif">NotoSerifArmenian-Bold.otf</font> </family> <family lang="und-Geor,und-Geok"> - <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf + <font weight="400" style="normal">NotoSansGeorgian-VF.ttf <axis tag="wght" stylevalue="400" /> </font> - <font weight="500" style="normal">NotoSansGeorgian-Regular.ttf + <font weight="500" style="normal">NotoSansGeorgian-VF.ttf <axis tag="wght" stylevalue="500" /> </font> - <font weight="600" style="normal">NotoSansGeorgian-Regular.ttf + <font weight="600" style="normal">NotoSansGeorgian-VF.ttf <axis tag="wght" stylevalue="600" /> </font> - <font weight="700" style="normal">NotoSansGeorgian-Regular.ttf + <font weight="700" style="normal">NotoSansGeorgian-VF.ttf <axis tag="wght" stylevalue="700" /> </font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.ttf + <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf <axis tag="wght" stylevalue="400" /> </font> - <font weight="500" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.ttf + <font weight="500" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf <axis tag="wght" stylevalue="500" /> </font> - <font weight="600" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.ttf + <font weight="600" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf <axis tag="wght" stylevalue="600" /> </font> - <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.ttf + <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-VF.ttf <axis tag="wght" stylevalue="700" /> </font> </family> @@ -178,7 +178,7 @@ <font weight="400" style="normal">NotoSansDevanagari-Regular.otf</font> <font weight="500" style="normal">NotoSansDevanagari-Medium.otf</font> <font weight="700" style="normal">NotoSansDevanagari-Bold.otf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifDevanagari.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifDevanagari-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifDevanagari-Bold.ttf</font> </family> <family lang="und-Deva" variant="compact"> @@ -191,23 +191,23 @@ danda characters. --> <family lang="und-Gujr" variant="elegant"> - <font weight="400" style="normal">NotoSansGujarati.ttf</font> + <font weight="400" style="normal">NotoSansGujarati-Regular.ttf</font> <font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifGujarati.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifGujarati-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifGujarati-Bold.ttf</font> </family> <family lang="und-Gujr" variant="compact"> - <font weight="400" style="normal">NotoSansGujaratiUI.ttf</font> + <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> </family> <family lang="und-Guru" variant="elegant"> - <font weight="400" style="normal">NotoSansGurmukhi.ttf</font> + <font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font> <font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font> <font weight="400" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Regular.otf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Bold.otf</font> </family> <family lang="und-Guru" variant="compact"> - <font weight="400" style="normal">NotoSansGurmukhiUI.ttf</font> + <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font> </family> <family lang="und-Taml" variant="elegant"> @@ -226,7 +226,7 @@ <font weight="400" style="normal">NotoSansMalayalam-Regular.otf</font> <font weight="500" style="normal">NotoSansMalayalam-Medium.otf</font> <font weight="700" style="normal">NotoSansMalayalam-Bold.otf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifMalayalam.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifMalayalam-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifMalayalam-Bold.ttf</font> </family> <family lang="und-Mlym" variant="compact"> @@ -238,7 +238,7 @@ <font weight="400" style="normal">NotoSansBengali-Regular.otf</font> <font weight="500" style="normal">NotoSansBengali-Medium.otf</font> <font weight="700" style="normal">NotoSansBengali-Bold.otf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifBengali.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifBengali-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifBengali-Bold.ttf</font> </family> <family lang="und-Beng" variant="compact"> @@ -247,31 +247,31 @@ <font weight="700" style="normal">NotoSansBengaliUI-Bold.otf</font> </family> <family lang="und-Telu" variant="elegant"> - <font weight="400" style="normal">NotoSansTelugu.ttf</font> + <font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font> <font weight="700" style="normal">NotoSansTelugu-Bold.ttf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifTelugu.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifTelugu-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifTelugu-Bold.ttf</font> </family> <family lang="und-Telu" variant="compact"> - <font weight="400" style="normal">NotoSansTeluguUI.ttf</font> + <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font> </family> <family lang="und-Knda" variant="elegant"> - <font weight="400" style="normal">NotoSansKannada.ttf</font> + <font weight="400" style="normal">NotoSansKannada-Regular.ttf</font> <font weight="700" style="normal">NotoSansKannada-Bold.ttf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifKannada.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifKannada-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifKannada-Bold.ttf</font> </family> <family lang="und-Knda" variant="compact"> - <font weight="400" style="normal">NotoSansKannadaUI.ttf</font> + <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font> </family> <family lang="und-Orya" variant="elegant"> - <font weight="400" style="normal">NotoSansOriya.ttf</font> + <font weight="400" style="normal">NotoSansOriya-Regular.ttf</font> <font weight="700" style="normal">NotoSansOriya-Bold.ttf</font> </family> <family lang="und-Orya" variant="compact"> - <font weight="400" style="normal">NotoSansOriyaUI.ttf</font> + <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> </family> @@ -288,39 +288,39 @@ <font weight="700" style="normal">NotoSansSinhalaUI-Bold.otf</font> </family> <family lang="und-Khmr" variant="elegant"> - <font weight="100" style="normal">NotoSansKhmer-Regular.ttf + <font weight="100" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="26.0" /> </font> - <font weight="200" style="normal">NotoSansKhmer-Regular.ttf + <font weight="200" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="39.0" /> </font> - <font weight="300" style="normal">NotoSansKhmer-Regular.ttf + <font weight="300" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="58.0" /> </font> - <font weight="400" style="normal">NotoSansKhmer-Regular.ttf + <font weight="400" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="90.0" /> </font> - <font weight="500" style="normal">NotoSansKhmer-Regular.ttf + <font weight="500" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="108.0" /> </font> - <font weight="600" style="normal">NotoSansKhmer-Regular.ttf + <font weight="600" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="128.0" /> </font> - <font weight="700" style="normal">NotoSansKhmer-Regular.ttf + <font weight="700" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="151.0" /> </font> - <font weight="800" style="normal">NotoSansKhmer-Regular.ttf + <font weight="800" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="169.0" /> </font> - <font weight="900" style="normal">NotoSansKhmer-Regular.ttf + <font weight="900" style="normal">NotoSansKhmer-VF.ttf <axis tag="wdth" stylevalue="100.0" /> <axis tag="wght" stylevalue="190.0" /> </font> @@ -328,17 +328,17 @@ <font weight="700" style="normal" fallbackFor="serif">NotoSerifKhmer-Bold.otf</font> </family> <family lang="und-Khmr" variant="compact"> - <font weight="400" style="normal">NotoSansKhmerUI.ttf</font> + <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> </family> <family lang="und-Laoo" variant="elegant"> - <font weight="400" style="normal">NotoSansLao.ttf</font> + <font weight="400" style="normal">NotoSansLao-Regular.ttf</font> <font weight="700" style="normal">NotoSansLao-Bold.ttf</font> - <font weight="400" style="normal" fallbackFor="serif">NotoSerifLao.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifLao-Regular.ttf</font> <font weight="700" style="normal" fallbackFor="serif">NotoSerifLao-Bold.ttf</font> </family> <family lang="und-Laoo" variant="compact"> - <font weight="400" style="normal">NotoSansLaoUI.ttf</font> + <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font> <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> </family> <family lang="und-Mymr" variant="elegant"> @@ -354,56 +354,56 @@ <font weight="700" style="normal">NotoSansMyanmarUI-Bold.otf</font> </family> <family lang="und-Thaa"> - <font weight="400" style="normal">NotoSansThaana.ttf</font> + <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font> <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> </family> <family lang="und-Cham"> - <font weight="400" style="normal">NotoSansCham.ttf</font> + <font weight="400" style="normal">NotoSansCham-Regular.ttf</font> <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> </family> <family lang="und-Ahom"> <font weight="400" style="normal">NotoSansAhom-Regular.otf</font> </family> <family lang="und-Adlm"> - <font weight="400" style="normal">NotoSansAdlam-Regular.ttf + <font weight="400" style="normal">NotoSansAdlam-VF.ttf <axis tag="wght" stylevalue="400" /> </font> - <font weight="500" style="normal">NotoSansAdlam-Regular.ttf + <font weight="500" style="normal">NotoSansAdlam-VF.ttf <axis tag="wght" stylevalue="500" /> </font> - <font weight="600" style="normal">NotoSansAdlam-Regular.ttf + <font weight="600" style="normal">NotoSansAdlam-VF.ttf <axis tag="wght" stylevalue="600" /> </font> - <font weight="700" style="normal">NotoSansAdlam-Regular.ttf + <font weight="700" style="normal">NotoSansAdlam-VF.ttf <axis tag="wght" stylevalue="700" /> </font> </family> <family lang="und-Avst"> - <font weight="400" style="normal">NotoSansAvestan.ttf</font> + <font weight="400" style="normal">NotoSansAvestan-Regular.ttf</font> </family> <family lang="und-Bali"> - <font weight="400" style="normal">NotoSansBalinese.ttf</font> + <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font> </family> <family lang="und-Bamu"> - <font weight="400" style="normal">NotoSansBamum.ttf</font> + <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font> </family> <family lang="und-Batk"> - <font weight="400" style="normal">NotoSansBatak.ttf</font> + <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font> </family> <family lang="und-Brah"> - <font weight="400" style="normal">NotoSansBrahmi.ttf</font> + <font weight="400" style="normal">NotoSansBrahmi-Regular.ttf</font> </family> <family lang="und-Bugi"> - <font weight="400" style="normal">NotoSansBuginese.ttf</font> + <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font> </family> <family lang="und-Buhd"> - <font weight="400" style="normal">NotoSansBuhid.ttf</font> + <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font> </family> <family lang="und-Cans"> - <font weight="400" style="normal">NotoSansCanadianAboriginal.ttf</font> + <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font> </family> <family lang="und-Cari"> - <font weight="400" style="normal">NotoSansCarian.ttf</font> + <font weight="400" style="normal">NotoSansCarian-Regular.ttf</font> </family> <family lang="und-Cakm"> <font weight="400" style="normal">NotoSansChakma-Regular.otf</font> @@ -412,184 +412,184 @@ <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> </family> <family lang="und-Copt"> - <font weight="400" style="normal">NotoSansCoptic.ttf</font> + <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font> </family> <family lang="und-Xsux"> - <font weight="400" style="normal">NotoSansCuneiform.ttf</font> + <font weight="400" style="normal">NotoSansCuneiform-Regular.ttf</font> </family> <family lang="und-Cprt"> - <font weight="400" style="normal">NotoSansCypriot.ttf</font> + <font weight="400" style="normal">NotoSansCypriot-Regular.ttf</font> </family> <family lang="und-Dsrt"> - <font weight="400" style="normal">NotoSansDeseret.ttf</font> + <font weight="400" style="normal">NotoSansDeseret-Regular.ttf</font> </family> <family lang="und-Egyp"> - <font weight="400" style="normal">NotoSansEgyptianHieroglyphs.ttf</font> + <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.ttf</font> </family> <family lang="und-Elba"> <font weight="400" style="normal">NotoSansElbasan-Regular.otf</font> </family> <family lang="und-Glag"> - <font weight="400" style="normal">NotoSansGlagolitic.ttf</font> + <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font> </family> <family lang="und-Goth"> - <font weight="400" style="normal">NotoSansGothic.ttf</font> + <font weight="400" style="normal">NotoSansGothic-Regular.ttf</font> </family> <family lang="und-Hano"> - <font weight="400" style="normal">NotoSansHanunoo.ttf</font> + <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font> </family> <family lang="und-Armi"> - <font weight="400" style="normal">NotoSansImperialAramaic.ttf</font> + <font weight="400" style="normal">NotoSansImperialAramaic-Regular.ttf</font> </family> <family lang="und-Phli"> - <font weight="400" style="normal">NotoSansInscriptionalPahlavi.ttf</font> + <font weight="400" style="normal">NotoSansInscriptionalPahlavi-Regular.ttf</font> </family> <family lang="und-Prti"> - <font weight="400" style="normal">NotoSansInscriptionalParthian.ttf</font> + <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.ttf</font> </family> <family lang="und-Java"> <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font> </family> <family lang="und-Kthi"> - <font weight="400" style="normal">NotoSansKaithi.ttf</font> + <font weight="400" style="normal">NotoSansKaithi-Regular.ttf</font> </family> <family lang="und-Kali"> - <font weight="400" style="normal">NotoSansKayahLi.ttf</font> + <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font> </family> <family lang="und-Khar"> - <font weight="400" style="normal">NotoSansKharoshthi.ttf</font> + <font weight="400" style="normal">NotoSansKharoshthi-Regular.ttf</font> </family> <family lang="und-Lepc"> - <font weight="400" style="normal">NotoSansLepcha.ttf</font> + <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font> </family> <family lang="und-Limb"> - <font weight="400" style="normal">NotoSansLimbu.ttf</font> + <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font> </family> <family lang="und-Linb"> - <font weight="400" style="normal">NotoSansLinearB.ttf</font> + <font weight="400" style="normal">NotoSansLinearB-Regular.ttf</font> </family> <family lang="und-Lisu"> - <font weight="400" style="normal">NotoSansLisu.ttf</font> + <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font> </family> <family lang="und-Lyci"> - <font weight="400" style="normal">NotoSansLycian.ttf</font> + <font weight="400" style="normal">NotoSansLycian-Regular.ttf</font> </family> <family lang="und-Lydi"> - <font weight="400" style="normal">NotoSansLydian.ttf</font> + <font weight="400" style="normal">NotoSansLydian-Regular.ttf</font> </family> <family lang="und-Mand"> - <font weight="400" style="normal">NotoSansMandaic.ttf</font> + <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font> </family> <family lang="und-Mtei"> - <font weight="400" style="normal">NotoSansMeeteiMayek.ttf</font> + <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font> </family> <family lang="und-Talu"> - <font weight="400" style="normal">NotoSansNewTaiLue.ttf</font> + <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font> </family> <family lang="und-Nkoo"> - <font weight="400" style="normal">NotoSansNKo.ttf</font> + <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font> </family> <family lang="und-Ogam"> - <font weight="400" style="normal">NotoSansOgham.ttf</font> + <font weight="400" style="normal">NotoSansOgham-Regular.ttf</font> </family> <family lang="und-Olck"> - <font weight="400" style="normal">NotoSansOlChiki.ttf</font> + <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font> </family> <family lang="und-Ital"> - <font weight="400" style="normal">NotoSansOldItalic.ttf</font> + <font weight="400" style="normal">NotoSansOldItalic-Regular.ttf</font> </family> <family lang="und-Xpeo"> - <font weight="400" style="normal">NotoSansOldPersian.ttf</font> + <font weight="400" style="normal">NotoSansOldPersian-Regular.ttf</font> </family> <family lang="und-Sarb"> - <font weight="400" style="normal">NotoSansOldSouthArabian.ttf</font> + <font weight="400" style="normal">NotoSansOldSouthArabian-Regular.ttf</font> </family> <family lang="und-Orkh"> - <font weight="400" style="normal">NotoSansOldTurkic.ttf</font> + <font weight="400" style="normal">NotoSansOldTurkic-Regular.ttf</font> </family> <family lang="und-Osge"> <font weight="400" style="normal">NotoSansOsage-Regular.ttf</font> </family> <family lang="und-Osma"> - <font weight="400" style="normal">NotoSansOsmanya.ttf</font> + <font weight="400" style="normal">NotoSansOsmanya-Regular.ttf</font> </family> <family lang="und-Phnx"> - <font weight="400" style="normal">NotoSansPhoenician.ttf</font> + <font weight="400" style="normal">NotoSansPhoenician-Regular.ttf</font> </family> <family lang="und-Rjng"> - <font weight="400" style="normal">NotoSansRejang.ttf</font> + <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font> </family> <family lang="und-Runr"> - <font weight="400" style="normal">NotoSansRunic.ttf</font> + <font weight="400" style="normal">NotoSansRunic-Regular.ttf</font> </family> <family lang="und-Samr"> - <font weight="400" style="normal">NotoSansSamaritan.ttf</font> + <font weight="400" style="normal">NotoSansSamaritan-Regular.ttf</font> </family> <family lang="und-Saur"> - <font weight="400" style="normal">NotoSansSaurashtra.ttf</font> + <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font> </family> <family lang="und-Shaw"> - <font weight="400" style="normal">NotoSansShavian.ttf</font> + <font weight="400" style="normal">NotoSansShavian-Regular.ttf</font> </family> <family lang="und-Sund"> - <font weight="400" style="normal">NotoSansSundanese.ttf</font> + <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font> </family> <family lang="und-Sylo"> - <font weight="400" style="normal">NotoSansSylotiNagri.ttf</font> + <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font> </family> <!-- Esrangela should precede Eastern and Western Syriac, since it's our default form. --> <family lang="und-Syre"> - <font weight="400" style="normal">NotoSansSyriacEstrangela.ttf</font> + <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font> </family> <family lang="und-Syrn"> - <font weight="400" style="normal">NotoSansSyriacEastern.ttf</font> + <font weight="400" style="normal">NotoSansSyriacEastern-Regular.ttf</font> </family> <family lang="und-Syrj"> - <font weight="400" style="normal">NotoSansSyriacWestern.ttf</font> + <font weight="400" style="normal">NotoSansSyriacWestern-Regular.ttf</font> </family> <family lang="und-Tglg"> - <font weight="400" style="normal">NotoSansTagalog.ttf</font> + <font weight="400" style="normal">NotoSansTagalog-Regular.ttf</font> </family> <family lang="und-Tagb"> - <font weight="400" style="normal">NotoSansTagbanwa.ttf</font> + <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font> </family> <family lang="und-Lana"> - <font weight="400" style="normal">NotoSansTaiTham.ttf</font> + <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font> </family> <family lang="und-Tavt"> - <font weight="400" style="normal">NotoSansTaiViet.ttf</font> + <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font> </family> <family lang="und-Tibt"> - <font weight="400" style="normal">NotoSansTibetan.ttf</font> + <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font> <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font> </family> <family lang="und-Tfng"> <font weight="400" style="normal">NotoSansTifinagh-Regular.otf</font> </family> <family lang="und-Ugar"> - <font weight="400" style="normal">NotoSansUgaritic.ttf</font> + <font weight="400" style="normal">NotoSansUgaritic-Regular.ttf</font> </family> <family lang="und-Vaii"> - <font weight="400" style="normal">NotoSansVai.ttf</font> + <font weight="400" style="normal">NotoSansVai-Regular.ttf</font> </family> <family> <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> </family> <family lang="zh-Hans"> - <font weight="400" style="normal" index="2">NotoSansCJKjp-Regular.otc</font> - <font weight="400" style="normal" index="2" fallbackFor="serif">NotoSerifCJKjp-Regular.otc</font> + <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font> + <font weight="400" style="normal" index="2" fallbackFor="serif">NotoSerifCJK-Regular.ttc</font> </family> <family lang="zh-Hant,zh-Bopo"> - <font weight="400" style="normal" index="3">NotoSansCJKjp-Regular.otc</font> - <font weight="400" style="normal" index="3" fallbackFor="serif">NotoSerifCJKjp-Regular.otc</font> + <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font> + <font weight="400" style="normal" index="3" fallbackFor="serif">NotoSerifCJK-Regular.ttc</font> </family> <family lang="ja"> - <font weight="400" style="normal" index="0">NotoSansCJKjp-Regular.otc</font> - <font weight="400" style="normal" index="0" fallbackFor="serif">NotoSerifCJKjp-Regular.otc</font> + <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font> + <font weight="400" style="normal" index="0" fallbackFor="serif">NotoSerifCJK-Regular.ttc</font> </family> <family lang="ko"> - <font weight="400" style="normal" index="1">NotoSansCJKjp-Regular.otc</font> - <font weight="400" style="normal" index="1" fallbackFor="serif">NotoSerifCJKjp-Regular.otc</font> + <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> + <font weight="400" style="normal" index="1" fallbackFor="serif">NotoSerifCJK-Regular.ttc</font> </family> <family lang="und-Zsye"> <font weight="400" style="normal">NotoColorEmoji.ttf</font> @@ -602,16 +602,16 @@ override the East Asian punctuation for Chinese. --> <family lang="und-Tale"> - <font weight="400" style="normal">NotoSansTaiLe.ttf</font> + <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font> </family> <family lang="und-Yiii"> - <font weight="400" style="normal">NotoSansYi.ttf</font> + <font weight="400" style="normal">NotoSansYi-Regular.ttf</font> </family> <family lang="und-Mong"> - <font weight="400" style="normal">NotoSansMongolian.ttf</font> + <font weight="400" style="normal">NotoSansMongolian-Regular.ttf</font> </family> <family lang="und-Phag"> - <font weight="400" style="normal">NotoSansPhagsPa.ttf</font> + <font weight="400" style="normal">NotoSansPhagsPa-Regular.ttf</font> </family> <family lang="und-Hluw"> <font weight="400" style="normal">NotoSansAnatolianHieroglyphs-Regular.otf</font> diff --git a/drm/java/Android.bp b/drm/java/Android.bp new file mode 100644 index 000000000000..54e1a8c0dff8 --- /dev/null +++ b/drm/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-drm-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/graphics/java/Android.bp b/graphics/java/Android.bp new file mode 100644 index 000000000000..dcfd5d72a7cb --- /dev/null +++ b/graphics/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-graphics-nonupdatable-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/identity/java/Android.bp b/identity/java/Android.bp new file mode 100644 index 000000000000..16aef5d2d871 --- /dev/null +++ b/identity/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-identity-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/identity/java/android/security/identity/TEST_MAPPING b/identity/java/android/security/identity/TEST_MAPPING new file mode 100644 index 000000000000..87707a848efd --- /dev/null +++ b/identity/java/android/security/identity/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "CtsIdentityTestCases" + } + ] +} diff --git a/keystore/java/Android.bp b/keystore/java/Android.bp new file mode 100644 index 000000000000..6860f71a8516 --- /dev/null +++ b/keystore/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-keystore-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/location/java/Android.bp b/location/java/Android.bp new file mode 100644 index 000000000000..996a7ea37adf --- /dev/null +++ b/location/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-location-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/lowpan/java/Android.bp b/lowpan/java/Android.bp new file mode 100644 index 000000000000..b95b0daf428e --- /dev/null +++ b/lowpan/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-lowpan-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/media/java/Android.bp b/media/java/Android.bp index aea63a073e95..eeaf6e9015ac 100644 --- a/media/java/Android.bp +++ b/media/java/Android.bp @@ -8,6 +8,18 @@ package { } filegroup { + name: "framework-media-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + exclude_srcs: [ + ":framework-media-tv-tunerresourcemanager-sources-aidl", + ], + visibility: ["//frameworks/base"], +} + +filegroup { name: "IMidiDeviceServer.aidl", srcs: ["android/media/midi/IMidiDeviceServer.aidl"], } diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 7062f83fe575..5633236a122e 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -4412,14 +4412,25 @@ final public class MediaCodec { int i = 0; for (final String key: params.keySet()) { - keys[i] = key; - Object value = params.get(key); - - // Bundle's byte array is a byte[], JNI layer only takes ByteBuffer - if (value instanceof byte[]) { - values[i] = ByteBuffer.wrap((byte[])value); + if (key.equals(MediaFormat.KEY_AUDIO_SESSION_ID)) { + int sessionId = 0; + try { + sessionId = (Integer)params.get(key); + } catch (Exception e) { + throw new IllegalArgumentException("Wrong Session ID Parameter!"); + } + keys[i] = "audio-hw-sync"; + values[i] = AudioSystem.getAudioHwSyncForSession(sessionId); } else { - values[i] = value; + keys[i] = key; + Object value = params.get(key); + + // Bundle's byte array is a byte[], JNI layer only takes ByteBuffer + if (value instanceof byte[]) { + values[i] = ByteBuffer.wrap((byte[])value); + } else { + values[i] = value; + } } ++i; } diff --git a/media/java/android/media/tv/tunerresourcemanager/Android.bp b/media/java/android/media/tv/tunerresourcemanager/Android.bp index 66c7bd4a1f2b..e365ee11067d 100644 --- a/media/java/android/media/tv/tunerresourcemanager/Android.bp +++ b/media/java/android/media/tv/tunerresourcemanager/Android.bp @@ -6,6 +6,12 @@ package { // SPDX-license-identifier-Apache-2.0 default_applicable_licenses: ["frameworks_base_license"], } +filegroup { + // NOTE: This is purposefully left empty, and exists only so that it can be + // referenced in frameworks/base/Android.bp. + name: "framework-media-tv-tunerresourcemanager-sources-aidl", + srcs: [], +} filegroup { name: "framework-media-tv-tunerresourcemanager-sources", diff --git a/media/mca/effect/java/Android.bp b/media/mca/effect/java/Android.bp new file mode 100644 index 000000000000..708167c94607 --- /dev/null +++ b/media/mca/effect/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-mca-effect-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/media/mca/filterfw/java/Android.bp b/media/mca/filterfw/java/Android.bp new file mode 100644 index 000000000000..51be85b46602 --- /dev/null +++ b/media/mca/filterfw/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-mca-filterfw-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/media/mca/filterpacks/java/Android.bp b/media/mca/filterpacks/java/Android.bp new file mode 100644 index 000000000000..d9271b95f6d2 --- /dev/null +++ b/media/mca/filterpacks/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-mca-filterpacks-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/mime/java/Android.bp b/mime/java/Android.bp new file mode 100644 index 000000000000..7e562639d4cc --- /dev/null +++ b/mime/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-mime-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/mms/java/Android.bp b/mms/java/Android.bp new file mode 100644 index 000000000000..367d8c35fdce --- /dev/null +++ b/mms/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-mms-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/opengl/java/Android.bp b/opengl/java/Android.bp new file mode 100644 index 000000000000..8ed4161cb9de --- /dev/null +++ b/opengl/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-opengl-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/packages/Connectivity/framework/api/current.txt b/packages/Connectivity/framework/api/current.txt index ad44b27f6d0b..0a9560a5c56d 100644 --- a/packages/Connectivity/framework/api/current.txt +++ b/packages/Connectivity/framework/api/current.txt @@ -68,6 +68,7 @@ package android.net { method public boolean bindProcessToNetwork(@Nullable android.net.Network); method @NonNull public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull android.net.IpSecManager.UdpEncapsulationSocket, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network getActiveNetwork(); + method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public android.net.Network getActiveNetworkForUid(int); method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getActiveNetworkInfo(); method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo[] getAllNetworkInfo(); method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network[] getAllNetworks(); @@ -387,7 +388,9 @@ package android.net { public class NetworkRequest implements android.os.Parcelable { method public boolean canBeSatisfiedBy(@Nullable android.net.NetworkCapabilities); method public int describeContents(); + method @NonNull public int[] getCapabilities(); method @Nullable public android.net.NetworkSpecifier getNetworkSpecifier(); + method @NonNull public int[] getTransportTypes(); method public boolean hasCapability(int); method public boolean hasTransport(int); method public void writeToParcel(android.os.Parcel, int); diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt index 35e45ecb1853..cd96a1b481b6 100644 --- a/packages/Connectivity/framework/api/module-lib-current.txt +++ b/packages/Connectivity/framework/api/module-lib-current.txt @@ -120,6 +120,7 @@ package android.net { } public class NetworkRequest implements android.os.Parcelable { + method @NonNull public int[] getUnwantedCapabilities(); method public boolean hasUnwantedCapability(int); } diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt index 1ee79a425e80..95ad694293f2 100644 --- a/packages/Connectivity/framework/api/system-current.txt +++ b/packages/Connectivity/framework/api/system-current.txt @@ -219,7 +219,7 @@ package android.net { method public void onAutomaticReconnectDisabled(); method public void onBandwidthUpdateRequested(); method public void onNetworkCreated(); - method public void onNetworkDisconnected(); + method public void onNetworkDestroyed(); method public void onNetworkUnwanted(); method public void onQosCallbackRegistered(int, @NonNull android.net.QosFilter); method public void onQosCallbackUnregistered(int); @@ -238,6 +238,7 @@ package android.net { method public final void sendQosSessionLost(int, int, int); method public final void sendSocketKeepaliveEvent(int, int); method @Deprecated public void setLegacySubtype(int, @NonNull String); + method public void setTeardownDelayMs(@IntRange(from=0, to=0x1388) int); method public final void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>); method public void unregister(); field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2 diff --git a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java index d196c1a2d186..c6f4e0b354c4 100644 --- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java +++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java @@ -921,6 +921,7 @@ public class ConnectivityManager { BLOCKED_REASON_DOZE, BLOCKED_REASON_APP_STANDBY, BLOCKED_REASON_RESTRICTED_MODE, + BLOCKED_REASON_LOCKDOWN_VPN, BLOCKED_METERED_REASON_DATA_SAVER, BLOCKED_METERED_REASON_USER_RESTRICTED, BLOCKED_METERED_REASON_ADMIN_DISABLED, @@ -1189,8 +1190,7 @@ public class ConnectivityManager { * * @return a {@link Network} object for the current default network for the * given UID or {@code null} if no default network is currently active - * - * @hide + * TODO: b/183465229 Cleanup getActiveNetworkForUid once b/165835257 is fixed */ @RequiresPermission(android.Manifest.permission.NETWORK_STACK) @Nullable @@ -3659,7 +3659,8 @@ public class ConnectivityManager { public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {} /** - * Called when access to the specified network is blocked or unblocked. + * Called when access to the specified network is blocked or unblocked, or the reason for + * access being blocked changes. * * If a NetworkCallback object implements this method, * {@link #onBlockedStatusChanged(Network, boolean)} will not be called. diff --git a/packages/Connectivity/framework/src/android/net/INetworkAgent.aidl b/packages/Connectivity/framework/src/android/net/INetworkAgent.aidl index f9d399459ebd..d941d4b95b56 100644 --- a/packages/Connectivity/framework/src/android/net/INetworkAgent.aidl +++ b/packages/Connectivity/framework/src/android/net/INetworkAgent.aidl @@ -47,5 +47,5 @@ oneway interface INetworkAgent { void onQosFilterCallbackRegistered(int qosCallbackId, in QosFilterParcelable filterParcel); void onQosCallbackUnregistered(int qosCallbackId); void onNetworkCreated(); - void onNetworkDisconnected(); + void onNetworkDestroyed(); } diff --git a/packages/Connectivity/framework/src/android/net/INetworkAgentRegistry.aidl b/packages/Connectivity/framework/src/android/net/INetworkAgentRegistry.aidl index cbd6193744b9..26cb1ed6b4b4 100644 --- a/packages/Connectivity/framework/src/android/net/INetworkAgentRegistry.aidl +++ b/packages/Connectivity/framework/src/android/net/INetworkAgentRegistry.aidl @@ -41,4 +41,5 @@ oneway interface INetworkAgentRegistry { void sendNrQosSessionAvailable(int callbackId, in QosSession session, in NrQosSessionAttributes attributes); void sendQosSessionLost(int qosCallbackId, in QosSession session); void sendQosCallbackError(int qosCallbackId, int exceptionType); + void sendTeardownDelayMs(int teardownDelayMs); } diff --git a/packages/Connectivity/framework/src/android/net/NetworkAgent.java b/packages/Connectivity/framework/src/android/net/NetworkAgent.java index 6b55bb771c30..c57da53f289d 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkAgent.java +++ b/packages/Connectivity/framework/src/android/net/NetworkAgent.java @@ -185,6 +185,20 @@ public abstract class NetworkAgent { public static final int EVENT_UNDERLYING_NETWORKS_CHANGED = BASE + 5; /** + * Sent by the NetworkAgent to ConnectivityService to pass the current value of the teardown + * delay. + * arg1 = teardown delay in milliseconds + * @hide + */ + public static final int EVENT_TEARDOWN_DELAY_CHANGED = BASE + 6; + + /** + * The maximum value for the teardown delay, in milliseconds. + * @hide + */ + public static final int MAX_TEARDOWN_DELAY_MS = 5000; + + /** * Sent by ConnectivityService to the NetworkAgent to inform the agent of the * networks status - whether we could use the network or could not, due to * either a bad network configuration (no internet link) or captive portal. @@ -197,7 +211,6 @@ public abstract class NetworkAgent { */ public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7; - /** * Network validation suceeded. * Corresponds to {@link NetworkCapabilities.NET_CAPABILITY_VALIDATED}. @@ -376,7 +389,7 @@ public abstract class NetworkAgent { * * @hide */ - public static final int CMD_NETWORK_DISCONNECTED = BASE + 23; + public static final int CMD_NETWORK_DESTROYED = BASE + 23; private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) { final NetworkInfo ni = new NetworkInfo(config.legacyType, config.legacySubType, @@ -581,8 +594,8 @@ public abstract class NetworkAgent { onNetworkCreated(); break; } - case CMD_NETWORK_DISCONNECTED: { - onNetworkDisconnected(); + case CMD_NETWORK_DESTROYED: { + onNetworkDestroyed(); break; } } @@ -732,8 +745,8 @@ public abstract class NetworkAgent { } @Override - public void onNetworkDisconnected() { - mHandler.sendMessage(mHandler.obtainMessage(CMD_NETWORK_DISCONNECTED)); + public void onNetworkDestroyed() { + mHandler.sendMessage(mHandler.obtainMessage(CMD_NETWORK_DESTROYED)); } } @@ -851,6 +864,29 @@ public abstract class NetworkAgent { } /** + * Sets the value of the teardown delay. + * + * The teardown delay is the time between when the network disconnects and when the native + * network corresponding to this {@code NetworkAgent} is destroyed. By default, the native + * network is destroyed immediately. If {@code teardownDelayMs} is non-zero, then when this + * network disconnects, the system will instead immediately mark the network as restricted + * and unavailable to unprivileged apps, but will defer destroying the native network until the + * teardown delay timer expires. + * + * The interfaces in use by this network will remain in use until the native network is + * destroyed and cannot be reused until {@link #onNetworkDestroyed()} is called. + * + * This method may be called at any time while the network is connected. It has no effect if + * the network is already disconnected and the teardown delay timer is running. + * + * @param teardownDelayMs the teardown delay to set, or 0 to disable teardown delay. + */ + public void setTeardownDelayMs( + @IntRange(from = 0, to = MAX_TEARDOWN_DELAY_MS) int teardownDelayMs) { + queueOrSendMessage(reg -> reg.sendTeardownDelayMs(teardownDelayMs)); + } + + /** * Change the legacy subtype of this network agent. * * This is only for backward compatibility and should not be used by non-legacy network agents, @@ -1053,7 +1089,7 @@ public abstract class NetworkAgent { /** * Called when ConnectivityService has successfully destroy this NetworkAgent's native network. */ - public void onNetworkDisconnected() {} + public void onNetworkDestroyed() {} /** * Requests that the network hardware send the specified packet at the specified interval. diff --git a/packages/Connectivity/framework/src/android/net/NetworkRequest.java b/packages/Connectivity/framework/src/android/net/NetworkRequest.java index bcbc04f72efc..38691ef5cb39 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkRequest.java +++ b/packages/Connectivity/framework/src/android/net/NetworkRequest.java @@ -699,4 +699,43 @@ public class NetworkRequest implements Parcelable { public int hashCode() { return Objects.hash(requestId, legacyType, networkCapabilities, type); } + + /** + * Gets all the capabilities set on this {@code NetworkRequest} instance. + * + * @return an array of capability values for this instance. + */ + @NonNull + public @NetCapability int[] getCapabilities() { + // No need to make a defensive copy here as NC#getCapabilities() already returns + // a new array. + return networkCapabilities.getCapabilities(); + } + + /** + * Gets all the unwanted capabilities set on this {@code NetworkRequest} instance. + * + * @return an array of unwanted capability values for this instance. + * + * @hide + */ + @NonNull + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public @NetCapability int[] getUnwantedCapabilities() { + // No need to make a defensive copy here as NC#getUnwantedCapabilities() already returns + // a new array. + return networkCapabilities.getUnwantedCapabilities(); + } + + /** + * Gets all the transports set on this {@code NetworkRequest} instance. + * + * @return an array of transport type values for this instance. + */ + @NonNull + public @Transport int[] getTransportTypes() { + // No need to make a defensive copy here as NC#getTransportTypes() already returns + // a new array. + return networkCapabilities.getTransportTypes(); + } } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index b7ce2a30931b..904148f0415b 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -122,7 +122,8 @@ <uses-permission android:name="android.permission.CREATE_USERS" /> <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> <uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" /> - <uses-permission android:name="android.permission.QUERY_USERS" /> + <uses-permission android:name="android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS" /> + <uses-permission android:name="android.permission.CLEAR_FREEZE_PERIOD" /> <uses-permission android:name="android.permission.MODIFY_QUIET_MODE" /> <uses-permission android:name="android.permission.ACCESS_LOWPAN_STATE"/> <uses-permission android:name="android.permission.CHANGE_LOWPAN_STATE"/> @@ -182,6 +183,7 @@ <uses-permission android:name="android.permission.SET_HARMFUL_APP_WARNINGS" /> <uses-permission android:name="android.permission.MANAGE_SENSORS" /> <uses-permission android:name="android.permission.MANAGE_AUDIO_POLICY" /> + <uses-permission android:name="android.permission.QUERY_AUDIO_STATE" /> <uses-permission android:name="android.permission.MANAGE_CAMERA" /> <!-- Permissions needed to test system only camera devices --> <uses-permission android:name="android.permission.CAMERA" /> @@ -230,6 +232,9 @@ <!-- Permission needed to run keyguard manager tests in CTS --> <uses-permission android:name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS" /> + <!-- Permission needed to set/clear/verify lockscreen credentials in CTS tests --> + <uses-permission android:name="android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS" /> + <!-- Permission needed to test wallpaper component --> <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" /> @@ -369,6 +374,15 @@ <uses-permission android:name="android.permission.BIND_RESUME_ON_REBOOT_SERVICE" /> <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION"/> + <!-- Permission required for CTS test - ResourceObserverNativeTest --> + <uses-permission android:name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" /> + + <!-- Permission required for CTS test - android.widget.cts.ToastTest --> + <uses-permission android:name="android.permission.UNLIMITED_TOASTS" /> + + <!-- Permission required for CTS test - CtsAlarmManagerTestCases --> + <uses-permission android:name="android.permission.SCHEDULE_PRIORITIZED_ALARM" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/rs/java/Android.bp b/rs/java/Android.bp new file mode 100644 index 000000000000..9f854f7d5cb7 --- /dev/null +++ b/rs/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-rs-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/sax/java/Android.bp b/sax/java/Android.bp new file mode 100644 index 000000000000..97751891559c --- /dev/null +++ b/sax/java/Android.bp @@ -0,0 +1,5 @@ +filegroup { + name: "framework-sax-sources", + srcs: ["**/*.java"], + visibility: ["//frameworks/base"], +} diff --git a/services/api/current.txt b/services/api/current.txt index 17ca369c62ab..7c5c01ef6868 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -80,6 +80,14 @@ package com.android.server { } +package com.android.server.stats { + + public final class StatsHelper { + method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context); + } + +} + package com.android.server.wifi { public class SupplicantManager { diff --git a/services/api/non-updatable-current.txt b/services/api/non-updatable-current.txt index 647739f34cf2..6419b7088fdb 100644 --- a/services/api/non-updatable-current.txt +++ b/services/api/non-updatable-current.txt @@ -35,6 +35,14 @@ package com.android.server { } +package com.android.server.stats { + + public final class StatsHelper { + method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context); + } + +} + package com.android.server.wifi { public class SupplicantManager { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 0c4258561f70..e3ce7a31b97e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -318,6 +318,9 @@ public class ConnectivityService extends IConnectivityManager.Stub // The maximum number of network request allowed per uid before an exception is thrown. private static final int MAX_NETWORK_REQUESTS_PER_UID = 100; + // The maximum number of network request allowed for system UIDs before an exception is thrown. + private static final int MAX_NETWORK_REQUESTS_PER_SYSTEM_UID = 250; + @VisibleForTesting protected int mLingerDelayMs; // Can't be final, or test subclass constructors can't change it. @VisibleForTesting @@ -333,6 +336,7 @@ public class ConnectivityService extends IConnectivityManager.Stub protected final PermissionMonitor mPermissionMonitor; private final PerUidCounter mNetworkRequestCounter; + private final PerUidCounter mSystemNetworkRequestCounter; private volatile boolean mLockdownEnabled; @@ -1201,6 +1205,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mContext = Objects.requireNonNull(context, "missing Context"); mResources = deps.getResources(mContext); mNetworkRequestCounter = new PerUidCounter(MAX_NETWORK_REQUESTS_PER_UID); + mSystemNetworkRequestCounter = new PerUidCounter(MAX_NETWORK_REQUESTS_PER_SYSTEM_UID); mMetricsLog = logger; mNetworkRanker = new NetworkRanker(); @@ -1551,16 +1556,16 @@ public class ConnectivityService extends IConnectivityManager.Stub mNetworkInfoBlockingLogs.log(action + " " + uid); } - private void maybeLogBlockedStatusChanged(NetworkRequestInfo nri, Network net, - boolean blocked) { + private void maybeLogBlockedStatusChanged(NetworkRequestInfo nri, Network net, int blocked) { if (nri == null || net == null || !LOGD_BLOCKED_NETWORKINFO) { return; } - final String action = blocked ? "BLOCKED" : "UNBLOCKED"; + final String action = (blocked != 0) ? "BLOCKED" : "UNBLOCKED"; final int requestId = nri.getActiveRequest() != null ? nri.getActiveRequest().requestId : nri.mRequests.get(0).requestId; mNetworkInfoBlockingLogs.log(String.format( - "%s %d(%d) on netId %d", action, nri.mAsUid, requestId, net.getNetId())); + "%s %d(%d) on netId %d: %s", action, nri.mAsUid, requestId, net.getNetId(), + blockedReasonsToString(blocked))); } /** @@ -3122,6 +3127,13 @@ public class ConnectivityService extends IConnectivityManager.Stub } break; } + case NetworkAgent.EVENT_TEARDOWN_DELAY_CHANGED: { + if (msg.arg1 >= 0 && msg.arg1 <= NetworkAgent.MAX_TEARDOWN_DELAY_MS) { + nai.teardownDelayMs = msg.arg1; + } else { + logwtf(nai.toShortString() + " set invalid teardown delay " + msg.arg1); + } + } } } @@ -3692,6 +3704,23 @@ public class ConnectivityService extends IConnectivityManager.Stub mLegacyTypeTracker.remove(nai, wasDefault); rematchAllNetworksAndRequests(); mLingerMonitor.noteDisconnect(nai); + + // Immediate teardown. + if (nai.teardownDelayMs == 0) { + destroyNetwork(nai); + return; + } + + // Delayed teardown. + try { + mNetd.networkSetPermissionForNetwork(nai.network.netId, INetd.PERMISSION_SYSTEM); + } catch (RemoteException e) { + Log.d(TAG, "Error marking network restricted during teardown: " + e); + } + mHandler.postDelayed(() -> destroyNetwork(nai), nai.teardownDelayMs); + } + + private void destroyNetwork(NetworkAgentInfo nai) { if (nai.created) { // Tell netd to clean up the configuration for this network // (routing rules, DNS, etc). @@ -3704,7 +3733,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mDnsManager.removeNetwork(nai.network); } mNetIdManager.releaseNetId(nai.network.getNetId()); - nai.onNetworkDisconnected(); + nai.onNetworkDestroyed(); } private boolean createNativeNetwork(@NonNull NetworkAgentInfo networkAgent) { @@ -4005,7 +4034,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } - mNetworkRequestCounter.decrementCount(nri.mUid); + decrementRequestCount(nri); mNetworkRequestInfoLogs.log("RELEASE " + nri); if (null != nri.getActiveRequest()) { @@ -4116,6 +4145,20 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + private PerUidCounter getRequestCounter(NetworkRequestInfo nri) { + return checkAnyPermissionOf( + nri.mPid, nri.mUid, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) + ? mSystemNetworkRequestCounter : mNetworkRequestCounter; + } + + private void incrementRequestCountOrThrow(NetworkRequestInfo nri) { + getRequestCounter(nri).incrementCountOrThrow(nri.mUid); + } + + private void decrementRequestCount(NetworkRequestInfo nri) { + getRequestCounter(nri).decrementCount(nri.mUid); + } + @Override public void setAcceptUnvalidated(Network network, boolean accept, boolean always) { enforceNetworkStackSettingsOrSetup(); @@ -5464,7 +5507,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mPid = getCallingPid(); mUid = mDeps.getCallingUid(); mAsUid = asUid; - mNetworkRequestCounter.incrementCountOrThrow(mUid); + incrementRequestCountOrThrow(this); /** * Location sensitive data not included in pending intent. Only included in * {@link NetworkCallback}. @@ -5496,7 +5539,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mUid = mDeps.getCallingUid(); mAsUid = asUid; mPendingIntent = null; - mNetworkRequestCounter.incrementCountOrThrow(mUid); + incrementRequestCountOrThrow(this); mCallbackFlags = callbackFlags; mCallingAttributionTag = callingAttributionTag; @@ -5539,7 +5582,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mUid = nri.mUid; mAsUid = nri.mAsUid; mPendingIntent = nri.mPendingIntent; - mNetworkRequestCounter.incrementCountOrThrow(mUid); + incrementRequestCountOrThrow(this); mCallbackFlags = nri.mCallbackFlags; mCallingAttributionTag = nri.mCallingAttributionTag; } @@ -6253,8 +6296,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // Request used to optionally keep vehicle internal network always active private final NetworkRequest mDefaultVehicleRequest; - // TODO replace with INetd.DUMMY_NET_ID when available. - private static final int NO_SERVICE_NET_ID = 51; + // TODO replace with INetd.UNREACHABLE_NET_ID when available. + private static final int NO_SERVICE_NET_ID = 52; // Sentinel NAI used to direct apps with default networks that should have no connectivity to a // network with no service. This NAI should never be matched against, nor should any public API // ever return the associated network. For this reason, this NAI is not in the list of available @@ -7348,7 +7391,7 @@ public class ConnectivityService extends IConnectivityManager.Stub break; } case ConnectivityManager.CALLBACK_BLK_CHANGED: { - maybeLogBlockedStatusChanged(nri, networkAgent.network, arg1 != 0); + maybeLogBlockedStatusChanged(nri, networkAgent.network, arg1); msg.arg1 = arg1; break; } @@ -8724,7 +8767,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Decrement the reference count for this NetworkRequestInfo. The reference count is // incremented when the NetworkRequestInfo is created as part of // enforceRequestCountLimit(). - mNetworkRequestCounter.decrementCount(nri.mUid); + decrementRequestCount(nri); return; } @@ -8790,7 +8833,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Decrement the reference count for this NetworkRequestInfo. The reference count is // incremented when the NetworkRequestInfo is created as part of // enforceRequestCountLimit(). - mNetworkRequestCounter.decrementCount(nri.mUid); + decrementRequestCount(nri); iCb.unlinkToDeath(cbInfo, 0); } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index a95589b5ace3..0affda4fd561 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -402,10 +402,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { switch (msg.what) { case MSG_USER_SWITCHED: { if (VDBG) log("MSG_USER_SWITCHED userId=" + msg.arg1); - int numPhones = getTelephonyManager().getPhoneCount(); - for (int sub = 0; sub < numPhones; sub++) { - TelephonyRegistry.this.notifyCellLocationForSubscriber(sub, - mCellIdentity[sub]); + int numPhones = getTelephonyManager().getActiveModemCount(); + for (int phoneId = 0; phoneId < numPhones; phoneId++) { + int[] subIds = SubscriptionManager.getSubId(phoneId); + int subId = + (subIds != null) && (subIds.length > 0) + ? subIds[0] + : SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; + TelephonyRegistry.this.notifyCellLocationForSubscriber( + subId, mCellIdentity[phoneId], true /* hasUserSwitched */); } break; } @@ -1879,20 +1884,20 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } @Override - public void notifyCellLocation(CellIdentity cellLocation) { - notifyCellLocationForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, cellLocation); + public void notifyCellLocationForSubscriber(int subId, CellIdentity cellIdentity) { + notifyCellLocationForSubscriber(subId, cellIdentity, false /* hasUserSwitched */); } - @Override - public void notifyCellLocationForSubscriber(int subId, CellIdentity cellIdentity) { - log("notifyCellLocationForSubscriber: subId=" + subId - + " cellIdentity=" + cellIdentity); + private void notifyCellLocationForSubscriber(int subId, CellIdentity cellIdentity, + boolean hasUserSwitched) { + log("notifyCellLocationForSubscriber: subId=" + subId + " cellIdentity=" + cellIdentity); if (!checkNotifyPermission("notifyCellLocation()")) { return; } int phoneId = getPhoneIdFromSubId(subId); synchronized (mRecords) { - if (validatePhoneId(phoneId) && !Objects.equals(cellIdentity, mCellIdentity[phoneId])) { + if (validatePhoneId(phoneId) + && (hasUserSwitched || !Objects.equals(cellIdentity, mCellIdentity[phoneId]))) { mCellIdentity[phoneId] = cellIdentity; for (Record r : mRecords) { if (validateEventAndUserLocked( @@ -2553,7 +2558,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { final int recordCount = mRecords.size(); pw.println("last known state:"); pw.increaseIndent(); - for (int i = 0; i < getTelephonyManager().getPhoneCount(); i++) { + for (int i = 0; i < getTelephonyManager().getActiveModemCount(); i++) { pw.println("Phone Id=" + i); pw.increaseIndent(); pw.println("mCallState=" + mCallState[i]); diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 4622e98bbbb2..8eefbfc606de 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -36,7 +36,6 @@ import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.LinkProperties; import android.net.NetworkCapabilities; -import android.net.TelephonyNetworkSpecifier; import android.net.vcn.IVcnManagementService; import android.net.vcn.IVcnStatusCallback; import android.net.vcn.IVcnUnderlyingNetworkPolicyListener; @@ -717,19 +716,29 @@ public class VcnManagementService extends IVcnManagementService.Stub { }); } - private int getSubIdForNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) { - if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) - && networkCapabilities.getNetworkSpecifier() instanceof TelephonyNetworkSpecifier) { - TelephonyNetworkSpecifier telephonyNetworkSpecifier = - (TelephonyNetworkSpecifier) networkCapabilities.getNetworkSpecifier(); - return telephonyNetworkSpecifier.getSubscriptionId(); - } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) - && networkCapabilities.getTransportInfo() instanceof WifiInfo) { - WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo(); - return mDeps.getSubIdForWifiInfo(wifiInfo); + private ParcelUuid getSubGroupForNetworkCapabilities( + @NonNull NetworkCapabilities networkCapabilities) { + ParcelUuid subGrp = null; + final TelephonySubscriptionSnapshot snapshot; + + // Always access mLastSnapshot under lock. Technically this can be treated as a volatile + // but for consistency and safety, always access under lock. + synchronized (mLock) { + snapshot = mLastSnapshot; + } + + // If multiple subscription IDs exist, they MUST all point to the same subscription + // group. Otherwise undefined behavior may occur. + for (int subId : networkCapabilities.getSubIds()) { + // Verify that all subscriptions point to the same group + if (subGrp != null && !subGrp.equals(snapshot.getGroupForSubId(subId))) { + Slog.wtf(TAG, "Got multiple subscription groups for a single network"); + } + + subGrp = snapshot.getGroupForSubId(subId); } - return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + return subGrp; } /** @@ -754,23 +763,19 @@ public class VcnManagementService extends IVcnManagementService.Stub { // mutates final NetworkCapabilities ncCopy = new NetworkCapabilities(networkCapabilities); - final int subId = getSubIdForNetworkCapabilities(ncCopy); + final ParcelUuid subGrp = getSubGroupForNetworkCapabilities(ncCopy); boolean isVcnManagedNetwork = false; boolean isRestrictedCarrierWifi = false; - if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - synchronized (mLock) { - ParcelUuid subGroup = mLastSnapshot.getGroupForSubId(subId); - - final Vcn vcn = mVcns.get(subGroup); - if (vcn != null) { - if (vcn.isActive()) { - isVcnManagedNetwork = true; - } + synchronized (mLock) { + final Vcn vcn = mVcns.get(subGrp); + if (vcn != null) { + if (vcn.isActive()) { + isVcnManagedNetwork = true; + } - if (ncCopy.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { - // Carrier WiFi always restricted if VCN exists (even in safe mode). - isRestrictedCarrierWifi = true; - } + if (ncCopy.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + // Carrier WiFi always restricted if VCN exists (even in safe mode). + isRestrictedCarrierWifi = true; } } } diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index 6aec9fcf9a24..72160c203595 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -52,6 +52,10 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; +import android.system.VmSocketAddress; import android.text.TextUtils; import android.util.Slog; import android.util.SparseArray; @@ -63,8 +67,11 @@ import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.wm.WindowManagerInternal; -import java.io.IOException; -import java.io.RandomAccessFile; +import java.io.FileDescriptor; +import java.io.InterruptedIOException; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -76,10 +83,10 @@ class HostClipboardMonitor implements Runnable { void onHostClipboardUpdated(String contents); } - private RandomAccessFile mPipe = null; + private FileDescriptor mPipe = null; private HostClipboardCallback mHostClipboardCallback; private static final String PIPE_NAME = "pipe:clipboard"; - private static final String PIPE_DEVICE = "/dev/qemu_pipe"; + private static final int HOST_PORT = 5000; private static byte[] createOpenHandshake() { // String.getBytes doesn't include the null terminator, @@ -93,40 +100,57 @@ class HostClipboardMonitor implements Runnable { private boolean openPipe() { try { - final RandomAccessFile pipe = new RandomAccessFile(PIPE_DEVICE, "rw"); + final FileDescriptor fd = Os.socket(OsConstants.AF_VSOCK, OsConstants.SOCK_STREAM, 0); + try { - pipe.write(createOpenHandshake()); - mPipe = pipe; + Os.connect(fd, new VmSocketAddress(HOST_PORT, OsConstants.VMADDR_CID_HOST)); + + final byte[] handshake = createOpenHandshake(); + Os.write(fd, handshake, 0, handshake.length); + mPipe = fd; return true; - } catch (IOException ignore) { - pipe.close(); + } catch (ErrnoException | SocketException | InterruptedIOException e) { + Os.close(fd); } - } catch (IOException ignore) { + } catch (ErrnoException e) { } + return false; } private void closePipe() { try { - final RandomAccessFile pipe = mPipe; + final FileDescriptor fd = mPipe; mPipe = null; - if (pipe != null) { - pipe.close(); + if (fd != null) { + Os.close(fd); } - } catch (IOException ignore) { + } catch (ErrnoException ignore) { } } - private byte[] receiveMessage() throws IOException { - final int size = Integer.reverseBytes(mPipe.readInt()); - final byte[] receivedData = new byte[size]; - mPipe.readFully(receivedData); - return receivedData; + private byte[] receiveMessage() throws ErrnoException, InterruptedIOException { + final byte[] lengthBits = new byte[4]; + Os.read(mPipe, lengthBits, 0, lengthBits.length); + + final ByteBuffer bb = ByteBuffer.wrap(lengthBits); + bb.order(ByteOrder.LITTLE_ENDIAN); + final int msgLen = bb.getInt(); + + final byte[] msg = new byte[msgLen]; + Os.read(mPipe, msg, 0, msg.length); + + return msg; } - private void sendMessage(byte[] message) throws IOException { - mPipe.writeInt(Integer.reverseBytes(message.length)); - mPipe.write(message); + private void sendMessage(byte[] msg) throws ErrnoException, InterruptedIOException { + final byte[] lengthBits = new byte[4]; + final ByteBuffer bb = ByteBuffer.wrap(lengthBits); + bb.order(ByteOrder.LITTLE_ENDIAN); + bb.putInt(msg.length); + + Os.write(mPipe, lengthBits, 0, lengthBits.length); + Os.write(mPipe, msg, 0, msg.length); } public HostClipboardMonitor(HostClipboardCallback cb) { @@ -135,7 +159,7 @@ class HostClipboardMonitor implements Runnable { @Override public void run() { - while(!Thread.interrupted()) { + while (!Thread.interrupted()) { try { // There's no guarantee that QEMU pipes will be ready at the moment // this method is invoked. We simply try to get the pipe open and @@ -147,9 +171,10 @@ class HostClipboardMonitor implements Runnable { final byte[] receivedData = receiveMessage(); mHostClipboardCallback.onHostClipboardUpdated( new String(receivedData)); - } catch (IOException e) { + } catch (ErrnoException | InterruptedIOException e) { closePipe(); - } catch (InterruptedException e) {} + } catch (InterruptedException e) { + } } } @@ -158,7 +183,7 @@ class HostClipboardMonitor implements Runnable { if (mPipe != null) { sendMessage(content.getBytes()); } - } catch(IOException e) { + } catch (ErrnoException | InterruptedIOException e) { Slog.e("HostClipboardMonitor", "Failed to set host clipboard " + e.getMessage()); } diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index f3d201289f0e..6ea84ce35002 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -18,12 +18,14 @@ package com.android.server.connectivity; import static android.util.TimeUtils.NANOS_PER_MS; +import android.annotation.Nullable; import android.content.Context; import android.net.ConnectivityManager; import android.net.INetdEventCallback; import android.net.MacAddress; import android.net.Network; import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.net.metrics.ConnectStats; import android.net.metrics.DnsEvent; import android.net.metrics.INetdEventListener; @@ -98,6 +100,7 @@ public class NetdEventListenerService extends INetdEventListener.Stub { private final TokenBucket mConnectTb = new TokenBucket(CONNECT_LATENCY_FILL_RATE, CONNECT_LATENCY_BURST_LIMIT); + final TransportForNetIdNetworkCallback mCallback = new TransportForNetIdNetworkCallback(); /** * There are only 3 possible callbacks. @@ -158,6 +161,9 @@ public class NetdEventListenerService extends INetdEventListener.Stub { public NetdEventListenerService(ConnectivityManager cm) { // We are started when boot is complete, so ConnectivityService should already be running. mCm = cm; + // Clear all capabilities to listen all networks. + mCm.registerNetworkCallback(new NetworkRequest.Builder().clearCapabilities().build(), + mCallback); } private static long projectSnapshotTime(long timeMs) { @@ -389,18 +395,13 @@ public class NetdEventListenerService extends INetdEventListener.Stub { } private long getTransports(int netId) { - // TODO: directly query ConnectivityService instead of going through Binder interface. - NetworkCapabilities nc = mCm.getNetworkCapabilities(new Network(netId)); + final NetworkCapabilities nc = mCallback.getNetworkCapabilities(netId); if (nc == null) { return 0; } return BitUtils.packBits(nc.getTransportTypes()); } - private static void maybeLog(String s, Object... args) { - if (DBG) Log.d(TAG, String.format(s, args)); - } - /** Helper class for buffering summaries of NetworkMetrics at regular time intervals */ static class NetworkMetricsSnapshot { @@ -428,4 +429,29 @@ public class NetdEventListenerService extends INetdEventListener.Stub { return String.format("%tT.%tL: %s", timeMs, timeMs, j.toString()); } } + + private class TransportForNetIdNetworkCallback extends ConnectivityManager.NetworkCallback { + private final SparseArray<NetworkCapabilities> mCapabilities = new SparseArray<>(); + + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) { + synchronized (mCapabilities) { + mCapabilities.put(network.getNetId(), nc); + } + } + + @Override + public void onLost(Network network) { + synchronized (mCapabilities) { + mCapabilities.remove(network.getNetId()); + } + } + + @Nullable + public NetworkCapabilities getNetworkCapabilities(int netId) { + synchronized (mCapabilities) { + return mCapabilities.get(netId); + } + } + } } diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 97df5bff4946..ee32fbf00dfe 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -201,6 +201,9 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { // Set to true when partial connectivity was detected. public boolean partialConnectivity; + // Delay between when the network is disconnected and when the native network is destroyed. + public int teardownDelayMs; + // Captive portal info of the network from RFC8908, if any. // Obtained by ConnectivityService and merged into NetworkAgent-provided information. public CaptivePortalData capportApiData; @@ -589,13 +592,13 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { } /** - * Notify the NetworkAgent that the network is disconnected and destroyed. + * Notify the NetworkAgent that the native network has been destroyed. */ - public void onNetworkDisconnected() { + public void onNetworkDestroyed() { try { - networkAgent.onNetworkDisconnected(); + networkAgent.onNetworkDestroyed(); } catch (RemoteException e) { - Log.e(TAG, "Error sending network disconnected event", e); + Log.e(TAG, "Error sending network destroyed event", e); } } @@ -675,6 +678,12 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { @QosCallbackException.ExceptionType final int exceptionType) { mQosCallbackTracker.sendEventQosCallbackError(qosCallbackId, exceptionType); } + + @Override + public void sendTeardownDelayMs(int teardownDelayMs) { + mHandler.obtainMessage(NetworkAgent.EVENT_TEARDOWN_DELAY_CHANGED, + teardownDelayMs, 0, new Pair<>(NetworkAgentInfo.this, null)).sendToTarget(); + } } /** diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java index 6f12155c5ec6..6a407e99f1e4 100644 --- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java +++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java @@ -440,9 +440,8 @@ public abstract class BrightnessMappingStrategy { } private float permissibleRatio(float currLux, float prevLux) { - return MathUtils.exp(MAX_GRAD - * (MathUtils.log(currLux + LUX_GRAD_SMOOTHING) - - MathUtils.log(prevLux + LUX_GRAD_SMOOTHING))); + return MathUtils.pow((currLux + LUX_GRAD_SMOOTHING) + / (prevLux + LUX_GRAD_SMOOTHING), MAX_GRAD); } protected float inferAutoBrightnessAdjustment(float maxGamma, float desiredBrightness, diff --git a/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java index ee3427f0a383..740407c42178 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java @@ -35,9 +35,23 @@ final class HdmiControlShellCommand extends ShellCommand { private final IHdmiControlService.Stub mBinderService; + final CountDownLatch mLatch; + AtomicInteger mCecResult; + IHdmiControlCallback.Stub mHdmiControlCallback; HdmiControlShellCommand(IHdmiControlService.Stub binderService) { mBinderService = binderService; + mLatch = new CountDownLatch(1); + mCecResult = new AtomicInteger(); + mHdmiControlCallback = + new IHdmiControlCallback.Stub() { + @Override + public void onComplete(int result) { + getOutPrintWriter().println(" done (" + getResultString(result) + ")"); + mCecResult.set(result); + mLatch.countDown(); + } + }; } @Override @@ -70,6 +84,8 @@ final class HdmiControlShellCommand extends ShellCommand { pw.println(" --args <vendor specific arguments>"); pw.println(" [--id <true if vendor command should be sent with vendor id>]"); pw.println(" Send a Vendor Command to the given target device"); + pw.println(" setsystemaudiomode, setsam [on|off]"); + pw.println(" Sets the System Audio Mode feature on or off on TV devices"); } private int handleShellCommand(String cmd) throws RemoteException { @@ -81,6 +97,9 @@ final class HdmiControlShellCommand extends ShellCommand { return oneTouchPlay(pw); case "vendorcommand": return vendorCommand(pw); + case "setsystemaudiomode": + case "setsam": + return setSystemAudioMode(pw); } getErrPrintWriter().println("Unhandled command: " + cmd); @@ -88,28 +107,14 @@ final class HdmiControlShellCommand extends ShellCommand { } private int oneTouchPlay(PrintWriter pw) throws RemoteException { - final CountDownLatch latch = new CountDownLatch(1); - AtomicInteger cecResult = new AtomicInteger(); pw.print("Sending One Touch Play..."); - mBinderService.oneTouchPlay(new IHdmiControlCallback.Stub() { - @Override - public void onComplete(int result) { - pw.println(" done (" + result + ")"); - latch.countDown(); - cecResult.set(result); - } - }); + mBinderService.oneTouchPlay(mHdmiControlCallback); - try { - if (!latch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - getErrPrintWriter().println("One Touch Play timed out."); - return 1; - } - } catch (InterruptedException e) { - getErrPrintWriter().println("Caught InterruptedException"); - Thread.currentThread().interrupt(); + if (!receiveCallback("One Touch Play")) { + return 1; } - return cecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1; + + return mCecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1; } private int vendorCommand(PrintWriter pw) throws RemoteException { @@ -157,4 +162,62 @@ final class HdmiControlShellCommand extends ShellCommand { mBinderService.sendVendorCommand(deviceType, destination, params, hasVendorId); return 0; } + + private int setSystemAudioMode(PrintWriter pw) throws RemoteException { + if (1 > getRemainingArgsCount()) { + throw new IllegalArgumentException( + "Please indicate if System Audio Mode should be turned \"on\" or \"off\"."); + } + + String arg = getNextArg(); + if (arg.equals("on")) { + pw.println("Setting System Audio Mode on"); + mBinderService.setSystemAudioMode(true, mHdmiControlCallback); + } else if (arg.equals("off")) { + pw.println("Setting System Audio Mode off"); + mBinderService.setSystemAudioMode(false, mHdmiControlCallback); + } else { + throw new IllegalArgumentException( + "Please indicate if System Audio Mode should be turned \"on\" or \"off\"."); + } + + if (!receiveCallback("Set System Audio Mode")) { + return 1; + } + + return mCecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1; + } + + private boolean receiveCallback(String command) { + try { + if (!mLatch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + getErrPrintWriter().println(command + " timed out."); + return false; + } + } catch (InterruptedException e) { + getErrPrintWriter().println("Caught InterruptedException"); + Thread.currentThread().interrupt(); + } + return true; + } + + private String getResultString(int result) { + switch (result) { + case HdmiControlManager.RESULT_SUCCESS: + return "Success"; + case HdmiControlManager.RESULT_TIMEOUT: + return "Timeout"; + case HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE: + return "Source not available"; + case HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE: + return "Target not available"; + case HdmiControlManager.RESULT_EXCEPTION: + return "Exception"; + case HdmiControlManager.RESULT_INCORRECT_MODE: + return "Incorrect mode"; + case HdmiControlManager.RESULT_COMMUNICATION_FAILED: + return "Communication Failed"; + } + return Integer.toString(result); + } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index e9d5fe6d537c..c12785805a2e 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -423,8 +423,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_LIMIT_REACHED = 5; private static final int MSG_RESTRICT_BACKGROUND_CHANGED = 6; private static final int MSG_ADVISE_PERSIST_THRESHOLD = 7; - private static final int MSG_UPDATE_INTERFACE_QUOTA = 10; - private static final int MSG_REMOVE_INTERFACE_QUOTA = 11; + private static final int MSG_UPDATE_INTERFACE_QUOTAS = 10; + private static final int MSG_REMOVE_INTERFACE_QUOTAS = 11; private static final int MSG_POLICIES_CHANGED = 13; private static final int MSG_RESET_FIREWALL_RULES_BY_UID = 15; private static final int MSG_SUBSCRIPTION_OVERRIDE = 16; @@ -2036,33 +2036,44 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean hasWarning = policy.warningBytes != LIMIT_DISABLED; final boolean hasLimit = policy.limitBytes != LIMIT_DISABLED; long limitBytes = Long.MAX_VALUE; - if (hasLimit && policy.hasCycle()) { + long warningBytes = Long.MAX_VALUE; + if ((hasLimit || hasWarning) && policy.hasCycle()) { final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager .cycleIterator(policy).next(); final long start = cycle.first.toInstant().toEpochMilli(); final long end = cycle.second.toInstant().toEpochMilli(); final long totalBytes = getTotalBytes(policy.template, start, end); - if (policy.lastLimitSnooze < start) { + // If the limit notification is not snoozed, the limit quota needs to be calculated. + if (hasLimit && policy.lastLimitSnooze < start) { // remaining "quota" bytes are based on total usage in // current cycle. kernel doesn't like 0-byte rules, so we // set 1-byte quota and disable the radio later. limitBytes = Math.max(1, policy.limitBytes - totalBytes); } + + // If the warning notification was snoozed by user, or the service already knows + // it is over warning bytes, doesn't need to calculate warning bytes. + if (hasWarning && policy.lastWarningSnooze < start + && !policy.isOverWarning(totalBytes)) { + warningBytes = Math.max(1, policy.warningBytes - totalBytes); + } } - if (hasLimit || policy.metered) { + if (hasWarning || hasLimit || policy.metered) { if (matchingIfaces.size() > 1) { // TODO: switch to shared quota once NMS supports Slog.w(TAG, "shared quota unsupported; generating rule for each iface"); } - // Set the interface limit. For interfaces which has no cycle, or metered with - // no policy limit, or snoozed limit notification; we still need to put iptables - // rule hooks to restrict apps for data saver, so push really high quota. + // Set the interface warning and limit. For interfaces which has no cycle, + // or metered with no policy quotas, or snoozed notification; we still need to put + // iptables rule hooks to restrict apps for data saver, so push really high quota. + // TODO: Push NetworkStatsProvider.QUOTA_UNLIMITED instead of Long.MAX_VALUE to + // providers. for (int j = matchingIfaces.size() - 1; j >= 0; j--) { final String iface = matchingIfaces.valueAt(j); - setInterfaceQuotaAsync(iface, limitBytes); + setInterfaceQuotasAsync(iface, warningBytes, limitBytes); newMeteredIfaces.add(iface); } } @@ -2085,7 +2096,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { for (int j = matchingIfaces.size() - 1; j >= 0; j--) { final String iface = matchingIfaces.valueAt(j); if (!newMeteredIfaces.contains(iface)) { - setInterfaceQuotaAsync(iface, Long.MAX_VALUE); + setInterfaceQuotasAsync(iface, Long.MAX_VALUE, Long.MAX_VALUE); newMeteredIfaces.add(iface); } } @@ -2097,7 +2108,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { for (int i = mMeteredIfaces.size() - 1; i >= 0; i--) { final String iface = mMeteredIfaces.valueAt(i); if (!newMeteredIfaces.contains(iface)) { - removeInterfaceQuotaAsync(iface); + removeInterfaceQuotasAsync(iface); } } mMeteredIfaces = newMeteredIfaces; @@ -5038,19 +5049,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mNetworkStats.advisePersistThreshold(persistThreshold); return true; } - case MSG_UPDATE_INTERFACE_QUOTA: { - final String iface = (String) msg.obj; - // int params need to be stitched back into a long - final long quota = ((long) msg.arg1 << 32) | (msg.arg2 & 0xFFFFFFFFL); - removeInterfaceQuota(iface); - setInterfaceQuota(iface, quota); - mNetworkStats.setStatsProviderLimitAsync(iface, quota); + case MSG_UPDATE_INTERFACE_QUOTAS: { + final IfaceQuotas val = (IfaceQuotas) msg.obj; + // TODO: Consider set a new limit before removing the original one. + removeInterfaceLimit(val.iface); + setInterfaceLimit(val.iface, val.limit); + mNetworkStats.setStatsProviderWarningAndLimitAsync(val.iface, val.warning, + val.limit); return true; } - case MSG_REMOVE_INTERFACE_QUOTA: { + case MSG_REMOVE_INTERFACE_QUOTAS: { final String iface = (String) msg.obj; - removeInterfaceQuota(iface); - mNetworkStats.setStatsProviderLimitAsync(iface, QUOTA_UNLIMITED); + removeInterfaceLimit(iface); + mNetworkStats.setStatsProviderWarningAndLimitAsync(iface, QUOTA_UNLIMITED, + QUOTA_UNLIMITED); return true; } case MSG_RESET_FIREWALL_RULES_BY_UID: { @@ -5198,15 +5210,32 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - private void setInterfaceQuotaAsync(String iface, long quotaBytes) { - // long quotaBytes split up into two ints to fit in message - mHandler.obtainMessage(MSG_UPDATE_INTERFACE_QUOTA, (int) (quotaBytes >> 32), - (int) (quotaBytes & 0xFFFFFFFF), iface).sendToTarget(); + private static final class IfaceQuotas { + @NonNull public final String iface; + // Warning and limit bytes of interface qutoas, could be QUOTA_UNLIMITED or Long.MAX_VALUE + // if not set. 0 is not acceptable since kernel doesn't like 0-byte rules. + public final long warning; + public final long limit; + + private IfaceQuotas(@NonNull String iface, long warning, long limit) { + this.iface = iface; + this.warning = warning; + this.limit = limit; + } + } + + private void setInterfaceQuotasAsync(@NonNull String iface, + long warningBytes, long limitBytes) { + mHandler.obtainMessage(MSG_UPDATE_INTERFACE_QUOTAS, + new IfaceQuotas(iface, warningBytes, limitBytes)).sendToTarget(); } - private void setInterfaceQuota(String iface, long quotaBytes) { + private void setInterfaceLimit(String iface, long limitBytes) { try { - mNetworkManager.setInterfaceQuota(iface, quotaBytes); + // For legacy design the data warning is covered by global alert, where the + // kernel will notify upper layer for a small amount of change of traffic + // statistics. Thus, passing warning is not needed. + mNetworkManager.setInterfaceQuota(iface, limitBytes); } catch (IllegalStateException e) { Log.wtf(TAG, "problem setting interface quota", e); } catch (RemoteException e) { @@ -5214,11 +5243,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - private void removeInterfaceQuotaAsync(String iface) { - mHandler.obtainMessage(MSG_REMOVE_INTERFACE_QUOTA, iface).sendToTarget(); + private void removeInterfaceQuotasAsync(String iface) { + mHandler.obtainMessage(MSG_REMOVE_INTERFACE_QUOTAS, iface).sendToTarget(); } - private void removeInterfaceQuota(String iface) { + private void removeInterfaceLimit(String iface) { try { mNetworkManager.removeInterfaceQuota(iface); } catch (IllegalStateException e) { diff --git a/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java index 0cb0bc2c0896..0e9a9da6804b 100644 --- a/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java +++ b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java @@ -37,8 +37,9 @@ public abstract class NetworkStatsManagerInternal { public abstract void forceUpdate(); /** - * Set the quota limit to all registered custom network stats providers. + * Set the warning and limit to all registered custom network stats providers. * Note that invocation of any interface will be sent to all providers. */ - public abstract void setStatsProviderLimitAsync(@NonNull String iface, long quota); + public abstract void setStatsProviderWarningAndLimitAsync(@NonNull String iface, long warning, + long limit); } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 445a425854ea..19f5e3cd5dfa 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -1693,11 +1693,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } @Override - public void setStatsProviderLimitAsync(@NonNull String iface, long quota) { - if (LOGV) Slog.v(TAG, "setStatsProviderLimitAsync(" + iface + "," + quota + ")"); - // TODO: Set warning accordingly. + public void setStatsProviderWarningAndLimitAsync( + @NonNull String iface, long warning, long limit) { + if (LOGV) { + Slog.v(TAG, "setStatsProviderWarningAndLimitAsync(" + + iface + "," + warning + "," + limit + ")"); + } invokeForAllStatsProviderCallbacks((cb) -> cb.mProvider.onSetWarningAndLimit(iface, - NetworkStatsProvider.QUOTA_UNLIMITED, quota)); + warning, limit)); } } diff --git a/services/core/java/com/android/server/os/NativeTombstoneManager.java b/services/core/java/com/android/server/os/NativeTombstoneManager.java index cc6a8243799d..ed1f5f567d95 100644 --- a/services/core/java/com/android/server/os/NativeTombstoneManager.java +++ b/services/core/java/com/android/server/os/NativeTombstoneManager.java @@ -392,7 +392,7 @@ public final class NativeTombstoneManager { int pid = 0; int uid = 0; - String processName = ""; + String processName = null; String crashReason = ""; String selinuxLabel = ""; @@ -407,8 +407,10 @@ public final class NativeTombstoneManager { uid = stream.readInt(Tombstone.UID); break; - case (int) Tombstone.PROCESS_NAME: - processName = stream.readString(Tombstone.PROCESS_NAME); + case (int) Tombstone.COMMAND_LINE: + if (processName == null) { + processName = stream.readString(Tombstone.COMMAND_LINE); + } break; case (int) Tombstone.CAUSES: @@ -472,7 +474,7 @@ public final class NativeTombstoneManager { result.mAppId = appId; result.mPid = pid; result.mUid = uid; - result.mProcessName = processName; + result.mProcessName = processName == null ? "" : processName; result.mTimestampMs = timestampMs; result.mCrashReason = crashReason; diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 173f17b699de..0e4a2ee076c2 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -258,23 +258,23 @@ public class PackageDexOptimizer { packageStats, options.isDowngrade(), profileName, dexMetadataPath, options.getCompilationReason()); - // Only report metrics for base apk for now. - // TODO: add ISA and APK type to metrics. // OTAPreopt doesn't have stats so don't report in that case. - if (pkg.getBaseCodePath().equals(path) && packageStats != null) { + if (packageStats != null) { Trace.traceBegin(Trace.TRACE_TAG_PACKAGE_MANAGER, "dex2oat-metrics"); try { long sessionId = Math.randomLongInternal(); ArtStatsLogUtils.writeStatsLog( mArtStatsLogger, sessionId, - path, compilerFilter, sharedGid, packageStats.getCompileTime(path), dexMetadataPath, options.getCompilationReason(), - newResult); + newResult, + ArtStatsLogUtils.getApkType(path), + dexCodeIsa, + path); } finally { Trace.traceEnd(Trace.TRACE_TAG_PACKAGE_MANAGER); } diff --git a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java index c8dc1b1ff562..13798ba1b723 100644 --- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java @@ -32,6 +32,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; /** Utils class to report ART metrics to statsd. */ @@ -39,6 +41,7 @@ public class ArtStatsLogUtils { private static final String TAG = ArtStatsLogUtils.class.getSimpleName(); private static final String PROFILE_DEX_METADATA = "primary.prof"; private static final String VDEX_DEX_METADATA = "primary.vdex"; + private static final String BASE_APK= "base.apk"; private static final int ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY = @@ -122,16 +125,35 @@ public class ArtStatsLogUtils { ART_COMPILATION_FILTER_FAKE_RUN_FROM_VDEX_FALLBACK); } + private static final Map<String, Integer> ISA_MAP = new HashMap(); + + static { + COMPILE_FILTER_MAP.put("arm", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_ARM); + COMPILE_FILTER_MAP.put("arm64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_ARM64); + COMPILE_FILTER_MAP.put("x86", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_X86); + COMPILE_FILTER_MAP.put("x86_64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_X86_64); + COMPILE_FILTER_MAP.put("mips", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_MIPS); + COMPILE_FILTER_MAP.put("mips64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_MIPS64); + } + public static void writeStatsLog( ArtStatsLogger logger, long sessionId, - String path, String compilerFilter, int uid, long compileTime, String dexMetadataPath, int compilationReason, - int result) { + int result, + int apkType, + String isa, + String apkPath) { int dexMetadataType = getDexMetadataType(dexMetadataPath); logger.write( sessionId, @@ -140,7 +162,19 @@ public class ArtStatsLogUtils { compilerFilter, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_RESULT_CODE, result, - dexMetadataType); + dexMetadataType, + apkType, + isa); + logger.write( + sessionId, + uid, + compilationReason, + compilerFilter, + ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, + getDexBytes(apkPath), + dexMetadataType, + apkType, + isa); logger.write( sessionId, uid, @@ -148,7 +182,47 @@ public class ArtStatsLogUtils { compilerFilter, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, compileTime, - dexMetadataType); + dexMetadataType, + apkType, + isa); + } + + public static int getApkType(String path) { + if (path.equals(BASE_APK)) { + return ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE; + } + return ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_SPLIT; + } + + private static long getDexBytes(String apkPath) { + StrictJarFile jarFile = null; + long dexBytes = 0; + try { + jarFile = new StrictJarFile(apkPath, + /*verify=*/ false, + /*signatureSchemeRollbackProtectionsEnforced=*/ false); + Iterator<ZipEntry> it = jarFile.iterator(); + Pattern p = Pattern.compile("classes(\\d)*[.]dex"); + Matcher m = p.matcher(""); + while (it.hasNext()) { + ZipEntry entry = it.next(); + m.reset(entry.getName()); + if (m.matches()) { + dexBytes += entry.getSize(); + } + } + return dexBytes; + } catch (IOException ignore) { + Slog.e(TAG, "Error when parsing APK " + apkPath); + return -1L; + } finally { + try { + if (jarFile != null) { + jarFile.close(); + } + } catch (IOException ignore) { + } + } } private static int getDexMetadataType(String dexMetadataPath) { @@ -207,7 +281,9 @@ public class ArtStatsLogUtils { String compilerFilter, int kind, long value, - int dexMetadataType) { + int dexMetadataType, + int apkType, + String isa) { ArtStatsLog.write( ArtStatsLog.ART_DATUM_REPORTED, sessionId, @@ -220,7 +296,10 @@ public class ArtStatsLogUtils { ArtStatsLog.ART_DATUM_REPORTED__THREAD_TYPE__ART_THREAD_MAIN, kind, value, - dexMetadataType); + dexMetadataType, + apkType, + ISA_MAP.getOrDefault(isa, + ArtStatsLog.ART_DATUM_REPORTED__ISA__ART_ISA_UNKNOWN)); } } } diff --git a/services/core/java/com/android/server/speech/OWNERS b/services/core/java/com/android/server/speech/OWNERS new file mode 100644 index 000000000000..b187b87b476e --- /dev/null +++ b/services/core/java/com/android/server/speech/OWNERS @@ -0,0 +1 @@ +include /core/java/android/speech/OWNERS diff --git a/services/core/java/com/android/server/stats/StatsHelper.java b/services/core/java/com/android/server/stats/StatsHelper.java new file mode 100644 index 000000000000..9b9f6b502f2c --- /dev/null +++ b/services/core/java/com/android/server/stats/StatsHelper.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.stats; + +import static android.app.StatsManager.ACTION_STATSD_STARTED; + +import android.annotation.NonNull; +import android.annotation.SystemApi; +import android.content.Context; +import android.content.Intent; +import android.os.UserHandle; + +/** + * Provides helper methods for the Statsd APEX + * + * @hide + **/ +@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) +public final class StatsHelper { + private StatsHelper() {} + + /** + * Send statsd ready broadcast + * + **/ + public static void sendStatsdReadyBroadcast(@NonNull final Context context) { + context.sendBroadcastAsUser( + new Intent(ACTION_STATSD_STARTED).addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND), + UserHandle.SYSTEM, android.Manifest.permission.DUMP); + } +} diff --git a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java index 8dcc547508ec..069c5c3fc714 100644 --- a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java +++ b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java @@ -27,15 +27,14 @@ import android.net.NetworkRequest; import android.net.TelephonyNetworkSpecifier; import android.os.Handler; import android.os.ParcelUuid; -import android.util.ArrayMap; -import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.Set; @@ -59,9 +58,9 @@ public class UnderlyingNetworkTracker { @NonNull private final Handler mHandler; @NonNull private final ConnectivityManager mConnectivityManager; - @NonNull private final Map<Integer, NetworkCallback> mCellBringupCallbacks = new ArrayMap<>(); - @NonNull private final NetworkCallback mWifiBringupCallback = new NetworkBringupCallback(); - @NonNull private final NetworkCallback mRouteSelectionCallback = new RouteSelectionCallback(); + @NonNull private final List<NetworkCallback> mCellBringupCallbacks = new ArrayList<>(); + @Nullable private NetworkCallback mWifiBringupCallback; + @Nullable private NetworkCallback mRouteSelectionCallback; @NonNull private TelephonySubscriptionSnapshot mLastSnapshot; private boolean mIsQuitting = false; @@ -105,36 +104,59 @@ public class UnderlyingNetworkTracker { mConnectivityManager = mVcnContext.getContext().getSystemService(ConnectivityManager.class); - registerNetworkRequests(); + registerOrUpdateNetworkRequests(); } - private void registerNetworkRequests() { - // register bringup requests for underlying Networks - mConnectivityManager.requestBackgroundNetwork( - getWifiNetworkRequest(), mHandler, mWifiBringupCallback); - updateSubIdsAndCellularRequests(); - - // Register Network-selection request used to decide selected underlying Network. All - // underlying networks must be VCN managed in order to be used. - mConnectivityManager.requestBackgroundNetwork( - getBaseNetworkRequest(true /* requireVcnManaged */).build(), - mHandler, - mRouteSelectionCallback); + private void registerOrUpdateNetworkRequests() { + NetworkCallback oldRouteSelectionCallback = mRouteSelectionCallback; + NetworkCallback oldWifiCallback = mWifiBringupCallback; + List<NetworkCallback> oldCellCallbacks = new ArrayList<>(mCellBringupCallbacks); + mCellBringupCallbacks.clear(); + + // Register new callbacks. Make-before-break; always register new callbacks before removal + // of old callbacks + if (!mIsQuitting) { + mRouteSelectionCallback = new RouteSelectionCallback(); + mConnectivityManager.requestBackgroundNetwork( + getBaseNetworkRequestBuilder().build(), mHandler, mRouteSelectionCallback); + + mWifiBringupCallback = new NetworkBringupCallback(); + mConnectivityManager.requestBackgroundNetwork( + getWifiNetworkRequest(), mHandler, mWifiBringupCallback); + + for (final int subId : mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup)) { + final NetworkBringupCallback cb = new NetworkBringupCallback(); + mCellBringupCallbacks.add(cb); + + mConnectivityManager.requestBackgroundNetwork( + getCellNetworkRequestForSubId(subId), mHandler, cb); + } + } else { + mRouteSelectionCallback = null; + mWifiBringupCallback = null; + // mCellBringupCallbacks already cleared above. + } + + // Unregister old callbacks (as necessary) + if (oldRouteSelectionCallback != null) { + mConnectivityManager.unregisterNetworkCallback(oldRouteSelectionCallback); + } + if (oldWifiCallback != null) { + mConnectivityManager.unregisterNetworkCallback(oldWifiCallback); + } + for (NetworkCallback cellBringupCallback : oldCellCallbacks) { + mConnectivityManager.unregisterNetworkCallback(cellBringupCallback); + } } private NetworkRequest getWifiNetworkRequest() { - // Request exclusively VCN managed networks to ensure that we only ever keep carrier wifi - // alive. - return getBaseNetworkRequest(true /* requireVcnManaged */) + return getBaseNetworkRequestBuilder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build(); } private NetworkRequest getCellNetworkRequestForSubId(int subId) { - // Do not request NOT_VCN_MANAGED to ensure that the TelephonyNetworkFactory has a - // fulfillable request to bring up underlying cellular Networks even if the VCN is already - // connected. - return getBaseNetworkRequest(false /* requireVcnManaged */) + return getBaseNetworkRequestBuilder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .setNetworkSpecifier(new TelephonyNetworkSpecifier(subId)) .build(); @@ -143,67 +165,19 @@ public class UnderlyingNetworkTracker { /** * Builds and returns a NetworkRequest builder common to all Underlying Network requests * - * <p>A NetworkRequest may either (1) Require the presence of a capability by using - * addCapability(), (2) require the absence of a capability using unwanted capabilities, or (3) - * allow any state. Underlying networks are never desired to have the NOT_VCN_MANAGED - * capability, and only cases (2) and (3) are used. - * - * @param requireVcnManaged whether the underlying network is required to be VCN managed to - * match this request. If {@code true}, the NOT_VCN_MANAGED capability will be set as - * unwanted. Else, the NOT_VCN_MANAGED capability will be removed, and any state is - * acceptable. + * <p>This request is guaranteed to select carrier-owned, non-VCN underlying networks by virtue + * of a populated set of subIds as expressed in NetworkCapabilities#getSubIds(). Only carrier + * owned networks may be selected, as the request specifies only subIds in the VCN's + * subscription group, while the VCN networks are excluded by virtue of not having subIds set on + * the VCN-exposed networks. */ - private NetworkRequest.Builder getBaseNetworkRequest(boolean requireVcnManaged) { - NetworkRequest.Builder requestBase = - new NetworkRequest.Builder() - .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); - - for (int capability : mRequiredUnderlyingNetworkCapabilities) { - requestBase.addCapability(capability); - } - - if (requireVcnManaged) { - requestBase.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); - } - - return requestBase; - } - - /** - * Update the current subIds and Cellular bringup requests for this UnderlyingNetworkTracker. - */ - private void updateSubIdsAndCellularRequests() { - mVcnContext.ensureRunningOnLooperThread(); - - // Don't bother re-filing NetworkRequests if this Tracker has been torn down. - if (mIsQuitting) { - return; - } - - final Set<Integer> subIdsInSubGroup = mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup); - - // new subIds to track = (updated list of subIds) - (currently tracked subIds) - final Set<Integer> subIdsToRegister = new ArraySet<>(subIdsInSubGroup); - subIdsToRegister.removeAll(mCellBringupCallbacks.keySet()); - - // subIds to stop tracking = (currently tracked subIds) - (updated list of subIds) - final Set<Integer> subIdsToUnregister = new ArraySet<>(mCellBringupCallbacks.keySet()); - subIdsToUnregister.removeAll(subIdsInSubGroup); - - for (final int subId : subIdsToRegister) { - final NetworkBringupCallback cb = new NetworkBringupCallback(); - mCellBringupCallbacks.put(subId, cb); - - mConnectivityManager.requestBackgroundNetwork( - getCellNetworkRequestForSubId(subId), mHandler, cb); - } - - for (final int subId : subIdsToUnregister) { - final NetworkCallback cb = mCellBringupCallbacks.remove(subId); - mConnectivityManager.unregisterNetworkCallback(cb); - } + private NetworkRequest.Builder getBaseNetworkRequestBuilder() { + return new NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) + .setSubIds(mLastSnapshot.getAllSubIdsInGroup(mSubscriptionGroup)); } /** @@ -217,22 +191,16 @@ public class UnderlyingNetworkTracker { Objects.requireNonNull(snapshot, "Missing snapshot"); mLastSnapshot = snapshot; - updateSubIdsAndCellularRequests(); + registerOrUpdateNetworkRequests(); } /** Tears down this Tracker, and releases all underlying network requests. */ public void teardown() { mVcnContext.ensureRunningOnLooperThread(); - - mConnectivityManager.unregisterNetworkCallback(mWifiBringupCallback); - mConnectivityManager.unregisterNetworkCallback(mRouteSelectionCallback); - - for (final NetworkCallback cb : mCellBringupCallbacks.values()) { - mConnectivityManager.unregisterNetworkCallback(cb); - } - mCellBringupCallbacks.clear(); - mIsQuitting = true; + + // Will unregister all existing callbacks, but not register new ones due to quitting flag. + registerOrUpdateNetworkRequests(); } /** Returns whether the currently selected Network matches the given network. */ @@ -290,25 +258,6 @@ public class UnderlyingNetworkTracker { maybeNotifyCallback(); } - private void handleNetworkSuspended(@NonNull Network network, boolean isSuspended) { - mVcnContext.ensureRunningOnLooperThread(); - - if (!isSameNetwork(mRecordInProgress, network)) { - Slog.wtf(TAG, "Invalid update to isSuspended"); - return; - } - - final NetworkCapabilities newCaps = - new NetworkCapabilities(mRecordInProgress.getNetworkCapabilities()); - if (isSuspended) { - newCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); - } else { - newCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); - } - - handleCapabilitiesChanged(network, newCaps); - } - private void handlePropertiesChanged( @NonNull Network network, @NonNull LinkProperties linkProperties) { mVcnContext.ensureRunningOnLooperThread(); @@ -366,20 +315,11 @@ public class UnderlyingNetworkTracker { @Override public void onCapabilitiesChanged( @NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { + if (networkCapabilities.equals(mRecordInProgress.getNetworkCapabilities())) return; handleCapabilitiesChanged(network, networkCapabilities); } @Override - public void onNetworkSuspended(@NonNull Network network) { - handleNetworkSuspended(network, true /* isSuspended */); - } - - @Override - public void onNetworkResumed(@NonNull Network network) { - handleNetworkSuspended(network, false /* isSuspended */); - } - - @Override public void onLinkPropertiesChanged( @NonNull Network network, @NonNull LinkProperties linkProperties) { handlePropertiesChanged(network, linkProperties); diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java index 29aedcea0cd2..1208eccc69eb 100644 --- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java +++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java @@ -30,6 +30,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UpdateEngine; import android.os.UpdateEngineCallback; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.DeviceConfig; import android.util.Log; @@ -301,10 +303,18 @@ public final class ProfcollectForwardingService extends SystemService { new Thread(() -> { try { - String reportPath = mIProfcollect.report(); + String reportUuid = mIProfcollect.report(); + if (!uploadReport) { return; } + + final int profileId = getBBProfileId(); + mIProfcollect.copy_report_to_bb(profileId, reportUuid); + String reportPath = + "/data/user/" + profileId + + "/com.google.android.apps.internal.betterbug/cache/" + + reportUuid + ".zip"; Intent uploadIntent = new Intent("com.google.android.apps.betterbug.intent.action.UPLOAD_PROFILE") .setPackage("com.google.android.apps.internal.betterbug") @@ -316,9 +326,27 @@ public final class ProfcollectForwardingService extends SystemService { if (context.getPackageManager().queryBroadcastReceivers(uploadIntent, 0) != null) { context.sendBroadcast(uploadIntent); } + mIProfcollect.delete_report(reportUuid); } catch (RemoteException e) { Log.e(LOG_TAG, e.getMessage()); } }).start(); } + + /** + * Get BetterBug's profile ID. It is the work profile ID, if it exists. Otherwise the system + * user ID. + * + * @return BetterBug's profile ID. + */ + private int getBBProfileId() { + UserManager userManager = UserManager.get(getContext()); + int[] profiles = userManager.getProfileIds(UserHandle.USER_SYSTEM, false); + for (int p : profiles) { + if (userManager.getUserInfo(p).isManagedProfile()) { + return p; + } + } + return UserHandle.USER_SYSTEM; + } } diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index d405113d064c..100d3ea87a89 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -1773,57 +1773,75 @@ public class NetworkPolicyManagerServiceTest { true); } + private void increaseMockedTotalBytes(NetworkStats stats, long rxBytes, long txBytes) { + stats.insertEntry(TEST_IFACE, UID_A, SET_ALL, TAG_NONE, + rxBytes, 1, txBytes, 1, 0); + when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) + .thenReturn(stats.getTotalBytes()); + when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong())) + .thenReturn(stats); + } + + private void triggerOnStatsProviderWarningOrLimitReached() throws InterruptedException { + final NetworkPolicyManagerInternal npmi = LocalServices + .getService(NetworkPolicyManagerInternal.class); + npmi.onStatsProviderWarningOrLimitReached("TEST"); + // Wait for processing of MSG_STATS_PROVIDER_WARNING_OR_LIMIT_REACHED. + postMsgAndWaitForCompletion(); + verify(mStatsService).forceUpdate(); + // Wait for processing of MSG_*_INTERFACE_QUOTAS. + postMsgAndWaitForCompletion(); + } + /** - * Test that when StatsProvider triggers limit reached, new limit will be calculated and - * re-armed. + * Test that when StatsProvider triggers warning and limit reached, new quotas will be + * calculated and re-armed. */ @Test - public void testStatsProviderLimitReached() throws Exception { + public void testStatsProviderWarningAndLimitReached() throws Exception { final int CYCLE_DAY = 15; final NetworkStats stats = new NetworkStats(0L, 1); - stats.insertEntry(TEST_IFACE, UID_A, SET_ALL, TAG_NONE, - 2999, 1, 2000, 1, 0); - when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) - .thenReturn(stats.getTotalBytes()); - when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong())) - .thenReturn(stats); + increaseMockedTotalBytes(stats, 2999, 2000); // Get active mobile network in place expectMobileDefaults(); mService.updateNetworks(); - verify(mStatsService).setStatsProviderLimitAsync(TEST_IFACE, Long.MAX_VALUE); + verify(mStatsService).setStatsProviderWarningAndLimitAsync(TEST_IFACE, Long.MAX_VALUE, + Long.MAX_VALUE); - // Set limit to 10KB. + // Set warning to 7KB and limit to 10KB. setNetworkPolicies(new NetworkPolicy( - sTemplateMobileAll, CYCLE_DAY, TIMEZONE_UTC, WARNING_DISABLED, 10000L, - true)); + sTemplateMobileAll, CYCLE_DAY, TIMEZONE_UTC, 7000L, 10000L, true)); postMsgAndWaitForCompletion(); - // Verifies that remaining quota is set to providers. - verify(mStatsService).setStatsProviderLimitAsync(TEST_IFACE, 10000L - 4999L); - + // Verifies that remaining quotas are set to providers. + verify(mStatsService).setStatsProviderWarningAndLimitAsync(TEST_IFACE, 2001L, 5001L); reset(mStatsService); - // Increase the usage. - stats.insertEntry(TEST_IFACE, UID_A, SET_ALL, TAG_NONE, - 1000, 1, 999, 1, 0); - when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) - .thenReturn(stats.getTotalBytes()); - when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong())) - .thenReturn(stats); + // Increase the usage and simulates that limit reached fires earlier by provider, + // but actually the quota is not yet reached. Verifies that the limit reached leads to + // a force update and new quotas should be set. + increaseMockedTotalBytes(stats, 1000, 999); + triggerOnStatsProviderWarningOrLimitReached(); + verify(mStatsService).setStatsProviderWarningAndLimitAsync(TEST_IFACE, 2L, 3002L); + reset(mStatsService); - // Simulates that limit reached fires earlier by provider, but actually the quota is not - // yet reached. - final NetworkPolicyManagerInternal npmi = LocalServices - .getService(NetworkPolicyManagerInternal.class); - npmi.onStatsProviderWarningOrLimitReached("TEST"); + // Increase the usage and simulate warning reached, the new warning should be unlimited + // since service will disable warning quota to stop lower layer from keep triggering + // warning reached event. + increaseMockedTotalBytes(stats, 1000L, 1000); + triggerOnStatsProviderWarningOrLimitReached(); + verify(mStatsService).setStatsProviderWarningAndLimitAsync( + TEST_IFACE, Long.MAX_VALUE, 1002L); + reset(mStatsService); - // Verifies that the limit reached leads to a force update and new limit should be set. - postMsgAndWaitForCompletion(); - verify(mStatsService).forceUpdate(); - postMsgAndWaitForCompletion(); - verify(mStatsService).setStatsProviderLimitAsync(TEST_IFACE, 10000L - 4999L - 1999L); + // Increase the usage that over the warning and limit, the new limit should set to 1 to + // block the network traffic. + increaseMockedTotalBytes(stats, 1000L, 1000); + triggerOnStatsProviderWarningOrLimitReached(); + verify(mStatsService).setStatsProviderWarningAndLimitAsync(TEST_IFACE, Long.MAX_VALUE, 1L); + reset(mStatsService); } /** diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java index 13d75a77507f..7d6f4acfb7a0 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java @@ -22,6 +22,7 @@ import com.android.internal.art.ArtStatsLog; import com.android.server.pm.dex.ArtStatsLogUtils.ArtStatsLogger; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -49,6 +50,9 @@ public final class ArtStatsLogUtilsTest { private static final String COMPILER_FILTER = "space-profile"; private static final String PROFILE_DEX_METADATA = "primary.prof"; private static final String VDEX_DEX_METADATA = "primary.vdex"; + private static final String INSTRUCTION_SET = "arm64"; + private static final String BASE_APK = "base.apk"; + private static final String SPLIT_APK = "split.apk"; private static final byte[] DEX_CONTENT = "dexData".getBytes(); private static final int COMPILATION_REASON = 1; private static final int RESULT_CODE = 222; @@ -97,17 +101,19 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE_AND_VDEX); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE_AND_VDEX); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -127,17 +133,19 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -157,17 +165,19 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_VDEX); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_VDEX); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -185,17 +195,19 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, /*dexMetadataPath=*/ null, COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE); } finally { deleteSliently(apk); } @@ -214,23 +226,36 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_UNKNOWN); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_UNKNOWN); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); } } + @Test + public void testGetApkType() { + // Act + int result1 = ArtStatsLogUtils.getApkType(BASE_APK); + int result2 = ArtStatsLogUtils.getApkType(SPLIT_APK); + + // Assert + Assert.assertEquals(result1, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE); + Assert.assertEquals(result2, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_SPLIT); + } + private void verifyWrites(int dexMetadataType) { InOrder inorder = inOrder(mockLogger); inorder.verify(mockLogger).write( @@ -239,7 +264,19 @@ public final class ArtStatsLogUtilsTest { COMPILER_FILTER, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_RESULT_CODE, RESULT_CODE, - dexMetadataType); + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); + inorder.verify(mockLogger).write( + SESSION_ID, + UID, + COMPILATION_REASON, + COMPILER_FILTER, + ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, + DEX_CONTENT.length, + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); inorder.verify(mockLogger).write( SESSION_ID, UID, @@ -247,7 +284,9 @@ public final class ArtStatsLogUtilsTest { COMPILER_FILTER, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, COMPILE_TIME, - dexMetadataType); + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); } private Path zipFiles(String suffix, Path... files) throws IOException { diff --git a/telecomm/java/Android.bp b/telecomm/java/Android.bp new file mode 100644 index 000000000000..bac7228ca03b --- /dev/null +++ b/telecomm/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-telecomm-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 973b20ad0713..ae5db3dfd4e4 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -1153,6 +1153,10 @@ public abstract class Connection extends Conferenceable { builder.append(isLong ? " PROPERTY_IS_ADHOC_CONFERENCE" : " adhoc_conf"); } + if ((properties & PROPERTY_IS_DOWNGRADED_CONFERENCE) == PROPERTY_IS_DOWNGRADED_CONFERENCE) { + builder.append(isLong ? " PROPERTY_IS_DOWNGRADED_CONFERENCE" : " dngrd_conf"); + } + builder.append("]"); return builder.toString(); } diff --git a/telephony/common/Android.bp b/telephony/common/Android.bp new file mode 100644 index 000000000000..9572c695c552 --- /dev/null +++ b/telephony/common/Android.bp @@ -0,0 +1,20 @@ +filegroup { + name: "framework-telephony-common-sources", + srcs: [ + "**/*.java", + ":statslog-telephony-common-java-gen", + ], + visibility: [ + "//frameworks/base", + "//frameworks/base/tests/TelephonyCommonTests", + ], +} + +genrule { + name: "statslog-telephony-common-java-gen", + tools: ["stats-log-api-gen"], + cmd: "$(location stats-log-api-gen) --java $(out) --module telephony_common" + + " --javaPackage com.android.internal.telephony --javaClass TelephonyCommonStatsLog", + out: ["com/android/internal/telephony/TelephonyCommonStatsLog.java"], + visibility: ["//visibility:private"], +} diff --git a/telephony/java/Android.bp b/telephony/java/Android.bp new file mode 100644 index 000000000000..1bd582789572 --- /dev/null +++ b/telephony/java/Android.bp @@ -0,0 +1,8 @@ +filegroup { + name: "framework-telephony-sources", + srcs: [ + "**/*.java", + "**/*.aidl", + ], + visibility: ["//frameworks/base"], +} diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 0ba96a947a73..7c234fcc949e 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -17,7 +17,6 @@ package android.telephony; import android.Manifest; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -32,10 +31,11 @@ import android.os.PersistableBundle; import android.os.RemoteException; import android.service.carrier.CarrierService; import android.telecom.TelecomManager; +import android.telephony.gba.TlsParams; +import android.telephony.gba.UaSecurityProtocolIdentifier; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsRegistrationAttributes; import android.telephony.ims.ImsSsData; -import android.telephony.ims.SipDelegateManager; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.feature.RcsFeature; @@ -3616,6 +3616,71 @@ public class CarrierConfigManager { public static final String ENABLE_EAP_METHOD_PREFIX_BOOL = "enable_eap_method_prefix_bool"; /** + * Indicates that GBA_ME should be used for GBA authentication, as defined in 3GPP TS 33.220. + * @hide + */ + @SystemApi + public static final int GBA_ME = 1; + + /** + * Indicates that GBA_U should be used for GBA authentication, as defined in 3GPP TS 33.220. + * @hide + */ + @SystemApi + public static final int GBA_U = 2; + + /** + * Indicates that GBA_Digest should be used for GBA authentication, as defined + * in 3GPP TS 33.220. + * @hide + */ + @SystemApi + public static final int GBA_DIGEST = 3; + + /** + * An integer representing the GBA mode to use for requesting credentials + * via {@link TelephonyManager#bootstrapAuthenticationRequest}. + * + * One of {@link #GBA_ME}, {@link #GBA_U}, or {@link #GBA_DIGEST}. + * @hide + */ + @SystemApi + public static final String KEY_GBA_MODE_INT = "gba_mode_int"; + + /** + * An integer representing the organization code to be used when building the + * {@link UaSecurityProtocolIdentifier} used when requesting GBA authentication. + * + * See the {@code ORG_} constants in {@link UaSecurityProtocolIdentifier}. + * @hide + */ + @SystemApi + public static final String KEY_GBA_UA_SECURITY_ORGANIZATION_INT = + "gba_ua_security_organization_int"; + + /** + * An integer representing the security protocol to be used when building the + * {@link UaSecurityProtocolIdentifier} used when requesting GBA authentication. + * + * See the {@code UA_SECURITY_PROTOCOL_} constants in {@link UaSecurityProtocolIdentifier}. + * @hide + */ + @SystemApi + public static final String KEY_GBA_UA_SECURITY_PROTOCOL_INT = + "gba_ua_security_protocol_int"; + + /** + * An integer representing the cipher suite to be used when building the + * {@link UaSecurityProtocolIdentifier} used when requesting GBA authentication. + * + * See the {@code TLS_} constants in {@link android.telephony.gba.TlsParams}. + * @hide + */ + @SystemApi + public static final String KEY_GBA_UA_TLS_CIPHER_SUITE_INT = + "gba_ua_tls_cipher_suite_int"; + + /** * GPS configs. See the GNSS HAL documentation for more details. */ public static final class Gps { @@ -4823,6 +4888,13 @@ public class CarrierConfigManager { // Default wifi configurations. sDefaults.putAll(Wifi.getDefaults()); sDefaults.putBoolean(ENABLE_EAP_METHOD_PREFIX_BOOL, false); + sDefaults.putInt(KEY_GBA_MODE_INT, GBA_ME); + sDefaults.putInt(KEY_GBA_UA_SECURITY_ORGANIZATION_INT, + UaSecurityProtocolIdentifier.ORG_3GPP); + sDefaults.putInt(KEY_GBA_UA_SECURITY_PROTOCOL_INT, + UaSecurityProtocolIdentifier.UA_SECURITY_PROTOCOL_3GPP_TLS_DEFAULT); + sDefaults.putInt(KEY_GBA_UA_TLS_CIPHER_SUITE_INT, TlsParams.TLS_NULL_WITH_NULL_NULL); + sDefaults.putBoolean(KEY_SHOW_FORWARDED_NUMBER_BOOL, false); sDefaults.putLong(KEY_DATA_SWITCH_VALIDATION_MIN_GAP_LONG, TimeUnit.DAYS.toMillis(1)); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY, diff --git a/telephony/java/android/telephony/PreciseDataConnectionState.java b/telephony/java/android/telephony/PreciseDataConnectionState.java index 9ea624b60988..ce2f3f924554 100644 --- a/telephony/java/android/telephony/PreciseDataConnectionState.java +++ b/telephony/java/android/telephony/PreciseDataConnectionState.java @@ -166,14 +166,12 @@ public final class PreciseDataConnectionState implements Parcelable { /** * @return The unique id of the data connection * - * Note this is the id assigned in {@link DataCallResponse}. + * Note this is the id assigned by the data service. * The id remains the same for data connection handover between * {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN} and * {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} * - * @hide */ - @SystemApi public int getId() { return mId; } diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index 6315b242184a..b384e50d9f03 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -391,6 +391,7 @@ public class RcsFeature extends ImsFeature { * event to the framework. * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability * exchange if it is supported by the device. + * @hide */ public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl( @NonNull Executor executor, @NonNull CapabilityExchangeEventListener listener) { @@ -399,14 +400,45 @@ public class RcsFeature extends ImsFeature { } /** + * Retrieve the implementation of UCE for this {@link RcsFeature}, which can use either + * presence or OPTIONS for capability exchange. + * + * Will only be requested by the framework if capability exchange is configured + * as capable during a + * {@link #changeEnabledCapabilities(CapabilityChangeRequest, CapabilityCallbackProxy)} + * operation and the RcsFeature sets the status of the capability to true using + * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)}. + * + * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange + * event to the framework. + * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability + * exchange if it is supported by the device. + */ + public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl( + @NonNull CapabilityExchangeEventListener listener) { + // Base Implementation, override to implement functionality + return new RcsCapabilityExchangeImplBase(); + } + + /** * Remove the given CapabilityExchangeImplBase instance. * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be removed. + * @hide */ public void removeCapabilityExchangeImpl( @NonNull RcsCapabilityExchangeImplBase capExchangeImpl) { // Override to implement the process of removing RcsCapabilityExchangeImplBase instance. } + /** + * Remove the given CapabilityExchangeImplBase instance. + * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be destroyed. + */ + public void destroyCapabilityExchangeImpl( + @NonNull RcsCapabilityExchangeImplBase capExchangeImpl) { + // Override to implement the process of destroying RcsCapabilityExchangeImplBase instance. + } + /**{@inheritDoc}*/ @Override public void onFeatureRemoved() { diff --git a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java index 25b9446152ac..a117adcfb99a 100644 --- a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java +++ b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java @@ -356,12 +356,13 @@ public class RcsCapabilityExchangeImplBase { void onTerminated(@NonNull String reason, long retryAfterMilliseconds) throws ImsException; } - private final Executor mBinderExecutor; + private Executor mBinderExecutor; /** * Create a new RcsCapabilityExchangeImplBase instance. * * @param executor The executor that remote calls from the framework will be called on. + * @hide */ public RcsCapabilityExchangeImplBase(@NonNull Executor executor) { if (executor == null) { @@ -371,6 +372,12 @@ public class RcsCapabilityExchangeImplBase { } /** + * Create a new RcsCapabilityExchangeImplBase instance. + */ + public RcsCapabilityExchangeImplBase() { + } + + /** * The user capabilities of one or multiple contacts have been requested by the framework. * <p> * The implementer must follow up this call with an diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 4c0c1198a6f5..14c72f1445a9 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -18,6 +18,7 @@ package com.android.server; import static android.Manifest.permission.CHANGE_NETWORK_STATE; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; +import static android.Manifest.permission.NETWORK_SETTINGS; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.content.Intent.ACTION_USER_ADDED; import static android.content.Intent.ACTION_USER_REMOVED; @@ -716,6 +717,9 @@ public class ConnectivityServiceTest { private int mProbesSucceeded; private String mNmValidationRedirectUrl = null; private boolean mNmProvNotificationRequested = false; + private Runnable mCreatedCallback; + private Runnable mUnwantedCallback; + private Runnable mDisconnectedCallback; private final ConditionVariable mNetworkStatusReceived = new ConditionVariable(); // Contains the redirectUrl from networkStatus(). Before reading, wait for @@ -770,6 +774,24 @@ public class ConnectivityServiceTest { mRedirectUrl = redirectUrl; mNetworkStatusReceived.open(); } + + @Override + public void onNetworkCreated() { + super.onNetworkCreated(); + if (mCreatedCallback != null) mCreatedCallback.run(); + } + + @Override + public void onNetworkUnwanted() { + super.onNetworkUnwanted(); + if (mUnwantedCallback != null) mUnwantedCallback.run(); + } + + @Override + public void onNetworkDestroyed() { + super.onNetworkDestroyed(); + if (mDisconnectedCallback != null) mDisconnectedCallback.run(); + } }; assertEquals(na.getNetwork().netId, nmNetworkCaptor.getValue().netId); @@ -971,6 +993,18 @@ public class ConnectivityServiceTest { p.timestampMillis = DATA_STALL_TIMESTAMP; mNmCallbacks.notifyDataStallSuspected(p); } + + public void setCreatedCallback(Runnable r) { + mCreatedCallback = r; + } + + public void setUnwantedCallback(Runnable r) { + mUnwantedCallback = r; + } + + public void setDisconnectedCallback(Runnable r) { + mDisconnectedCallback = r; + } } /** @@ -2450,8 +2484,7 @@ public class ConnectivityServiceTest { public void networkCallbacksSanitizationTest_Sanitize() throws Exception { mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_DENIED); - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_DENIED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED); doNetworkCallbacksSanitizationTest(true /* sanitized */); } @@ -2459,7 +2492,7 @@ public class ConnectivityServiceTest { public void networkCallbacksSanitizationTest_NoSanitize_NetworkStack() throws Exception { mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_GRANTED); - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED); doNetworkCallbacksSanitizationTest(false /* sanitized */); } @@ -2467,7 +2500,7 @@ public class ConnectivityServiceTest { public void networkCallbacksSanitizationTest_NoSanitize_Settings() throws Exception { mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_DENIED); - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); doNetworkCallbacksSanitizationTest(false /* sanitized */); } @@ -2811,6 +2844,94 @@ public class ConnectivityServiceTest { } @Test + public void testNetworkAgentCallbacks() throws Exception { + // Keeps track of the order of events that happen in this test. + final LinkedBlockingQueue<String> eventOrder = new LinkedBlockingQueue<>(); + + final NetworkRequest request = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_WIFI).build(); + final TestNetworkCallback callback = new TestNetworkCallback(); + final AtomicReference<Network> wifiNetwork = new AtomicReference<>(); + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + + // Expectations for state when various callbacks fire. These expectations run on the handler + // thread and not on the test thread because they need to prevent the handler thread from + // advancing while they examine state. + + // 1. When onCreated fires, netd has been told to create the network. + mWiFiNetworkAgent.setCreatedCallback(() -> { + eventOrder.offer("onNetworkCreated"); + wifiNetwork.set(mWiFiNetworkAgent.getNetwork()); + assertNotNull(wifiNetwork.get()); + try { + verify(mMockNetd).networkCreatePhysical(wifiNetwork.get().getNetId(), + INetd.PERMISSION_NONE); + } catch (RemoteException impossible) { + fail(); + } + }); + + // 2. onNetworkUnwanted isn't precisely ordered with respect to any particular events. Just + // check that it is fired at some point after disconnect. + mWiFiNetworkAgent.setUnwantedCallback(() -> eventOrder.offer("onNetworkUnwanted")); + + // 3. While the teardown timer is running, connectivity APIs report the network is gone, but + // netd has not yet been told to destroy it. + final Runnable duringTeardown = () -> { + eventOrder.offer("timePasses"); + assertNull(mCm.getLinkProperties(wifiNetwork.get())); + try { + verify(mMockNetd, never()).networkDestroy(wifiNetwork.get().getNetId()); + } catch (RemoteException impossible) { + fail(); + } + }; + + // 4. After onNetworkDisconnected is called, connectivity APIs report the network is gone, + // and netd has been told to destroy it. + mWiFiNetworkAgent.setDisconnectedCallback(() -> { + eventOrder.offer("onNetworkDisconnected"); + assertNull(mCm.getLinkProperties(wifiNetwork.get())); + try { + verify(mMockNetd).networkDestroy(wifiNetwork.get().getNetId()); + } catch (RemoteException impossible) { + fail(); + } + }); + + // Connect a network, and file a request for it after it has come up, to ensure the nascent + // timer is cleared and the test does not have to wait for it. Filing the request after the + // network has come up is necessary because ConnectivityService does not appear to clear the + // nascent timer if the first request satisfied by the network was filed before the network + // connected. + // TODO: fix this bug, file the request before connecting, and remove the waitForIdle. + mWiFiNetworkAgent.connectWithoutInternet(); + waitForIdle(); + mCm.requestNetwork(request, callback); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + + // Set teardown delay and make sure CS has processed it. + mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMs(300); + waitForIdle(); + + // Post the duringTeardown lambda to the handler so it fires while teardown is in progress. + // The delay must be long enough it will run after the unregisterNetworkCallback has torn + // down the network and started the teardown timer, and short enough that the lambda is + // scheduled to run before the teardown timer. + final Handler h = new Handler(mCsHandlerThread.getLooper()); + h.postDelayed(duringTeardown, 150); + + // Disconnect the network and check that events happened in the right order. + mCm.unregisterNetworkCallback(callback); + assertEquals("onNetworkCreated", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertEquals("onNetworkUnwanted", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertEquals("timePasses", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertEquals("onNetworkDisconnected", eventOrder.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + + mCm.unregisterNetworkCallback(callback); + } + + @Test public void testExplicitlySelected() throws Exception { NetworkRequest request = new NetworkRequest.Builder() .clearCapabilities().addCapability(NET_CAPABILITY_INTERNET) @@ -3451,8 +3572,7 @@ public class ConnectivityServiceTest { @Test public void testCaptivePortalApi() throws Exception { - mServiceContext.setPermission( - android.Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() @@ -3486,8 +3606,7 @@ public class ConnectivityServiceTest { private TestNetworkCallback setupNetworkCallbackAndConnectToWifi() throws Exception { // Grant NETWORK_SETTINGS permission to be able to receive LinkProperties change callbacks // with sensitive (captive portal) data - mServiceContext.setPermission( - android.Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() @@ -3921,8 +4040,7 @@ public class ConnectivityServiceTest { @Test public void testRegisterDefaultNetworkCallback() throws Exception { // NETWORK_SETTINGS is necessary to call registerSystemDefaultNetworkCallback. - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); mCm.registerDefaultNetworkCallback(defaultNetworkCallback); @@ -4081,8 +4199,7 @@ public class ConnectivityServiceTest { () -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler)); callback.assertNoCallback(); - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); mCm.registerSystemDefaultNetworkCallback(callback, handler); callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); @@ -5403,10 +5520,11 @@ public class ConnectivityServiceTest { } @Test - public void testNetworkCallbackMaximum() { + public void testNetworkCallbackMaximum() throws Exception { final int MAX_REQUESTS = 100; final int CALLBACKS = 89; final int INTENTS = 11; + final int SYSTEM_ONLY_MAX_REQUESTS = 250; assertEquals(MAX_REQUESTS, CALLBACKS + INTENTS); NetworkRequest networkRequest = new NetworkRequest.Builder().build(); @@ -5455,6 +5573,33 @@ public class ConnectivityServiceTest { new Intent("d"), FLAG_IMMUTABLE)) ); + // The system gets another SYSTEM_ONLY_MAX_REQUESTS slots. + final Handler handler = new Handler(ConnectivityThread.getInstanceLooper()); + withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> { + ArrayList<NetworkCallback> systemRegistered = new ArrayList<>(); + for (int i = 0; i < SYSTEM_ONLY_MAX_REQUESTS - 1; i++) { + NetworkCallback cb = new NetworkCallback(); + if (i % 2 == 0) { + mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, cb, handler); + } else { + mCm.registerNetworkCallback(networkRequest, cb); + } + systemRegistered.add(cb); + } + waitForIdle(); + + assertThrows(TooManyRequestsException.class, () -> + mCm.registerDefaultNetworkCallbackAsUid(1001042, new NetworkCallback(), + handler)); + assertThrows(TooManyRequestsException.class, () -> + mCm.registerNetworkCallback(networkRequest, new NetworkCallback())); + + for (NetworkCallback callback : systemRegistered) { + mCm.unregisterNetworkCallback(callback); + } + waitForIdle(); // Wait for requests to be unregistered before giving up the permission. + }); + for (Object o : registered) { if (o instanceof NetworkCallback) { mCm.unregisterNetworkCallback((NetworkCallback)o); @@ -5481,6 +5626,30 @@ public class ConnectivityServiceTest { waitForIdle(); for (int i = 0; i < MAX_REQUESTS; i++) { + NetworkCallback networkCallback = new NetworkCallback(); + mCm.registerDefaultNetworkCallback(networkCallback); + mCm.unregisterNetworkCallback(networkCallback); + } + waitForIdle(); + + for (int i = 0; i < MAX_REQUESTS; i++) { + NetworkCallback networkCallback = new NetworkCallback(); + mCm.registerDefaultNetworkCallback(networkCallback); + mCm.unregisterNetworkCallback(networkCallback); + } + waitForIdle(); + + withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> { + for (int i = 0; i < MAX_REQUESTS; i++) { + NetworkCallback networkCallback = new NetworkCallback(); + mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, networkCallback, + new Handler(ConnectivityThread.getInstanceLooper())); + mCm.unregisterNetworkCallback(networkCallback); + } + }); + waitForIdle(); + + for (int i = 0; i < MAX_REQUESTS; i++) { final PendingIntent pendingIntent = PendingIntent.getBroadcast( mContext, 0 /* requestCode */, new Intent("e" + i), FLAG_IMMUTABLE); mCm.requestNetwork(networkRequest, pendingIntent); @@ -6473,8 +6642,7 @@ public class ConnectivityServiceTest { @Test public void testVpnNetworkActive() throws Exception { // NETWORK_SETTINGS is necessary to call registerSystemDefaultNetworkCallback. - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final int uid = Process.myUid(); @@ -6966,8 +7134,7 @@ public class ConnectivityServiceTest { @Test public void testRestrictedProfileAffectsVpnUidRanges() throws Exception { // NETWORK_SETTINGS is necessary to see the UID ranges in NetworkCapabilities. - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final NetworkRequest request = new NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_NOT_VPN) @@ -7053,8 +7220,7 @@ public class ConnectivityServiceTest { mServiceContext.setPermission( Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED); // Necessary to see the UID ranges in NetworkCapabilities. - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final NetworkRequest request = new NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_NOT_VPN) @@ -7542,8 +7708,7 @@ public class ConnectivityServiceTest { Manifest.permission.CONTROL_ALWAYS_ON_VPN, PERMISSION_GRANTED); mServiceContext.setPermission( Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED); - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final TestNetworkCallback callback = new TestNetworkCallback(); final NetworkRequest request = new NetworkRequest.Builder() @@ -7779,8 +7944,7 @@ public class ConnectivityServiceTest { mServiceContext.setPermission( Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED); // For LockdownVpnTracker to call registerSystemDefaultNetworkCallback. - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build(); final TestNetworkCallback callback = new TestNetworkCallback(); @@ -8910,8 +9074,7 @@ public class ConnectivityServiceTest { private void denyAllLocationPrivilegedPermissions() { mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_DENIED); - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, - PERMISSION_DENIED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED); mServiceContext.setPermission(Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); mServiceContext.setPermission(Manifest.permission.NETWORK_SETUP_WIZARD, @@ -9167,7 +9330,7 @@ public class ConnectivityServiceTest { @Test public void testCreateForCallerWithLocalMacAddressSanitizedWithSettingsPermission() throws Exception { - mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); final TransportInfo transportInfo = mock(TransportInfo.class); when(transportInfo.getApplicableRedactions()) @@ -10486,8 +10649,7 @@ public class ConnectivityServiceTest { private void registerDefaultNetworkCallbacks() { // Using Manifest.permission.NETWORK_SETTINGS for registerSystemDefaultNetworkCallback() - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); mSystemDefaultNetworkCallback = new TestNetworkCallback(); mDefaultNetworkCallback = new TestNetworkCallback(); mProfileDefaultNetworkCallback = new TestNetworkCallback(); @@ -10497,8 +10659,7 @@ public class ConnectivityServiceTest { registerDefaultNetworkCallbackAsUid(mProfileDefaultNetworkCallback, TEST_WORK_PROFILE_APP_UID); // TODO: test using ConnectivityManager#registerDefaultNetworkCallbackAsUid as well. - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED); + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED); } private void unregisterDefaultNetworkCallbacks() { @@ -10653,7 +10814,7 @@ public class ConnectivityServiceTest { defaultNetworkCallback.assertNoCallback(); final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); - withPermission(Manifest.permission.NETWORK_SETTINGS, () -> + withPermission(NETWORK_SETTINGS, () -> mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); @@ -10701,7 +10862,7 @@ public class ConnectivityServiceTest { defaultNetworkCallback.assertNoCallback(); final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); - withPermission(Manifest.permission.NETWORK_SETTINGS, () -> + withPermission(NETWORK_SETTINGS, () -> mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); @@ -10743,7 +10904,7 @@ public class ConnectivityServiceTest { defaultNetworkCallback.assertNoCallback(); final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); - withPermission(Manifest.permission.NETWORK_SETTINGS, () -> + withPermission(NETWORK_SETTINGS, () -> mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java index 8c5d1d6d05e5..8b072c49de82 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -22,7 +22,9 @@ import static android.net.metrics.INetdEventListener.EVENT_GETHOSTBYNAME; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; @@ -56,6 +58,7 @@ import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -80,6 +83,12 @@ public class IpConnectivityMetricsTest { IpConnectivityMetrics mService; NetdEventListenerService mNetdListener; + private static final NetworkCapabilities CAPABILITIES_WIFI = new NetworkCapabilities.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build(); + private static final NetworkCapabilities CAPABILITIES_CELL = new NetworkCapabilities.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .build(); @Before public void setUp() { @@ -263,14 +272,6 @@ public class IpConnectivityMetricsTest { // TODO: instead of comparing textpb to textpb, parse textpb and compare proto to proto. IpConnectivityLog logger = new IpConnectivityLog(mService.impl); - NetworkCapabilities ncWifi = new NetworkCapabilities(); - NetworkCapabilities ncCell = new NetworkCapabilities(); - ncWifi.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); - ncCell.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - - when(mCm.getNetworkCapabilities(new Network(100))).thenReturn(ncWifi); - when(mCm.getNetworkCapabilities(new Network(101))).thenReturn(ncCell); - ApfStats apfStats = new ApfStats.Builder() .setDurationMs(45000) .setReceivedRas(10) @@ -584,11 +585,21 @@ public class IpConnectivityMetricsTest { return buffer.toString(); } - void connectEvent(int netid, int error, int latencyMs, String ipAddr) throws Exception { - mNetdListener.onConnectEvent(netid, error, latencyMs, ipAddr, 80, 1); + private void setCapabilities(int netId) { + final ArgumentCaptor<ConnectivityManager.NetworkCallback> networkCallback = + ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); + verify(mCm).registerNetworkCallback(any(), networkCallback.capture()); + networkCallback.getValue().onCapabilitiesChanged(new Network(netId), + netId == 100 ? CAPABILITIES_WIFI : CAPABILITIES_CELL); + } + + void connectEvent(int netId, int error, int latencyMs, String ipAddr) throws Exception { + setCapabilities(netId); + mNetdListener.onConnectEvent(netId, error, latencyMs, ipAddr, 80, 1); } void dnsEvent(int netId, int type, int result, int latency) throws Exception { + setCapabilities(netId); mNetdListener.onDnsEvent(netId, type, result, latency, "", null, 0, 0); } diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java index 8ccea1aa3474..50aaaee24418 100644 --- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java +++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java @@ -23,8 +23,9 @@ import static com.android.testutils.MiscAsserts.assertStringContains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; import android.content.Context; import android.net.ConnectivityManager; @@ -42,6 +43,7 @@ import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpCon import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import java.io.FileOutputStream; import java.io.PrintWriter; @@ -61,18 +63,16 @@ public class NetdEventListenerServiceTest { NetdEventListenerService mService; ConnectivityManager mCm; + private static final NetworkCapabilities CAPABILITIES_WIFI = new NetworkCapabilities.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build(); + private static final NetworkCapabilities CAPABILITIES_CELL = new NetworkCapabilities.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .build(); @Before public void setUp() { - NetworkCapabilities ncWifi = new NetworkCapabilities(); - NetworkCapabilities ncCell = new NetworkCapabilities(); - ncWifi.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); - ncCell.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - mCm = mock(ConnectivityManager.class); - when(mCm.getNetworkCapabilities(new Network(100))).thenReturn(ncWifi); - when(mCm.getNetworkCapabilities(new Network(101))).thenReturn(ncCell); - mService = new NetdEventListenerService(mCm); } @@ -470,7 +470,16 @@ public class NetdEventListenerServiceTest { assertEquals(want, got); } + private void setCapabilities(int netId) { + final ArgumentCaptor<ConnectivityManager.NetworkCallback> networkCallback = + ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); + verify(mCm).registerNetworkCallback(any(), networkCallback.capture()); + networkCallback.getValue().onCapabilitiesChanged(new Network(netId), + netId == 100 ? CAPABILITIES_WIFI : CAPABILITIES_CELL); + } + Thread connectEventAction(int netId, int error, int latencyMs, String ipAddr) { + setCapabilities(netId); return new Thread(() -> { try { mService.onConnectEvent(netId, error, latencyMs, ipAddr, 80, 1); @@ -481,6 +490,7 @@ public class NetdEventListenerServiceTest { } void dnsEvent(int netId, int type, int result, int latency) throws Exception { + setCapabilities(netId); mService.onDnsEvent(netId, type, result, latency, "", null, 0, 0); } diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index f15d4204d125..c88b0c154712 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -34,8 +34,8 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; @@ -45,7 +45,6 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.AppOpsManager; @@ -63,7 +62,6 @@ import android.net.vcn.VcnConfig; import android.net.vcn.VcnConfigTest; import android.net.vcn.VcnManager; import android.net.vcn.VcnUnderlyingNetworkPolicy; -import android.net.wifi.WifiInfo; import android.os.IBinder; import android.os.ParcelUuid; import android.os.PersistableBundle; @@ -708,22 +706,12 @@ public class VcnManagementServiceTest { int subId, ParcelUuid subGrp, boolean isVcnActive, int transport) { setupSubscriptionAndStartVcn(subId, subGrp, isVcnActive); - final NetworkCapabilities.Builder ncBuilder = new NetworkCapabilities.Builder(); - ncBuilder.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); - if (transport == TRANSPORT_CELLULAR) { - ncBuilder - .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) - .setNetworkSpecifier(new TelephonyNetworkSpecifier(TEST_SUBSCRIPTION_ID)); - } else if (transport == TRANSPORT_WIFI) { - WifiInfo wifiInfo = mock(WifiInfo.class); - when(wifiInfo.makeCopy(anyLong())).thenReturn(wifiInfo); - when(mMockDeps.getSubIdForWifiInfo(eq(wifiInfo))).thenReturn(TEST_SUBSCRIPTION_ID); - - ncBuilder - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .setTransportInfo(wifiInfo); - } else { - throw new IllegalArgumentException("Unknown transport"); + final NetworkCapabilities.Builder ncBuilder = + new NetworkCapabilities.Builder() + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + .addTransportType(transport); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + ncBuilder.setSubIds(Collections.singleton(subId)); } return mVcnMgmtSvc.getUnderlyingNetworkPolicy(ncBuilder.build(), new LinkProperties()); diff --git a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java index 1ef1a61f17ea..ed2e4d9b9946 100644 --- a/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java +++ b/tests/vcn/java/com/android/server/vcn/UnderlyingNetworkTrackerTest.java @@ -146,40 +146,34 @@ public class UnderlyingNetworkTrackerTest { @Test public void testNetworkCallbacksRegisteredOnStartup() { - // verify NetworkCallbacks registered when instantiated - verify(mConnectivityManager) - .requestBackgroundNetwork( - eq(getWifiRequest()), - any(), - any(NetworkBringupCallback.class)); - verifyBackgroundCellRequests(mSubscriptionSnapshot, SUB_GROUP, INITIAL_SUB_IDS); + verifyNetworkRequestsRegistered(INITIAL_SUB_IDS); + } + private void verifyNetworkRequestsRegistered(Set<Integer> expectedSubIds) { verify(mConnectivityManager) .requestBackgroundNetwork( - eq(getRouteSelectionRequest()), + eq(getWifiRequest(expectedSubIds)), any(), - any(RouteSelectionCallback.class)); - } - - private void verifyBackgroundCellRequests( - TelephonySubscriptionSnapshot snapshot, - ParcelUuid subGroup, - Set<Integer> expectedSubIds) { - verify(snapshot).getAllSubIdsInGroup(eq(subGroup)); - + any(NetworkBringupCallback.class)); for (final int subId : expectedSubIds) { verify(mConnectivityManager) .requestBackgroundNetwork( - eq(getCellRequestForSubId(subId)), + eq(getCellRequestForSubId(subId, expectedSubIds)), any(), any(NetworkBringupCallback.class)); } + + verify(mConnectivityManager) + .requestBackgroundNetwork( + eq(getRouteSelectionRequest(expectedSubIds)), + any(), + any(RouteSelectionCallback.class)); } @Test public void testUpdateSubscriptionSnapshot() { // Verify initial cell background requests filed - verifyBackgroundCellRequests(mSubscriptionSnapshot, SUB_GROUP, INITIAL_SUB_IDS); + verifyNetworkRequestsRegistered(INITIAL_SUB_IDS); TelephonySubscriptionSnapshot subscriptionUpdate = mock(TelephonySubscriptionSnapshot.class); @@ -187,40 +181,38 @@ public class UnderlyingNetworkTrackerTest { mUnderlyingNetworkTracker.updateSubscriptionSnapshot(subscriptionUpdate); - // verify that initially-filed bringup requests are unregistered - verify(mConnectivityManager, times(INITIAL_SUB_IDS.size())) + // verify that initially-filed bringup requests are unregistered (cell + wifi) + verify(mConnectivityManager, times(INITIAL_SUB_IDS.size() + 1)) .unregisterNetworkCallback(any(NetworkBringupCallback.class)); - verifyBackgroundCellRequests(subscriptionUpdate, SUB_GROUP, UPDATED_SUB_IDS); + verify(mConnectivityManager).unregisterNetworkCallback(any(RouteSelectionCallback.class)); + verifyNetworkRequestsRegistered(UPDATED_SUB_IDS); } - private NetworkRequest getWifiRequest() { - return getExpectedRequestBase(true) + private NetworkRequest getWifiRequest(Set<Integer> netCapsSubIds) { + return getExpectedRequestBase(netCapsSubIds) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build(); } - private NetworkRequest getCellRequestForSubId(int subId) { - return getExpectedRequestBase(false) + private NetworkRequest getCellRequestForSubId(int subId, Set<Integer> netCapsSubIds) { + return getExpectedRequestBase(netCapsSubIds) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .setNetworkSpecifier(new TelephonyNetworkSpecifier(subId)) .build(); } - private NetworkRequest getRouteSelectionRequest() { - return getExpectedRequestBase(true).build(); + private NetworkRequest getRouteSelectionRequest(Set<Integer> netCapsSubIds) { + return getExpectedRequestBase(netCapsSubIds).build(); } - private NetworkRequest.Builder getExpectedRequestBase(boolean requireVcnManaged) { + private NetworkRequest.Builder getExpectedRequestBase(Set<Integer> subIds) { final NetworkRequest.Builder builder = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); - - if (requireVcnManaged) { - builder.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); - } + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) + .setSubIds(subIds); return builder; } @@ -274,7 +266,7 @@ public class UnderlyingNetworkTrackerTest { NetworkCapabilities networkCapabilities) { verify(mConnectivityManager) .requestBackgroundNetwork( - eq(getRouteSelectionRequest()), + eq(getRouteSelectionRequest(INITIAL_SUB_IDS)), any(), mRouteSelectionCallbackCaptor.capture()); @@ -328,7 +320,7 @@ public class UnderlyingNetworkTrackerTest { public void testRecordTrackerCallbackNotifiedForNetworkSuspended() { RouteSelectionCallback cb = verifyRegistrationOnAvailableAndGetCallback(); - cb.onNetworkSuspended(mNetwork); + cb.onCapabilitiesChanged(mNetwork, SUSPENDED_NETWORK_CAPABILITIES); UnderlyingNetworkRecord expectedRecord = new UnderlyingNetworkRecord( @@ -336,7 +328,11 @@ public class UnderlyingNetworkTrackerTest { SUSPENDED_NETWORK_CAPABILITIES, INITIAL_LINK_PROPERTIES, false /* isBlocked */); - verify(mNetworkTrackerCb).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); + verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); + // onSelectedUnderlyingNetworkChanged() won't be fired twice if network capabilities doesn't + // change. + cb.onCapabilitiesChanged(mNetwork, SUSPENDED_NETWORK_CAPABILITIES); + verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); } @Test @@ -344,7 +340,7 @@ public class UnderlyingNetworkTrackerTest { RouteSelectionCallback cb = verifyRegistrationOnAvailableAndGetCallback(SUSPENDED_NETWORK_CAPABILITIES); - cb.onNetworkResumed(mNetwork); + cb.onCapabilitiesChanged(mNetwork, INITIAL_NETWORK_CAPABILITIES); UnderlyingNetworkRecord expectedRecord = new UnderlyingNetworkRecord( @@ -352,7 +348,11 @@ public class UnderlyingNetworkTrackerTest { INITIAL_NETWORK_CAPABILITIES, INITIAL_LINK_PROPERTIES, false /* isBlocked */); - verify(mNetworkTrackerCb).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); + verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); + // onSelectedUnderlyingNetworkChanged() won't be fired twice if network capabilities doesn't + // change. + cb.onCapabilitiesChanged(mNetwork, INITIAL_NETWORK_CAPABILITIES); + verify(mNetworkTrackerCb, times(1)).onSelectedUnderlyingNetworkChanged(eq(expectedRecord)); } @Test diff --git a/tools/fonts/fontchain_linter.py b/tools/fonts/fontchain_linter.py index 7de706502618..a4a315b7e371 100755 --- a/tools/fonts/fontchain_linter.py +++ b/tools/fonts/fontchain_linter.py @@ -11,12 +11,6 @@ from fontTools import ttLib EMOJI_VS = 0xFE0F -#TODO(179952916): Rename CutiveMono and DancingScript -CANONICAL_NAME_EXCEPTION_LIST = [ - 'CutiveMono.ttf', - 'DancingScript-Regular.ttf', -] - LANG_TO_SCRIPT = { 'as': 'Beng', 'be': 'Cyrl', @@ -664,53 +658,6 @@ def check_cjk_punctuation(): assert_font_supports_none_of_chars(record.font, cjk_punctuation, name) -def getPostScriptName(font): - ttf = open_font(font) - nameTable = ttf['name'] - for name in nameTable.names: - if name.nameID == 6 and name.platformID == 3 and name.platEncID == 1 and name.langID == 0x0409: - return str(name) - - -def getSuffix(font): - file_path, index = font - with open(path.join(_fonts_dir, file_path), 'rb') as f: - tag = f.read(4) - isCollection = tag == b'ttcf' - - ttf = open_font(font) - isType1 = ('CFF ' in ttf or 'CFF2' in ttf) - - if isType1: - if isCollection: - return '.otc' - else: - return '.otf' - else: - if isCollection: - return '.ttc' - else: - return '.ttf' - - -def check_canonical_name(): - for record in _all_fonts: - file_name, index = record.font - if file_name in CANONICAL_NAME_EXCEPTION_LIST: - continue - - if index and index != 0: - continue - - psName = getPostScriptName(record.font) - assert psName, 'PostScript must be defined' - - suffix = getSuffix(record.font) - canonicalName = '%s%s' % (psName, suffix) - - assert file_name == canonicalName, ( - '%s is not a canonical name. Must be %s' % (file_name, canonicalName)) - def main(): global _fonts_dir target_out = sys.argv[1] @@ -728,8 +675,6 @@ def main(): check_cjk_punctuation() - check_canonical_name() - check_emoji = sys.argv[2] if check_emoji == 'true': ucd_path = sys.argv[3] |