Slide 1

Slide 1 text

1SJWBDZ$IBOHFTJO"OESPJE2 )B%POH)ZVO )FBMJOH1BQFS "OESPJE

Slide 2

Slide 2 text

"OESPJEIBTNBOZ
 QSJWBDZGFBUVSFT 4&-JOVY $POUFOU#BTFE1FSNJTTJPOT -PDLEPXO.PEF (VFTU.PEF 3VOUJNFQFSNJTTJPOT (PPHMF1MBZ1SPUFDU "QQMJDBUJPO4BOECPYJOH 'JMF#BTFE&ODSZQUJPO &ODSZQUFECBDLVQT )BSEXBSFQSPUFDUFE"1*T 3FTUSJDUFECBDLHSPVOEBDDFTTUPNJDDBNFSB4FOTPS.BOBHFS 4FDVSF%/4 5-4CZ%FGBVMU

Slide 3

Slide 3 text

"OENBOZNPSFUP "OESPJE2 1FSNJTTJPO6TBHF 3FNJOEFS "DUJWJUZ3FDPHOJUJPO1FSNJTTJPO "QQ*DPO)BOEMJOH .BJOMJOF 'PSFHSPVOE4FSWJDF .PSF-PDBUJPO$POUSPM 1SJWBDZ"MFSUT -PDBUJPO3FNJOEFST 3PMFT $POUBDUT1SPWJEFS #BDLHSPVOE"QQ -BVODIJOH %FWJDF*%3FTUSJDUJPOT -PDBUJPO4FUUJOHT 4ZTUFN'JMF1JDLFS 1FSNJTTJPO4FUUJOHT 4DSFFO3FDPSEJOH ."$3BOEPNJ[BUJPO $BNFSB*OUFOUT "DDFTTJCJMJUZ
 6TBHF4FUUJOH "QQ4UPSBHF

Slide 4

Slide 4 text

"OENBOZNPSFUP "OESPJE2 1FSNJTTJPO6TBHF 3FNJOEFS "DUJWJUZ3FDPHOJUJPO1FSNJTTJPO "QQ*DPO)BOEMJOH .BJOMJOF 'PSFHSPVOE4FSWJDF .PSF-PDBUJPO$POUSPM 1SJWBDZ"MFSUT -PDBUJPO3FNJOEFST 3PMFT $POUBDUT1SPWJEFS #BDLHSPVOE"QQ -BVODIJOH %FWJDF*%3FTUSJDUJPOT -PDBUJPO4FUUJOHT 4ZTUFN'JMF1JDLFS 1FSNJTTJPO4FUUJOHT 4DSFFO3FDPSEJOH ."$3BOEPNJ[BUJPO $BNFSB*OUFOUT "DDFTTJCJMJUZ
 6TBHF4FUUJOH "QQ4UPSBHF

Slide 5

Slide 5 text

↟3FTUSJDUJPOTUPCBDLHSPVOEBDUJWJUZTUBSUT ↟$IBOHFTUPJEFOUJGJFST 8IBUXFsSFHPJOHUPUBMLBCPVU JOUIJTUPQJD

Slide 6

Slide 6 text

3FTUSJDUJPOTUP
 CBDLHSPVOEBDUJWJUZTUBSUT

Slide 7

Slide 7 text

↟"GGFDUTZPVSBQQJGZPVMBVODIBDUJWJUJFTXJUIPVUVTFSJOUFSBDUJPO ↟.JUJHBUFCZVTJOHOPUJGJDBUJPOUSJHHFSFEBDUJWJUJFT ↟%JTBCMFSFTUSJDUJPOTCZUVSOJOHPOUIF
 "MMPXCBDLHSPVOEBDUJWJUZTUBSUTEFWFMPQFSPQUJPO "OESPJE2#FUB UIJTDIBOHFIBTUIFGPMMPXJOHQSPQFSUJFT

Slide 8

Slide 8 text

)PXDBO*SFTUSJDUUIFTUBSUPG
 BDUJWJUZJOUIFCBDLHSPVOE ↟%FWFMPQFS0QUJPOT"QQT
 "MMPXCBDLHSPVOEBDUJWJUZTUBSUT
 UVSOPGGUIFTXJUDI 


