diff options
37 files changed, 665 insertions, 158 deletions
diff --git a/StubLibraries.bp b/StubLibraries.bp index d0da5dae2ce3..00d077192a01 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -392,16 +392,6 @@ java_library_static { } java_defaults { - name: "android_defaults_stubs_current", - sdk_version: "none", - system_modules: "none", - java_version: "1.8", - compile_dex: true, - defaults_visibility: ["//visibility:private"], - visibility: ["//visibility:public"], -} - -java_defaults { name: "android_stubs_dists_default", dist: { targets: [ @@ -420,7 +410,7 @@ java_library_static { "android-non-updatable.stubs", "private-stub-annotations-jar", ], - defaults: ["android_defaults_stubs_current"], + defaults: ["android.jar_defaults"], } java_library_static { @@ -430,7 +420,7 @@ java_library_static { "private-stub-annotations-jar", ], defaults: [ - "android_defaults_stubs_current", + "android.jar_defaults", "android_stubs_dists_default", ], dist: { @@ -458,7 +448,7 @@ java_library_static { "private-stub-annotations-jar", ], defaults: [ - "android_defaults_stubs_current", + "android.jar_defaults", "android_stubs_dists_default", ], dist: { @@ -469,7 +459,7 @@ java_library_static { java_library_static { name: "android_module_lib_stubs_current", defaults: [ - "android_defaults_stubs_current", + "android.jar_defaults", "android_stubs_dists_default", ], static_libs: [ diff --git a/core/api/current.txt b/core/api/current.txt index 0c637755bf5f..d04012e941f8 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -19384,8 +19384,14 @@ package android.media { field public static final int ENCODING_IEC61937 = 13; // 0xd field public static final int ENCODING_INVALID = 0; // 0x0 field public static final int ENCODING_MP3 = 9; // 0x9 + field public static final int ENCODING_MPEGH_BL_L3 = 23; // 0x17 + field public static final int ENCODING_MPEGH_BL_L4 = 24; // 0x18 + field public static final int ENCODING_MPEGH_LC_L3 = 25; // 0x19 + field public static final int ENCODING_MPEGH_LC_L4 = 26; // 0x1a field public static final int ENCODING_OPUS = 20; // 0x14 field public static final int ENCODING_PCM_16BIT = 2; // 0x2 + field public static final int ENCODING_PCM_24BIT_PACKED = 21; // 0x15 + field public static final int ENCODING_PCM_32BIT = 22; // 0x16 field public static final int ENCODING_PCM_8BIT = 3; // 0x3 field public static final int ENCODING_PCM_FLOAT = 4; // 0x4 field public static final int SAMPLE_RATE_UNSPECIFIED = 0; // 0x0 @@ -21438,6 +21444,8 @@ package android.media { field public static final String MIMETYPE_AUDIO_G711_ALAW = "audio/g711-alaw"; field public static final String MIMETYPE_AUDIO_G711_MLAW = "audio/g711-mlaw"; field public static final String MIMETYPE_AUDIO_MPEG = "audio/mpeg"; + field public static final String MIMETYPE_AUDIO_MPEGH_MHA1 = "audio/mha1"; + field public static final String MIMETYPE_AUDIO_MPEGH_MHM1 = "audio/mhm1"; field public static final String MIMETYPE_AUDIO_MSGSM = "audio/gsm"; field public static final String MIMETYPE_AUDIO_OPUS = "audio/opus"; field public static final String MIMETYPE_AUDIO_QCELP = "audio/qcelp"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index ef3a54387d25..7e729e55071b 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10069,6 +10069,7 @@ package android.telephony { method public boolean canManageSubscription(@NonNull android.telephony.SubscriptionInfo, @NonNull String); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getActiveSubscriptionIdList(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForIcc(@NonNull String); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public byte[] getAllSimSpecificSettingsForBackup(); method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList(); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int[] getCompleteActiveSubscriptionIdList(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEnabledSubscriptionId(int); @@ -10076,6 +10077,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSubscriptionEnabled(int); method public void requestEmbeddedSubscriptionInfoListRefresh(); method public void requestEmbeddedSubscriptionInfoListRefresh(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void restoreAllSimSpecificSettingsFromBackup(@NonNull byte[]); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java index 28a21f767283..134cef5b6bfa 100644 --- a/core/java/android/app/AppCompatCallbacks.java +++ b/core/java/android/app/AppCompatCallbacks.java @@ -28,7 +28,7 @@ import java.util.Arrays; * * @hide */ -public final class AppCompatCallbacks extends Compatibility.Callbacks { +public final class AppCompatCallbacks implements Compatibility.BehaviorChangeDelegate { private final long[] mDisabledChanges; private final ChangeReporter mChangeReporter; @@ -38,7 +38,7 @@ public final class AppCompatCallbacks extends Compatibility.Callbacks { * @param disabledChanges Set of compatibility changes that are disabled for this process. */ public static void install(long[] disabledChanges) { - Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges)); + Compatibility.setBehaviorChangeDelegate(new AppCompatCallbacks(disabledChanges)); } private AppCompatCallbacks(long[] disabledChanges) { @@ -48,11 +48,11 @@ public final class AppCompatCallbacks extends Compatibility.Callbacks { ChangeReporter.SOURCE_APP_PROCESS); } - protected void reportChange(long changeId) { + public void onChangeReported(long changeId) { reportChange(changeId, ChangeReporter.STATE_LOGGED); } - protected boolean isChangeEnabled(long changeId) { + public boolean isChangeEnabled(long changeId) { if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) { // Not present in the disabled array reportChange(changeId, ChangeReporter.STATE_ENABLED); diff --git a/core/java/com/android/internal/colorextraction/OWNERS b/core/java/com/android/internal/colorextraction/OWNERS new file mode 100644 index 000000000000..ffade1ec4ebd --- /dev/null +++ b/core/java/com/android/internal/colorextraction/OWNERS @@ -0,0 +1,3 @@ +dupin@google.com +cinek@google.com +jamesoleary@google.com diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h index b1b39f3e36ff..5630a1e23f83 100644 --- a/core/jni/android_media_AudioFormat.h +++ b/core/jni/android_media_AudioFormat.h @@ -39,6 +39,12 @@ #define ENCODING_E_AC3_JOC 18 #define ENCODING_DOLBY_MAT 19 #define ENCODING_OPUS 20 +#define ENCODING_PCM_24BIT_PACKED 21 +#define ENCODING_PCM_32BIT 22 +#define ENCODING_MPEGH_BL_L3 23 +#define ENCODING_MPEGH_BL_L4 24 +#define ENCODING_MPEGH_LC_L3 25 +#define ENCODING_MPEGH_LC_L4 26 #define ENCODING_INVALID 0 #define ENCODING_DEFAULT 1 @@ -92,6 +98,18 @@ static inline audio_format_t audioFormatToNative(int audioFormat) return AUDIO_FORMAT_MAT; case ENCODING_OPUS: return AUDIO_FORMAT_OPUS; + case ENCODING_PCM_24BIT_PACKED: + return AUDIO_FORMAT_PCM_24_BIT_PACKED; + case ENCODING_PCM_32BIT: + return AUDIO_FORMAT_PCM_32_BIT; + case ENCODING_MPEGH_BL_L3: + return AUDIO_FORMAT_MPEGH_BL_L3; + case ENCODING_MPEGH_BL_L4: + return AUDIO_FORMAT_MPEGH_BL_L4; + case ENCODING_MPEGH_LC_L3: + return AUDIO_FORMAT_MPEGH_LC_L3; + case ENCODING_MPEGH_LC_L4: + return AUDIO_FORMAT_MPEGH_LC_L4; default: return AUDIO_FORMAT_INVALID; } @@ -107,10 +125,15 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat) case AUDIO_FORMAT_PCM_FLOAT: return ENCODING_PCM_FLOAT; - // map these to ENCODING_PCM_FLOAT - case AUDIO_FORMAT_PCM_8_24_BIT: + // As of S, these extend integer precision formats now return more specific values + // than ENCODING_PCM_FLOAT. case AUDIO_FORMAT_PCM_24_BIT_PACKED: + return ENCODING_PCM_24BIT_PACKED; case AUDIO_FORMAT_PCM_32_BIT: + return ENCODING_PCM_32BIT; + + // map this to ENCODING_PCM_FLOAT + case AUDIO_FORMAT_PCM_8_24_BIT: return ENCODING_PCM_FLOAT; case AUDIO_FORMAT_AC3: @@ -148,6 +171,14 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat) return ENCODING_DOLBY_MAT; case AUDIO_FORMAT_OPUS: return ENCODING_OPUS; + case AUDIO_FORMAT_MPEGH_BL_L3: + return ENCODING_MPEGH_BL_L3; + case AUDIO_FORMAT_MPEGH_BL_L4: + return ENCODING_MPEGH_BL_L4; + case AUDIO_FORMAT_MPEGH_LC_L3: + return ENCODING_MPEGH_LC_L3; + case AUDIO_FORMAT_MPEGH_LC_L4: + return ENCODING_MPEGH_LC_L4; case AUDIO_FORMAT_DEFAULT: return ENCODING_DEFAULT; default: diff --git a/core/proto/android/providers/OWNERS b/core/proto/android/providers/OWNERS new file mode 100644 index 000000000000..1f5cd9a5c3b8 --- /dev/null +++ b/core/proto/android/providers/OWNERS @@ -0,0 +1 @@ +include /packages/SettingsProvider/OWNERS diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java index 9d8a5effc2d7..e808c5cc51bd 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java @@ -579,7 +579,11 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor protected final byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) throws IllegalBlockSizeException, BadPaddingException { if (mCipher != null) { - return mCipher.doFinal(input, inputOffset, inputLen); + if (input == null && inputLen == 0) { + return mCipher.doFinal(); + } else { + return mCipher.doFinal(input, inputOffset, inputLen); + } } if (mCachedException != null) { diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index f79fc92477f7..270dffea429e 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -23,6 +23,7 @@ import android.util.SparseIntArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; import java.util.Objects; import java.util.TreeSet; @@ -467,9 +468,32 @@ public final class AudioDeviceInfo { * @see AudioFormat * * Note: an empty array indicates that the device supports arbitrary encodings. + * For forward compatibility, applications should ignore entries it does not recognize. */ public @NonNull int[] getEncodings() { - return AudioFormat.filterPublicFormats(mPort.formats()); + final int[] encodings = AudioFormat.filterPublicFormats(mPort.formats()); + boolean hasFloat = false; + boolean hasExtendedIntegerPrecision = false; + + for (int encoding : encodings) { + if (AudioFormat.isEncodingLinearPcm(encoding)) { + if (encoding == AudioFormat.ENCODING_PCM_FLOAT) { + hasFloat = true; + } else if (AudioFormat.getBytesPerSample(encoding) > 2) { + hasExtendedIntegerPrecision = true; + } + } + } + if (hasExtendedIntegerPrecision && !hasFloat) { + // R and earlier compatibility - add ENCODING_PCM_FLOAT to the end + // (replacing the zero pad). This ensures pre-S apps that look + // for ENCODING_PCM_FLOAT continue to see that encoding if the device supports + // extended precision integers. + int[] encodingsPlusFloat = Arrays.copyOf(encodings, encodings.length + 1); + encodingsPlusFloat[encodings.length] = AudioFormat.ENCODING_PCM_FLOAT; + return encodingsPlusFloat; + } + return encodings; } /** diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 090812e39c5f..c77f418966a7 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -110,6 +110,24 @@ import java.util.Objects; * <code>AudioTrack</code> as of API {@link android.os.Build.VERSION_CODES#LOLLIPOP} * support <code>ENCODING_PCM_FLOAT</code>. * </li> + * <li> {@link #ENCODING_PCM_24BIT_PACKED}: Introduced in + * API {@link android.os.Build.VERSION_CODES#S}, + * this encoding specifies the audio sample is an + * extended precision 24 bit signed integer + * stored as a 3 Java bytes in a {@code ByteBuffer} or byte array in native endian + * (see {@link java.nio.ByteOrder#nativeOrder()}). + * Each sample has full range from [-8388608, 8388607], + * and can be interpreted as fixed point Q.23 data. + * </li> + * <li> {@link #ENCODING_PCM_32BIT}: Introduced in + * API {@link android.os.Build.VERSION_CODES#S}, + * this encoding specifies the audio sample is an + * extended precision 32 bit signed integer + * stored as a 4 Java bytes in a {@code ByteBuffer} or byte array in native endian + * (see {@link java.nio.ByteOrder#nativeOrder()}). + * Each sample has full range from [-2147483648, 2147483647], + * and can be interpreted as fixed point Q.31 data. + * </li> * </ul> * <p>For compressed audio, the encoding specifies the method of compression, * for example {@link #ENCODING_AC3} and {@link #ENCODING_DTS}. The compressed @@ -285,6 +303,28 @@ public final class AudioFormat implements Parcelable { /** Audio data format: OPUS compressed. */ public static final int ENCODING_OPUS = 20; + /** @hide + * We do not permit legacy short array reads or writes for encodings + * introduced after this threshold. + */ + public static final int ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD = ENCODING_OPUS; + + /** Audio data format: PCM 24 bit per sample packed as 3 bytes. + * Not guaranteed to be supported by devices, may be emulated if not supported. */ + public static final int ENCODING_PCM_24BIT_PACKED = 21; + /** Audio data format: PCM 32 bit per sample. + * Not guaranteed to be supported by devices, may be emulated if not supported. */ + public static final int ENCODING_PCM_32BIT = 22; + + /** Audio data format: MPEG-H baseline profile, level 3 */ + public static final int ENCODING_MPEGH_BL_L3 = 23; + /** Audio data format: MPEG-H baseline profile, level 4 */ + public static final int ENCODING_MPEGH_BL_L4 = 24; + /** Audio data format: MPEG-H low complexity profile, level 3 */ + public static final int ENCODING_MPEGH_LC_L3 = 25; + /** Audio data format: MPEG-H low complexity profile, level 4 */ + public static final int ENCODING_MPEGH_LC_L4 = 26; + /** @hide */ public static String toLogFriendlyEncoding(int enc) { switch(enc) { @@ -328,6 +368,18 @@ public final class AudioFormat implements Parcelable { return "ENCODING_DOLBY_MAT"; case ENCODING_OPUS: return "ENCODING_OPUS"; + case ENCODING_PCM_24BIT_PACKED: + return "ENCODING_PCM_24BIT_PACKED"; + case ENCODING_PCM_32BIT: + return "ENCODING_PCM_32BIT"; + case ENCODING_MPEGH_BL_L3: + return "ENCODING_MPEGH_BL_L3"; + case ENCODING_MPEGH_BL_L4: + return "ENCODING_MPEGH_BL_L4"; + case ENCODING_MPEGH_LC_L3: + return "ENCODING_MPEGH_LC_L3"; + case ENCODING_MPEGH_LC_L4: + return "ENCODING_MPEGH_LC_L4"; default : return "invalid encoding " + enc; } @@ -561,17 +613,20 @@ public final class AudioFormat implements Parcelable { public static int getBytesPerSample(int audioFormat) { switch (audioFormat) { - case ENCODING_PCM_8BIT: - return 1; - case ENCODING_PCM_16BIT: - case ENCODING_IEC61937: - case ENCODING_DEFAULT: - return 2; - case ENCODING_PCM_FLOAT: - return 4; - case ENCODING_INVALID: - default: - throw new IllegalArgumentException("Bad audio format " + audioFormat); + case ENCODING_PCM_8BIT: + return 1; + case ENCODING_PCM_16BIT: + case ENCODING_IEC61937: + case ENCODING_DEFAULT: + return 2; + case ENCODING_PCM_24BIT_PACKED: + return 3; + case ENCODING_PCM_FLOAT: + case ENCODING_PCM_32BIT: + return 4; + case ENCODING_INVALID: + default: + throw new IllegalArgumentException("Bad audio format " + audioFormat); } } @@ -598,6 +653,12 @@ public final class AudioFormat implements Parcelable { case ENCODING_E_AC3_JOC: case ENCODING_DOLBY_MAT: case ENCODING_OPUS: + case ENCODING_PCM_24BIT_PACKED: + case ENCODING_PCM_32BIT: + case ENCODING_MPEGH_BL_L3: + case ENCODING_MPEGH_BL_L4: + case ENCODING_MPEGH_LC_L3: + case ENCODING_MPEGH_LC_L4: return true; default: return false; @@ -627,6 +688,12 @@ public final class AudioFormat implements Parcelable { case ENCODING_E_AC3_JOC: case ENCODING_DOLBY_MAT: case ENCODING_OPUS: + case ENCODING_PCM_24BIT_PACKED: + case ENCODING_PCM_32BIT: + case ENCODING_MPEGH_BL_L3: + case ENCODING_MPEGH_BL_L4: + case ENCODING_MPEGH_LC_L3: + case ENCODING_MPEGH_LC_L4: return true; default: return false; @@ -641,6 +708,8 @@ public final class AudioFormat implements Parcelable { case ENCODING_PCM_16BIT: case ENCODING_PCM_8BIT: case ENCODING_PCM_FLOAT: + case ENCODING_PCM_24BIT_PACKED: + case ENCODING_PCM_32BIT: case ENCODING_DEFAULT: return true; case ENCODING_AC3: @@ -659,6 +728,10 @@ public final class AudioFormat implements Parcelable { case ENCODING_E_AC3_JOC: case ENCODING_DOLBY_MAT: case ENCODING_OPUS: + case ENCODING_MPEGH_BL_L3: + case ENCODING_MPEGH_BL_L4: + case ENCODING_MPEGH_LC_L3: + case ENCODING_MPEGH_LC_L4: return false; case ENCODING_INVALID: default: @@ -674,6 +747,8 @@ public final class AudioFormat implements Parcelable { case ENCODING_PCM_8BIT: case ENCODING_PCM_FLOAT: case ENCODING_IEC61937: // same size as stereo PCM + case ENCODING_PCM_24BIT_PACKED: + case ENCODING_PCM_32BIT: case ENCODING_DEFAULT: return true; case ENCODING_AC3: @@ -691,6 +766,10 @@ public final class AudioFormat implements Parcelable { case ENCODING_E_AC3_JOC: case ENCODING_DOLBY_MAT: case ENCODING_OPUS: + case ENCODING_MPEGH_BL_L3: + case ENCODING_MPEGH_BL_L4: + case ENCODING_MPEGH_LC_L3: + case ENCODING_MPEGH_LC_L4: return false; case ENCODING_INVALID: default: @@ -971,6 +1050,12 @@ public final class AudioFormat implements Parcelable { case ENCODING_E_AC3_JOC: case ENCODING_DOLBY_MAT: case ENCODING_OPUS: + case ENCODING_PCM_24BIT_PACKED: + case ENCODING_PCM_32BIT: + case ENCODING_MPEGH_BL_L3: + case ENCODING_MPEGH_BL_L4: + case ENCODING_MPEGH_LC_L3: + case ENCODING_MPEGH_LC_L4: mEncoding = encoding; break; case ENCODING_INVALID: @@ -1191,7 +1276,13 @@ public final class AudioFormat implements Parcelable { ENCODING_AC4, ENCODING_E_AC3_JOC, ENCODING_DOLBY_MAT, - ENCODING_OPUS } + ENCODING_OPUS, + ENCODING_PCM_24BIT_PACKED, + ENCODING_PCM_32BIT, + ENCODING_MPEGH_BL_L3, + ENCODING_MPEGH_BL_L4, + ENCODING_MPEGH_LC_L3, + ENCODING_MPEGH_LC_L4 } ) @Retention(RetentionPolicy.SOURCE) public @interface Encoding {} @@ -1207,6 +1298,10 @@ public final class AudioFormat implements Parcelable { ENCODING_AC4, ENCODING_E_AC3_JOC, ENCODING_DOLBY_MAT, + ENCODING_MPEGH_BL_L3, + ENCODING_MPEGH_BL_L4, + ENCODING_MPEGH_LC_L3, + ENCODING_MPEGH_LC_L4, }; /** @hide */ @@ -1219,7 +1314,11 @@ public final class AudioFormat implements Parcelable { ENCODING_DOLBY_TRUEHD, ENCODING_AC4, ENCODING_E_AC3_JOC, - ENCODING_DOLBY_MAT } + ENCODING_DOLBY_MAT, + ENCODING_MPEGH_BL_L3, + ENCODING_MPEGH_BL_L4, + ENCODING_MPEGH_LC_L3, + ENCODING_MPEGH_LC_L4 } ) @Retention(RetentionPolicy.SOURCE) public @interface SurroundSoundEncoding {} @@ -1253,6 +1352,14 @@ public final class AudioFormat implements Parcelable { return "Dolby Atmos in Dolby Digital Plus"; case ENCODING_DOLBY_MAT: return "Dolby MAT"; + case ENCODING_MPEGH_BL_L3: + return "MPEG-H 3D Audio baseline profile level 3"; + case ENCODING_MPEGH_BL_L4: + return "MPEG-H 3D Audio baseline profile level 4"; + case ENCODING_MPEGH_LC_L3: + return "MPEG-H 3D Audio low complexity profile level 3"; + case ENCODING_MPEGH_LC_L4: + return "MPEG-H 3D Audio low complexity profile level 4"; default: return "Unknown surround sound format"; } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index d670f073fe8b..52233b65ce6d 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -845,17 +845,21 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, //-------------- // audio format switch (audioFormat) { - case AudioFormat.ENCODING_DEFAULT: - mAudioFormat = AudioFormat.ENCODING_PCM_16BIT; - break; - case AudioFormat.ENCODING_PCM_FLOAT: - case AudioFormat.ENCODING_PCM_16BIT: - case AudioFormat.ENCODING_PCM_8BIT: - mAudioFormat = audioFormat; - break; - default: - throw new IllegalArgumentException("Unsupported sample encoding " + audioFormat - + ". Should be ENCODING_PCM_8BIT, ENCODING_PCM_16BIT, or ENCODING_PCM_FLOAT."); + case AudioFormat.ENCODING_DEFAULT: + mAudioFormat = AudioFormat.ENCODING_PCM_16BIT; + break; + case AudioFormat.ENCODING_PCM_24BIT_PACKED: + case AudioFormat.ENCODING_PCM_32BIT: + case AudioFormat.ENCODING_PCM_FLOAT: + case AudioFormat.ENCODING_PCM_16BIT: + case AudioFormat.ENCODING_PCM_8BIT: + mAudioFormat = audioFormat; + break; + default: + throw new IllegalArgumentException("Unsupported sample encoding " + audioFormat + + ". Should be ENCODING_PCM_8BIT, ENCODING_PCM_16BIT," + + " ENCODING_PCM_24BIT_PACKED, ENCODING_PCM_32BIT," + + " or ENCODING_PCM_FLOAT."); } } @@ -1262,6 +1266,7 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, */ public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes, @ReadMode int readMode) { + // Note: we allow reads of extended integers into a byte array. if (mState != STATE_INITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) { return ERROR_INVALID_OPERATION; } @@ -1334,7 +1339,10 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, */ public int read(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts, @ReadMode int readMode) { - if (mState != STATE_INITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) { + if (mState != STATE_INITIALIZED + || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT + // use ByteBuffer instead for later encodings + || mAudioFormat > AudioFormat.ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD) { return ERROR_INVALID_OPERATION; } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 67880a589b43..7c91f52affa6 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -2992,7 +2992,7 @@ public class AudioTrack extends PlayerBase */ public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes, @WriteMode int writeMode) { - + // Note: we allow writes of extended integers and compressed formats from a byte array. if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) { return ERROR_INVALID_OPERATION; } @@ -3106,7 +3106,10 @@ public class AudioTrack extends PlayerBase public int write(@NonNull short[] audioData, int offsetInShorts, int sizeInShorts, @WriteMode int writeMode) { - if (mState == STATE_UNINITIALIZED || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT) { + if (mState == STATE_UNINITIALIZED + || mAudioFormat == AudioFormat.ENCODING_PCM_FLOAT + // use ByteBuffer or byte[] instead for later encodings + || mAudioFormat > AudioFormat.ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD) { return ERROR_INVALID_OPERATION; } diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 13c690770f49..17f3e96250da 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -169,6 +169,10 @@ public final class MediaFormat { public static final String MIMETYPE_AUDIO_EAC3_JOC = "audio/eac3-joc"; public static final String MIMETYPE_AUDIO_AC4 = "audio/ac4"; public static final String MIMETYPE_AUDIO_SCRAMBLED = "audio/scrambled"; + /** MIME type for MPEG-H Audio single stream */ + public static final String MIMETYPE_AUDIO_MPEGH_MHA1 = "audio/mha1"; + /** MIME type for MPEG-H Audio single stream, encapsulated in MHAS */ + public static final String MIMETYPE_AUDIO_MPEGH_MHM1 = "audio/mhm1"; /** * MIME type for HEIF still image data encoded in HEVC. diff --git a/native/android/Android.bp b/native/android/Android.bp index 34b9fced5bee..2a2b08d77e21 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -62,7 +62,7 @@ cc_library_shared { "surface_texture.cpp", "system_fonts.cpp", "trace.cpp", - "thermal.cpp" + "thermal.cpp", ], shared_libs: [ @@ -75,7 +75,7 @@ cc_library_shared { "libbinder", "libui", "libgui", - "libharfbuzz_ng", // Only for including hb.h via minikin + "libharfbuzz_ng", // Only for including hb.h via minikin "libsensor", "libactivitymanager_aidl", "libandroid_runtime", @@ -96,7 +96,7 @@ cc_library_shared { "libarect", ], - header_libs: [ "libhwui_internal_headers",], + header_libs: ["libhwui_internal_headers"], whole_static_libs: ["libnativewindow"], @@ -130,27 +130,26 @@ llndk_library { unversioned: true, } - // Aidl library for platform compat. cc_library_shared { name: "lib-platform-compat-native-api", cflags: [ - "-Wall", - "-Werror", - "-Wno-missing-field-initializers", - "-Wno-unused-variable", - "-Wunused-parameter", - ], + "-Wall", + "-Werror", + "-Wno-missing-field-initializers", + "-Wno-unused-variable", + "-Wunused-parameter", + ], shared_libs: [ "libbinder", - "libutils", + "libutils", ], aidl: { local_include_dirs: ["aidl"], export_aidl_headers: true, }, srcs: [ - ":platform-compat-native-aidl", + ":platform-compat-native-aidl", ], export_include_dirs: ["aidl"], } diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt index 9e2cd3e8a7fd..8b10fcc62b6d 100644 --- a/packages/Connectivity/framework/api/module-lib-current.txt +++ b/packages/Connectivity/framework/api/module-lib-current.txt @@ -11,7 +11,7 @@ package android.net { method @Nullable public android.net.ProxyInfo getGlobalProxy(); method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange(); method @NonNull public static String getPrivateDnsMode(@NonNull android.content.Context); - method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackAsUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler); + method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackForUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler); method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler); method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler); method @Deprecated public boolean requestRouteToHostAddress(int, java.net.InetAddress); @@ -166,11 +166,11 @@ package android.net { public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo { ctor public VpnTransportInfo(int, @Nullable String); method public int describeContents(); + method @Nullable public String getSessionId(); + method public int getType(); method @NonNull public android.net.VpnTransportInfo makeCopy(long); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.VpnTransportInfo> CREATOR; - field @Nullable public final String sessionId; - field public final int type; } } diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt index 935b09330c6c..5750845c5863 100644 --- a/packages/Connectivity/framework/api/system-current.txt +++ b/packages/Connectivity/framework/api/system-current.txt @@ -238,7 +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 void setTeardownDelayMillis(@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 4dd0984c79fd..4636abb8aeda 100644 --- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java +++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java @@ -4418,7 +4418,7 @@ public class ConnectivityManager { @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, @NonNull Handler handler) { - registerDefaultNetworkCallbackAsUid(Process.INVALID_UID, networkCallback, handler); + registerDefaultNetworkCallbackForUid(Process.INVALID_UID, networkCallback, handler); } /** @@ -4448,7 +4448,7 @@ public class ConnectivityManager { @RequiresPermission(anyOf = { NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) - public void registerDefaultNetworkCallbackAsUid(int uid, + public void registerDefaultNetworkCallbackForUid(int uid, @NonNull NetworkCallback networkCallback, @NonNull Handler handler) { CallbackHandler cbHandler = new CallbackHandler(handler); sendRequestForNetwork(uid, null /* need */, networkCallback, 0 /* timeoutMs */, diff --git a/packages/Connectivity/framework/src/android/net/NetworkAgent.java b/packages/Connectivity/framework/src/android/net/NetworkAgent.java index c57da53f289d..f65acdd5b467 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkAgent.java +++ b/packages/Connectivity/framework/src/android/net/NetworkAgent.java @@ -879,11 +879,11 @@ public abstract class NetworkAgent { * 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. + * @param teardownDelayMillis 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)); + public void setTeardownDelayMillis( + @IntRange(from = 0, to = MAX_TEARDOWN_DELAY_MS) int teardownDelayMillis) { + queueOrSendMessage(reg -> reg.sendTeardownDelayMs(teardownDelayMillis)); } /** diff --git a/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java b/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java index efd336377114..4071c9ab71b4 100644 --- a/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java +++ b/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java @@ -40,10 +40,10 @@ import java.util.Objects; @SystemApi(client = MODULE_LIBRARIES) public final class VpnTransportInfo implements TransportInfo, Parcelable { /** Type of this VPN. */ - public final int type; + private final int mType; @Nullable - public final String sessionId; + private final String mSessionId; @Override public @RedactionType long getApplicableRedactions() { @@ -55,13 +55,28 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { */ @NonNull public VpnTransportInfo makeCopy(@RedactionType long redactions) { - return new VpnTransportInfo(type, - ((redactions & REDACT_FOR_NETWORK_SETTINGS) != 0) ? null : sessionId); + return new VpnTransportInfo(mType, + ((redactions & REDACT_FOR_NETWORK_SETTINGS) != 0) ? null : mSessionId); } public VpnTransportInfo(int type, @Nullable String sessionId) { - this.type = type; - this.sessionId = sessionId; + this.mType = type; + this.mSessionId = sessionId; + } + + /** + * Returns the session Id of this VpnTransportInfo. + */ + @Nullable + public String getSessionId() { + return mSessionId; + } + + /** + * Returns the type of this VPN. + */ + public int getType() { + return mType; } @Override @@ -69,17 +84,17 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { if (!(o instanceof VpnTransportInfo)) return false; VpnTransportInfo that = (VpnTransportInfo) o; - return (this.type == that.type) && TextUtils.equals(this.sessionId, that.sessionId); + return (this.mType == that.mType) && TextUtils.equals(this.mSessionId, that.mSessionId); } @Override public int hashCode() { - return Objects.hash(type, sessionId); + return Objects.hash(mType, mSessionId); } @Override public String toString() { - return String.format("VpnTransportInfo{type=%d, sessionId=%s}", type, sessionId); + return String.format("VpnTransportInfo{type=%d, sessionId=%s}", mType, mSessionId); } @Override @@ -89,8 +104,8 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(type); - dest.writeString(sessionId); + dest.writeInt(mType); + dest.writeString(mSessionId); } public static final @NonNull Creator<VpnTransportInfo> CREATOR = diff --git a/packages/Connectivity/service/ServiceConnectivityResources/Android.bp b/packages/Connectivity/service/ServiceConnectivityResources/Android.bp index 7de1c6ee29f5..912d99f46867 100644 --- a/packages/Connectivity/service/ServiceConnectivityResources/Android.bp +++ b/packages/Connectivity/service/ServiceConnectivityResources/Android.bp @@ -30,6 +30,10 @@ android_app { apex_available: [ "com.android.tethering", ], - // TODO: use a dedicated cert once generated - certificate: "platform", + certificate: ":com.android.connectivity.resources.certificate", +} + +android_app_certificate { + name: "com.android.connectivity.resources.certificate", + certificate: "resources-certs/com.android.connectivity.resources", } diff --git a/packages/Connectivity/service/ServiceConnectivityResources/res/values/config.xml b/packages/Connectivity/service/ServiceConnectivityResources/res/values/config.xml index 71674e4dc606..9ff2a2209e76 100644 --- a/packages/Connectivity/service/ServiceConnectivityResources/res/values/config.xml +++ b/packages/Connectivity/service/ServiceConnectivityResources/res/values/config.xml @@ -78,6 +78,11 @@ <item>1,3</item> </string-array> + <!-- Reserved privileged keepalive slots per transport. --> + <integer translatable="false" name="config_reservedPrivilegedKeepaliveSlots">2</integer> + + <!-- Allowed unprivileged keepalive slots per uid. --> + <integer translatable="false" name="config_allowedUnprivilegedKeepalivePerUid">2</integer> <!-- Default value for ConnectivityManager.getMultipathPreference() on metered networks. Actual device behaviour is controlled by the metered multipath preference in @@ -89,4 +94,33 @@ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. --> <integer translatable="false" name="config_networkAvoidBadWifi">1</integer> + <!-- Array of ConnectivityManager.TYPE_xxxx constants for networks that may only + be controlled by systemOrSignature apps. --> + <integer-array translatable="false" name="config_protectedNetworks"> + <item>10</item> + <item>11</item> + <item>12</item> + <item>14</item> + <item>15</item> + </integer-array> + + <!-- Whether the internal vehicle network should remain active even when no + apps requested it. --> + <bool name="config_vehicleInternalNetworkAlwaysRequested">false</bool> + + + <!-- If the hardware supports specially marking packets that caused a wakeup of the + main CPU, set this value to the mark used. --> + <integer name="config_networkWakeupPacketMark">0</integer> + + <!-- Mask to use when checking skb mark defined in config_networkWakeupPacketMark above. --> + <integer name="config_networkWakeupPacketMask">0</integer> + + <!-- Whether/how to notify the user on network switches. See LingerMonitor.java. --> + <integer translatable="false" name="config_networkNotifySwitchType">0</integer> + + <!-- What types of network switches to notify. See LingerMonitor.java. --> + <string-array translatable="false" name="config_networkNotifySwitches"> + </string-array> + </resources> diff --git a/packages/Connectivity/service/ServiceConnectivityResources/res/values/overlayable.xml b/packages/Connectivity/service/ServiceConnectivityResources/res/values/overlayable.xml index 25e19cedbbba..717d08e13e44 100644 --- a/packages/Connectivity/service/ServiceConnectivityResources/res/values/overlayable.xml +++ b/packages/Connectivity/service/ServiceConnectivityResources/res/values/overlayable.xml @@ -26,6 +26,12 @@ <item type="integer" name="config_networkMeteredMultipathPreference"/> <item type="array" name="config_networkSupportedKeepaliveCount"/> <item type="integer" name="config_networkAvoidBadWifi"/> + <item type="array" name="config_protectedNetworks"/> + <item type="bool" name="config_vehicleInternalNetworkAlwaysRequested"/> + <item type="integer" name="config_networkWakeupPacketMark"/> + <item type="integer" name="config_networkWakeupPacketMask"/> + <item type="integer" name="config_networkNotifySwitchType"/> + <item type="array" name="config_networkNotifySwitches"/> </policy> </overlayable> diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8 b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8 Binary files differnew file mode 100644 index 000000000000..bfdc28b313ec --- /dev/null +++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8 diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem new file mode 100644 index 000000000000..70eca1cee1d0 --- /dev/null +++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem @@ -0,0 +1,36 @@ +-----BEGIN CERTIFICATE----- +MIIGQzCCBCugAwIBAgIUZY8nxBMINp/79sziXU77MLPpEXowDQYJKoZIhvcNAQEL +BQAwga8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH +DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy +b2lkMSswKQYDVQQDDCJjb20uYW5kcm9pZC5jb25uZWN0aXZpdHkucmVzb3VyY2Vz +MSIwIAYJKoZIhvcNAQkBFhNhbmRyb2lkQGFuZHJvaWQuY29tMCAXDTIxMDQyMjA3 +MjkxMFoYDzQ3NTkwMzE5MDcyOTEwWjCBrzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +CkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB0Fu +ZHJvaWQxEDAOBgNVBAsMB0FuZHJvaWQxKzApBgNVBAMMImNvbS5hbmRyb2lkLmNv +bm5lY3Rpdml0eS5yZXNvdXJjZXMxIjAgBgkqhkiG9w0BCQEWE2FuZHJvaWRAYW5k +cm9pZC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC361NT9qSz +h3uLcLBD67HNE1QX3ykwGyw8u7ExzqpsqLCzZsOCFRJQJY+CnrgNaAz0NXeNtx7D +Lpr9OCWWbG1KTQ/ANlR8g6xCqlAk4xdixsAnIlBUJB90+RlkcWrliEY7OwcqIu3x +/qe+5UR3irIFZOApNHOm760PjRl7VWAnYZC/PhkW0iKwnBuE96ddPIJc+KuiqCcP +KflgF4/jmbHTZ+5uvVV4qkfovc744HnQtQoCDoYR8WpsJv3YL5xrAv78o3WCRzx6 +xxB+eUlJpuyyfIee2lUCG4Ly4jgOsWaupnUglLDORnz/L8fhhnpv83wLal7E0Shx +sqvzZZbb1QLuwMWy++gfzdDvGWewES3BdSFp5NwYWXQGZWSkEEFbIiorKSurU1On +9OwB0jT/H2B/CAFKYJQ2V+hQ4I7PG+z9p7ZFNR6GZbZuhEr+Dpq1CwtI3W45izr3 +RJgcc2IP6Oj7/XC2MmKGMqZkybBWcvazdyAMHzk9EZIBT2Oru3dnOl3uVUUPeZRs +xRzqaA0MAlyj+GJ9uziEr3W1j+U1CFEnNWtlD/jqcTAwmaOsn1GhWyMAo1KOrJ/o +LcJvwk5P/0XEyeli7/DSUpGjYiAgWMHWCOn9s6aYw3YFb+A/SgX3/+FIDib/vHTX +i76JZfO0CfoKsbFDCH9KOMupHM9EO3ftQwIDAQABo1MwUTAdBgNVHQ4EFgQU/KGg +gmMqXD5YOe5+B0W+YezN9LcwHwYDVR0jBBgwFoAU/KGggmMqXD5YOe5+B0W+YezN +9LcwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAhr+AaNaIlRyM +WKyJ+2Aa35fH5e44Xr/xPpriM5HHxsj0evjMCODqCQ7kzfwSEmtXh5uZYYNKb/JP +ZMDHIFcYi1QCvm6E6YOd+Qn9CVxrwaDhigJv7ylhVf8q201GTvHhJIU99yFIrzJQ +RNhxw+pNo7FYMZr3J7JZPAy60DN1KZvRV4FjZx5qiPUMyu4zVygzDkr0v5Ilncdp +l9VVjOi7ocHyBKI+7RkXl97xN4SUe3vszwZQHCVyVopBw+YrMbDBCrknrQzUEgie +BuI+kj5oOeiQ0P1i1K+UCCAjrLwhNyc9H02rKUtBHxa2AVjw7YpAJlBesb49Qvq+ +5L6JjHFVSSOEbIjboNib26zNackjbiefF74meSUbGVGfcJ1OdkZsXZWphmER8V7X +Wz3Z8JwOXW1RLPgcbjilHUR5g8pEmWBv4KrTCSg5IvOJr4w3pyyMBiiVI9NI5sB7 +g5Mi9v3ifPD1OHA4Y3wYCb26mMEpRb8ogOhMHcGNbdnL3QtIUg4cmXGqGSY/LbpU +np0sIQDSjc46o79F0boPsLlaN3US5WZIu0nc9SHkjoNhd0CJQ5r9aEn4/wNrZgxs +s8OEKsqcS7OsWiIE6nG51TMDsCuyRBrGedtSUyFFSVSpivpYIrPVNKKlHsJ/o+Nv +Udb6dBjCraPvJB8binB1aojwya3MwRs= +-----END CERTIFICATE----- diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem new file mode 100644 index 000000000000..38771c261518 --- /dev/null +++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +/4Pif3Aj5E9dm1zkUtZJYQbII5SKQ94= +-----END PRIVATE KEY----- diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 44864a61ade6..9cd7083a2a11 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -24,6 +24,7 @@ import android.app.backup.FullBackupDataOutput; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.pm.PackageManager; import android.database.Cursor; import android.net.NetworkPolicy; import android.net.NetworkPolicyManager; @@ -42,6 +43,7 @@ import android.provider.settings.validators.GlobalSettingsValidators; import android.provider.settings.validators.SecureSettingsValidators; import android.provider.settings.validators.SystemSettingsValidators; import android.provider.settings.validators.Validator; +import android.telephony.SubscriptionManager; import android.util.ArrayMap; import android.util.ArraySet; import android.util.BackupUtils; @@ -95,10 +97,11 @@ public class SettingsBackupAgent extends BackupAgentHelper { private static final String KEY_NETWORK_POLICIES = "network_policies"; private static final String KEY_WIFI_NEW_CONFIG = "wifi_new_config"; private static final String KEY_DEVICE_SPECIFIC_CONFIG = "device_specific_config"; + private static final String KEY_SIM_SPECIFIC_SETTINGS = "sim_specific_settings"; // Versioning of the state file. Increment this version // number any time the set of state items is altered. - private static final int STATE_VERSION = 8; + private static final int STATE_VERSION = 9; // Versioning of the Network Policies backup payload. private static final int NETWORK_POLICIES_BACKUP_VERSION = 1; @@ -106,19 +109,20 @@ public class SettingsBackupAgent extends BackupAgentHelper { // Slots in the checksum array. Never insert new items in the middle // of this array; new slots must be appended. - private static final int STATE_SYSTEM = 0; - private static final int STATE_SECURE = 1; - private static final int STATE_LOCALE = 2; - private static final int STATE_WIFI_SUPPLICANT = 3; - private static final int STATE_WIFI_CONFIG = 4; - private static final int STATE_GLOBAL = 5; - private static final int STATE_LOCK_SETTINGS = 6; - private static final int STATE_SOFTAP_CONFIG = 7; - private static final int STATE_NETWORK_POLICIES = 8; - private static final int STATE_WIFI_NEW_CONFIG = 9; - private static final int STATE_DEVICE_CONFIG = 10; - - private static final int STATE_SIZE = 11; // The current number of state items + private static final int STATE_SYSTEM = 0; + private static final int STATE_SECURE = 1; + private static final int STATE_LOCALE = 2; + private static final int STATE_WIFI_SUPPLICANT = 3; + private static final int STATE_WIFI_CONFIG = 4; + private static final int STATE_GLOBAL = 5; + private static final int STATE_LOCK_SETTINGS = 6; + private static final int STATE_SOFTAP_CONFIG = 7; + private static final int STATE_NETWORK_POLICIES = 8; + private static final int STATE_WIFI_NEW_CONFIG = 9; + private static final int STATE_DEVICE_CONFIG = 10; + private static final int STATE_SIM_SPECIFIC_SETTINGS = 11; + + private static final int STATE_SIZE = 12; // The current number of state items // Number of entries in the checksum array at various version numbers private static final int STATE_SIZES[] = { @@ -130,7 +134,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { 8, // version 5 added STATE_SOFTAP_CONFIG 9, // version 6 added STATE_NETWORK_POLICIES 10, // version 7 added STATE_WIFI_NEW_CONFIG - STATE_SIZE // version 8 added STATE_DEVICE_CONFIG + 11, // version 8 added STATE_DEVICE_CONFIG + STATE_SIZE // version 9 added STATE_SIM_SPECIFIC_SETTINGS }; private static final int FULL_BACKUP_ADDED_GLOBAL = 2; // added the "global" entry @@ -208,7 +213,6 @@ public class SettingsBackupAgent extends BackupAgentHelper { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { - byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); @@ -218,6 +222,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { byte[] netPoliciesData = getNetworkPolicies(); byte[] wifiFullConfigData = getNewWifiConfigData(); byte[] deviceSpecificInformation = getDeviceSpecificConfiguration(); + byte[] simSpecificSettingsData = getSimSpecificSettingsData(); long[] stateChecksums = readOldChecksums(oldState); @@ -246,6 +251,9 @@ public class SettingsBackupAgent extends BackupAgentHelper { stateChecksums[STATE_DEVICE_CONFIG] = writeIfChanged(stateChecksums[STATE_DEVICE_CONFIG], KEY_DEVICE_SPECIFIC_CONFIG, deviceSpecificInformation, data); + stateChecksums[STATE_SIM_SPECIFIC_SETTINGS] = + writeIfChanged(stateChecksums[STATE_SIM_SPECIFIC_SETTINGS], + KEY_SIM_SPECIFIC_SETTINGS, simSpecificSettingsData, data); writeNewChecksums(stateChecksums, newState); } @@ -386,6 +394,12 @@ public class SettingsBackupAgent extends BackupAgentHelper { preservedSettings); break; + case KEY_SIM_SPECIFIC_SETTINGS: + byte[] restoredSimSpecificSettings = new byte[size]; + data.readEntityData(restoredSimSpecificSettings, 0, size); + restoreSimSpecificSettings(restoredSimSpecificSettings); + break; + default : data.skipEntityData(); @@ -1189,6 +1203,28 @@ public class SettingsBackupAgent extends BackupAgentHelper { return true; } + private byte[] getSimSpecificSettingsData() { + byte[] simSpecificData = new byte[0]; + PackageManager packageManager = getBaseContext().getPackageManager(); + if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { + SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); + simSpecificData = subManager.getAllSimSpecificSettingsForBackup(); + Log.i(TAG, "sim specific data of length + " + simSpecificData.length + + " successfully retrieved"); + } + + return simSpecificData; + } + + private void restoreSimSpecificSettings(byte[] data) { + PackageManager packageManager = getBaseContext().getPackageManager(); + boolean hasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); + if (hasTelephony) { + SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); + subManager.restoreAllSimSpecificSettingsFromBackup(data); + } + } + private void updateWindowManagerIfNeeded(Integer previousDensity) { int newDensity; try { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 142169efc89d..1ab03aa49c2f 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -216,6 +216,7 @@ import android.util.Pair; import android.util.SparseArray; import android.util.SparseIntArray; +import com.android.connectivity.resources.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; @@ -830,8 +831,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private ArrayMap<Integer, Integer> loadRestoreTimers() { final String[] configs = mService.mResources.get().getStringArray( - com.android.connectivity.resources.R.array - .config_legacy_networktype_restore_timers); + R.array.config_legacy_networktype_restore_timers); final ArrayMap<Integer, Integer> ret = new ArrayMap<>(configs.length); for (final String config : configs) { final String[] splits = TextUtils.split(config, ","); @@ -1310,8 +1310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mLegacyTypeTracker.loadSupportedTypes(mContext, mTelephonyManager); mProtectedNetworks = new ArrayList<>(); - int[] protectedNetworks = context.getResources().getIntArray( - com.android.internal.R.array.config_protectedNetworks); + int[] protectedNetworks = mResources.get().getIntArray(R.array.config_protectedNetworks); for (int p : protectedNetworks) { if (mLegacyTypeTracker.isTypeSupported(p) && !mProtectedNetworks.contains(p)) { mProtectedNetworks.add(p); @@ -1483,8 +1482,14 @@ public class ConnectivityService extends IConnectivityManager.Stub ConnectivitySettingsManager.MOBILE_DATA_ALWAYS_ON, true /* defaultValue */); handleAlwaysOnNetworkRequest(mDefaultWifiRequest, ConnectivitySettingsManager.WIFI_ALWAYS_REQUESTED, false /* defaultValue */); + final boolean vehicleAlwaysRequested = mResources.get().getBoolean( + R.bool.config_vehicleInternalNetworkAlwaysRequested); + // TODO (b/183076074): remove legacy fallback after migrating overlays + final boolean legacyAlwaysRequested = mContext.getResources().getBoolean( + mContext.getResources().getIdentifier( + "config_vehicleInternalNetworkAlwaysRequested", "bool", "android")); handleAlwaysOnNetworkRequest(mDefaultVehicleRequest, - com.android.internal.R.bool.config_vehicleInternalNetworkAlwaysRequested); + vehicleAlwaysRequested || legacyAlwaysRequested); } private void registerSettingsCallbacks() { @@ -4839,7 +4844,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mWakelockLogs.log("ACQUIRE for " + forWhom); Message msg = mHandler.obtainMessage(EVENT_EXPIRE_NET_TRANSITION_WAKELOCK); final int lockTimeout = mResources.get().getInteger( - com.android.connectivity.resources.R.integer.config_networkTransitionTimeout); + R.integer.config_networkTransitionTimeout); mHandler.sendMessageDelayed(msg, lockTimeout); } @@ -6700,10 +6705,16 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } - int mark = mContext.getResources().getInteger( - com.android.internal.R.integer.config_networkWakeupPacketMark); - int mask = mContext.getResources().getInteger( - com.android.internal.R.integer.config_networkWakeupPacketMask); + int mark = mResources.get().getInteger(R.integer.config_networkWakeupPacketMark); + int mask = mResources.get().getInteger(R.integer.config_networkWakeupPacketMask); + + // TODO (b/183076074): remove legacy fallback after migrating overlays + final int legacyMark = mContext.getResources().getInteger(mContext.getResources() + .getIdentifier("config_networkWakeupPacketMark", "integer", "android")); + final int legacyMask = mContext.getResources().getInteger(mContext.getResources() + .getIdentifier("config_networkWakeupPacketMask", "integer", "android")); + mark = mark == 0 ? legacyMark : mark; + mask = mask == 0 ? legacyMask : mask; // Mask/mark of zero will not detect anything interesting. // Don't install rules unless both values are nonzero. @@ -6896,8 +6907,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updateWakeOnLan(@NonNull LinkProperties lp) { if (mWolSupportedInterfaces == null) { mWolSupportedInterfaces = new ArraySet<>(mResources.get().getStringArray( - com.android.connectivity.resources.R.array - .config_wakeonlan_supported_interfaces)); + R.array.config_wakeonlan_supported_interfaces)); } lp.setWakeOnLanSupported(mWolSupportedInterfaces.contains(lp.getInterfaceName())); } @@ -8473,7 +8483,7 @@ public class ConnectivityService extends IConnectivityManager.Stub public String getCaptivePortalServerUrl() { enforceNetworkStackOrSettingsPermission(); String settingUrl = mResources.get().getString( - com.android.connectivity.resources.R.string.config_networkCaptivePortalServerUrl); + R.string.config_networkCaptivePortalServerUrl); if (!TextUtils.isEmpty(settingUrl)) { return settingUrl; @@ -8654,7 +8664,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (vpn == null) return VpnManager.TYPE_VPN_NONE; final TransportInfo ti = vpn.networkCapabilities.getTransportInfo(); if (!(ti instanceof VpnTransportInfo)) return VpnManager.TYPE_VPN_NONE; - return ((VpnTransportInfo) ti).type; + return ((VpnTransportInfo) ti).getType(); } /** @@ -9583,7 +9593,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // request. final ArrayList<NetworkRequest> nrs = new ArrayList<>(); nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities)); - nrs.add(createDefaultRequest()); + nrs.add(createDefaultInternetRequestForTransport( + TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT)); setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids())); final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs); result.add(nri); @@ -9888,7 +9899,8 @@ public class ConnectivityService extends IConnectivityManager.Stub case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID: requests.add(createUnmeteredNetworkRequest()); requests.add(createOemPaidNetworkRequest()); - requests.add(createDefaultRequest()); + requests.add(createDefaultInternetRequestForTransport( + TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT)); break; case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK: requests.add(createUnmeteredNetworkRequest()); diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index 1241b77798ff..53af88e68468 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -848,9 +848,7 @@ public final class PinnerService extends SystemService { int mapSize = 0; try { - int openFlags = (OsConstants.O_RDONLY | - OsConstants.O_CLOEXEC | - OsConstants.O_NOFOLLOW); + int openFlags = (OsConstants.O_RDONLY | OsConstants.O_CLOEXEC); fd = Os.open(fileToPin, openFlags, 0); mapSize = (int) Math.min(Os.fstat(fd).st_size, Integer.MAX_VALUE); address = Os.mmap(0, mapSize, diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java index 058dac882225..acf39f05a541 100644 --- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java +++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java @@ -37,6 +37,7 @@ import static android.net.SocketKeepalive.SUCCESS; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; +import android.net.ConnectivityResources; import android.net.ISocketKeepaliveCallback; import android.net.InetAddresses; import android.net.InvalidPacketException; @@ -57,7 +58,7 @@ import android.system.Os; import android.util.Log; import android.util.Pair; -import com.android.internal.R; +import com.android.connectivity.resources.R; import com.android.internal.util.IndentingPrintWriter; import com.android.net.module.util.HexDump; import com.android.net.module.util.IpUtils; @@ -112,10 +113,19 @@ public class KeepaliveTracker { mTcpController = new TcpKeepaliveController(handler); mContext = context; mSupportedKeepalives = KeepaliveUtils.getSupportedKeepalives(mContext); - mReservedPrivilegedSlots = mContext.getResources().getInteger( - R.integer.config_reservedPrivilegedKeepaliveSlots); - mAllowedUnprivilegedSlotsForUid = mContext.getResources().getInteger( - R.integer.config_allowedUnprivilegedKeepalivePerUid); + + // TODO (b/183076074): stop reading legacy resources after migrating overlays + final int legacyReservedSlots = mContext.getResources().getInteger( + mContext.getResources().getIdentifier( + "config_reservedPrivilegedKeepaliveSlots", "integer", "android")); + final int legacyAllowedSlots = mContext.getResources().getInteger( + mContext.getResources().getIdentifier( + "config_allowedUnprivilegedKeepalivePerUid", "integer", "android")); + final ConnectivityResources res = new ConnectivityResources(mContext); + mReservedPrivilegedSlots = Math.min(legacyReservedSlots, res.get().getInteger( + R.integer.config_reservedPrivilegedKeepaliveSlots)); + mAllowedUnprivilegedSlotsForUid = Math.min(legacyAllowedSlots, res.get().getInteger( + R.integer.config_allowedUnprivilegedKeepalivePerUid)); } /** diff --git a/services/core/java/com/android/server/connectivity/LingerMonitor.java b/services/core/java/com/android/server/connectivity/LingerMonitor.java index adec7ad5c89d..032612c6f093 100644 --- a/services/core/java/com/android/server/connectivity/LingerMonitor.java +++ b/services/core/java/com/android/server/connectivity/LingerMonitor.java @@ -24,6 +24,8 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; +import android.net.ConnectivityResources; import android.net.NetworkCapabilities; import android.os.SystemClock; import android.os.UserHandle; @@ -34,7 +36,7 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; -import com.android.internal.R; +import com.android.connectivity.resources.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.MessageUtils; import com.android.server.connectivity.NetworkNotificationManager.NotificationType; @@ -72,6 +74,7 @@ public class LingerMonitor { new Class[] { LingerMonitor.class }, new String[]{ "NOTIFY_TYPE_" }); private final Context mContext; + final Resources mResources; private final NetworkNotificationManager mNotifier; private final int mDailyLimit; private final long mRateLimitMillis; @@ -89,6 +92,7 @@ public class LingerMonitor { public LingerMonitor(Context context, NetworkNotificationManager notifier, int dailyLimit, long rateLimitMillis) { mContext = context; + mResources = new ConnectivityResources(mContext).get(); mNotifier = notifier; mDailyLimit = dailyLimit; mRateLimitMillis = rateLimitMillis; @@ -128,8 +132,7 @@ public class LingerMonitor { @VisibleForTesting public boolean isNotificationEnabled(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) { // TODO: Evaluate moving to CarrierConfigManager. - String[] notifySwitches = - mContext.getResources().getStringArray(R.array.config_networkNotifySwitches); + String[] notifySwitches = mResources.getStringArray(R.array.config_networkNotifySwitches); if (VDBG) { Log.d(TAG, "Notify on network switches: " + Arrays.toString(notifySwitches)); @@ -178,8 +181,7 @@ public class LingerMonitor { // Notify the user of a network switch using a notification or a toast. private void notify(NetworkAgentInfo fromNai, NetworkAgentInfo toNai, boolean forceToast) { - int notifyType = - mContext.getResources().getInteger(R.integer.config_networkNotifySwitchType); + int notifyType = mResources.getInteger(R.integer.config_networkNotifySwitchType); if (notifyType == NOTIFY_TYPE_NOTIFICATION && forceToast) { notifyType = NOTIFY_TYPE_TOAST; } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 2908e94aad81..497801f9c3a1 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -47,6 +47,7 @@ import android.net.NetworkPolicyManager; import android.net.Uri; import android.os.Binder; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.ParcelUuid; @@ -150,6 +151,22 @@ public class SubscriptionManager { public static final String CACHE_KEY_SLOT_INDEX_PROPERTY = "cache_key.telephony.get_slot_index"; + /** @hide */ + public static final String GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME = "getSimSpecificSettings"; + + /** @hide */ + public static final String RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME = + "restoreSimSpecificSettings"; + + /** + * Key to the backup & restore data byte array in the Bundle that is returned by {@link + * #getAllSimSpecificSettingsForBackup()} or to be pass in to {@link + * #restoreAllSimSpecificSettings()}. + * + * @hide + */ + public static final String KEY_SIM_SPECIFIC_SETTINGS_DATA = "KEY_SIM_SPECIFIC_SETTINGS_DATA"; + private static final int MAX_CACHE_SIZE = 4; private static class VoidPropertyInvalidatedCache<T> @@ -372,6 +389,28 @@ public class SubscriptionManager { public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_enabled"); + + /** + * A content {@link uri} used to call the appropriate backup or restore method for sim-specific + * settings + * <p> + * See {@link #GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME} and {@link + * #RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME} for information on what method to call. + * @hide + */ + @NonNull + public static final Uri SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI = Uri.withAppendedPath( + CONTENT_URI, "backup_and_restore"); + + /** + * A content {@link uri} used to notify contentobservers listening to siminfo restore during + * SuW. + * @hide + */ + @NonNull + public static final Uri SIM_INFO_SUW_RESTORE_CONTENT_URI = Uri.withAppendedPath( + SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI, "suw_restore"); + /** * TelephonyProvider unique key column name is the subscription id. * <P>Type: TEXT (String)</P> @@ -3446,4 +3485,71 @@ public class SubscriptionManager { sSlotIndexCache.clear(); sPhoneIdCache.clear(); } + + /** + * Called to retrieve SIM-specific settings data to be backed up. + * + * @return data in byte[] to be backed up. + * + * @hide + */ + @NonNull + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public byte[] getAllSimSpecificSettingsForBackup() { + Bundle bundle = mContext.getContentResolver().call( + SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI, + GET_SIM_SPECIFIC_SETTINGS_METHOD_NAME, null, null); + return bundle.getByteArray(SubscriptionManager.KEY_SIM_SPECIFIC_SETTINGS_DATA); + } + + /** + * Called to attempt to restore the backed up sim-specific configs to device for specific sim. + * This will try to restore the data that was stored internally when {@link + * #restoreAllSimSpecificSettingsFromBackup(byte[] data)} was called during setup wizard. + * End result is SimInfoDB is modified to match any backed up configs for the requested + * inserted sim. + * + * <p> + * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB + * entry is updated as the result of this method call. + * + * @param iccId of the sim that a restore is requested for. + * + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public void restoreSimSpecificSettingsForIccIdFromBackup(@NonNull String iccId) { + mContext.getContentResolver().call( + SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI, + RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME, + iccId, null); + } + + /** + * Called during setup wizard restore flow to attempt to restore the backed up sim-specific + * configs to device for all existing SIMs in SimInfoDB. Internally, it will store the backup + * data in an internal file. This file will persist on device for device's lifetime and will be + * used later on when a SIM is inserted to restore that specific SIM's settings by calling + * {@link #restoreSimSpecificSettingsForIccIdFromBackup(String iccId)}. End result is + * SimInfoDB is modified to match any backed up configs for the appropriate inserted SIMs. + * + * <p> + * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB + * entry is updated as the result of this method call. + * + * @param data with the sim specific configs to be backed up. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public void restoreAllSimSpecificSettingsFromBackup(@NonNull byte[] data) { + Bundle bundle = new Bundle(); + bundle.putByteArray(KEY_SIM_SPECIFIC_SETTINGS_DATA, data); + mContext.getContentResolver().call( + SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI, + RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME, + null, bundle); + } } diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk index 9b155c930871..b6f34717658c 100644 --- a/tests/backup/Android.mk +++ b/tests/backup/Android.mk @@ -47,4 +47,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE include $(BUILD_PACKAGE) diff --git a/tests/net/java/android/net/ConnectivityManagerTest.java b/tests/net/java/android/net/ConnectivityManagerTest.java index 19f884346e6f..591e0cc3504e 100644 --- a/tests/net/java/android/net/ConnectivityManagerTest.java +++ b/tests/net/java/android/net/ConnectivityManagerTest.java @@ -379,7 +379,7 @@ public class ConnectivityManagerTest { eq(testPkgName), eq(testAttributionTag)); reset(mService); - manager.registerDefaultNetworkCallbackAsUid(42, callback, handler); + manager.registerDefaultNetworkCallbackForUid(42, callback, handler); verify(mService).requestNetwork(eq(42), eq(null), eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(testPkgName), eq(testAttributionTag)); diff --git a/tests/net/java/android/net/VpnTransportInfoTest.java b/tests/net/java/android/net/VpnTransportInfoTest.java index fee65f06bcad..ccaa5cf7e9f7 100644 --- a/tests/net/java/android/net/VpnTransportInfoTest.java +++ b/tests/net/java/android/net/VpnTransportInfoTest.java @@ -63,6 +63,6 @@ public class VpnTransportInfoTest { assertEquals(v31, v32); assertEquals(v11.hashCode(), v13.hashCode()); assertEquals(REDACT_FOR_NETWORK_SETTINGS, v32.getApplicableRedactions()); - assertEquals(session1, v15.makeCopy(REDACT_NONE).sessionId); + assertEquals(session1, v15.makeCopy(REDACT_NONE).getSessionId()); } } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 9c797e403bad..557f0d2f3c8d 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1400,7 +1400,7 @@ public class ConnectivityServiceTest { final TransportInfo ti = nc.getTransportInfo(); assertTrue("VPN TransportInfo is not a VpnTransportInfo: " + ti, ti instanceof VpnTransportInfo); - assertEquals(type, ((VpnTransportInfo) ti).type); + assertEquals(type, ((VpnTransportInfo) ti).getType()); } @@ -1637,25 +1637,26 @@ public class ConnectivityServiceTest { }).when(deps).makeMultinetworkPolicyTracker(any(), any(), any()); doReturn(true).when(deps).getCellular464XlatEnabled(); - doReturn(60000).when(mResources).getInteger( - com.android.connectivity.resources.R.integer.config_networkTransitionTimeout); - doReturn("").when(mResources).getString( - com.android.connectivity.resources.R.string.config_networkCaptivePortalServerUrl); + doReturn(60000).when(mResources).getInteger(R.integer.config_networkTransitionTimeout); + doReturn("").when(mResources).getString(R.string.config_networkCaptivePortalServerUrl); doReturn(new String[]{ WIFI_WOL_IFNAME }).when(mResources).getStringArray( - com.android.connectivity.resources.R.array.config_wakeonlan_supported_interfaces); + R.array.config_wakeonlan_supported_interfaces); doReturn(new String[] { "0,1", "1,3" }).when(mResources).getStringArray( - com.android.connectivity.resources.R.array.config_networkSupportedKeepaliveCount); - doReturn(com.android.connectivity.resources.R.array.config_networkSupportedKeepaliveCount) - .when(mResources).getIdentifier(eq("config_networkSupportedKeepaliveCount"), - eq("array"), any()); - doReturn(com.android.connectivity.resources.R.array.network_switch_type_name) - .when(mResources).getIdentifier(eq("network_switch_type_name"), - eq("array"), any()); - + R.array.config_networkSupportedKeepaliveCount); + doReturn(new String[0]).when(mResources).getStringArray( + R.array.config_networkNotifySwitches); + doReturn(new int[]{10, 11, 12, 14, 15}).when(mResources).getIntArray( + R.array.config_protectedNetworks); // We don't test the actual notification value strings, so just return an empty array. // It doesn't matter what the values are as long as it's not null. doReturn(new String[0]).when(mResources).getStringArray(R.array.network_switch_type_name); + doReturn(R.array.config_networkSupportedKeepaliveCount).when(mResources) + .getIdentifier(eq("config_networkSupportedKeepaliveCount"), eq("array"), any()); + doReturn(R.array.network_switch_type_name).when(mResources) + .getIdentifier(eq("network_switch_type_name"), eq("array"), any()); + + final ConnectivityResources connRes = mock(ConnectivityResources.class); doReturn(mResources).when(connRes).get(); doReturn(connRes).when(deps).getResources(any()); @@ -2927,7 +2928,7 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); // Set teardown delay and make sure CS has processed it. - mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMs(300); + mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMillis(300); waitForIdle(); // Post the duringTeardown lambda to the handler so it fires while teardown is in progress. @@ -4215,7 +4216,7 @@ public class ConnectivityServiceTest { () -> mCm.registerSystemDefaultNetworkCallback(callback, handler)); callback.assertNoCallback(); assertThrows(SecurityException.class, - () -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler)); + () -> mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler)); callback.assertNoCallback(); mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); @@ -4223,7 +4224,7 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); - mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler); + mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler); callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); } @@ -5599,7 +5600,7 @@ public class ConnectivityServiceTest { 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); + mCm.registerDefaultNetworkCallbackForUid(1000000 + i, cb, handler); } else { mCm.registerNetworkCallback(networkRequest, cb); } @@ -5608,7 +5609,7 @@ public class ConnectivityServiceTest { waitForIdle(); assertThrows(TooManyRequestsException.class, () -> - mCm.registerDefaultNetworkCallbackAsUid(1001042, new NetworkCallback(), + mCm.registerDefaultNetworkCallbackForUid(1001042, new NetworkCallback(), handler)); assertThrows(TooManyRequestsException.class, () -> mCm.registerNetworkCallback(networkRequest, new NetworkCallback())); @@ -5661,7 +5662,7 @@ public class ConnectivityServiceTest { withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> { for (int i = 0; i < MAX_REQUESTS; i++) { NetworkCallback networkCallback = new NetworkCallback(); - mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, networkCallback, + mCm.registerDefaultNetworkCallbackForUid(1000000 + i, networkCallback, new Handler(ConnectivityThread.getInstanceLooper())); mCm.unregisterNetworkCallback(networkCallback); } @@ -7746,7 +7747,7 @@ public class ConnectivityServiceTest { registerDefaultNetworkCallbackAsUid(vpnUidDefaultCallback, VPN_UID); final TestNetworkCallback vpnDefaultCallbackAsUid = new TestNetworkCallback(); - mCm.registerDefaultNetworkCallbackAsUid(VPN_UID, vpnDefaultCallbackAsUid, + mCm.registerDefaultNetworkCallbackForUid(VPN_UID, vpnDefaultCallbackAsUid, new Handler(ConnectivityThread.getInstanceLooper())); final int uid = Process.myUid(); @@ -10322,7 +10323,7 @@ public class ConnectivityServiceTest { assertTrue(mRequests.get(0).hasCapability(NET_CAPABILITY_VALIDATED)); assertTrue(mRequests.get(1).isRequest()); assertTrue(mRequests.get(1).hasCapability(NET_CAPABILITY_OEM_PAID)); - assertTrue(mRequests.get(2).isRequest()); + assertEquals(NetworkRequest.Type.TRACK_DEFAULT, mRequests.get(2).type); assertTrue(mService.getDefaultRequest().networkCapabilities.equalsNetCapabilities( mRequests.get(2).networkCapabilities)); } @@ -10834,7 +10835,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Setup the test process to use networkPref for their default network. @@ -10882,7 +10883,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. @@ -10924,7 +10925,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Setup a process different than the test process to use the default network. This means diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java index 9ab60a41a397..116d755e30a4 100644 --- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java @@ -32,6 +32,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.res.Resources; import android.net.ConnectivityManager; +import android.net.ConnectivityResources; import android.net.IDnsResolver; import android.net.INetd; import android.net.LinkProperties; @@ -47,10 +48,11 @@ import android.text.format.DateUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.R; +import com.android.connectivity.resources.R; import com.android.server.ConnectivityService; import com.android.server.connectivity.NetworkNotificationManager.NotificationType; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -84,10 +86,16 @@ public class LingerMonitorTest { MockitoAnnotations.initMocks(this); when(mCtx.getResources()).thenReturn(mResources); when(mCtx.getPackageName()).thenReturn("com.android.server.connectivity"); + ConnectivityResources.setResourcesContextForTest(mCtx); mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, HIGH_RATE_LIMIT); } + @After + public void tearDown() { + ConnectivityResources.setResourcesContextForTest(null); + } + @Test public void testTransitions() { setNotificationSwitch(transition(WIFI, CELLULAR)); diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index 6ad4900989f5..b725b826b14f 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -1023,7 +1023,7 @@ public class VpnTest { assertNotNull(nc); VpnTransportInfo ti = (VpnTransportInfo) nc.getTransportInfo(); assertNotNull(ti); - assertEquals(type, ti.type); + assertEquals(type, ti.getType()); } public void startRacoon(final String serverAddr, final String expectedAddr) |