diff --git a/app/build.gradle b/app/build.gradle index 4ed479397..2a470ab1c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { defaultConfig { applicationId 'org.rfcx.incidents' manifestPlaceholders = [auth0Domain: "@string/auth0_domain", auth0Scheme: "@string/auth0_scheme"] - versionCode 51 - versionName '1.0.13' + versionCode 52 + versionName '1.0.14' minSdkVersion 19 targetSdkVersion 31 multiDexEnabled true diff --git a/app/src/main/java/org/rfcx/incidents/data/ProjectsRepositoryImp.kt b/app/src/main/java/org/rfcx/incidents/data/ProjectsRepositoryImp.kt index 461ea7ae5..4d1c7c9b7 100644 --- a/app/src/main/java/org/rfcx/incidents/data/ProjectsRepositoryImp.kt +++ b/app/src/main/java/org/rfcx/incidents/data/ProjectsRepositoryImp.kt @@ -1,7 +1,5 @@ package org.rfcx.incidents.data -import android.os.Looper -import android.util.Log import io.reactivex.Single import org.rfcx.incidents.data.interfaces.ProjectsRepository import org.rfcx.incidents.data.local.CachedEndpointDb @@ -9,20 +7,20 @@ import org.rfcx.incidents.data.local.ProjectDb import org.rfcx.incidents.data.remote.project.ProjectsEndpoint import org.rfcx.incidents.domain.executor.PostExecutionThread import org.rfcx.incidents.entity.stream.Project +import org.rfcx.incidents.util.ConnectivityUtils class ProjectsRepositoryImp( private val endpoint: ProjectsEndpoint, private val projectDb: ProjectDb, private val cachedEndpointDb: CachedEndpointDb, + private val connectivityUtils: ConnectivityUtils, private val postExecutionThread: PostExecutionThread ) : ProjectsRepository { override fun getProjects(forceRefresh: Boolean): Single> { - if (forceRefresh || !cachedEndpointDb.hasCachedEndpoint("GetProjects")) { - Log.d("ProjectsRepo", "API") + if (forceRefresh || !cachedEndpointDb.hasCachedEndpoint("GetProjects") && connectivityUtils.isNetworkAvailable()) { return refreshFromAPI() } - Log.d("ProjectsRepo", "DB") return getFromLocalDB() } @@ -31,9 +29,7 @@ class ProjectsRepositoryImp( } private fun refreshFromAPI(): Single> { - Log.d("ProjectsRepo", "OUTSIDE: " + if (Looper.myLooper() == Looper.getMainLooper()) "MAIN THREAD" else "NOT MAIN!") return endpoint.getProjects().observeOn(postExecutionThread.scheduler).flatMap { rawProjects -> - Log.d("ProjectsRepo", "INSIDE: " + if (Looper.myLooper() == Looper.getMainLooper()) "MAIN THREAD" else "NOT MAIN!") rawProjects.forEach { projectDb.insertOrUpdate(it) } diff --git a/app/src/main/java/org/rfcx/incidents/data/StreamsRepositoryImp.kt b/app/src/main/java/org/rfcx/incidents/data/StreamsRepositoryImp.kt index 08c4e5bfb..d04b4502c 100644 --- a/app/src/main/java/org/rfcx/incidents/data/StreamsRepositoryImp.kt +++ b/app/src/main/java/org/rfcx/incidents/data/StreamsRepositoryImp.kt @@ -11,19 +11,21 @@ import org.rfcx.incidents.data.remote.streams.toStream import org.rfcx.incidents.domain.GetStreamsParams import org.rfcx.incidents.domain.executor.PostExecutionThread import org.rfcx.incidents.entity.stream.Stream +import org.rfcx.incidents.util.ConnectivityUtils class StreamsRepositoryImp( private val endpoint: Endpoint, private val streamDb: StreamDb, private val eventDb: EventDb, private val cachedEndpointDb: CachedEndpointDb, + private val connectivityUtils: ConnectivityUtils, private val postExecutionThread: PostExecutionThread ) : StreamsRepository { override fun get(params: GetStreamsParams): Single> { - if (params.streamRefresh) { + if (params.streamRefresh && connectivityUtils.isNetworkAvailable()) { return refreshFromAPI(params.projectId, params.offset, true) } - if (params.forceRefresh || !cachedEndpointDb.hasCachedEndpoint(cacheKey(params.projectId))) { + if (params.forceRefresh || !cachedEndpointDb.hasCachedEndpoint(cacheKey(params.projectId)) && connectivityUtils.isNetworkAvailable()) { return refreshFromAPI(params.projectId, params.offset) } return getFromLocalDB(params.projectId) diff --git a/app/src/main/java/org/rfcx/incidents/domain/DataModule.kt b/app/src/main/java/org/rfcx/incidents/domain/DataModule.kt index 20322da78..cf78f7542 100644 --- a/app/src/main/java/org/rfcx/incidents/domain/DataModule.kt +++ b/app/src/main/java/org/rfcx/incidents/domain/DataModule.kt @@ -41,6 +41,7 @@ import org.rfcx.incidents.data.remote.common.CredentialVerifier import org.rfcx.incidents.data.remote.common.service.ServiceFactory import org.rfcx.incidents.domain.executor.PostExecutionThread import org.rfcx.incidents.domain.executor.ThreadExecutor +import org.rfcx.incidents.util.ConnectivityUtils import org.rfcx.incidents.view.UiThread object DataModule { @@ -50,10 +51,10 @@ object DataModule { factory { JobExecutor() } bind ThreadExecutor::class factory { UiThread() } bind PostExecutionThread::class - single { ProjectsRepositoryImp(get(), get(), get(), get()) } bind ProjectsRepository::class + single { ProjectsRepositoryImp(get(), get(), get(), get(), get()) } bind ProjectsRepository::class single { GetProjectsUseCase(get(), get(), get()) } - single { StreamsRepositoryImp(get(), get(), get(), get(), get()) } bind StreamsRepository::class + single { StreamsRepositoryImp(get(), get(), get(), get(), get(), get()) } bind StreamsRepository::class single { GetStreamsUseCase(get(), get(), get()) } single { EventsRepositoryImpl(get()) } bind EventsRepository::class @@ -82,6 +83,8 @@ object DataModule { single { MediaRepositoryImp(get()) } bind MediaRepository::class single { MediaUseCase(get(), get(), get()) } + + single { ConnectivityUtils(androidContext()) } } val remoteModule = module { diff --git a/app/src/main/java/org/rfcx/incidents/util/ConnectivityUtils.kt b/app/src/main/java/org/rfcx/incidents/util/ConnectivityUtils.kt new file mode 100644 index 000000000..9311a48c3 --- /dev/null +++ b/app/src/main/java/org/rfcx/incidents/util/ConnectivityUtils.kt @@ -0,0 +1,20 @@ +package org.rfcx.incidents.util + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build + +class ConnectivityUtils(private val context: Context) { + + fun isNetworkAvailable(): Boolean { + val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) + capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + } else { + val activeNetworkInfo = cm.activeNetworkInfo + activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting + } + } +} diff --git a/releaseDetail/whatsnew-en-US b/releaseDetail/whatsnew-en-US index 6a7abef04..2f4078057 100644 --- a/releaseDetail/whatsnew-en-US +++ b/releaseDetail/whatsnew-en-US @@ -1,6 +1,2 @@ - Bug fixes - - firebase messaging crashed fixed (newer version lib) - - app crashed when open notification from bad connectivity - - app crashed when preference is not initialized - - app crashed when event start time is bigger than end time - - sites are disappear when refresh with poor connection + - Cannot load project and alerts when offline