Slide 9

Slide 9 text

#FGPSF"OESPJE2 ↟#BDLHSPVOEBDUJWJUZDBOCFTUBSU
 XJUIPVUVTFSJOUFSBDUJPO ↟5IJTCFIBWJPSDBVTFTEJTDPNGPSUUPVTFST

Slide 10

Slide 10 text

#FGPSF"OESPJE2 ↟8IFOUIFBQQJTUIFCBDLHSPVOEBOE SFDFJWFTBQVTINFTTBHFGSPNUIFTFSWFS  UIF'-"(@"$5*7*5:@/&8@5"4,GMBHJT VTFEUPFYFDVUFUIFBDUJWJUZ TFSWFS DMJFOU

Slide 11

Slide 11 text

#FGPSF"OESPJE2 ↟8IFOUIFBQQJTUIFCBDLHSPVOEBOE SFDFJWFTBQVTINFTTBHFGSPNUIFTFSWFS  UIF'-"(@"$5*7*5:@/&8@5"4,GMBHJT VTFEUPFYFDVUFUIFBDUJWJUZ TFSWFS DMJFOU .FTTBHF

Slide 12

Slide 12 text

4UBSU"DUJWJUZJOUIF#BDLHSPVOE override fun onMessageReceived(message: RemoteMessage?) { ... goLiveConsIncomingActivity(this) } fun goLiveConsIncomingActivity(context: Context) { val intent = Intent(context, LiveConsIncomingActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(intent) }

Slide 13

Slide 13 text

4UBSU"DUJWJUZJOUIF#BDLHSPVOE override fun onMessageReceived(message: RemoteMessage?) { ... goLiveConsIncomingActivity(this) } fun goLiveConsIncomingActivity(context: Context) { val intent = Intent(context, LiveConsIncomingActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK context.startActivity(intent) }

Slide 14

Slide 14 text

↟6OBCMFUPFYFDVUFBDUJWJUZXJUIPVUVTFSJOUFSBDUJPO ↟*GZPVSBQQUBSHFUT"OESPJEPSMPXFS 
 UIFCFIBWJPSDIBOHFTUJMMUBLFTFGGFDUJO"OESPJE2%FWJDF ↟1MBUGPSNTFOETBXBSOJOHNFTTBHFUPMPHDBUBOEUPBTUNFTTBHF
 XBSOJOHUPBTUXJMMOPUBQQFBSJOUIFQVCMJDSFMFBTFPG"OESPJE2 "DUJWJUZFYFDVUJPO
 SFTUSJDUFEJOUIFCBDLHSPVOE 0O"OESPJE2 FYUFOEFE

Slide 15

Slide 15 text

8IBUTIPVME*EP
 JG*XBOUUPHJWFVTFSTJNQPSUBOUJOGPSNBUJPO JOUIFCBDLHSPVOE

Slide 16

Slide 16 text

↟5IFBQQSFDFJWFTBOPUJGJDBUJPO1FOEJOH*OUFOUGSPNUIFTZTUFN ↟5IFBQQSFDFJWFTBTZTUFNCSPBEDBTUXIFSFUIFBQQJTFYQFDUFEUP MBVODIB6*
 FY "$5*0/@/&8@065(0*/(@$"-- 4&$3&5@$0%&@"$5*0/ ↟"QQTUIBUIBWFCFFOHSBOUFEUIF4:45&.@"-&35@8*/%08 QFSNJTTJPOCZUIFVTFS $POEJUJPOTUIBUBMMPXGPSBDUJWJUZTUBSUT JOCBDLHSPVOE

Slide 17

Slide 17 text

↟5IFBQQSFDFJWFTBOPUJGJDBUJPO1FOEJOH*OUFOUGSPNUIFTZTUFN ↟5IFBQQSFDFJWFTBTZTUFNCSPBEDBTUXIFSFUIFBQQJTFYQFDUFEUP MBVODIB6*
 FY "$5*0/@/&8@065(0*/(@$"-- 4&$3&5@$0%&@"$5*0/ ↟"QQTUIBUIBWFCFFOHSBOUFEUIF4:45&.@"-&35@8*/%08 QFSNJTTJPOCZUIFVTFS $POEJUJPOTUIBUBMMPXGPSBDUJWJUZTUBSUT JOCBDLHSPVOE

