diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-25 09:15:01 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-25 09:15:01 -0300 |
| commit | f2f1752439826baebe827e46b479964a26010dc6 (patch) | |
| tree | 90bfd9106a2652a6d5796b20983609938ae1f268 /android/src/main | |
| parent | 119510c7356ab4c6858a01d330d3b1452026c3ab (diff) | |
| parent | 94e51f89373dd08f89950119cfbefb4bcc285935 (diff) | |
| download | mullvadvpn-f2f1752439826baebe827e46b479964a26010dc6.tar.xz mullvadvpn-f2f1752439826baebe827e46b479964a26010dc6.zip | |
Merge branch 'refactor-event-notifier-ids'
Diffstat (limited to 'android/src/main')
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) } |
