Expose OnKeyStatusChange events, this is required to learn the usabilities of the keys.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=170268043
This commit is contained in:
zhihuichen 2017-09-27 16:11:01 -07:00 committed by Oliver Woodman
parent 52de36c5eb
commit b14b3d43de
2 changed files with 78 additions and 2 deletions

View File

@ -21,7 +21,9 @@ import android.media.MediaCryptoException;
import android.media.MediaDrm;
import android.media.MediaDrmException;
import android.media.NotProvisionedException;
import android.os.Handler;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -80,6 +82,31 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
byte[] data);
}
/**
* @see android.media.MediaDrm.KeyStatus
*/
interface ExoKeyStatus {
int getStatusCode();
byte[] getKeyId();
}
/**
* @see android.media.MediaDrm.OnKeyStatusChangeListener
*/
interface OnKeyStatusChangeListener<T extends ExoMediaCrypto> {
/**
* Called when the keys in a session change status, such as when the license is renewed or
* expires.
*
* @param mediaDrm the {@link ExoMediaDrm} object on which the event occurred.
* @param sessionId the DRM session ID on which the event occurred.
* @param exoKeyInfo a list of {@link ExoKeyStatus} that contains key ID and status.
* @param hasNewUsableKey true if new key becomes usable.
*/
void onKeyStatusChange(ExoMediaDrm<? extends T> mediaDrm, byte[] sessionId,
List<ExoKeyStatus> exoKeyInfo, boolean hasNewUsableKey);
}
/**
* @see android.media.MediaDrm.KeyRequest
*/
@ -101,6 +128,11 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
*/
void setOnEventListener(OnEventListener<? super T> listener);
/**
* @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler)
*/
void setOnKeyStatusChangeListener(OnKeyStatusChangeListener<? super T> listener);
/**
* @see MediaDrm#openSession()
*/

View File

@ -20,6 +20,7 @@ import android.media.DeniedByServerException;
import android.media.MediaCrypto;
import android.media.MediaCryptoException;
import android.media.MediaDrm;
import android.media.MediaDrm.KeyStatus;
import android.media.MediaDrmException;
import android.media.NotProvisionedException;
import android.media.UnsupportedSchemeException;
@ -27,14 +28,16 @@ import android.support.annotation.NonNull;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}.
*/
@TargetApi(18)
@TargetApi(23)
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
private final UUID uuid;
@ -71,13 +74,36 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
final ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> listener) {
mediaDrm.setOnEventListener(listener == null ? null : new MediaDrm.OnEventListener() {
@Override
public void onEvent(@NonNull MediaDrm md, byte[] sessionId, int event, int extra,
public void onEvent(@NonNull MediaDrm md, @NonNull byte[] sessionId, int event, int extra,
byte[] data) {
listener.onEvent(FrameworkMediaDrm.this, sessionId, event, extra, data);
}
});
}
@Override
public void setOnKeyStatusChangeListener(
final ExoMediaDrm.OnKeyStatusChangeListener<? super FrameworkMediaCrypto> listener) {
if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException();
}
mediaDrm.setOnKeyStatusChangeListener(listener == null ? null
: new MediaDrm.OnKeyStatusChangeListener() {
@Override
public void onKeyStatusChange(@NonNull MediaDrm md, @NonNull byte[] sessionId,
@NonNull List<KeyStatus> keyInfo, boolean hasNewUsableKey) {
List<ExoKeyStatus> exoKeyInfo = new ArrayList<>();
for (KeyStatus keyStatus : keyInfo) {
exoKeyInfo.add(new FrameworkKeyStatus(keyStatus));
}
listener.onKeyStatusChange(FrameworkMediaDrm.this, sessionId, exoKeyInfo,
hasNewUsableKey);
}
}, null);
}
@Override
public byte[] openSession() throws MediaDrmException {
return mediaDrm.openSession();
@ -178,4 +204,22 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
forceAllowInsecureDecoderComponents);
}
private static final class FrameworkKeyStatus implements ExoKeyStatus {
private final MediaDrm.KeyStatus keyStatus;
FrameworkKeyStatus(MediaDrm.KeyStatus keyStatus) {
this.keyStatus = keyStatus;
}
@Override
public int getStatusCode() {
return keyStatus.getStatusCode();
}
@Override
public byte[] getKeyId() {
return keyStatus.getKeyId();
}
}
}