Slide 18

Slide 18 text

"QQTUIBUBSFJOUIFCBDLHSPVOE TIPVMEDSFBUFOPUJGJDBUJPOT
 UPQSPWJEFJOGPSNBUJPOUPUIFVTFS
 JOTUFBEPGEJSFDUMZTUBSUJOHBOBDUJWJUZ

Slide 19

Slide 19 text

↟8IFODSFBUJOHUIFOPUJGJDBUJPO  NBLFTVSFUIBUZPVJODMVEFB EFTDSJQUJWFUJUMFBOENFTTBHF 0QUJPOBMMZ ZPVDBOBMTPQSPWJEF BGVMMTDSFFOJOUFOU FYUFOEFE DMJFOU TFSWFS 0O"OESPJE2

Slide 20

Slide 20 text

↟8IFODSFBUJOHUIFOPUJGJDBUJPO  NBLFTVSFUIBUZPVJODMVEFB EFTDSJQUJWFUJUMFBOENFTTBHF 0QUJPOBMMZ ZPVDBOBMTPQSPWJEF BGVMMTDSFFOJOUFOU FYUFOEFE DMJFOU TFSWFS 0O"OESPJE2 .FTTBHF %POPUTUBSUBDUJWJUZ
 JOCBDLHSPVOE

Slide 21

Slide 21 text

↟8IFODSFBUJOHUIFOPUJGJDBUJPO  NBLFTVSFUIBUZPVJODMVEFB EFTDSJQUJWFUJUMFBOENFTTBHF 0QUJPOBMMZ ZPVDBOBMTPQSPWJEF BGVMMTDSFFOJOUFOU FYUFOEFE DMJFOU TFSWFS 0O"OESPJE2

Slide 22

Slide 22 text

↟8IFODSFBUJOHUIFOPUJGJDBUJPO  NBLFTVSFUIBUZPVJODMVEFB EFTDSJQUJWFUJUMFBOENFTTBHF 0QUJPOBMMZ ZPVDBOBMTPQSPWJEF BGVMMTDSFFOJOUFOU FYUFOEFE DMJFOU TFSWFS .FTTBHF 0O"OESPJE2

Slide 23

Slide 23 text

TFU'VMM4DSFFO*OUFOU private fun showIncomingCallNotification(channelId: String) { ... NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.noti_icon) ... .setContentIntent(getContentIntent()) .setFullScreenIntent(getContentIntent(), true) .build() ... } private fun getContentIntent(): PendingIntent { val intent = Intent(a, LiveConsIncomingActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK return PendingIntent.getActivity(this, REQUEST_CONTENT, intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 24

Slide 24 text

TFU'VMM4DSFFO*OUFOU private fun showIncomingCallNotification(channelId: String) { ... NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.noti_icon) ... .setContentIntent(getContentIntent()) .setFullScreenIntent(getContentIntent(), true) .build() ... } private fun getContentIntent(): PendingIntent { val intent = Intent(a, LiveConsIncomingActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK return PendingIntent.getActivity(this, REQUEST_CONTENT, intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 25

Slide 25 text

TFU'VMM4DSFFO*OUFOU private fun showIncomingCallNotification(channelId: String) { ... NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.noti_icon) ... .setContentIntent(getContentIntent()) .setFullScreenIntent(getContentIntent(), true) .build() ... } private fun getContentIntent(): PendingIntent { val intent = Intent(a, LiveConsIncomingActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK return PendingIntent.getActivity(this, REQUEST_CONTENT, intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 26

Slide 26 text

TFU'VMM4DSFFO*OUFOU public Notification.Builder setFullScreenIntent (PendingIntent intent, boolean highPriority) ↟)FBETVQOPUJGJDBUJPOXJMMBQQFBSBOEXJMMOPUBVUPNBUJDBMMZEJTBQQFBS ↟JG/PUJGJDBUJPO$IBOOFMJNQPSUBODFJTOPUTFU )FBETVQOPUJGJDBUJPOEPOPUBQQFBS ↟"QQTUBSHFUJOH#VJME7&34*0/@$0%&42BOEBCPWFXJMMIBWFUPSFRVFTUBQFSNJTTJPO
 .BOJGFTUQFSNJTTJPO64&@'6--@4$3&&/@*/5&/5

