From 551a3e3caa6920300dff0203c5fdf98c692b5769 Mon Sep 17 00:00:00 2001 From: davidoskky Date: Wed, 17 Aug 2022 20:20:44 +0200 Subject: [PATCH] Remove all connectivity checks outside the repository --- .../android/LoginActivity.kt | 17 +-- .../android/SourcesActivity.kt | 37 +++-- .../android/adapters/ItemCardAdapter.kt | 29 ++-- .../android/adapters/SourcesListAdapter.kt | 29 ++-- .../android/background/background.kt | 98 ++++++------ .../android/fragments/ArticleFragment.kt | 143 +++++++++--------- 6 files changed, 166 insertions(+), 187 deletions(-) diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt index 3ef0544..544325f 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt @@ -15,7 +15,6 @@ import androidx.appcompat.app.AppCompatActivity import bou.amine.apps.readerforselfossv2.android.databinding.ActivityLoginBinding import bou.amine.apps.readerforselfossv2.android.themes.AppColors import bou.amine.apps.readerforselfossv2.android.utils.isBaseUrlValid -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.repository.Repository import com.mikepenz.aboutlibraries.LibsBuilder import com.russhwolf.settings.Settings @@ -202,15 +201,13 @@ class LoginActivity() : AppCompatActivity(), DIAware { repository.refreshLoginInformation(url, login, password, httpLogin, httpPassword, isWithSelfSignedCert) - if (this@LoginActivity.isNetworkAvailable(this@LoginActivity.findViewById(R.id.loginForm))) { - CoroutineScope(Dispatchers.IO).launch { - val result = repository.login() - if (result) { - goToMain() - } else { - CoroutineScope(Dispatchers.Main).launch { - preferenceError(Exception("Not success")) - } + CoroutineScope(Dispatchers.IO).launch { + val result = repository.login() + if (result) { + goToMain() + } else { + CoroutineScope(Dispatchers.Main).launch { + preferenceError(Exception("Not success")) } } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/SourcesActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/SourcesActivity.kt index fe94cf3..10988e9 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/SourcesActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/SourcesActivity.kt @@ -10,7 +10,6 @@ import bou.amine.apps.readerforselfossv2.android.adapters.SourcesListAdapter import bou.amine.apps.readerforselfossv2.android.databinding.ActivitySourcesBinding import bou.amine.apps.readerforselfossv2.android.themes.AppColors import bou.amine.apps.readerforselfossv2.android.themes.Toppings -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.rest.SelfossModel import com.ftinc.scoop.Scoop @@ -64,30 +63,28 @@ class SourcesActivity : AppCompatActivity(), DIAware { binding.recyclerView.setHasFixedSize(true) binding.recyclerView.layoutManager = mLayoutManager - if (this@SourcesActivity.isNetworkAvailable(binding.recyclerView)) { - CoroutineScope(Dispatchers.Main).launch { - val response = repository.getSources() - if (response != null) { - items = response - val mAdapter = SourcesListAdapter( - this@SourcesActivity, items - ) - binding.recyclerView.adapter = mAdapter - mAdapter.notifyDataSetChanged() - if (items.isEmpty()) { - Toast.makeText( - this@SourcesActivity, - R.string.nothing_here, - Toast.LENGTH_SHORT - ).show() - } - } else { + CoroutineScope(Dispatchers.Main).launch { + val response = repository.getSources() + if (response != null) { + items = response + val mAdapter = SourcesListAdapter( + this@SourcesActivity, items + ) + binding.recyclerView.adapter = mAdapter + mAdapter.notifyDataSetChanged() + if (items.isEmpty()) { Toast.makeText( this@SourcesActivity, - R.string.cant_get_sources, + R.string.nothing_here, Toast.LENGTH_SHORT ).show() } + } else { + Toast.makeText( + this@SourcesActivity, + R.string.cant_get_sources, + Toast.LENGTH_SHORT + ).show() } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/ItemCardAdapter.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/ItemCardAdapter.kt index c4a32fe..aa87278 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/ItemCardAdapter.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/ItemCardAdapter.kt @@ -16,7 +16,6 @@ import bou.amine.apps.readerforselfossv2.android.utils.* import bou.amine.apps.readerforselfossv2.android.utils.customtabs.CustomTabActivityHelper import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop import bou.amine.apps.readerforselfossv2.android.utils.glide.circularBitmapDrawable -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.rest.SelfossModel import com.amulyakhare.textdrawable.TextDrawable @@ -110,22 +109,20 @@ class ItemCardAdapter( binding.favButton.setOnClickListener { val item = items[bindingAdapterPosition] - if (c.isNetworkAvailable()) { - if (item.starred) { - CoroutineScope(Dispatchers.IO).launch { - repository.unstarr(item) - // TODO: Handle failure - } - item.starred = false - binding.favButton.isSelected = false - } else { - CoroutineScope(Dispatchers.IO).launch { - repository.starr(item) - // TODO: Handle failure - } - item.starred = true - binding.favButton.isSelected = true + if (item.starred) { + CoroutineScope(Dispatchers.IO).launch { + repository.unstarr(item) + // TODO: Handle failure } + item.starred = false + binding.favButton.isSelected = false + } else { + CoroutineScope(Dispatchers.IO).launch { + repository.starr(item) + // TODO: Handle failure + } + item.starred = true + binding.favButton.isSelected = true } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/SourcesListAdapter.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/SourcesListAdapter.kt index 30c9260..dd7d9e0 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/SourcesListAdapter.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/adapters/SourcesListAdapter.kt @@ -14,7 +14,6 @@ import bou.amine.apps.readerforselfossv2.android.model.getIcon import bou.amine.apps.readerforselfossv2.android.model.getTitleDecoded import bou.amine.apps.readerforselfossv2.android.utils.Config import bou.amine.apps.readerforselfossv2.android.utils.glide.circularBitmapDrawable -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.android.utils.toTextDrawableString import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.rest.SelfossModel @@ -78,21 +77,19 @@ class SourcesListAdapter( val deleteBtn: Button = mView.findViewById(R.id.deleteBtn) deleteBtn.setOnClickListener { - if (c.isNetworkAvailable(null)) { - val (id) = items[adapterPosition] - CoroutineScope(Dispatchers.IO).launch { - val successfullyDeletedSource = repository.deleteSource(id) - if (successfullyDeletedSource) { - items.removeAt(adapterPosition) - notifyItemRemoved(adapterPosition) - notifyItemRangeChanged(adapterPosition, itemCount) - } else { - Toast.makeText( - app, - R.string.can_delete_source, - Toast.LENGTH_SHORT - ).show() - } + val (id) = items[adapterPosition] + CoroutineScope(Dispatchers.IO).launch { + val successfullyDeletedSource = repository.deleteSource(id) + if (successfullyDeletedSource) { + items.removeAt(adapterPosition) + notifyItemRemoved(adapterPosition) + notifyItemRangeChanged(adapterPosition, itemCount) + } else { + Toast.makeText( + app, + R.string.can_delete_source, + Toast.LENGTH_SHORT + ).show() } } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/background/background.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/background/background.kt index ddbf1d8..2bf2fa5 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/background/background.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/background/background.kt @@ -21,7 +21,6 @@ import bou.amine.apps.readerforselfossv2.android.persistence.migrations.MIGRATIO import bou.amine.apps.readerforselfossv2.android.persistence.migrations.MIGRATION_2_3 import bou.amine.apps.readerforselfossv2.android.persistence.migrations.MIGRATION_3_4 import bou.amine.apps.readerforselfossv2.android.utils.Config -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.rest.SelfossModel import bou.amine.apps.readerforselfossv2.utils.ItemType @@ -46,65 +45,60 @@ override fun doWork(): Result { val periodicRefresh = settings.getBoolean("periodic_refresh", false) if (periodicRefresh) { - if (context.isNetworkAvailable()) { + CoroutineScope(Dispatchers.IO).launch { + val notificationManager = + applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - CoroutineScope(Dispatchers.IO).launch { - val notificationManager = - applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val notification = + NotificationCompat.Builder(applicationContext, Config.syncChannelId) + .setContentTitle(context.getString(R.string.loading_notification_title)) + .setContentText(context.getString(R.string.loading_notification_text)) + .setOngoing(true) + .setPriority(PRIORITY_LOW) + .setChannelId(Config.syncChannelId) + .setSmallIcon(R.drawable.ic_stat_cloud_download_black_24dp) - val notification = - NotificationCompat.Builder(applicationContext, Config.syncChannelId) - .setContentTitle(context.getString(R.string.loading_notification_title)) - .setContentText(context.getString(R.string.loading_notification_text)) - .setOngoing(true) - .setPriority(PRIORITY_LOW) - .setChannelId(Config.syncChannelId) - .setSmallIcon(R.drawable.ic_stat_cloud_download_black_24dp) + notificationManager.notify(1, notification.build()) - notificationManager.notify(1, notification.build()) + val notifyNewItems = settings.getBoolean("notify_new_items", false) - val notifyNewItems = settings.getBoolean("notify_new_items", false) + db = Room.databaseBuilder( + applicationContext, + AppDatabase::class.java, "selfoss-database" + ).addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3) + .addMigrations(MIGRATION_3_4).build() - db = Room.databaseBuilder( - applicationContext, - AppDatabase::class.java, "selfoss-database" - ).addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3) - .addMigrations(MIGRATION_3_4).build() + val actions = db.actionsDao().actions() - val actions = db.actionsDao().actions() - - actions.forEach { action -> - when { - action.read -> doAndReportOnFail( - repository.markAsReadById(action.articleId.toInt()), - action - ) - action.unread -> doAndReportOnFail( - repository.unmarkAsReadById(action.articleId.toInt()), - action - ) - action.starred -> doAndReportOnFail( - repository.starrById(action.articleId.toInt()), - action - ) - action.unstarred -> doAndReportOnFail( - repository.unstarrById(action.articleId.toInt()), - action - ) - } + actions.forEach { action -> + when { + action.read -> doAndReportOnFail( + repository.markAsReadById(action.articleId.toInt()), + action + ) + action.unread -> doAndReportOnFail( + repository.unmarkAsReadById(action.articleId.toInt()), + action + ) + action.starred -> doAndReportOnFail( + repository.starrById(action.articleId.toInt()), + action + ) + action.unstarred -> doAndReportOnFail( + repository.unstarrById(action.articleId.toInt()), + action + ) } + } - if (context.isNetworkAvailable()) { - launch { - try { - val newItems = repository.allItems(ItemType.UNREAD) - handleNewItemsNotification(newItems, notifyNewItems, notificationManager) - val readItems = repository.allItems(ItemType.ALL) - val starredItems = repository.allItems(ItemType.STARRED) - // TODO: save all to DB - } catch (e: Throwable) {} - } - } + launch { + try { + val newItems = repository.allItems(ItemType.UNREAD) + handleNewItemsNotification(newItems, notifyNewItems, notificationManager) + val readItems = repository.allItems(ItemType.ALL) + val starredItems = repository.allItems(ItemType.STARRED) + // TODO: save all to DB + } catch (e: Throwable) {} } } } diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt index 2b9d6b2..3fca8d8 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt @@ -35,7 +35,6 @@ import bou.amine.apps.readerforselfossv2.android.utils.* import bou.amine.apps.readerforselfossv2.android.utils.customtabs.CustomTabActivityHelper import bou.amine.apps.readerforselfossv2.android.utils.glide.getBitmapInputStream import bou.amine.apps.readerforselfossv2.android.utils.glide.loadMaybeBasicAuth -import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAvailable import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.rest.SelfossModel import bou.amine.apps.readerforselfossv2.utils.isEmptyOrNullOrNullString @@ -276,89 +275,87 @@ class ArticleFragment : Fragment(), DIAware { } private fun getContentFromMercury(customTabsIntent: CustomTabsIntent) { - if ((context != null && requireContext().isNetworkAvailable(null)) || context == null) { - binding.progressBar.visibility = View.VISIBLE - val parser = MercuryApi() + binding.progressBar.visibility = View.VISIBLE + val parser = MercuryApi() - parser.parseUrl(url).enqueue( - object : Callback { - override fun onResponse( - call: Call, - response: Response - ) { - // TODO: clean all the following after finding the mercury content issue - try { - if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) { + parser.parseUrl(url).enqueue( + object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + // TODO: clean all the following after finding the mercury content issue + try { + if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) { + try { + binding.titleView.text = response.body()!!.title + if (typeface != null) { + binding.titleView.typeface = typeface + } try { - binding.titleView.text = response.body()!!.title - if (typeface != null) { - binding.titleView.typeface = typeface - } + // Note: Mercury may return relative urls... If it does the url val will not be changed. + URL(response.body()!!.url) + url = response.body()!!.url + } catch (e: MalformedURLException) { + // Mercury returned a relative url. We do nothing. + } + } catch (e: Exception) { + } + + try { + contentText = response.body()!!.content.orEmpty() + htmlToWebview() + } catch (e: Exception) { + } + + try { + if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty() && context != null) { + binding.imageView.visibility = View.VISIBLE try { - // Note: Mercury may return relative urls... If it does the url val will not be changed. - URL(response.body()!!.url) - url = response.body()!!.url - } catch (e: MalformedURLException) { - // Mercury returned a relative url. We do nothing. + Glide + .with(requireContext()) + .asBitmap() + .loadMaybeBasicAuth(config, response.body()!!.lead_image_url.orEmpty()) + .apply(RequestOptions.fitCenterTransform()) + .into(binding.imageView) + } catch (e: Exception) { } - } catch (e: Exception) { + } else { + binding.imageView.visibility = View.GONE } - - try { - contentText = response.body()!!.content.orEmpty() - htmlToWebview() - } catch (e: Exception) { - } - - try { - if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty() && context != null) { - binding.imageView.visibility = View.VISIBLE - try { - Glide - .with(requireContext()) - .asBitmap() - .loadMaybeBasicAuth(config, response.body()!!.lead_image_url.orEmpty()) - .apply(RequestOptions.fitCenterTransform()) - .into(binding.imageView) - } catch (e: Exception) { - } - } else { - binding.imageView.visibility = View.GONE - } - } catch (e: Exception) { - if (context != null) { - } - } - - try { - binding.nestedScrollView.scrollTo(0, 0) - - binding.progressBar.visibility = View.GONE - } catch (e: Exception) { - if (context != null) { - } - } - } else { - try { - openInBrowserAfterFailing(customTabsIntent) - } catch (e: Exception) { - if (context != null) { - } + } catch (e: Exception) { + if (context != null) { } } - } catch (e: Exception) { - if (context != null) { + + try { + binding.nestedScrollView.scrollTo(0, 0) + + binding.progressBar.visibility = View.GONE + } catch (e: Exception) { + if (context != null) { + } + } + } else { + try { + openInBrowserAfterFailing(customTabsIntent) + } catch (e: Exception) { + if (context != null) { + } } } + } catch (e: Exception) { + if (context != null) { + } } - - override fun onFailure( - call: Call, - t: Throwable - ) = openInBrowserAfterFailing(customTabsIntent) } - ) - } + + override fun onFailure( + call: Call, + t: Throwable + ) = openInBrowserAfterFailing(customTabsIntent) + } + ) } private fun htmlToWebview() {