Merge "Safely handle the case of BroadcastOptions being null."
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index 7378ac7..6dc80cf 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -32,7 +32,6 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.IntentFilter;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.nfc.tech.MifareClassic;
@@ -572,66 +571,6 @@
}
/**
- * Helper to check if this device has FEATURE_NFC_BEAM, but without using
- * a context.
- * Equivalent to
- * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)
- */
- private static boolean hasBeamFeature() {
- IPackageManager pm = ActivityThread.getPackageManager();
- if (pm == null) {
- Log.e(TAG, "Cannot get package manager, assuming no Android Beam feature");
- return false;
- }
- try {
- return pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM, 0);
- } catch (RemoteException e) {
- Log.e(TAG, "Package manager query failed, assuming no Android Beam feature", e);
- return false;
- }
- }
-
- /**
- * Helper to check if this device has FEATURE_NFC, but without using
- * a context.
- * Equivalent to
- * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)
- */
- private static boolean hasNfcFeature() {
- IPackageManager pm = ActivityThread.getPackageManager();
- if (pm == null) {
- Log.e(TAG, "Cannot get package manager, assuming no NFC feature");
- return false;
- }
- try {
- return pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0);
- } catch (RemoteException e) {
- Log.e(TAG, "Package manager query failed, assuming no NFC feature", e);
- return false;
- }
- }
-
- /**
- * Helper to check if this device is NFC HCE capable, by checking for
- * FEATURE_NFC_HOST_CARD_EMULATION and/or FEATURE_NFC_HOST_CARD_EMULATION_NFCF,
- * but without using a context.
- */
- private static boolean hasNfcHceFeature() {
- IPackageManager pm = ActivityThread.getPackageManager();
- if (pm == null) {
- Log.e(TAG, "Cannot get package manager, assuming no NFC feature");
- return false;
- }
- try {
- return pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)
- || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0);
- } catch (RemoteException e) {
- Log.e(TAG, "Package manager query failed, assuming no NFC feature", e);
- return false;
- }
- }
-
- /**
* Return list of Secure Elements which support off host card emulation.
*
* @return List<String> containing secure elements on the device which supports
@@ -640,23 +579,21 @@
* @hide
*/
public @NonNull List<String> getSupportedOffHostSecureElements() {
+ if (mContext == null) {
+ throw new UnsupportedOperationException("You need a context on NfcAdapter to use the "
+ + " getSupportedOffHostSecureElements APIs");
+ }
List<String> offHostSE = new ArrayList<String>();
- IPackageManager pm = ActivityThread.getPackageManager();
+ PackageManager pm = mContext.getPackageManager();
if (pm == null) {
Log.e(TAG, "Cannot get package manager, assuming no off-host CE feature");
return offHostSE;
}
- try {
- if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC, 0)) {
- offHostSE.add("SIM");
- }
- if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE, 0)) {
- offHostSE.add("eSE");
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Package manager query failed, assuming no off-host CE feature", e);
- offHostSE.clear();
- return offHostSE;
+ if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC)) {
+ offHostSE.add("SIM");
+ }
+ if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE)) {
+ offHostSE.add("eSE");
}
return offHostSE;
}
@@ -668,10 +605,20 @@
*/
@UnsupportedAppUsage
public static synchronized NfcAdapter getNfcAdapter(Context context) {
+ if (context == null) {
+ if (sNullContextNfcAdapter == null) {
+ sNullContextNfcAdapter = new NfcAdapter(null);
+ }
+ return sNullContextNfcAdapter;
+ }
if (!sIsInitialized) {
- sHasNfcFeature = hasNfcFeature();
- sHasBeamFeature = hasBeamFeature();
- boolean hasHceFeature = hasNfcHceFeature();
+ PackageManager pm;
+ pm = context.getPackageManager();
+ sHasNfcFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC);
+ sHasBeamFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM);
+ boolean hasHceFeature =
+ pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
+ || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF);
/* is this device meant to have NFC */
if (!sHasNfcFeature && !hasHceFeature) {
Log.v(TAG, "this device does not have NFC support");
@@ -707,12 +654,6 @@
sIsInitialized = true;
}
- if (context == null) {
- if (sNullContextNfcAdapter == null) {
- sNullContextNfcAdapter = new NfcAdapter(null);
- }
- return sNullContextNfcAdapter;
- }
NfcAdapter adapter = sNfcAdapters.get(context);
if (adapter == null) {
adapter = new NfcAdapter(context);
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
index 0b56d19..6a42091 100644
--- a/core/java/android/nfc/cardemulation/CardEmulation.java
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -22,11 +22,9 @@
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.Activity;
-import android.app.ActivityThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.nfc.INfcCardEmulation;
import android.nfc.NfcAdapter;
@@ -158,18 +156,13 @@
throw new UnsupportedOperationException();
}
if (!sIsInitialized) {
- IPackageManager pm = ActivityThread.getPackageManager();
+ PackageManager pm = context.getPackageManager();
if (pm == null) {
Log.e(TAG, "Cannot get PackageManager");
throw new UnsupportedOperationException();
}
- try {
- if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)) {
- Log.e(TAG, "This device does not support card emulation");
- throw new UnsupportedOperationException();
- }
- } catch (RemoteException e) {
- Log.e(TAG, "PackageManager query failed.");
+ if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+ Log.e(TAG, "This device does not support card emulation");
throw new UnsupportedOperationException();
}
sIsInitialized = true;
diff --git a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java
index 3c92455..48bbf5b6 100644
--- a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java
+++ b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java
@@ -17,10 +17,8 @@
package android.nfc.cardemulation;
import android.app.Activity;
-import android.app.ActivityThread;
import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.nfc.INfcFCardEmulation;
import android.nfc.NfcAdapter;
@@ -70,18 +68,13 @@
throw new UnsupportedOperationException();
}
if (!sIsInitialized) {
- IPackageManager pm = ActivityThread.getPackageManager();
+ PackageManager pm = context.getPackageManager();
if (pm == null) {
Log.e(TAG, "Cannot get PackageManager");
throw new UnsupportedOperationException();
}
- try {
- if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0)) {
- Log.e(TAG, "This device does not support NFC-F card emulation");
- throw new UnsupportedOperationException();
- }
- } catch (RemoteException e) {
- Log.e(TAG, "PackageManager query failed.");
+ if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF)) {
+ Log.e(TAG, "This device does not support NFC-F card emulation");
throw new UnsupportedOperationException();
}
sIsInitialized = true;
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index a708506..8682f9e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1248,7 +1248,7 @@
<!-- Default value for led color when battery is medium charged -->
<integer name="config_notificationsBatteryMediumARGB">0xFFFFFF00</integer>
- <!-- Default value for led color when battery is fully charged -->
+ <!-- Default value for led color when battery is fully or nearly fully charged -->
<integer name="config_notificationsBatteryFullARGB">0xFF00FF00</integer>
<!-- Default value for LED on time when the battery is low on charge in miliseconds -->
@@ -1263,6 +1263,9 @@
<!-- Default value for LED off time when the battery is low on charge in miliseconds -->
<integer name="config_notificationsBatteryLedOff">2875</integer>
+ <!-- Battery level percent that is treated as nearly full. -->
+ <integer name="config_notificationsBatteryNearlyFullLevel">90</integer>
+
<!-- If true, only colorized CallStyle notifications will apply custom colors -->
<bool name="config_callNotificationActionColorsRequireColorized">true</bool>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index b2bb6d5..ee6f1f8 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2043,6 +2043,7 @@
<java-symbol type="integer" name="config_notificationsBatteryLedOn" />
<java-symbol type="integer" name="config_notificationsBatteryLowARGB" />
<java-symbol type="integer" name="config_notificationsBatteryMediumARGB" />
+ <java-symbol type="integer" name="config_notificationsBatteryNearlyFullLevel" />
<java-symbol type="integer" name="config_notificationServiceArchiveSize" />
<java-symbol type="integer" name="config_previousVibrationsDumpLimit" />
<java-symbol type="integer" name="config_defaultVibrationAmplitude" />
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
index 4715045..c1f6c29 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -801,7 +801,8 @@
));
if (mSpec.isDevicePropertiesAttestationIncluded()) {
- final String platformReportedBrand = TextUtils.isEmpty(Build.BRAND_FOR_ATTESTATION)
+ final String platformReportedBrand =
+ isPropertyEmptyOrUnknown(Build.BRAND_FOR_ATTESTATION)
? Build.BRAND : Build.BRAND_FOR_ATTESTATION;
params.add(KeyStore2ParameterUtils.makeBytes(
KeymasterDefs.KM_TAG_ATTESTATION_ID_BRAND,
@@ -812,8 +813,8 @@
Build.DEVICE.getBytes(StandardCharsets.UTF_8)
));
final String platformReportedProduct =
- TextUtils.isEmpty(Build.PRODUCT_FOR_ATTESTATION) ? Build.PRODUCT :
- Build.PRODUCT_FOR_ATTESTATION;
+ isPropertyEmptyOrUnknown(Build.PRODUCT_FOR_ATTESTATION)
+ ? Build.PRODUCT : Build.PRODUCT_FOR_ATTESTATION;
params.add(KeyStore2ParameterUtils.makeBytes(
KeymasterDefs.KM_TAG_ATTESTATION_ID_PRODUCT,
platformReportedProduct.getBytes(StandardCharsets.UTF_8)
@@ -822,7 +823,8 @@
KeymasterDefs.KM_TAG_ATTESTATION_ID_MANUFACTURER,
Build.MANUFACTURER.getBytes(StandardCharsets.UTF_8)
));
- final String platformReportedModel = TextUtils.isEmpty(Build.MODEL_FOR_ATTESTATION)
+ final String platformReportedModel =
+ isPropertyEmptyOrUnknown(Build.MODEL_FOR_ATTESTATION)
? Build.MODEL : Build.MODEL_FOR_ATTESTATION;
params.add(KeyStore2ParameterUtils.makeBytes(
KeymasterDefs.KM_TAG_ATTESTATION_ID_MODEL,
@@ -1227,4 +1229,8 @@
result.retainAll(authorizedKeymasterKeyDigests);
return result;
}
+
+ private boolean isPropertyEmptyOrUnknown(String property) {
+ return TextUtils.isEmpty(property) || property.equals(Build.UNKNOWN);
+ }
}
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 015602e..0704da4f 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -41,6 +41,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Singleton;
@@ -360,14 +361,14 @@
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_CAS_EVENT) {
- mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2,
- toBytes((ArrayList<Byte>) msg.obj));
+ byte[] data = (msg.obj == null) ? new byte[0] : (byte[]) msg.obj;
+ mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, data);
} else if (msg.what == MSG_CAS_SESSION_EVENT) {
Bundle bundle = msg.getData();
byte[] sessionId = bundle.getByteArray(SESSION_KEY);
- mListener.onSessionEvent(MediaCas.this,
- createFromSessionId(sessionId), msg.arg1, msg.arg2,
- bundle.getByteArray(DATA_KEY));
+ byte[] data = bundle.getByteArray(DATA_KEY);
+ mListener.onSessionEvent(
+ MediaCas.this, createFromSessionId(sessionId), msg.arg1, msg.arg2, data);
} else if (msg.what == MSG_CAS_STATUS_EVENT) {
if ((msg.arg1 == PLUGIN_STATUS_SESSION_NUMBER_CHANGED)
&& (mTunerResourceManager != null)) {
@@ -599,7 +600,11 @@
try {
if (mICas != null) {
- mICas.setSessionPrivateData(mSessionId, data);
+ try {
+ mICas.setSessionPrivateData(mSessionId, data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.setSessionPrivateData(
@@ -628,7 +633,12 @@
try {
if (mICas != null) {
- mICas.processEcm(mSessionId, data);
+ try {
+ mICas.processEcm(
+ mSessionId, Arrays.copyOfRange(data, offset, length + offset));
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.processEcm(
@@ -671,23 +681,26 @@
validateSessionInternalStates();
if (mICas != null) {
try {
+ if (data == null) {
+ data = new byte[0];
+ }
mICas.sendSessionEvent(mSessionId, event, arg, data);
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
- }
+ } else {
+ if (mICasHidl11 == null) {
+ Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface");
+ throw new UnsupportedCasException("Send Session Event is not supported");
+ }
- if (mICasHidl11 == null) {
- Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface");
- throw new UnsupportedCasException("Send Session Event is not supported");
- }
-
- try {
- MediaCasException.throwExceptionIfNeeded(
- mICasHidl11.sendSessionEvent(
- toByteArray(mSessionId), event, arg, toByteArray(data)));
- } catch (RemoteException e) {
- cleanupAndRethrowIllegalState();
+ try {
+ MediaCasException.throwExceptionIfNeeded(
+ mICasHidl11.sendSessionEvent(
+ toByteArray(mSessionId), event, arg, toByteArray(data)));
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
+ }
}
}
@@ -1038,7 +1051,11 @@
try {
if (mICas != null) {
- mICas.setPrivateData(data);
+ try {
+ mICas.setPrivateData(data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.setPrivateData(toByteArray(data, 0, data.length)));
@@ -1126,7 +1143,21 @@
int sessionResourceHandle = getSessionResourceHandle();
try {
- if (mICasHidl != null) {
+ if (mICas != null) {
+ try {
+ byte[] sessionId = mICas.openSessionDefault();
+ Session session = createFromSessionId(sessionId);
+ Log.d(TAG, "Write Stats Log for succeed to Open Session.");
+ FrameworkStatsLog.write(
+ FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS,
+ mUserId,
+ mCasSystemId,
+ FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED);
+ return session;
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
+ } else if (mICasHidl != null) {
OpenSessionCallback cb = new OpenSessionCallback();
mICasHidl.openSession(cb);
MediaCasException.throwExceptionIfNeeded(cb.mStatus);
@@ -1183,7 +1214,7 @@
mCasSystemId,
FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED);
return session;
- } catch (RemoteException e) {
+ } catch (ServiceSpecificException | RemoteException e) {
cleanupAndRethrowIllegalState();
}
}
@@ -1229,7 +1260,11 @@
try {
if (mICas != null) {
- mICas.processEmm(Arrays.copyOfRange(data, offset, length));
+ try {
+ mICas.processEmm(Arrays.copyOfRange(data, offset, length));
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.processEmm(toByteArray(data, offset, length)));
@@ -1272,7 +1307,14 @@
try {
if (mICas != null) {
- mICas.sendEvent(event, arg, data);
+ try {
+ if (data == null) {
+ data = new byte[0];
+ }
+ mICas.sendEvent(event, arg, data);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.sendEvent(event, arg, toByteArray(data)));
@@ -1298,7 +1340,11 @@
try {
if (mICas != null) {
- mICas.provision(provisionString);
+ try {
+ mICas.provision(provisionString);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(mICasHidl.provision(provisionString));
}
@@ -1323,7 +1369,14 @@
try {
if (mICas != null) {
- mICas.refreshEntitlements(refreshType, refreshData);
+ try {
+ if (refreshData == null) {
+ refreshData = new byte[0];
+ }
+ mICas.refreshEntitlements(refreshType, refreshData);
+ } catch (ServiceSpecificException se) {
+ MediaCasException.throwExceptionIfNeeded(se.errorCode);
+ }
} else {
MediaCasException.throwExceptionIfNeeded(
mICasHidl.refreshEntitlements(refreshType, toByteArray(refreshData)));
diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java
index b4bdf93d..15dee85 100644
--- a/media/java/android/media/MediaDescrambler.java
+++ b/media/java/android/media/MediaDescrambler.java
@@ -17,24 +17,15 @@
package android.media;
import android.annotation.NonNull;
-import android.hardware.cas.DestinationBuffer;
import android.hardware.cas.IDescrambler;
import android.hardware.cas.ScramblingControl;
-import android.hardware.cas.SharedBuffer;
-import android.hardware.cas.SubSample;
import android.hardware.cas.V1_0.IDescramblerBase;
-import android.hardware.common.Ashmem;
-import android.hardware.common.NativeHandle;
import android.media.MediaCasException.UnsupportedCasException;
import android.os.IHwBinder;
-import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
-import android.os.SharedMemory;
-import android.system.ErrnoException;
import android.util.Log;
-import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -52,6 +43,7 @@
public final class MediaDescrambler implements AutoCloseable {
private static final String TAG = "MediaDescrambler";
private DescramblerWrapper mIDescrambler;
+ private boolean mIsAidlHal;
private interface DescramblerWrapper {
@@ -68,50 +60,18 @@
void setMediaCasSession(byte[] sessionId) throws RemoteException;
void release() throws RemoteException;
- }
- ;
-
- private long getSubsampleInfo(
- int numSubSamples,
- int[] numBytesOfClearData,
- int[] numBytesOfEncryptedData,
- SubSample[] subSamples) {
- long totalSize = 0;
-
- for (int i = 0; i < numSubSamples; i++) {
- totalSize += numBytesOfClearData[i];
- subSamples[i].numBytesOfClearData = numBytesOfClearData[i];
- totalSize += numBytesOfEncryptedData[i];
- subSamples[i].numBytesOfEncryptedData = numBytesOfEncryptedData[i];
- }
- return totalSize;
- }
-
- private ParcelFileDescriptor createSharedMemory(ByteBuffer buffer, String name)
- throws RemoteException {
- byte[] source = buffer.array();
- if (source.length == 0) {
- return null;
- }
- ParcelFileDescriptor fd = null;
- try {
- SharedMemory ashmem = SharedMemory.create(name == null ? "" : name, source.length);
- ByteBuffer ptr = ashmem.mapReadWrite();
- ptr.put(buffer);
- ashmem.unmap(ptr);
- fd = ashmem.getFdDup();
- return fd;
- } catch (ErrnoException | IOException e) {
- throw new RemoteException(e);
- }
- }
+ };
private class AidlDescrambler implements DescramblerWrapper {
IDescrambler mAidlDescrambler;
- AidlDescrambler(IDescrambler aidlDescrambler) {
- mAidlDescrambler = aidlDescrambler;
+ AidlDescrambler(IDescrambler aidlDescrambler) throws Exception {
+ if (aidlDescrambler != null) {
+ mAidlDescrambler = aidlDescrambler;
+ } else {
+ throw new Exception("Descrambler could not be created");
+ }
}
@Override
@@ -125,47 +85,17 @@
@NonNull ByteBuffer dst,
@NonNull MediaCodec.CryptoInfo cryptoInfo)
throws RemoteException {
- SubSample[] subSamples = new SubSample[cryptoInfo.numSubSamples];
- long totalLength =
- getSubsampleInfo(
- cryptoInfo.numSubSamples,
- cryptoInfo.numBytesOfClearData,
- cryptoInfo.numBytesOfEncryptedData,
- subSamples);
- SharedBuffer srcBuffer = new SharedBuffer();
- DestinationBuffer dstBuffer;
- srcBuffer.heapBase = new Ashmem();
- srcBuffer.heapBase.fd = createSharedMemory(src, "Descrambler Source Buffer");
- srcBuffer.heapBase.size = src.array().length;
- if (dst == null) {
- dstBuffer = DestinationBuffer.nonsecureMemory(srcBuffer);
- } else {
- ParcelFileDescriptor pfd =
- createSharedMemory(dst, "Descrambler Destination Buffer");
- NativeHandle nh = new NativeHandle();
- nh.fds = new ParcelFileDescriptor[] {pfd};
- nh.ints = new int[] {1}; // Mark 1 since source buffer also uses it?
- dstBuffer = DestinationBuffer.secureMemory(nh);
- }
- @ScramblingControl int control = cryptoInfo.key[0];
-
- return mAidlDescrambler.descramble(
- (byte) control,
- subSamples,
- srcBuffer,
- src.position(),
- dstBuffer,
- dst.position());
+ throw new RemoteException("Not supported");
}
@Override
public boolean requiresSecureDecoderComponent(@NonNull String mime) throws RemoteException {
- return mAidlDescrambler.requiresSecureDecoderComponent(mime);
+ throw new RemoteException("Not supported");
}
@Override
public void setMediaCasSession(byte[] sessionId) throws RemoteException {
- mAidlDescrambler.setMediaCasSession(sessionId);
+ throw new RemoteException("Not supported");
}
@Override
@@ -178,9 +108,13 @@
IDescramblerBase mHidlDescrambler;
- HidlDescrambler(IDescramblerBase hidlDescrambler) {
- mHidlDescrambler = hidlDescrambler;
- native_setup(hidlDescrambler.asBinder());
+ HidlDescrambler(IDescramblerBase hidlDescrambler) throws Exception {
+ if (hidlDescrambler != null) {
+ mHidlDescrambler = hidlDescrambler;
+ native_setup(hidlDescrambler.asBinder());
+ } else {
+ throw new Exception("Descrambler could not be created");
+ }
}
@Override
@@ -267,10 +201,14 @@
if (MediaCas.getService() != null) {
mIDescrambler =
new AidlDescrambler(MediaCas.getService().createDescrambler(CA_system_id));
+ mIsAidlHal = true;
} else if (MediaCas.getServiceHidl() != null) {
mIDescrambler =
new HidlDescrambler(
MediaCas.getServiceHidl().createDescrambler(CA_system_id));
+ mIsAidlHal = false;
+ } else {
+ throw new Exception("No CAS service found!");
}
} catch(Exception e) {
Log.e(TAG, "Failed to create descrambler: " + e);
@@ -282,6 +220,15 @@
}
}
+ /**
+ * Check if the underlying HAL is AIDL. Used only for CTS.
+ *
+ * @hide
+ */
+ public boolean isAidlHal() {
+ return mIsAidlHal;
+ }
+
IHwBinder getBinder() {
validateInternalStates();
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 2f8dea7..379fe2a 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -158,6 +158,7 @@
private int mLowBatteryWarningLevel;
private int mLastLowBatteryWarningLevel;
private int mLowBatteryCloseWarningLevel;
+ private int mBatteryNearlyFullLevel;
private int mShutdownBatteryTemperature;
private int mPlugType;
@@ -1183,6 +1184,8 @@
com.android.internal.R.integer.config_notificationsBatteryLedOn);
mBatteryLedOff = context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLedOff);
+ mBatteryNearlyFullLevel = context.getResources().getInteger(
+ com.android.internal.R.integer.config_notificationsBatteryNearlyFullLevel);
}
/**
@@ -1205,7 +1208,8 @@
}
} else if (status == BatteryManager.BATTERY_STATUS_CHARGING
|| status == BatteryManager.BATTERY_STATUS_FULL) {
- if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) {
+ if (status == BatteryManager.BATTERY_STATUS_FULL
+ || level >= mBatteryNearlyFullLevel) {
// Solid green when full or charging and nearly full
mBatteryLight.setColor(mBatteryFullARGB);
} else {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 8a22ab9..dd214b4 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -1232,7 +1232,8 @@
void launchRoutingControl(boolean routingForBootup) {
assertRunOnServiceThread();
// Seq #24
- if (getActivePortId() != Constants.INVALID_PORT_ID) {
+ if (getActivePortId() != Constants.INVALID_PORT_ID
+ && getActivePortId() != Constants.CEC_SWITCH_HOME) {
if (!routingForBootup && !isProhibitMode()) {
int newPath = mService.portIdToPath(getActivePortId());
setActivePath(newPath);
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 3256b49..98d5acf 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -2238,6 +2238,7 @@
Slog.w(TAG, "Local tv device not available to change arc mode.");
return;
}
+ tv.startArcAction(enabled);
}
});
}