Slide 27

Slide 27 text

TFU'VMM4DSFFO*OUFOU public Notification.Builder setFullScreenIntent (PendingIntent intent, boolean highPriority) ↟)FBETVQOPUJGJDBUJPOXJMMBQQFBSBOEXJMMOPUBVUPNBUJDBMMZEJTBQQFBS ↟JG/PUJGJDBUJPO$IBOOFMJNQPSUBODFJTOPUTFU )FBETVQOPUJGJDBUJPOEPOPUBQQFBS ↟"QQTUBSHFUJOH#VJME7&34*0/@$0%&42BOEBCPWFXJMMIBWFUPSFRVFTUBQFSNJTTJPO
 .BOJGFTUQFSNJTTJPO64&@'6--@4$3&&/@*/5&/5

Slide 28

Slide 28 text

$SFBUFBIJHIQSJPSJUZOPUJGJDBUJPO NotificationChannel("LIVE_CONS_FOR_USER", "Live ࢚׸", NotificationManager.IMPORTANCE_HIGH).apply { description = "Live ࢚׸ ঌܿ" enableLights(true) enableVibration(true) lightColor = Color.RED vibrationPattern = longArrayOf(0, 400, 200, 400, 1000) lockscreenVisibility = Notification.VISIBILITY_PUBLIC }

Slide 29

Slide 29 text

$SFBUFBIJHIQSJPSJUZOPUJGJDBUJPO NotificationChannel("LIVE_CONS_FOR_USER", "Live ࢚׸", NotificationManager.IMPORTANCE_HIGH).apply { description = "Live ࢚׸ ঌܿ" enableLights(true) enableVibration(true) lightColor = Color.RED vibrationPattern = longArrayOf(0, 400, 200, 400, 1000) lockscreenVisibility = Notification.VISIBILITY_PUBLIC }

Slide 30

Slide 30 text

TFU'VMM4DSFFO*OUFOU public Notification.Builder setFullScreenIntent (PendingIntent intent, boolean highPriority) ↟)FBETVQOPUJGJDBUJPOXJMMBQQFBSBOEXJMMOPUBVUPNBUJDBMMZEJTBQQFBS ↟JG/PUJGJDBUJPO$IBOOFMJNQPSUBODFJTOPUTFU )FBETVQOPUJGJDBUJPOEPOPUBQQFBS ↟"QQTUBSHFUJOH#VJME7&34*0/@$0%&42BOEBCPWFXJMMIBWFUPSFRVFTUBQFSNJTTJPO
 .BOJGFTUQFSNJTTJPO64&@'6--@4$3&&/@*/5&/5

Slide 31

Slide 31 text

TFU'VMM4DSFFO*OUFOU public Notification.Builder setFullScreenIntent (PendingIntent intent, boolean highPriority) ↟)FBETVQOPUJGJDBUJPOXJMMBQQFBSBOEXJMMOPUBVUPNBUJDBMMZEJTBQQFBS ↟JG/PUJGJDBUJPO$IBOOFMJNQPSUBODFJTOPUTFU )FBETVQOPUJGJDBUJPOEPOPUBQQFBS ↟"QQTUBSHFUJOH#VJME7&34*0/@$0%&42BOEBCPWFXJMMIBWFUPSFRVFTUBQFSNJTTJPO
 .BOJGFTUQFSNJTTJPO64&@'6--@4$3&&/@*/5&/5

Slide 32

Slide 32 text

1FOEJOH*OUFOU "EFTDSJQUJPOPGBO*OUFOUBOEUBSHFUBDUJPOUPQFSGPSNXJUIJU NotificationManager 4ZTUFN4FSWJDF "QQ Activity Activity Activity Activity

Slide 33

Slide 33 text

)PXEP*JNQMFNFOUUIFCVUUPO
 DMJDLBDUJPOPGUIF3FNPUF7JFXT

