Merge "Update signature files to the new format"
diff --git a/core/java/android/bluetooth/BluetoothCodecConfig.java b/core/java/android/bluetooth/BluetoothCodecConfig.java
index 79c0a3a..c9d0ef2 100644
--- a/core/java/android/bluetooth/BluetoothCodecConfig.java
+++ b/core/java/android/bluetooth/BluetoothCodecConfig.java
@@ -114,6 +114,19 @@
mCodecSpecific4 = codecSpecific4;
}
+ @UnsupportedAppUsage
+ public BluetoothCodecConfig(int codecType) {
+ mCodecType = codecType;
+ mCodecPriority = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT;
+ mSampleRate = BluetoothCodecConfig.SAMPLE_RATE_NONE;
+ mBitsPerSample = BluetoothCodecConfig.BITS_PER_SAMPLE_NONE;
+ mChannelMode = BluetoothCodecConfig.CHANNEL_MODE_NONE;
+ mCodecSpecific1 = 0;
+ mCodecSpecific2 = 0;
+ mCodecSpecific3 = 0;
+ mCodecSpecific4 = 0;
+ }
+
@Override
public boolean equals(Object o) {
if (o instanceof BluetoothCodecConfig) {
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 3a77a6a..6d22277 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -18,7 +18,6 @@
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
-import android.apex.ApexInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -578,15 +577,6 @@
}
}
- /**
- * @hide
- */
- public PackageInfo(ApexInfo apexInfo) {
- packageName = apexInfo.packageName;
- setLongVersionCode(apexInfo.versionCode);
- isApex = true;
- }
-
private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
if (components != null) {
for (ComponentInfo ci : components) {
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 5e15b00..a185c8a 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -8490,4 +8490,42 @@
this.error = error;
}
}
+
+ public static PackageInfo generatePackageInfoFromApex(File apexFile, boolean collectCerts)
+ throws PackageParserException {
+ PackageInfo pi = new PackageInfo();
+ // TODO(b/123052859): We should avoid these repeated calls to parseApkLite each time
+ // we want to generate information for APEX modules.
+ PackageParser.ApkLite apk = PackageParser.parseApkLite(apexFile,
+ collectCerts ? PackageParser.PARSE_COLLECT_CERTIFICATES : 0);
+
+ pi.packageName = apk.packageName;
+ pi.setLongVersionCode(apk.getLongVersionCode());
+
+ if (collectCerts) {
+ if (apk.signingDetails.hasPastSigningCertificates()) {
+ // Package has included signing certificate rotation information. Return
+ // the oldest cert so that programmatic checks keep working even if unaware
+ // of key rotation.
+ pi.signatures = new Signature[1];
+ pi.signatures[0] = apk.signingDetails.pastSigningCertificates[0];
+ } else if (apk.signingDetails.hasSignatures()) {
+ // otherwise keep old behavior
+ int numberOfSigs = apk.signingDetails.signatures.length;
+ pi.signatures = new Signature[numberOfSigs];
+ System.arraycopy(apk.signingDetails.signatures, 0, pi.signatures, 0,
+ numberOfSigs);
+ }
+
+ if (apk.signingDetails != SigningDetails.UNKNOWN) {
+ // only return a valid SigningInfo if there is signing information to report
+ pi.signingInfo = new SigningInfo(apk.signingDetails);
+ } else {
+ pi.signingInfo = null;
+ }
+ }
+
+ pi.isApex = true;
+ return pi;
+ }
}
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index cdbc979..554e42e 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -2947,7 +2947,9 @@
for (VolumeInfo vi : sm.getVolumes()) {
if (Objects.equals(vi.getFsUuid(), volumeName)) {
final File path = vi.getPathForUser(UserHandle.myUserId());
- if (path == null) {
+ if (path != null) {
+ return path;
+ } else {
throw new FileNotFoundException("Failed to find path for " + vi);
}
}
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 860de75..9e32206 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -2006,7 +2006,7 @@
std::vector<media::MicrophoneInfo> microphones;
status_t status = AudioSystem::getMicrophones(µphones);
if (status != NO_ERROR) {
- ALOGE_IF(status != NO_ERROR, "AudioSystem::getMicrophones error %d", status);
+ ALOGE("AudioSystem::getMicrophones error %d", status);
jStatus = nativeToJavaStatus(status);
return jStatus;
}
@@ -2028,6 +2028,36 @@
}
static jint
+android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP(
+ JNIEnv *env, jobject thiz, jobject jEncodingFormatList)
+{
+ ALOGV("%s", __FUNCTION__);
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ if (!env->IsInstanceOf(jEncodingFormatList, gArrayListClass)) {
+ ALOGE("%s: jEncodingFormatList not an ArrayList", __FUNCTION__);
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+ std::vector<audio_format_t> encodingFormats;
+ //FIXME: enable when native implementaiton is merged
+ //status_t status = AudioSystem::getHwOffloadEncodingFormatsSupportedForA2DP(
+ // &encodingFormats);
+ status_t status = NO_ERROR;
+ if (status != NO_ERROR) {
+ ALOGE("%s: error %d", __FUNCTION__, status);
+ jStatus = nativeToJavaStatus(status);
+ return jStatus;
+ }
+
+ for (size_t i = 0; i < encodingFormats.size(); i++) {
+ ScopedLocalRef<jobject> jEncodingFormat(
+ env, env->NewObject(gIntegerClass, gIntegerCstor, encodingFormats[i]));
+ env->CallBooleanMethod(jEncodingFormatList, gArrayListMethods.add,
+ jEncodingFormat.get());
+ }
+ return jStatus;
+}
+
+static jint
android_media_AudioSystem_getSurroundFormats(JNIEnv *env, jobject thiz,
jobject jSurroundFormats, jboolean reported)
{
@@ -2199,6 +2229,8 @@
{"setAssistantUid", "(I)I", (void *)android_media_AudioSystem_setAssistantUid},
{"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids},
{"isHapticPlaybackSupported", "()Z", (void *)android_media_AudioSystem_isHapticPlaybackSupported},
+ {"getHwOffloadEncodingFormatsSupportedForA2DP", "(Ljava/util/ArrayList;)I",
+ (void*)android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP},
};
static const JNINativeMethod gEventHandlerMethods[] = {
diff --git a/core/tests/coretests/res/raw/com_android_tzdata.apex b/core/tests/coretests/res/raw/com_android_tzdata.apex
new file mode 100644
index 0000000..72294de
--- /dev/null
+++ b/core/tests/coretests/res/raw/com_android_tzdata.apex
Binary files differ
diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
index be1b1ce..c5454a6 100644
--- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
@@ -330,6 +330,28 @@
}
/**
+ * Copies a specified {@code resourceId} to a file. Returns a non-null file if the copy
+ * succeeded, or {@code null} otherwise.
+ */
+ File copyRawResourceToFile(String baseName, int resourceId) throws Exception {
+ // Copy the resource to a file.
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ InputStream is = context.getResources().openRawResource(resourceId);
+ File outFile = null;
+ try {
+ outFile = new File(context.getFilesDir(), baseName);
+ assertTrue(FileUtils.copyToFile(is, outFile));
+ return outFile;
+ } catch (Exception e) {
+ if (outFile != null) {
+ outFile.delete();
+ }
+
+ return null;
+ }
+ }
+
+ /**
* Attempts to parse a package.
*
* APKs are put into coretests/apks/packageparser_*.
@@ -340,14 +362,14 @@
Package parsePackage(String apkFileName, int apkResourceId,
Function<Package, Package> converter) throws Exception {
// Copy the resource to a file.
- Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
- File outFile = new File(context.getFilesDir(), apkFileName);
+ File outFile = null;
try {
- InputStream is = context.getResources().openRawResource(apkResourceId);
- assertTrue(FileUtils.copyToFile(is, outFile));
+ outFile = copyRawResourceToFile(apkFileName, apkResourceId);
return converter.apply(new PackageParser().parsePackage(outFile, 0 /* flags */));
} finally {
- outFile.delete();
+ if (outFile != null) {
+ outFile.delete();
+ }
}
}
@@ -498,4 +520,20 @@
"android.permission.READ_CONTACTS"),
secondChild.requestedPermissions);
}
+
+ @Test
+ public void testApexPackageInfoGeneration() throws Exception {
+ File apexFile = copyRawResourceToFile("com.android.tzdata.apex",
+ R.raw.com_android_tzdata);
+ PackageInfo pi = PackageParser.generatePackageInfoFromApex(apexFile, false);
+ assertEquals("com.google.android.tzdata", pi.packageName);
+ assertEquals(1, pi.getLongVersionCode());
+ assertNull(pi.signingInfo);
+
+ pi = PackageParser.generatePackageInfoFromApex(apexFile, true);
+ assertEquals("com.google.android.tzdata", pi.packageName);
+ assertEquals(1, pi.getLongVersionCode());
+ assertNotNull(pi.signingInfo);
+ assertTrue(pi.signingInfo.getApkContentsSigners().length > 0);
+ }
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 89a2696..b7f042b 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -28,6 +28,7 @@
import android.annotation.UnsupportedAppUsage;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothCodecConfig;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
@@ -4946,6 +4947,34 @@
return microphones;
}
+ /**
+ * Returns a list of audio formats that corresponds to encoding formats
+ * supported on offload path for A2DP playback.
+ *
+ * @return a list of {@link BluetoothCodecConfig} objects containing encoding formats
+ * supported for offload A2DP playback
+ * @hide
+ */
+ public List<BluetoothCodecConfig> getHwOffloadEncodingFormatsSupportedForA2DP() {
+ ArrayList<Integer> formatsList = new ArrayList<Integer>();
+ ArrayList<BluetoothCodecConfig> codecConfigList = new ArrayList<BluetoothCodecConfig>();
+
+ int status = AudioSystem.getHwOffloadEncodingFormatsSupportedForA2DP(formatsList);
+ if (status != AudioManager.SUCCESS) {
+ Log.e(TAG, "getHwOffloadEncodingFormatsSupportedForA2DP failed:" + status);
+ return codecConfigList;
+ }
+
+ for (Integer format : formatsList) {
+ int btSourceCodec = AudioSystem.audioFormatToBluetoothSourceCodec(format);
+ if (btSourceCodec
+ != BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID) {
+ codecConfigList.add(new BluetoothCodecConfig(btSourceCodec));
+ }
+ }
+ return codecConfigList;
+ }
+
// Since we need to calculate the changes since THE LAST NOTIFICATION, and not since the
// (unpredictable) last time updateAudioPortCache() was called by someone, keep a list
// of the ports that exist at the time of the last notification.
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 774023f..2848b89 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
+import android.bluetooth.BluetoothCodecConfig;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
@@ -149,21 +150,20 @@
public static final int AUDIO_FORMAT_APTX_HD = 0x21000000;
public static final int AUDIO_FORMAT_LDAC = 0x23000000;
- /** converts audio format enum to string */
- public static String audioFormatToString(int audioFormat) {
+ /**
+ * Convert audio format enum values to Bluetooth codec values
+ */
+ public static int audioFormatToBluetoothSourceCodec(int audioFormat) {
switch (audioFormat) {
- case AUDIO_FORMAT_INVALID: return "AUDIO_FORMAT_INVALID";
- case AUDIO_FORMAT_DEFAULT: return "AUDIO_FORMAT_DEFAULT";
- case AUDIO_FORMAT_AAC: return "AUDIO_FORMAT_AAC";
- case AUDIO_FORMAT_SBC: return "AUDIO_FORMAT_SBC";
- case AUDIO_FORMAT_APTX: return "AUDIO_FORMAT_APTX";
- case AUDIO_FORMAT_APTX_HD: return "AUDIO_FORMAT_APTX_HD";
- case AUDIO_FORMAT_LDAC: return "AUDIO_FORMAT_LDAC";
- default: return "unknown audio format (" + audioFormat + ")";
+ case AUDIO_FORMAT_AAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC;
+ case AUDIO_FORMAT_SBC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC;
+ case AUDIO_FORMAT_APTX: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX;
+ case AUDIO_FORMAT_APTX_HD: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD;
+ case AUDIO_FORMAT_LDAC: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
+ default: return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID;
}
}
-
/* Routing bits for the former setRouting/getRouting API */
/** @deprecated */
@Deprecated public static final int ROUTE_EARPIECE = (1 << 0);
@@ -981,6 +981,12 @@
public static native int getSurroundFormats(Map<Integer, Boolean> surroundFormats,
boolean reported);
+ /**
+ * Returns a list of audio formats (codec) supported on the A2DP offload path.
+ */
+ public static native int getHwOffloadEncodingFormatsSupportedForA2DP(
+ ArrayList<Integer> formatList);
+
public static native int setSurroundFormatEnabled(int audioFormat, boolean enabled);
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 55e12cd..09fe26d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -7892,8 +7892,13 @@
if (apex != null) {
try {
final ApexInfo[] activePkgs = apex.getActivePackages();
- for (ApexInfo apexInfo : activePkgs) {
- list.add(new PackageInfo(apexInfo));
+ for (ApexInfo ai : activePkgs) {
+ try {
+ list.add(PackageParser.generatePackageInfoFromApex(
+ new File(ai.packagePath), true /* collect certs */));
+ } catch (PackageParserException pe) {
+ throw new IllegalStateException("Unable to parse: " + ai, pe);
+ }
}
} catch (RemoteException e) {
Log.e(TAG, "Unable to retrieve packages from apexservice: " + e.toString());
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index ceaf69d..d5af313 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -535,7 +535,7 @@
}
// Cell Broadcast Receiver
- grantPermissionsToSystemPackage(
+ grantSystemFixedPermissionsToSystemPackage(
getDefaultSystemHandlerActivityPackage(Intents.SMS_CB_RECEIVED_ACTION, userId),
userId, SMS_PERMISSIONS);