From e6b8b42b3bd8a2877160cbb836f618064f1fb5c7 Mon Sep 17 00:00:00 2001 From: danil Date: Sat, 1 Jun 2024 15:17:51 +0300 Subject: [PATCH] fix comments --- .../repository/ConnectivityRepository.kt | 32 +++---- .../dedis/popstellar/ui/NetworkStatusView.kt | 44 +++++----- .../dedis/popstellar/ui/home/HomeActivity.kt | 8 +- .../dedis/popstellar/ui/home/HomeViewModel.kt | 29 +++--- .../dedis/popstellar/ui/lao/LaoViewModel.kt | 17 ++-- .../repository/ConnectivityRepositoryTest.kt | 88 +++++++++++++++++++ 6 files changed, 155 insertions(+), 63 deletions(-) create mode 100644 fe2-android/app/src/test/unit/java/com/github/dedis/popstellar/repository/ConnectivityRepositoryTest.kt diff --git a/fe2-android/app/src/main/java/com/github/dedis/popstellar/repository/ConnectivityRepository.kt b/fe2-android/app/src/main/java/com/github/dedis/popstellar/repository/ConnectivityRepository.kt index e66dabff61..f5b9394b26 100644 --- a/fe2-android/app/src/main/java/com/github/dedis/popstellar/repository/ConnectivityRepository.kt +++ b/fe2-android/app/src/main/java/com/github/dedis/popstellar/repository/ConnectivityRepository.kt @@ -3,35 +3,35 @@ package com.github.dedis.popstellar.repository import android.app.Application import android.content.Context import android.net.ConnectivityManager -import io.reactivex.schedulers.Schedulers import io.reactivex.Observable +import io.reactivex.schedulers.Schedulers import javax.inject.Inject import javax.inject.Singleton @Singleton class ConnectivityRepository @Inject constructor(application: Application) { - private val connectivityManager = - application.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + private val connectivityManager = + application.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) + as ConnectivityManager - fun observeConnectivity(): Observable { - return Observable.create { emitter -> - val callback = object : ConnectivityManager.NetworkCallback() { + fun observeConnectivity(): Observable { + return Observable.create { emitter -> + val callback = + object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: android.net.Network) { - emitter.onNext(true) + emitter.onNext(true) } override fun onLost(network: android.net.Network) { - emitter.onNext(false) + emitter.onNext(false) } - } + } - connectivityManager.registerDefaultNetworkCallback(callback) + connectivityManager.registerDefaultNetworkCallback(callback) - emitter.setCancellable { - connectivityManager.unregisterNetworkCallback(callback) - } + emitter.setCancellable { connectivityManager.unregisterNetworkCallback(callback) } } - .subscribeOn(Schedulers.io()) - } -} \ No newline at end of file + .subscribeOn(Schedulers.io()) + } +} diff --git a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/NetworkStatusView.kt b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/NetworkStatusView.kt index f22e6df380..39a3e2c808 100644 --- a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/NetworkStatusView.kt +++ b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/NetworkStatusView.kt @@ -11,28 +11,32 @@ import android.widget.FrameLayout import androidx.core.view.isVisible import com.github.dedis.popstellar.databinding.NetworkStatusBinding -class NetworkStatusView @JvmOverloads constructor( - context: Context, attrs: AttributeSet, defStyleAttr: Int = 0, defStyleRes: Int = 0, +class NetworkStatusView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet, + defStyleAttr: Int = 0, + defStyleRes: Int = 0, ) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) { - private val binding = NetworkStatusBinding.inflate(LayoutInflater.from(context), this, true) + private val binding = NetworkStatusBinding.inflate(LayoutInflater.from(context), this, true) - fun setIsNetworkConnected(isVisible: Boolean) { - setVisibility(isVisible) - } + fun setIsNetworkConnected(isVisible: Boolean) { + setVisibility(isVisible) + } - private fun setVisibility(isVisible: Boolean) { - TransitionManager.beginDelayedTransition( - this.parent as ViewGroup, - Slide(Gravity.TOP).apply { - addTarget(binding.networkConnectionContainer) - duration = VISIBILITY_CHANGE_DURATION - } - ) - binding.networkConnectionContainer.isVisible = !isVisible - } + private fun setVisibility(isVisible: Boolean) { + TransitionManager.beginDelayedTransition( + this.parent as ViewGroup, + Slide(Gravity.TOP).apply { + addTarget(binding.networkConnectionContainer) + duration = VISIBILITY_CHANGE_DURATION + }) + binding.networkConnectionContainer.isVisible = !isVisible + } - companion object { - private const val VISIBILITY_CHANGE_DURATION = 400L - } -} \ No newline at end of file + companion object { + private const val VISIBILITY_CHANGE_DURATION = 400L + } +} diff --git a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeActivity.kt b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeActivity.kt index e449e9f4a9..c455db6d79 100644 --- a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeActivity.kt +++ b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeActivity.kt @@ -81,11 +81,11 @@ class HomeActivity : AppCompatActivity() { } } - private fun observeInternetConnection() { - viewModel.isInternetConnected.observe(this) { - binding.networkStatusView.setIsNetworkConnected(it) - } + private fun observeInternetConnection() { + viewModel.isInternetConnected.observe(this) { + binding.networkStatusView.setIsNetworkConnected(it) } + } private fun handleTopAppBar() { viewModel.pageTitle.observe(this) { resId: Int -> binding.topAppBar.setTitle(resId) } diff --git a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeViewModel.kt b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeViewModel.kt index b97aaf8a08..f8150f5ef0 100644 --- a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeViewModel.kt +++ b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/home/HomeViewModel.kt @@ -40,13 +40,13 @@ class HomeViewModel @Inject /** Dependencies for this class */ constructor( - application: Application, - private val gson: Gson, - private val wallet: Wallet, - private val laoRepository: LAORepository, - private val networkManager: GlobalNetworkManager, - private val connectivityRepository: ConnectivityRepository, - private val appDatabase: AppDatabase + application: Application, + private val gson: Gson, + private val wallet: Wallet, + private val laoRepository: LAORepository, + private val networkManager: GlobalNetworkManager, + private val connectivityRepository: ConnectivityRepository, + private val appDatabase: AppDatabase ) : AndroidViewModel(application), QRCodeScanningViewModel, PopViewModel { /** LiveData objects that represent the state in a fragment */ private val isWalletSetup = MutableLiveData(false) @@ -198,13 +198,14 @@ constructor( fun observeInternetConnection() { addDisposable( - connectivityRepository.observeConnectivity() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { isConnected -> isInternetConnected.value = isConnected}, - { error: Throwable -> Timber.tag(LaoViewModel.TAG).e(error, "error connection status") } - ) - ) + connectivityRepository + .observeConnectivity() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { isConnected -> isInternetConnected.value = isConnected }, + { error: Throwable -> + Timber.tag(LaoViewModel.TAG).e(error, "error connection status") + })) } /** diff --git a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/lao/LaoViewModel.kt b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/lao/LaoViewModel.kt index 50ea40c156..112a9f6289 100644 --- a/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/lao/LaoViewModel.kt +++ b/fe2-android/app/src/main/java/com/github/dedis/popstellar/ui/lao/LaoViewModel.kt @@ -32,8 +32,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable -import kotlinx.coroutines.flow.observeOn import javax.inject.Inject +import kotlinx.coroutines.flow.observeOn import timber.log.Timber @HiltViewModel @@ -225,14 +225,13 @@ constructor( } fun observeInternetConnection() { - addDisposable( - connectivityRepository.observeConnectivity() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { isConnected -> isInternetConnected.value = isConnected}, - { error: Throwable -> Timber.tag(TAG).e(error, "error connection status") } - ) - ) + addDisposable( + connectivityRepository + .observeConnectivity() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { isConnected -> isInternetConnected.value = isConnected }, + { error: Throwable -> Timber.tag(TAG).e(error, "error connection status") })) } private fun isRollCallAttended(rollcall: RollCall, laoId: String): Boolean { diff --git a/fe2-android/app/src/test/unit/java/com/github/dedis/popstellar/repository/ConnectivityRepositoryTest.kt b/fe2-android/app/src/test/unit/java/com/github/dedis/popstellar/repository/ConnectivityRepositoryTest.kt new file mode 100644 index 0000000000..3bde2b5736 --- /dev/null +++ b/fe2-android/app/src/test/unit/java/com/github/dedis/popstellar/repository/ConnectivityRepositoryTest.kt @@ -0,0 +1,88 @@ +package com.github.dedis.popstellar.repository + +import android.app.Application +import android.content.Context +import android.net.ConnectivityManager +import android.net.ConnectivityManager.NetworkCallback +import android.net.Network +import io.reactivex.Observable +import io.reactivex.observers.TestObserver +import org.junit.Assert.* +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.* +import org.mockito.Mockito.* +import org.mockito.junit.MockitoJUnitRunner + + +@RunWith(MockitoJUnitRunner::class) +class ConnectivityRepositoryTest { + @Mock + private lateinit var application: Application + + @Mock + private lateinit var context: Context + + @Mock + lateinit var connectivityManager: ConnectivityManager + + private lateinit var connectivityRepository: ConnectivityRepository + + @Before + fun setUp() { + MockitoAnnotations.openMocks(this) + `when`(application.applicationContext).thenReturn(context) + `when`(context.getSystemService(Context.CONNECTIVITY_SERVICE)) + .thenReturn(connectivityManager) + connectivityRepository = ConnectivityRepository(application) + } + + @Test + fun testObserveConnectivity_onAvailable() { + val callbackCaptor = ArgumentCaptor.forClass( + NetworkCallback::class.java + ) + + val observable: Observable = connectivityRepository.observeConnectivity() + val testObserver: TestObserver = observable.test() + + verify(connectivityManager).registerDefaultNetworkCallback(callbackCaptor.capture()) + val callback = callbackCaptor.value + + callback.onAvailable(mock(Network::class.java)) + testObserver.assertValue(true) + } + + @Test + fun testObserveConnectivity_onLost() { + val callbackCaptor = ArgumentCaptor.forClass( + NetworkCallback::class.java + ) + + val observable = connectivityRepository.observeConnectivity() + val testObserver = observable.test() + + verify(connectivityManager).registerDefaultNetworkCallback(callbackCaptor.capture()) + val callback = callbackCaptor.value + + callback.onLost(mock(Network::class.java)) + testObserver.assertValue(false) + } + + @Test + fun testObserveConnectivity_cancellable() { + val callbackCaptor = ArgumentCaptor.forClass( + NetworkCallback::class.java + ) + + val observable = connectivityRepository.observeConnectivity() + val testObserver = observable.test() + + verify(connectivityManager).registerDefaultNetworkCallback(callbackCaptor.capture()) + val callback = callbackCaptor.value + + testObserver.dispose() + verify(connectivityManager).unregisterNetworkCallback(callback) + } +} \ No newline at end of file