@@ -8,6 +8,7 @@ import android.content.Intent
8
8
import android.content.IntentFilter
9
9
import android.net.wifi.WifiManager
10
10
import android.provider.Settings
11
+ import android.util.Log
11
12
import io.parity.signer.domain.backend.UniffiInteractor
12
13
import io.parity.signer.uniffi.historyAcknowledgeWarnings
13
14
import io.parity.signer.uniffi.historyGetWarnings
@@ -32,17 +33,23 @@ class NetworkExposedStateKeeper(
32
33
MutableStateFlow (null )
33
34
val bluetoothDisabledState: StateFlow <Boolean ?> = _bluetoothDisabledState
34
35
36
+ private val _usbDisconnected : MutableStateFlow <Boolean ?> =
37
+ MutableStateFlow (null )
38
+ val usbDisconnected: StateFlow <Boolean ?> = _usbDisconnected
39
+
35
40
private val _airGapModeState : MutableStateFlow <NetworkState > =
36
41
MutableStateFlow (NetworkState .None )
37
42
val airGapModeState: StateFlow <NetworkState > = _airGapModeState
38
43
44
+ private val isCurentlyBreached: Boolean
45
+ get() = airPlaneModeEnabled.value == false || wifiDisabledState.value == false
46
+ || bluetoothDisabledState.value == false || usbDisconnected.value == false
47
+
39
48
init {
40
49
registerAirplaneBroadcastReceiver()
41
50
registerWifiBroadcastReceiver()
42
51
registerBluetoothBroadcastReceiver()
43
- reactOnAirplaneMode()
44
- reactOnWifiAwareState()
45
- reactOnBluetooth()
52
+ registerUsbBroadcastReceiver()
46
53
}
47
54
48
55
/* *
@@ -64,6 +71,7 @@ class NetworkExposedStateKeeper(
64
71
}
65
72
}
66
73
appContext.registerReceiver(receiver, intentFilter)
74
+ reactOnAirplaneMode()
67
75
}
68
76
69
77
private fun registerBluetoothBroadcastReceiver () {
@@ -74,10 +82,23 @@ class NetworkExposedStateKeeper(
74
82
}
75
83
}
76
84
appContext.registerReceiver(receiver, intentFilter)
85
+ reactOnBluetooth()
77
86
}
78
87
79
- private fun updateGeneralAirgap (isBreached : Boolean ) {
80
- if (isBreached) {
88
+ private fun registerUsbBroadcastReceiver () {
89
+ val intentFilter = IntentFilter (" android.hardware.usb.action.USB_STATE" )
90
+ val receiver: BroadcastReceiver = object : BroadcastReceiver () {
91
+ override fun onReceive (context : Context , intent : Intent ) {
92
+ Log .e(" TAGG" , " usb broadcast" )
93
+ reactOnUsb(intent)
94
+ }
95
+ }
96
+ val oldIntent = appContext.registerReceiver(receiver, intentFilter)
97
+ oldIntent?.let { reactOnUsb(it) }
98
+ }
99
+
100
+ private fun updateGeneralAirgapState () {
101
+ if (isCurentlyBreached) {
81
102
if (airGapModeState.value != NetworkState .Active ) {
82
103
_airGapModeState .value = NetworkState .Active
83
104
if (appContext.isDbCreatedAndOnboardingPassed()) {
@@ -100,15 +121,37 @@ class NetworkExposedStateKeeper(
100
121
0
101
122
) == 0
102
123
_airplaneModeEnabled .value = ! airplaneModeOff
103
- updateGeneralAirgap(airplaneModeOff )
124
+ updateGeneralAirgapState( )
104
125
}
105
126
106
127
private fun reactOnBluetooth () {
107
128
val bluetooth =
108
129
appContext.applicationContext.getSystemService(BluetoothManager ::class .java)?.adapter
109
130
val btEnabled = bluetooth?.isEnabled == true
110
131
_bluetoothDisabledState .value = ! btEnabled
111
- updateGeneralAirgap(btEnabled)
132
+ updateGeneralAirgapState()
133
+ }
134
+
135
+ private fun reactOnUsb (usbIntent : Intent ) {
136
+ if (FeatureFlags .isEnabled(FeatureOption .SKIP_USB_CHECK )) {
137
+ _usbDisconnected .value = false
138
+ updateGeneralAirgapState()
139
+ return
140
+ }
141
+
142
+ when (usbIntent.extras?.getBoolean(" connected" )) {
143
+ true -> {
144
+ _usbDisconnected .value = false
145
+ updateGeneralAirgapState()
146
+ }
147
+ false -> {
148
+ _usbDisconnected .value = true
149
+ updateGeneralAirgapState()
150
+ }
151
+ null -> {
152
+ Log .d(" USB" , " usb action intent doesn't have connection state" )
153
+ }
154
+ }
112
155
}
113
156
114
157
private fun registerWifiBroadcastReceiver () {
@@ -119,14 +162,15 @@ class NetworkExposedStateKeeper(
119
162
}
120
163
}
121
164
appContext.registerReceiver(receiver, intentFilter)
165
+ reactOnWifiAwareState()
122
166
}
123
167
124
168
private fun reactOnWifiAwareState () {
125
169
val wifi =
126
170
appContext.applicationContext.getSystemService(Context .WIFI_SERVICE ) as WifiManager ?
127
171
val wifiEnabled = wifi?.isWifiEnabled == true
128
172
_wifiDisabledState .value = ! wifiEnabled
129
- updateGeneralAirgap(wifiEnabled )
173
+ updateGeneralAirgapState( )
130
174
}
131
175
132
176
/* *
0 commit comments