Slide 34

Slide 34 text

3FNPUF7JFXT ↟7JFXTTVQQPSUFECZ3FNPUF7JFXTBSFMJNJUFE
 'SBNF-BZPVU
 -JOFBS-BZPVU
 3FMBUJWF-BPVU
 #VUUPO
 $ISPOPNFUFS
 *NBHF#VUUPO
 *NBHF7JFX
 1SPHSFTT#BS
 5FYU7JFX
 %FTDFOEBOUTPGUIFTFDMBTTFTBSFOPUTVQQPSUFE 


Slide 35

Slide 35 text

$MJDLBDUJPOPG3FNPUF7JFXT private fun showIncomingCallNotification(channelId: String) { ... val remoteView = RemoteViews(packageName, R.layout.incoming_call_notification).apply { setOnClickPendingIntent(R.id.acceptBtn, getAcceptIntent(id)) ... } NotificationCompat.Builder(this, channelId) .setCustomBigContentView(remoteView) ... .build() ... } private fun getAcceptIntent(id: Long): PendingIntent { val intent = Intent(this, IncomingCallReceiver::class.java) ... return PendingIntent.getBroadcast(this, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 36

Slide 36 text

$MJDLBDUJPOPG3FNPUF7JFXT private fun showIncomingCallNotification(channelId: String) { ... val remoteView = RemoteViews(packageName, R.layout.incoming_call_notification).apply { setOnClickPendingIntent(R.id.acceptBtn, getAcceptIntent(id)) ... } NotificationCompat.Builder(this, channelId) .setCustomBigContentView(remoteView) ... .build() ... } private fun getAcceptIntent(id: Long): PendingIntent { val intent = Intent(this, IncomingCallReceiver::class.java) ... return PendingIntent.getBroadcast(this, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 37

Slide 37 text

$MJDLBDUJPOPG3FNPUF7JFXT private fun showIncomingCallNotification(channelId: String) { ... val remoteView = RemoteViews(packageName, R.layout.incoming_call_notification).apply { setOnClickPendingIntent(R.id.acceptBtn, getAcceptIntent(id)) ... } NotificationCompat.Builder(this, channelId) .setCustomBigContentView(remoteView) ... .build() ... } private fun getAcceptIntent(id: Long): PendingIntent { val intent = Intent(this, IncomingCallReceiver::class.java) ... return PendingIntent.getBroadcast(this, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT) }

Slide 38

Slide 38 text

$MJDLBDUJPOPG3FNPUF7JFXT class IncomingCallReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancel(FCMService.LIVECONS_FOR_USER) val acceptCall = intent.getBooleanExtra("acceptCall", false) val denyCall = intent.getBooleanExtra("denyCall", false) ... if (acceptCall) goLiveConsIncoming(context) } private fun goLiveConsIncoming(context: Context) { val intent = Intent(context, LiveConsIncomingActivity::class.java) ... PendingIntent.getActivity(context, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT).send() } }

Slide 39

Slide 39 text

$MJDLBDUJPOPG3FNPUF7JFXT class IncomingCallReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancel(FCMService.LIVECONS_FOR_USER) val acceptCall = intent.getBooleanExtra("acceptCall", false) val denyCall = intent.getBooleanExtra("denyCall", false) ... if (acceptCall) goLiveConsIncoming(context) } private fun goLiveConsIncoming(context: Context) { val intent = Intent(context, LiveConsIncomingActivity::class.java) ... PendingIntent.getActivity(context, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT).send() } }

Slide 40

Slide 40 text

$MJDLBDUJPOPG3FNPUF7JFXT class IncomingCallReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancel(FCMService.LIVECONS_FOR_USER) val acceptCall = intent.getBooleanExtra("acceptCall", false) val denyCall = intent.getBooleanExtra("denyCall", false) ... if (acceptCall) goLiveConsIncoming(context) } private fun goLiveConsIncoming(context: Context) { val intent = Intent(context, LiveConsIncomingActivity::class.java) ... PendingIntent.getActivity(context, REQUEST_ACCEPT, 
 intent, PendingIntent.FLAG_UPDATE_CURRENT).send() } }

