package Ġar . crypt ot est . ex op layer 2 Ċ Ċ import Ġandroid . media . Media Codec List Ċ import Ġandroid . media . Media Codec Info Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġar . crypt ot est . ex op layer 2 . ex op layer 2 . R Ċ import Ġcom . google . android . ex op layer 2 . Media Item Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . medi ac ode c . Media Codec Renderer Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . ui . Player View Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Cipher OutputStream Ċ import Ġjavax . crypto . spec . Iv Parameter Spec Ċ import Ġjavax . crypto . spec . SecretKey Spec ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Cipher : ĠCipher ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsecret KeySpec : ĠSecret KeySpec Ġget () Ġ= ĠSecret KeySpec ( secret Key , ĠAES _ ALGORITHM ) ĊĠĠĠ Ġprivate Ġval Ġiv Parameter Spec : ĠI v Parameter Spec ? Ġget () Ġ= ĠI v Parameter Spec ( initial Iv ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Cipher Ġ= ĠCipher . getInstance ( AES _ TRANS FORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Cipher !!. init ( Cipher . DE CRYPT _ MODE , Ġsecret KeySpec , Ġiv Parameter Spec ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Used Ġwith Ġ' onclick ' ĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġencrypt Video ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencryption Cipher Ġ= ĠCipher . getInstance ( AES _ TRANS FORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Cipher . init ( Cipher . ENCRYPT _ MODE , Ġsecret KeySpec , Ġiv Parameter Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypt File ( encryption Cipher ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Codec ( mime Type : ĠString ): ĠMedia Codec Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Code cs Ġ= ĠMedia Codec List . get Codec Count () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Code cs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodec Info : ĠMedia Codec Info Ġ= ĠMedia Codec List . get Codec Info At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! codec Info . is Encoder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes : ĠArray < String > Ġ= Ġcodec Info . get Supported Types () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġtypes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types [ j ]. equals ( mime Type , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcodec Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlist Code cs ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Codec For MimeType (" video / mp 4 "); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Codec For MimeType ( mime Type : ĠString ): ĠMedia Codec Info ? Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" D AD AD AD AD 2 Ġget Codec For MimeType .") ĊĠĠĠĠĠĠĠ Ġval Ġmedia Codec List Ġ= ĠMedia Codec List ( Media Codec List . REG ULAR _ CODE CS ) ĊĠĠĠĠĠĠĠ Ġval Ġcodec Infos Ġ= Ġmedia Codec List . codec Infos ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcodec Infos . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodec Info Ġ= Ġcodec Infos [ i ] ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( codec Info . is Encoder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" D AD AD AD AD Ġ" Ġ+ Ġcodec Info . name . toString ()) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġcodec Info . supported Types ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types [ 0 ]. contains (" video ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" D AD AD AD AD Ġ" Ġ+ Ġcodec Info . name . toString () Ġ+ Ġ"#" Ġ+ Ġtypes . join ToString ("# "). toString ()) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcodec Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġtypes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types [ j ]. equals ( mime Type , Ġignore Case Ġ= Ġtrue )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcodec Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay Video ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠSimple Exo Player . Builder ( view . context ). build () ĊĠĠĠĠĠĠĠ ĠfindViewById < Player View >( R . id . simple ex op layer view ). player Ġ= Ġplayer ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( encrypted File ) ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Factory : ĠDataSource . Factory Ġ= ĠBlock Cipher Encrypted DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecret KeySpec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAES _ TRANS FORMATION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Source Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( dataSource Factory ). create Media Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item . Builder (). set Uri ( uri ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Media Source ( video Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay Local Enc Video ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasset Encrypted File Ġ= ĠFile ( files Dir , Ġ" asset _ encrypted . mp 4 ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! asset Encrypted File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasset Encrypted File . output Stream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets . open (" asset _ encrypted . mp 4 "). copy To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" D AD AD AD AD Ġsuccessfully .") Ċ // ĠĠĠĠĠĠĠ Ġreturn ; ĊĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠSimple Exo Player . Builder ( view . context ). build () ĊĠĠĠĠĠĠĠ ĠfindViewById < Player View >( R . id . simple ex op layer view ). player Ġ= Ġplayer ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( asset Encrypted File ) ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Factory : ĠDataSource . Factory Ġ= ĠBlock Cipher Encrypted DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecret KeySpec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAES _ TRANS FORMATION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Source Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( dataSource Factory ). create Media Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item . Builder (). set Uri ( uri ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Media Source ( video Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAES _ ALGORITHM Ġ= Ġ" AES " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAES _ TRANS FORMATION Ġ= Ġ" AES / CBC / PKCS 7 Padding " ĊĊĠĠĠĠĠĠĠ Ġ// val Ġsecret Key Ġ= Ġ" TR FT X PN 4 6 8 F 8 6 6 J 2 ". map Ġ{ Ġit . to Byte () Ġ}. toByteArray () ĊĠĠĠĠĠĠĠ Ġ// ĠKey Ġis Ġnot Ġa Ġhex Ġstring ; Ġit Ġan Ġbe Ġany Ġst ing Ġof Ġ 1 6 Ġchar Ġlen ĊĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġ" 8 5 BE 6 2 F 9 AC 3 4 D 1 0 7 ". map Ġ{ Ġit . to Byte () Ġ}. toByteArray () ĊĠĠĠĠĠĠĠ Ġvar Ġinitial Iv Ġ= Ġ" 1 2 3 4 5 6 7 8 9 0 ABCDEF ". map Ġ{ Ġit . to Byte () Ġ}. toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġencrypted File Ġget () Ġ= ĠFile ( files Dir , Ġ" encrypted . mp 4 ") Ċ // ĠĠĠ Ġprivate Ġval Ġasset Encrypted File Ġget () Ġ= ĠFile ( files Dir , Ġ" asset _ encrypted . mp 4 ") ĊĊĊĠĠĠ Ġprivate Ġfun Ġencrypt File ( cipher : ĠCipher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun encrypted File Ġ= ĠFile ( files Dir , Ġ" un encrypted . mp 4 ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! un encrypted File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun encrypted File . output Stream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets . open (" ol iver . mp 4 "). copy To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġencrypted File . delete () ĊĊĠĠĠĠĠĠĠ Ġun encrypted File . inputStream (). use Ġ{ Ġun encrypted FileInputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted File . output Stream (). use Ġ{ Ġfile OutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile OutputStream . write ( initial Iv ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher OutputStream ( file OutputStream , Ġcipher ). use Ġ{ Ġcipher OutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun encrypted FileInputStream . copy To ( cipher OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" File Ġencrypted Ġsuccessfully .") ĊĠĠĠ Ġ} Ċ } ĊĊ