Merge "libhwui: handle eglSwapBuffers with EGL_BAD_NATIVE_WINDOW error case"
diff --git a/api/current.txt b/api/current.txt
index 6969210..4201b6b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6987,6 +6987,15 @@
field public static final int TYPE_SCO = 2; // 0x2
}
+ public class OobData implements android.os.Parcelable {
+ ctor public OobData();
+ method public int describeContents();
+ method public byte[] getSecurityManagerTk();
+ method public void setSecurityManagerTk(byte[]);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.bluetooth.OobData> CREATOR;
+ }
+
}
package android.bluetooth.le {
@@ -48189,13 +48198,16 @@
method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
method public A getAnnotation(java.lang.Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
method public java.lang.String getCanonicalName();
method public java.lang.ClassLoader getClassLoader();
method public java.lang.Class<?>[] getClasses();
method public java.lang.Class<?> getComponentType();
method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
+ method public T getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public java.lang.Class<?>[] getDeclaredClasses();
method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
@@ -48726,7 +48738,10 @@
public class Package implements java.lang.reflect.AnnotatedElement {
method public A getAnnotation(java.lang.Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
+ method public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public java.lang.String getImplementationTitle();
method public java.lang.String getImplementationVendor();
method public java.lang.String getImplementationVersion();
@@ -49420,7 +49435,10 @@
ctor protected AccessibleObject();
method public T getAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
+ method public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public boolean isAccessible();
method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
@@ -49430,7 +49448,10 @@
public abstract interface AnnotatedElement {
method public abstract T getAnnotation(java.lang.Class<T>);
method public abstract java.lang.annotation.Annotation[] getAnnotations();
+ method public abstract T[] getAnnotationsByType(java.lang.Class<T>);
+ method public abstract java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public abstract T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public abstract boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
}
@@ -50545,7 +50566,6 @@
method public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
method public java.lang.String toExternalForm();
method public java.net.URI toURI() throws java.net.URISyntaxException;
- method public java.net.URI toURILenient() throws java.net.URISyntaxException;
}
public class URLClassLoader extends java.security.SecureClassLoader implements java.io.Closeable {
diff --git a/api/system-current.txt b/api/system-current.txt
index bf6d1a2..06e1ab8 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -7208,6 +7208,15 @@
field public static final int TYPE_SCO = 2; // 0x2
}
+ public class OobData implements android.os.Parcelable {
+ ctor public OobData();
+ method public int describeContents();
+ method public byte[] getSecurityManagerTk();
+ method public void setSecurityManagerTk(byte[]);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.bluetooth.OobData> CREATOR;
+ }
+
}
package android.bluetooth.le {
@@ -50807,13 +50816,16 @@
method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
method public A getAnnotation(java.lang.Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
method public java.lang.String getCanonicalName();
method public java.lang.ClassLoader getClassLoader();
method public java.lang.Class<?>[] getClasses();
method public java.lang.Class<?> getComponentType();
method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
+ method public T getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public java.lang.Class<?>[] getDeclaredClasses();
method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
@@ -51344,7 +51356,10 @@
public class Package implements java.lang.reflect.AnnotatedElement {
method public A getAnnotation(java.lang.Class<A>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
+ method public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public java.lang.String getImplementationTitle();
method public java.lang.String getImplementationVendor();
method public java.lang.String getImplementationVersion();
@@ -52038,7 +52053,10 @@
ctor protected AccessibleObject();
method public T getAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getAnnotations();
+ method public T[] getAnnotationsByType(java.lang.Class<T>);
+ method public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public boolean isAccessible();
method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
@@ -52048,7 +52066,10 @@
public abstract interface AnnotatedElement {
method public abstract T getAnnotation(java.lang.Class<T>);
method public abstract java.lang.annotation.Annotation[] getAnnotations();
+ method public abstract T[] getAnnotationsByType(java.lang.Class<T>);
+ method public abstract java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method public abstract T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
method public abstract boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
}
@@ -53163,7 +53184,6 @@
method public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
method public java.lang.String toExternalForm();
method public java.net.URI toURI() throws java.net.URISyntaxException;
- method public java.net.URI toURILenient() throws java.net.URISyntaxException;
}
public class URLClassLoader extends java.security.SecureClassLoader implements java.io.Closeable {
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index d27dfa0..9faba1a 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -872,18 +872,16 @@
*
* <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}.
*
- * @param hash - Simple Secure pairing hash
- * @param randomizer - The random key obtained using OOB
+ * @param transport - Transport to use
+ * @param oobData - Out Of Band data
* @return false on immediate error, true if bonding will begin
*
* @hide
*/
- public boolean createBondOutOfBand(byte[] hash, byte[] randomizer) {
- //TODO(BT)
- /*
+ public boolean createBondOutOfBand(int transport, OobData oobData) {
try {
- return sService.createBondOutOfBand(this, hash, randomizer);
- } catch (RemoteException e) {Log.e(TAG, "", e);}*/
+ return sService.createBondOutOfBand(this, transport, oobData);
+ } catch (RemoteException e) {Log.e(TAG, "", e);}
return false;
}
diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl
index 2358116..9cd7d05 100644
--- a/core/java/android/bluetooth/IBluetooth.aidl
+++ b/core/java/android/bluetooth/IBluetooth.aidl
@@ -20,6 +20,7 @@
import android.bluetooth.IBluetoothStateChangeCallback;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.OobData;
import android.os.ParcelUuid;
import android.os.ParcelFileDescriptor;
@@ -56,6 +57,7 @@
BluetoothDevice[] getBondedDevices();
boolean createBond(in BluetoothDevice device, in int transport);
+ boolean createBondOutOfBand(in BluetoothDevice device, in int transport, in OobData oobData);
boolean cancelBondProcess(in BluetoothDevice device);
boolean removeBond(in BluetoothDevice device);
int getBondState(in BluetoothDevice device);
diff --git a/core/java/android/bluetooth/OobData.aidl b/core/java/android/bluetooth/OobData.aidl
new file mode 100644
index 0000000..d831c64
--- /dev/null
+++ b/core/java/android/bluetooth/OobData.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+parcelable OobData;
diff --git a/core/java/android/bluetooth/OobData.java b/core/java/android/bluetooth/OobData.java
new file mode 100644
index 0000000..01f72ef
--- /dev/null
+++ b/core/java/android/bluetooth/OobData.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import android.util.Log;
+
+/**
+ * Out Of Band Data for Bluetooth device.
+ */
+public class OobData implements Parcelable {
+ private byte[] securityManagerTk;
+
+ public byte[] getSecurityManagerTk() {
+ return securityManagerTk;
+ }
+
+ public void setSecurityManagerTk(byte[] securityManagerTk) {
+ this.securityManagerTk = securityManagerTk;
+ }
+
+ public OobData() { }
+
+ private OobData(Parcel in) {
+ securityManagerTk = in.createByteArray();
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeByteArray(securityManagerTk);
+ }
+
+ public static final Parcelable.Creator<OobData> CREATOR
+ = new Parcelable.Creator<OobData>() {
+ public OobData createFromParcel(Parcel in) {
+ return new OobData(in);
+ }
+
+ public OobData[] newArray(int size) {
+ return new OobData[size];
+ }
+ };
+}
\ No newline at end of file
diff --git a/core/java/android/nfc/tech/NfcF.java b/core/java/android/nfc/tech/NfcF.java
index b3e3ab6..4487121 100644
--- a/core/java/android/nfc/tech/NfcF.java
+++ b/core/java/android/nfc/tech/NfcF.java
@@ -98,8 +98,13 @@
/**
* Send raw NFC-F commands to the tag and receive the response.
*
- * <p>Applications must not append the SoD (length) or EoD (CRC) to the payload,
- * it will be automatically calculated.
+ * <p>Applications must not prefix the SoD (preamble and sync code)
+ * and/or append the EoD (CRC) to the payload, it will be automatically calculated.
+ *
+ * <p>A typical NFC-F frame for this method looks like:
+ * <pre>
+ * LENGTH (1 byte) --- CMD (1 byte) -- IDm (8 bytes) -- PARAMS (LENGTH - 10 bytes)
+ * </pre>
*
* <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum amount of bytes
* that can be sent with {@link #transceive}.
diff --git a/keystore/java/android/security/keystore/KeyInfo.java b/keystore/java/android/security/keystore/KeyInfo.java
index 7cf4b04..d726880 100644
--- a/keystore/java/android/security/keystore/KeyInfo.java
+++ b/keystore/java/android/security/keystore/KeyInfo.java
@@ -269,7 +269,7 @@
/**
* Returns {@code true} if the requirement that this key can only be used if the user has been
- * authenticated if enforced by secure hardware (e.g., Trusted Execution Environment (TEE) or
+ * authenticated is enforced by secure hardware (e.g., Trusted Execution Environment (TEE) or
* Secure Element (SE)).
*
* @see #isUserAuthenticationRequired()
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index a057ac9..4525231 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -1325,6 +1325,7 @@
// Whoops, there is an upcoming alarm. We don't actually want to go idle.
if (mState != STATE_ACTIVE) {
becomeActiveLocked("alarm", Process.myUid());
+ becomeInactiveIfAppropriateLocked();
}
return;
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 152ff30..0f957db 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3737,8 +3737,29 @@
int index;
if (mIsMuted) {
index = 0;
- } else if (((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && mAvrcpAbsVolSupported)
- || ((device & mFullVolumeDevices) != 0)) {
+ } else if ((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && mAvrcpAbsVolSupported) {
+ /* Special handling for Bluetooth Absolute Volume scenario
+ * If we send full audio gain, some accessories are too loud even at its lowest
+ * volume. We are not able to enumerate all such accessories, so here is the
+ * workaround from phone side.
+ * For the lowest volume steps 1 and 2, restrict audio gain to 50% and 75%.
+ * For volume step 0, set audio gain to 0 as some accessories won't mute on their end.
+ */
+ int i = (getIndex(device) + 5)/10;
+ if (i == 0) {
+ // 0% for volume 0
+ index = 0;
+ } else if (i == 1) {
+ // 50% for volume 1
+ index = (int)(mIndexMax * 0.5) /10;
+ } else if (i == 2) {
+ // 75% for volume 2
+ index = (int)(mIndexMax * 0.75) /10;
+ } else {
+ // otherwise, full gain
+ index = (mIndexMax + 5)/10;
+ }
+ } else if ((device & mFullVolumeDevices) != 0) {
index = (mIndexMax + 5)/10;
} else {
index = (getIndex(device) + 5)/10;
diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp
index 5cbb277..246ab0d 100644
--- a/services/core/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/core/jni/com_android_server_AlarmManagerService.cpp
@@ -40,6 +40,8 @@
#include <linux/android_alarm.h>
#include <linux/rtc.h>
+#include <memory>
+
namespace android {
static const size_t N_ANDROID_TIMERFDS = ANDROID_ALARM_TYPE_COUNT + 1;
@@ -323,14 +325,14 @@
static int wall_clock_rtc()
{
- DIR *dir = opendir(rtc_sysfs);
- if (!dir) {
+ std::unique_ptr<DIR, int(*)(DIR*)> dir(opendir(rtc_sysfs), closedir);
+ if (!dir.get()) {
ALOGE("failed to open %s: %s", rtc_sysfs, strerror(errno));
return -1;
}
struct dirent *dirent;
- while (errno = 0, dirent = readdir(dir)) {
+ while (errno = 0, dirent = readdir(dir.get())) {
unsigned int rtc_id;
int matched = sscanf(dirent->d_name, "rtc%u", &rtc_id);