11package com.aheaditec.talsec.demoapp
22
3+ import android.app.Activity
34import android.app.Application
5+ import android.os.Build
6+ import android.os.Bundle
47import android.util.Log
8+ import android.view.WindowManager.SCREEN_RECORDING_STATE_VISIBLE
59import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
610import com.aheaditec.talsec_security.security.api.Talsec
711import com.aheaditec.talsec_security.security.api.TalsecConfig
812import com.aheaditec.talsec_security.security.api.ThreatListener
13+ import java.util.function.Consumer
914
1015class TalsecApplication : Application (), ThreatListener.ThreatDetected {
1116
17+ private var currentActivity: Activity ? = null
18+ private var screenCaptureCallback: Activity .ScreenCaptureCallback ? = null
19+ private val screenRecordCallback: Consumer <Int > = Consumer <Int > { state ->
20+ if (state == SCREEN_RECORDING_STATE_VISIBLE ) {
21+ Talsec .onScreenRecordingDetected()
22+ }
23+ }
24+
1225 override fun onCreate () {
1326 super .onCreate()
1427
@@ -26,6 +39,64 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
2639
2740 ThreatListener (this , deviceStateListener).registerListener(this )
2841 Talsec .start(this , config)
42+
43+ registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
44+ override fun onActivityCreated (activity : Activity , bundle : Bundle ? ) {
45+
46+ // Set to 'true' to block screen capture
47+ Talsec .blockScreenCapture(activity, false )
48+ }
49+
50+ override fun onActivityStarted (activity : Activity ) {
51+ unregisterCallbacks()
52+ currentActivity = activity
53+ registerCallbacks(activity)
54+ }
55+
56+ override fun onActivityResumed (activity : Activity ) {}
57+ override fun onActivityPaused (activity : Activity ) {}
58+
59+ override fun onActivityStopped (activity : Activity ) {
60+ if (activity == currentActivity) {
61+ unregisterCallbacks()
62+ currentActivity = null
63+ }
64+ }
65+
66+ override fun onActivitySaveInstanceState (activity : Activity , bundle : Bundle ) {}
67+ override fun onActivityDestroyed (activity : Activity ) {}
68+ })
69+ }
70+
71+ private fun registerCallbacks (activity : Activity ) {
72+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
73+ screenCaptureCallback = Activity .ScreenCaptureCallback {
74+ Talsec .onScreenshotDetected()
75+ }
76+ activity.registerScreenCaptureCallback(
77+ baseContext.mainExecutor, screenCaptureCallback!!
78+ )
79+ }
80+
81+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .VANILLA_ICE_CREAM ) {
82+ val initialState = activity.windowManager.addScreenRecordingCallback(
83+ mainExecutor, screenRecordCallback
84+ )
85+ screenRecordCallback.accept(initialState)
86+ }
87+ }
88+
89+ private fun unregisterCallbacks () {
90+ currentActivity?.let { activity ->
91+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE && screenCaptureCallback != null ) {
92+ activity.unregisterScreenCaptureCallback(screenCaptureCallback!! )
93+ screenCaptureCallback = null
94+ }
95+
96+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .VANILLA_ICE_CREAM ) {
97+ activity.windowManager.removeScreenRecordingCallback(screenRecordCallback)
98+ }
99+ }
29100 }
30101
31102 override fun onRootDetected () {
@@ -77,6 +148,14 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
77148 println (" onMalwareDetected" )
78149 }
79150
151+ override fun onScreenshotDetected () {
152+ println (" onScreenshotDetected" )
153+ }
154+
155+ override fun onScreenRecordingDetected () {
156+ println (" onScreenRecordingDetected" )
157+ }
158+
80159 // This is optional. Use only if you are interested in device state information like device lock and HW backed keystore state
81160 private val deviceStateListener = object : ThreatListener .DeviceState {
82161 override fun onUnlockedDeviceDetected () {
0 commit comments