Skip to content

Commit

Permalink
fix comments
Browse files Browse the repository at this point in the history
  • Loading branch information
danil committed Jun 1, 2024
1 parent 068d7c9 commit e6b8b42
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean> {
return Observable.create<Boolean> { emitter ->
val callback = object : ConnectivityManager.NetworkCallback() {
fun observeConnectivity(): Observable<Boolean> {
return Observable.create<Boolean> { 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())
}
}
.subscribeOn(Schedulers.io())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
companion object {
private const val VISIBILITY_CHANGE_DURATION = 400L
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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")
}))
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Boolean> = connectivityRepository.observeConnectivity()
val testObserver: TestObserver<Boolean> = 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)
}
}

0 comments on commit e6b8b42

Please sign in to comment.