summaryrefslogtreecommitdiffhomepage
path: root/android/src/main
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-25 09:15:01 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-25 09:15:01 -0300
commitf2f1752439826baebe827e46b479964a26010dc6 (patch)
tree90bfd9106a2652a6d5796b20983609938ae1f268 /android/src/main
parent119510c7356ab4c6858a01d330d3b1452026c3ab (diff)
parent94e51f89373dd08f89950119cfbefb4bcc285935 (diff)
downloadmullvadvpn-f2f1752439826baebe827e46b479964a26010dc6.tar.xz
mullvadvpn-f2f1752439826baebe827e46b479964a26010dc6.zip
Merge branch 'refactor-event-notifier-ids'
Diffstat (limited to 'android/src/main')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt12
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt11
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/ForegroundNotificationManager.kt25
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/LocationInfoCache.kt27
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt18
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/tunnelstate/TunnelStateUpdater.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt15
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt11
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/PreferencesFragment.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceAwareFragment.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt15
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt20
16 files changed, 88 insertions, 114 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
index ebb490a5a4..4b578f9a9b 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoCache.kt
@@ -19,10 +19,6 @@ class AppVersionInfoCache(
private val setUpJob = setUp()
- private val settingsListenerId = settingsListener.subscribe { settings ->
- showBetaReleases = settings.showBetaReleases
- }
-
private var appVersionInfo: AppVersionInfo? = null
set(value) {
synchronized(this) {
@@ -81,6 +77,12 @@ class AppVersionInfoCache(
var version: String? = null
private set
+ init {
+ settingsListener.subscribe(this) { settings ->
+ showBetaReleases = settings.showBetaReleases
+ }
+ }
+
fun onCreate() {
context.getSharedPreferences(LEGACY_SHARED_PREFERENCES, Context.MODE_PRIVATE)
.edit()
@@ -90,7 +92,7 @@ class AppVersionInfoCache(
fun onDestroy() {
setUpJob.cancel()
- settingsListener.unsubscribe(settingsListenerId)
+ settingsListener.unsubscribe(this)
daemon.onAppVersionInfoChange = null
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
index b75450b438..cdd90b0d3c 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
@@ -13,9 +13,6 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
}
private val jobTracker = JobTracker()
- private val subscriptionId = settingsListener.accountNumberNotifier.subscribe { accountNumber ->
- handleNewAccountNumber(accountNumber)
- }
private var accountNumber: String? = null
private var accountExpiry: DateTime? = null
@@ -28,6 +25,12 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
}
}
+ init {
+ settingsListener.accountNumberNotifier.subscribe(this) { accountNumber ->
+ handleNewAccountNumber(accountNumber)
+ }
+ }
+
fun fetchAccountExpiry() {
accountNumber?.let { account ->
jobTracker.newBackgroundJob("fetch") {
@@ -51,7 +54,7 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
}
fun onDestroy() {
- settingsListener.accountNumberNotifier.unsubscribe(subscriptionId)
+ settingsListener.accountNumberNotifier.unsubscribe(this)
jobTracker.cancelAllJobs()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ForegroundNotificationManager.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ForegroundNotificationManager.kt
index 449f62aa6c..fba3f02576 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ForegroundNotificationManager.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ForegroundNotificationManager.kt
@@ -29,22 +29,14 @@ class ForegroundNotificationManager(
private val notificationManager =
service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
- private val listenerId = serviceNotifier.subscribe { newServiceInstance ->
- connectionProxy = newServiceInstance?.connectionProxy
- settingsListener = newServiceInstance?.settingsListener
- }
-
private val badgeColor = service.resources.getColor(R.color.colorPrimary)
- private var connectionListenerId: Int? = null
private var connectionProxy: ConnectionProxy? = null
set(value) {
if (field != value) {
- connectionListenerId?.let { listenerId ->
- field?.onStateChange?.unsubscribe(listenerId)
- }
+ field?.onStateChange?.unsubscribe(this)
- connectionListenerId = value?.onStateChange?.subscribe { state ->
+ value?.onStateChange?.subscribe(this) { state ->
tunnelState = state
}
@@ -56,11 +48,9 @@ class ForegroundNotificationManager(
private var settingsListener: SettingsListener? = null
set(value) {
if (field != value) {
- loginListenerId?.let { listenerId ->
- field?.accountNumberNotifier?.unsubscribe(listenerId)
- }
+ field?.accountNumberNotifier?.unsubscribe(this)
- loginListenerId = value?.accountNumberNotifier?.subscribe { accountNumber ->
+ value?.accountNumberNotifier?.subscribe(this) { accountNumber ->
loggedIn = accountNumber != null
}
@@ -197,6 +187,11 @@ class ForegroundNotificationManager(
initChannel()
}
+ serviceNotifier.subscribe(this) { newServiceInstance ->
+ connectionProxy = newServiceInstance?.connectionProxy
+ settingsListener = newServiceInstance?.settingsListener
+ }
+
service.apply {
registerReceiver(connectReceiver, IntentFilter(KEY_CONNECT_ACTION))
registerReceiver(disconnectReceiver, IntentFilter(KEY_DISCONNECT_ACTION))
@@ -206,7 +201,7 @@ class ForegroundNotificationManager(
}
fun onDestroy() {
- serviceNotifier.unsubscribe(listenerId)
+ serviceNotifier.unsubscribe(this)
connectionProxy = null
settingsListener = null
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/LocationInfoCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/LocationInfoCache.kt
index 6d6c1e6359..f679f11c1b 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/LocationInfoCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/LocationInfoCache.kt
@@ -31,17 +31,6 @@ class LocationInfoCache(
private var fetchIdCounter = 0L
private var fetchIdIsActive = false
- private val connectivityListenerId =
- connectivityListener.connectivityNotifier.subscribe { isConnected ->
- if (isConnected && state is TunnelState.Disconnected) {
- fetchLocation(true)
- }
- }
-
- private val realStateListenerId = connectionProxy.onStateChange.subscribe { realState ->
- state = realState
- }
-
var onNewLocation: ((GeoIpLocation?) -> Unit)? = null
set(value) {
field = value
@@ -88,9 +77,21 @@ class LocationInfoCache(
}
}
+ init {
+ connectivityListener.connectivityNotifier.subscribe(this) { isConnected ->
+ if (isConnected && state is TunnelState.Disconnected) {
+ fetchLocation(true)
+ }
+ }
+
+ connectionProxy.onStateChange.subscribe(this) { realState ->
+ state = realState
+ }
+ }
+
fun onDestroy() {
- connectivityListener.connectivityNotifier.unsubscribe(connectivityListenerId)
- connectionProxy.onStateChange.unsubscribe(realStateListenerId)
+ connectivityListener.connectivityNotifier.unsubscribe(this)
+ connectionProxy.onStateChange.unsubscribe(this)
cancelFetch()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
index 0cbc994b4f..132517fe9f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
@@ -173,14 +173,14 @@ class MullvadVpnService : TalpidVpnService() {
private fun setUpInstance(daemon: MullvadDaemon, settings: Settings) {
val settingsListener = SettingsListener(daemon, settings).apply {
- accountNumberNotifier.subscribe { accountNumber ->
+ accountNumberNotifier.subscribe(this@MullvadVpnService) { accountNumber ->
loggedIn = accountNumber != null
}
}
val accountCache = AccountCache(daemon, settingsListener)
- val connectionProxy = ConnectionProxy(this@MullvadVpnService, daemon).apply {
+ val connectionProxy = ConnectionProxy(this, daemon).apply {
when (pendingAction) {
PendingAction.Connect -> {
if (loggedIn) {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt
index 3ba8b058a7..17af7022a8 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt
@@ -13,10 +13,6 @@ class SettingsListener(val daemon: MullvadDaemon, val initialSettings: Settings)
private val settingsNotifier: EventNotifier<Settings> = EventNotifier(settings)
- private val listenerId = daemon.onSettingsChange.subscribe { maybeSettings ->
- maybeSettings?.let { settings -> handleNewSettings(settings) }
- }
-
val accountNumberNotifier = EventNotifier(initialSettings.accountToken)
var onRelaySettingsChange: ((RelaySettings?) -> Unit)? = null
@@ -27,18 +23,24 @@ class SettingsListener(val daemon: MullvadDaemon, val initialSettings: Settings)
}
}
+ init {
+ daemon.onSettingsChange.subscribe(this) { maybeSettings ->
+ maybeSettings?.let { settings -> handleNewSettings(settings) }
+ }
+ }
+
fun onDestroy() {
- daemon.onSettingsChange.unsubscribe(listenerId)
+ daemon.onSettingsChange.unsubscribe(this)
accountNumberNotifier.unsubscribeAll()
settingsNotifier.unsubscribeAll()
}
- fun subscribe(listener: (Settings) -> Unit): Int {
- return settingsNotifier.subscribe(listener)
+ fun subscribe(id: Any, listener: (Settings) -> Unit) {
+ settingsNotifier.subscribe(id, listener)
}
- fun unsubscribe(id: Int) {
+ fun unsubscribe(id: Any) {
settingsNotifier.unsubscribe(id)
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/tunnelstate/TunnelStateUpdater.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/tunnelstate/TunnelStateUpdater.kt
index fa55dbd0cf..638a30d333 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/tunnelstate/TunnelStateUpdater.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/tunnelstate/TunnelStateUpdater.kt
@@ -12,16 +12,16 @@ class TunnelStateUpdater(context: Context, serviceNotifier: EventNotifier<Servic
private var stateSubscriptionId: Int? = null
init {
- serviceNotifier.subscribe { serviceInstance ->
+ serviceNotifier.subscribe(this) { serviceInstance ->
onNewServiceInstance(serviceInstance)
}
}
private fun onNewServiceInstance(serviceInstance: ServiceInstance?) {
- stateSubscriptionId?.let { id -> connectionProxy?.onStateChange?.unsubscribe(id) }
+ connectionProxy?.onStateChange?.unsubscribe(this)
connectionProxy = serviceInstance?.connectionProxy?.apply {
- stateSubscriptionId = onStateChange.subscribe { newState ->
+ onStateChange.subscribe(this@TunnelStateUpdater) { newState ->
persistence.state = newState
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt
index 1921546951..e070f5443c 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt
@@ -20,7 +20,6 @@ class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) {
private lateinit var wireguardMtuInput: CellInput
private lateinit var wireguardKeysMenu: View
- private var subscriptionId: Int? = null
private var updateUiJob: Job? = null
override fun onSafelyCreateView(
@@ -53,7 +52,9 @@ class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) {
}
}
- settingsListener.subscribe({ settings -> updateUi(settings) })
+ settingsListener.subscribe(this) { settings ->
+ updateUi(settings)
+ }
return view
}
@@ -68,7 +69,7 @@ class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) {
}
override fun onSafelyDestroyView() {
- subscriptionId?.let { id -> settingsListener.unsubscribe(id) }
+ settingsListener.unsubscribe(this)
updateUiJob?.cancel()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
index 1d71909d69..3adf175dc3 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
@@ -33,8 +33,6 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
private var updateTunnelStateJob: Job? = null
private var isTunnelInfoExpanded = false
- private var keyStatusListenerId: Int? = null
- private var tunnelStateListener: Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -83,7 +81,7 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
notificationBanner.onResume()
- keyStatusListenerId = keyStatusListener.onKeyStatusChange.subscribe { keyStatus ->
+ keyStatusListener.onKeyStatusChange.subscribe(this) { keyStatus ->
updateKeyStatusJob.cancel()
updateKeyStatusJob = updateKeyStatus(keyStatus)
}
@@ -100,7 +98,7 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
switchLocationButton.location = selectedRelayItem
}
- tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
+ connectionProxy.onUiStateChange.subscribe(this) { uiState ->
updateTunnelStateJob?.cancel()
updateTunnelStateJob = updateTunnelState(uiState, connectionProxy.state)
}
@@ -119,13 +117,8 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
locationInfoCache.onNewLocation = null
relayListListener.onRelayListChange = null
- keyStatusListenerId?.let { listener ->
- keyStatusListener.onKeyStatusChange.unsubscribe(listener)
- }
-
- tunnelStateListener?.let { listener ->
- connectionProxy.onUiStateChange.unsubscribe(listener)
- }
+ keyStatusListener.onKeyStatusChange.unsubscribe(this)
+ connectionProxy.onUiStateChange.unsubscribe(this)
updateLocationInfoJob?.cancel()
updateTunnelStateJob?.cancel()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
index 2bbd439325..d3fca15be7 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
@@ -26,7 +26,6 @@ class MainActivity : FragmentActivity() {
private var service: MullvadVpnService.LocalBinder? = null
private var serviceConnection: ServiceConnection? = null
- private var serviceConnectionSubscription: Int? = null
private var shouldConnect = false
private val serviceConnectionManager = object : android.content.ServiceConnection {
@@ -35,7 +34,7 @@ class MainActivity : FragmentActivity() {
service = localBinder
- serviceConnectionSubscription = localBinder.serviceNotifier.subscribe { service ->
+ localBinder.serviceNotifier.subscribe(this@MainActivity) { service ->
serviceConnection?.onDestroy()
val newConnection = service?.let { safeService ->
@@ -52,14 +51,8 @@ class MainActivity : FragmentActivity() {
}
override fun onServiceDisconnected(className: ComponentName) {
- serviceConnectionSubscription?.let { subscriptionId ->
- service?.apply {
- serviceNotifier.unsubscribe(subscriptionId)
- }
- }
-
+ service?.serviceNotifier?.unsubscribe(this@MainActivity)
serviceConnection = null
- serviceConnectionSubscription = null
serviceNotifier.notify(null)
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt
index 007589f13f..a89d4e45c5 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt
@@ -22,8 +22,6 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen)
private lateinit var disconnectButton: Button
private lateinit var redeemButton: Button
- private var tunnelStateListener: Int? = null
-
private var tunnelState: TunnelState = TunnelState.Disconnected()
set(value) {
field = value
@@ -61,7 +59,7 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen)
}
}
- tunnelStateListener = connectionProxy.onStateChange.subscribe() { newState ->
+ connectionProxy.onStateChange.subscribe(this) { newState ->
jobTracker.newUiJob("updateTunnelState") {
tunnelState = newState
}
@@ -90,10 +88,7 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen)
override fun onSafelyDestroyView() {
jobTracker.cancelAllJobs()
-
- tunnelStateListener?.let { id ->
- connectionProxy.onStateChange.unsubscribe(id)
- }
+ connectionProxy.onStateChange.unsubscribe(this)
}
private fun showRedeemVoucherDialog() {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/PreferencesFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/PreferencesFragment.kt
index 1a3eff2fa1..10b281c7f3 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/PreferencesFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/PreferencesFragment.kt
@@ -15,7 +15,6 @@ class PreferencesFragment : ServiceDependentFragment(OnNoService.GoBack) {
private lateinit var allowLanToggle: CellSwitch
private lateinit var autoConnectToggle: CellSwitch
- private var subscriptionId: Int? = null
private var updateUiJob: Job? = null
override fun onSafelyCreateView(
@@ -51,7 +50,9 @@ class PreferencesFragment : ServiceDependentFragment(OnNoService.GoBack) {
}
}
- settingsListener.subscribe({ settings -> updateUi(settings) })
+ settingsListener.subscribe(this) { settings ->
+ updateUi(settings)
+ }
return view
}
@@ -65,7 +66,7 @@ class PreferencesFragment : ServiceDependentFragment(OnNoService.GoBack) {
}
override fun onSafelyDestroyView() {
- subscriptionId?.let { id -> settingsListener.unsubscribe(id) }
+ settingsListener.unsubscribe(this)
}
private fun boolToSwitchState(pref: Boolean): CellSwitch.State {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt
index 7dde157903..d583684ad1 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt
@@ -30,7 +30,6 @@ class RedeemVoucherDialogFragment : DialogFragment() {
private lateinit var voucherInput: EditText
private var redeemButton: Button? = null
- private var subscriptionId: Int? = null
private var daemon: MullvadDaemon? = null
set(value) {
@@ -49,7 +48,7 @@ class RedeemVoucherDialogFragment : DialogFragment() {
parentActivity = context as MainActivity
- subscriptionId = parentActivity.serviceNotifier.subscribe { connection ->
+ parentActivity.serviceNotifier.subscribe(this) { connection ->
daemon = connection?.daemon
}
}
@@ -111,9 +110,7 @@ class RedeemVoucherDialogFragment : DialogFragment() {
}
override fun onDetach() {
- subscriptionId?.let { id ->
- parentActivity.serviceNotifier.unsubscribe(id)
- }
+ parentActivity.serviceNotifier.unsubscribe(this)
super.onDetach()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceAwareFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceAwareFragment.kt
index 833f539a75..b3e48acd06 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceAwareFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceAwareFragment.kt
@@ -10,22 +10,18 @@ abstract class ServiceAwareFragment : Fragment() {
var serviceConnection: ServiceConnection? = null
private set
- private var subscriptionId: Int? = null
-
override fun onAttach(context: Context) {
super.onAttach(context)
parentActivity = context as MainActivity
- subscriptionId = parentActivity.serviceNotifier.subscribe { connection ->
+ parentActivity.serviceNotifier.subscribe(this) { connection ->
configureServiceConnection(connection)
}
}
override fun onDetach() {
- subscriptionId?.let { id ->
- parentActivity.serviceNotifier.unsubscribe(id)
- }
+ parentActivity.serviceNotifier.unsubscribe(this)
super.onDetach()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
index 68e381d948..933c5bc9a4 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt
@@ -39,8 +39,6 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
private var greenColor: Int = 0
private var redColor: Int = 0
- private var keyStatusListenerId: Int? = null
- private var tunnelStateListener: Int? = null
private var tunnelState: TunnelState = TunnelState.Disconnected()
private var actionState: ActionState = ActionState.Idle(false)
@@ -144,7 +142,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
}
override fun onSafelyResume() {
- tunnelStateListener = connectionProxy.onUiStateChange.subscribe { uiState ->
+ connectionProxy.onUiStateChange.subscribe(this) { uiState ->
jobTracker.newUiJob("tunnelStateUpdate") {
synchronized(this@WireguardKeyFragment) {
tunnelState = uiState
@@ -162,7 +160,7 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
}
}
- keyStatusListenerId = keyStatusListener.onKeyStatusChange.subscribe { newKeyStatus ->
+ keyStatusListener.onKeyStatusChange.subscribe(this) { newKeyStatus ->
jobTracker.newUiJob("keyStatusUpdate") {
keyStatus = newKeyStatus
}
@@ -172,13 +170,8 @@ class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScre
}
override fun onSafelyPause() {
- tunnelStateListener?.let { listener ->
- connectionProxy.onUiStateChange.unsubscribe(listener)
- }
-
- keyStatusListenerId?.let { listener ->
- keyStatusListener.onKeyStatusChange.unsubscribe(listener)
- }
+ connectionProxy.onUiStateChange.unsubscribe(this)
+ keyStatusListener.onKeyStatusChange.unsubscribe(this)
if (!(actionState is ActionState.Idle)) {
actionState = ActionState.Idle(false)
diff --git a/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt b/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt
index 41cf1a7b3e..289f4a19b5 100644
--- a/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt
+++ b/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt
@@ -1,9 +1,16 @@
package net.mullvad.talpid.util
+// Manages listeners interested in receiving events of type T
+//
+// The listeners subscribe using an ID object. This ID is used later on for unsubscribing. The only
+// requirement is that the object uses the default implementation of the `hashCode` and `equals`
+// methods inherited from `Any` (or `Object` in Java).
+//
+// If the ID object class (or any of its super-classes) overrides `hashCode` or `equals`,
+// unsubscribe might not work correctly.
class EventNotifier<T>(private val initialValue: T) {
- private val listeners = HashMap<Int, (T) -> Unit>()
+ private val listeners = HashMap<Any, (T) -> Unit>()
- private var idCounter = 0
private var latestEvent = initialValue
fun notify(event: T) {
@@ -16,19 +23,14 @@ class EventNotifier<T>(private val initialValue: T) {
}
}
- fun subscribe(listener: (T) -> Unit): Int {
+ fun subscribe(id: Any, listener: (T) -> Unit) {
synchronized(this) {
- val id = idCounter
-
- idCounter += 1
listeners.put(id, listener)
listener(latestEvent)
-
- return id
}
}
- fun unsubscribe(id: Int) {
+ fun unsubscribe(id: Any) {
synchronized(this) {
listeners.remove(id)
}