Slide 41

Slide 41 text

↟$BOOPUTUBSUBDUJWJUZJOUIFCBDLHSPVOE ↟6TJOH1FOEJOH*OUFOU QFSGPSNUIFBDUJPOUP/PUJGJDBUJPO.BOBHFS 4VNNBSZ

Slide 42

Slide 42 text

$IBOHFTUPJEFOUJGJFST

Slide 43

Slide 43 text

↟3BOEPNJ[FE."$BEESFTTFT ↟/POSFTFUUBCMFEFWJDFJEFOUJGJFST $IBOHFTBGGFDUJOHBMMBQQT

Slide 44

Slide 44 text

↟/POSFTFUUBCMFEFWJDFJEFOUJGJFSTBSFOVMMPSVOLOPXO XIJDIJODMVEF CPUI*.&*BOETFSJBMOVNCFS ↟*O"OESPJE2NVTUIBWFUIF3&"%@13*7*-&(&%@1)0/&@45"5& QSJWJMFHFEQFSNJTTJPOJOPSEFSUPBDDFTTJEFOUJGJFST
 /PU1FSNJUUFECZUIFHFOFSBMVTFS  /POSFTFUUBCMFEFWJDFJEFOUJGJFST
 PO"OESPJE2

Slide 45

Slide 45 text

↟/POSFTFUUBCMFEFWJDFJEFOUJGJFSTBSFOVMMPSVOLOPXO XIJDIJODMVEF CPUI*.&*BOETFSJBMOVNCFS ↟*O"OESPJE2NVTUIBWFUIF3&"%@13*7*-&(&%@1)0/&@45"5& QSJWJMFHFEQFSNJTTJPOJOPSEFSUPBDDFTTJEFOUJGJFST
 /PU1FSNJUUFECZUIFHFOFSBMVTFS  /POSFTFUUBCMFEFWJDFJEFOUJGJFST
 PO"OESPJE2

Slide 46

Slide 46 text

)PXDBO*HFUBVOJRVFJEFOUJGJFS

Slide 47

Slide 47 text

