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:
parent
52de36c5eb
commit
b14b3d43de
@ -21,7 +21,9 @@ import android.media.MediaCryptoException;
|
|||||||
import android.media.MediaDrm;
|
import android.media.MediaDrm;
|
||||||
import android.media.MediaDrmException;
|
import android.media.MediaDrmException;
|
||||||
import android.media.NotProvisionedException;
|
import android.media.NotProvisionedException;
|
||||||
|
import android.os.Handler;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -80,6 +82,31 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
|
|||||||
byte[] data);
|
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
|
* @see android.media.MediaDrm.KeyRequest
|
||||||
*/
|
*/
|
||||||
@ -101,6 +128,11 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
|
|||||||
*/
|
*/
|
||||||
void setOnEventListener(OnEventListener<? super T> listener);
|
void setOnEventListener(OnEventListener<? super T> listener);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler)
|
||||||
|
*/
|
||||||
|
void setOnKeyStatusChangeListener(OnKeyStatusChangeListener<? super T> listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see MediaDrm#openSession()
|
* @see MediaDrm#openSession()
|
||||||
*/
|
*/
|
||||||
|
@ -20,6 +20,7 @@ import android.media.DeniedByServerException;
|
|||||||
import android.media.MediaCrypto;
|
import android.media.MediaCrypto;
|
||||||
import android.media.MediaCryptoException;
|
import android.media.MediaCryptoException;
|
||||||
import android.media.MediaDrm;
|
import android.media.MediaDrm;
|
||||||
|
import android.media.MediaDrm.KeyStatus;
|
||||||
import android.media.MediaDrmException;
|
import android.media.MediaDrmException;
|
||||||
import android.media.NotProvisionedException;
|
import android.media.NotProvisionedException;
|
||||||
import android.media.UnsupportedSchemeException;
|
import android.media.UnsupportedSchemeException;
|
||||||
@ -27,14 +28,16 @@ import android.support.annotation.NonNull;
|
|||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}.
|
* An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}.
|
||||||
*/
|
*/
|
||||||
@TargetApi(18)
|
@TargetApi(23)
|
||||||
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
|
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
|
||||||
|
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
@ -71,13 +74,36 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
|
|||||||
final ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> listener) {
|
final ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> listener) {
|
||||||
mediaDrm.setOnEventListener(listener == null ? null : new MediaDrm.OnEventListener() {
|
mediaDrm.setOnEventListener(listener == null ? null : new MediaDrm.OnEventListener() {
|
||||||
@Override
|
@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) {
|
byte[] data) {
|
||||||
listener.onEvent(FrameworkMediaDrm.this, sessionId, event, extra, 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
|
@Override
|
||||||
public byte[] openSession() throws MediaDrmException {
|
public byte[] openSession() throws MediaDrmException {
|
||||||
return mediaDrm.openSession();
|
return mediaDrm.openSession();
|
||||||
@ -178,4 +204,22 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
|
|||||||
forceAllowInsecureDecoderComponents);
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user