private DownloadDrmSessionCreator createModularDownload(DownloadedModularDrm drmHandler) { FrameworkMediaDrmCreator mediaDrmCreator = new FrameworkMediaDrmCreator(); return new DownloadDrmSessionCreator(drmHandler, mediaDrmCreator, handler); } }
public DrmSessionCreator createFor(DrmType drmType, DrmHandler drmHandler) throws DrmSessionCreatorException { switch (drmType) { case NONE: // Fall-through. case WIDEVINE_CLASSIC: return new NoDrmSessionCreator(); case WIDEVINE_MODULAR_STREAM: assertThatApiLevelIsJellyBeanEighteenOrAbove(drmType); return createModularStream((StreamingModularDrm) drmHandler); case WIDEVINE_MODULAR_DOWNLOAD: assertThatApiLevelIsJellyBeanEighteenOrAbove(drmType); return createModularDownload((DownloadedModularDrm) drmHandler); default: throw DrmSessionCreatorException.noDrmHandlerFor(drmType); } }
@Override public SessionId getSessionId() { return SessionId.absent(); }
@SuppressWarnings("PMD.AvoidCatchingGenericException") // We are forced to catch Exception as ResourceBusyException is minSdk 19 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @Override public DrmSession<FrameworkMediaCrypto> acquireSession(Looper playbackLooper, DrmInitData drmInitData) { DrmSession<FrameworkMediaCrypto> drmSession; try { SessionId sessionId = SessionId.of(mediaDrm.openSession()); FrameworkMediaCrypto mediaCrypto = mediaDrm.createMediaCrypto(sessionId.asBytes()); mediaDrm.restoreKeys(sessionId.asBytes(), keySetIdToRestore.asBytes()); drmSession = new LocalDrmSession(mediaCrypto, keySetIdToRestore, sessionId); } catch (Exception exception) { drmSession = new InvalidDrmSession(new DrmSession.DrmSessionException(exception)); notifyErrorListener(drmSession); } return drmSession; }
@Test public void givenAcquiredSession_whenReleasingSession_thenClosesCurrentSession() { DrmSession<FrameworkMediaCrypto> drmSession = new LocalDrmSession(frameworkMediaCrypto, KEY_SET_ID_TO_RESTORE, SESSION_ID); localDrmSessionManager.releaseSession(drmSession); verify(mediaDrm).closeSession(SESSION_ID.asBytes()); } }
@Test public void givenValidMediaDrm_whenAcquiringSession_thenReturnsLocalDrmSession() throws MediaCryptoException { given(mediaDrm.createMediaCrypto(SESSION_ID.asBytes())).willReturn(frameworkMediaCrypto); DrmSession<FrameworkMediaCrypto> drmSession = localDrmSessionManager.acquireSession(IGNORED_LOOPER, IGNORED_DRM_DATA); LocalDrmSession localDrmSession = new LocalDrmSession(frameworkMediaCrypto, KEY_SET_ID_TO_RESTORE, SESSION_ID); assertThat(drmSession).isEqualTo(localDrmSession); }
@Before public void setUp() throws MediaDrmException, MediaCryptoException { frameworkMediaCrypto = FrameworkMediaCryptoFixture.aFrameworkMediaCrypto().build(); given(mediaDrm.openSession()).willReturn(SESSION_ID.asBytes()); localDrmSessionManager = new LocalDrmSessionManager( KEY_SET_ID_TO_RESTORE, mediaDrm, DRM_SCHEME, handler, eventListener ); }
private DrmSessionCreator createModularStream(StreamingModularDrm drmHandler) { ProvisionExecutor provisionExecutor = provisionExecutorCreator.create(); ProvisioningModularDrmCallback mediaDrmCallback = new ProvisioningModularDrmCallback( drmHandler, provisionExecutor ); FrameworkMediaDrmCreator mediaDrmCreator = new FrameworkMediaDrmCreator(); return new StreamingDrmSessionCreator(mediaDrmCallback, mediaDrmCreator, handler); }
@Override public void releaseSession(DrmSession<FrameworkMediaCrypto> drmSession) { FrameworkDrmSession frameworkDrmSession = (FrameworkDrmSession) drmSession; SessionId sessionId = frameworkDrmSession.getSessionId(); mediaDrm.closeSession(sessionId.asBytes()); } }
@Override public DrmSessionManager<FrameworkMediaCrypto> create(DefaultDrmSessionEventListener eventListener) { return new LocalDrmSessionManager( downloadedModularDrm.getKeySetId(), mediaDrmCreator.create(WIDEVINE_MODULAR_UUID), WIDEVINE_MODULAR_UUID, handler, eventListener ); } }
@Test public void givenValidMediaDrm_whenAcquiringSession_thenRestoresKeys() throws MediaCryptoException { given(mediaDrm.createMediaCrypto(SESSION_ID.asBytes())).willReturn(frameworkMediaCrypto); localDrmSessionManager.acquireSession(IGNORED_LOOPER, IGNORED_DRM_DATA); verify(mediaDrm).restoreKeys(SESSION_ID.asBytes(), KEY_SET_ID_TO_RESTORE.asBytes()); }
@Test public void givenDrmTypeWidevineClassic_whenCreatingDrmSessionCreator_thenReturnsNoDrmSession() throws DrmSessionCreatorException { DrmSessionCreator drmSessionCreator = drmSessionCreatorFactory.createFor(DrmType.WIDEVINE_CLASSIC, IGNORED_DRM_HANDLER); assertThat(drmSessionCreator).isInstanceOf(NoDrmSessionCreator.class); }
@Before public void setUp() { drmSessionCreatorFactory = new DrmSessionCreatorFactory(SUPPORTED_MEDIA_DRM_DEVICE, provisionExecutorCreator, handler); }
static SessionId absent() { return new SessionId(new byte[0]); }
static DrmSessionCreatorException noDrmHandlerFor(DrmType drmType) { return new DrmSessionCreatorException("No DrmHandler for DrmType: " + drmType); }
@Override public int hashCode() { int result = mediaCrypto != null ? mediaCrypto.hashCode() : 0; result = 31 * result + (keySetIdToRestore != null ? keySetIdToRestore.hashCode() : 0); result = 31 * result + (sessionId != null ? sessionId.hashCode() : 0); return result; } }
@Override public DrmSessionManager<FrameworkMediaCrypto> create(DefaultDrmSessionEventListener eventListener) { FrameworkMediaDrm frameworkMediaDrm = frameworkMediaDrmCreator.create(WIDEVINE_MODULAR_UUID); DefaultDrmSessionManager<FrameworkMediaCrypto> defaultDrmSessionManager = new DefaultDrmSessionManager<>( WIDEVINE_MODULAR_UUID, frameworkMediaDrm, mediaDrmCallback, NO_OPTIONAL_PARAMETERS ); defaultDrmSessionManager.removeListener(eventListener); defaultDrmSessionManager.addListener(handler, eventListener); return defaultDrmSessionManager; } }
@SuppressWarnings("PMD.PreserveStackTrace") // We just unwrap the exception because we don't care about the UnsupportedDrmException itself FrameworkMediaDrm create(UUID uuid) { try { return FrameworkMediaDrm.newInstance(uuid); } catch (UnsupportedDrmException e) { throw new FrameworkMediaDrmException(e.getMessage(), e.getCause()); } }
@Test public void givenDrmTypeWidevineModularDownload_whenCreatingDrmSessionCreator_thenReturnsDownload() throws DrmSessionCreatorException { DrmSessionCreator drmSessionCreator = drmSessionCreatorFactory.createFor(DrmType.WIDEVINE_MODULAR_DOWNLOAD, downloadedModularDrm); assertThat(drmSessionCreator).isInstanceOf(DownloadDrmSessionCreator.class); }
static SessionId of(byte[] sessionId) { return new SessionId(Arrays.copyOf(sessionId, sessionId.length)); }