↟"WPJEVTJOHIBSEXBSFJEFOUJGJFST
 44"*% *.&*   ↟0OMZVTFBO"EWFSUJTJOH*%GPSVTFSQSPGJMJOHPSBETVTFDBTFT ↟6TFBO*OTUBODF*%PSBQSJWBUFMZTUPSFE(6*% ↟6TF"1*TUIBUBSFBQQSPQSJBUFGPSZPVSVTFDBTFUPNJOJNJ[FQSJWBDZSJTL
 %3."1* 4BGFUZ/FU"1* #FTUQSBDUJDFTGPSXPSLJOHXJUI
 "OESPJEJEFOUJGJFST

Slide 48

Slide 48 text

↟"WPJEVTJOHIBSEXBSFJEFOUJGJFST
 44"*% *.&*   ↟0OMZVTFBO"EWFSUJTJOH*%GPSVTFSQSPGJMJOHPSBETVTFDBTFT ↟6TFBO*OTUBODF*%PSBQSJWBUFMZTUPSFE(6*% ↟6TF"1*TUIBUBSFBQQSPQSJBUFGPSZPVSVTFDBTFUPNJOJNJ[FQSJWBDZSJTL
 %3."1* 4BGFUZ/FU"1* #FTUQSBDUJDFTGPSXPSLJOHXJUI
 "OESPJEJEFOUJGJFST QSPWJEFBOJEFOUJGJFSUIBUsTDPNNPOCFUXFFOBQQT
 TJHOFECZUIFTBNFEFWFMPQFSTJHOJOHLFZ

Slide 49

Slide 49 text

↟"WPJEVTJOHIBSEXBSFJEFOUJGJFST
 44"*% *.&*   ↟0OMZVTFBO"EWFSUJTJOH*%GPSVTFSQSPGJMJOHPSBETVTFDBTFT ↟6TFBO*OTUBODF*%PSBQSJWBUFMZTUPSFE(6*% ↟6TF"1*TUIBUBSFBQQSPQSJBUFGPSZPVSVTFDBTFUPNJOJNJ[FQSJWBDZSJTL
 %3."1* 4BGFUZ/FU"1* #FTUQSBDUJDFTGPSXPSLJOHXJUI
 "OESPJEJEFOUJGJFST DBOCFNPEJGJFE QSPWJEFBOJEFOUJGJFSUIBUsTDPNNPOCFUXFFOBQQT
 TJHOFECZUIFTBNFEFWFMPQFSTJHOJOHLFZ

Slide 50

Slide 50 text

44"*% "OESPJE*E android.provider.Settings.Secure.getString(context.contentResolver, 
 android.provider.Settings.Secure.ANDROID_ID)

Slide 51

Slide 51 text

↟DBOCFVTFEUPMJNJUBDDFTTUP DPOUFOU JODMVEFTBQFS"1, JEFOUJGJFS UIF8JEFWJOF*% ↟8JEFWJOFJTB%3.PGUIF "OESPJE.FEJB%3. FYUFOEFE .FEJB%3."1*

Slide 52

Slide 52 text

&YP1MBZFS66*% /** * UUID for the W3C */ val COMMON_PSSH_UUID = UUID(0x1077EFECC0B24D02L, -0x531cc3e1ad1d04b5L) /** * UUID for the ClearKey DRM scheme. * ClearKey is supported on Android devices running Android 5.0 (API Level 21) and up. */ val CLEARKEY_UUID = UUID(-0x1d8e62a7567a4c37L, 0x781AB030AF78D30EL) /** * UUID for the Widevine DRM scheme. * Widevine is supported on Android devices running Android 4.3 (API Level 18) and up. */ val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) /** * UUID for the PlayReady DRM scheme. * PlayReady is supported on all AndroidTV devices. Note that most other Android devices do not */ val PLAYREADY_UUID = UUID(-0x65fb0f8667bfbd7aL, -0x546d19a41f77a06bL)

Slide 53

Slide 53 text

&YP1MBZFS66*% /** * UUID for the W3C */ val COMMON_PSSH_UUID = UUID(0x1077EFECC0B24D02L, -0x531cc3e1ad1d04b5L) /** * UUID for the ClearKey DRM scheme. * ClearKey is supported on Android devices running Android 5.0 (API Level 21) and up. */ val CLEARKEY_UUID = UUID(-0x1d8e62a7567a4c37L, 0x781AB030AF78D30EL) /** * UUID for the Widevine DRM scheme. * Widevine is supported on Android devices running Android 4.3 (API Level 18) and up. */ val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) /** * UUID for the PlayReady DRM scheme. * PlayReady is supported on all AndroidTV devices. Note that most other Android devices do not */ val PLAYREADY_UUID = UUID(-0x65fb0f8667bfbd7aL, -0x546d19a41f77a06bL)

Slide 54

Slide 54 text

(FU8JEFWJOF*E val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) fun getDeviceId(): String { var deviceId = "" if(isWidevineDRMAvailable()) { val id = MediaDrm(WIDEVINE_UUID)
 .getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID) deviceId = Base64.encodeToString(id, Base64.DEFAULT) } return deviceId } private fun isWidevineDRMAvailable(): Boolean { return MediaDrm.isCryptoSchemeSupported(WIDEVINE_UUID) }

Slide 55

Slide 55 text

(FU8JEFWJOF*E val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) fun getDeviceId(): String { var deviceId = "" if(isWidevineDRMAvailable()) { val id = MediaDrm(WIDEVINE_UUID)
 .getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID) deviceId = Base64.encodeToString(id, Base64.DEFAULT) } return deviceId } private fun isWidevineDRMAvailable(): Boolean { return MediaDrm.isCryptoSchemeSupported(WIDEVINE_UUID) }

Slide 56

Slide 56 text

4BGFUZ/FU"UUFTUBUJPO"1*

Slide 57

Slide 57 text

↟'SPN"OESPJE2 DBOsUVTFOPOSFTFUUBCMFEFWJDFJEFOUJGJFST ↟%FQFOEJOHPOUIFTJUVBUJPO DBOVTF44"*% %3."1*BOE4BGFUZ/FU"1* 4VNNBSZ

Slide 58

Slide 58 text

5IBOLZPV