Really big settings cleaning.
This commit is contained in:
@ -68,10 +68,6 @@
|
||||
android:name=".ImageActivity">
|
||||
</activity>
|
||||
|
||||
<meta-data
|
||||
android:name="bou.amine.apps.readerforselfossv2.android.utils.glide.SelfSignedGlideModule"
|
||||
android:value="GlideModule" />
|
||||
|
||||
<meta-data android:name="android.webkit.WebView.MetricsOptOut"
|
||||
android:value="true" />
|
||||
|
||||
|
@ -12,7 +12,7 @@ import bou.amine.apps.readerforselfossv2.android.themes.Toppings
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.isBaseUrlValid
|
||||
import bou.amine.apps.readerforselfossv2.model.NetworkUnavailableException
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.ApiDetailsService
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.ftinc.scoop.Scoop
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -31,7 +31,7 @@ class AddSourceActivity : AppCompatActivity(), DIAware {
|
||||
|
||||
override val di by closestDI()
|
||||
private val repository : Repository by instance()
|
||||
private val apiDetailsService : ApiDetailsService by instance()
|
||||
private val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
appColors = AppColors(this@AddSourceActivity)
|
||||
@ -83,7 +83,7 @@ class AddSourceActivity : AppCompatActivity(), DIAware {
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
|
||||
val baseUrl = apiDetailsService.getBaseUrl()
|
||||
val baseUrl = appSettingsService.getBaseUrl()
|
||||
if (baseUrl.isEmpty() || !baseUrl.isBaseUrlValid(this@AddSourceActivity)) {
|
||||
mustLoginToAddSource()
|
||||
} else {
|
||||
|
@ -35,7 +35,7 @@ import bou.amine.apps.readerforselfossv2.android.utils.bottombar.removeBadge
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.customtabs.CustomTabActivityHelper
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.ApiDetailsService
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import bou.amine.apps.readerforselfossv2.utils.*
|
||||
import com.ashokvarma.bottomnavigation.BottomNavigationBar
|
||||
import com.ashokvarma.bottomnavigation.BottomNavigationItem
|
||||
@ -69,7 +69,6 @@ import kotlin.concurrent.thread
|
||||
|
||||
class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAware {
|
||||
|
||||
private val MENU_PREFERENCES = 12302
|
||||
private val DRAWER_ID_TAGS = 100101L
|
||||
private val DRAWER_ID_HIDDEN_TAGS = 101100L
|
||||
private val DRAWER_ID_SOURCES = 100110L
|
||||
@ -77,21 +76,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
|
||||
private var items: ArrayList<SelfossModel.Item> = ArrayList()
|
||||
|
||||
private var internalBrowser = false
|
||||
private var articleViewer = false
|
||||
private var shouldBeCardView = false
|
||||
private var displayUnreadCount = false
|
||||
private var displayAllCount = false
|
||||
private var fullHeightCards: Boolean = false
|
||||
private var elementsShown: ItemType = ItemType.UNREAD
|
||||
private var lastFetchDone: Boolean = false
|
||||
private var updateSources: Boolean = true
|
||||
private var markOnScroll: Boolean = false
|
||||
private var hiddenTags: List<String> = emptyList()
|
||||
|
||||
private var periodicRefresh = false
|
||||
private var refreshMinutes: Long = 360L
|
||||
private var refreshWhenChargingOnly = false
|
||||
|
||||
private lateinit var tabNewBadge: TextBadgeItem
|
||||
private lateinit var tabArchiveBadge: TextBadgeItem
|
||||
@ -101,7 +87,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
private var offset: Int = 0
|
||||
private var firstVisible: Int = 0
|
||||
private lateinit var recyclerViewScrollListener: RecyclerView.OnScrollListener
|
||||
private var settings = Settings()
|
||||
private lateinit var binding: ActivityHomeBinding
|
||||
|
||||
private var recyclerAdapter: RecyclerView.Adapter<*>? = null
|
||||
@ -112,6 +97,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
|
||||
override val di by closestDI()
|
||||
private val repository : Repository by instance()
|
||||
private val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
data class DrawerData(val tags: List<SelfossModel.Tag>?, val sources: List<SelfossModel.Source>?)
|
||||
|
||||
@ -121,6 +107,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
||||
// Add appcolors to DI
|
||||
appColors = AppColors(this@HomeActivity)
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
@ -152,8 +140,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
|
||||
handleSwipeRefreshLayout()
|
||||
|
||||
handleSettings()
|
||||
|
||||
getElementsAccordingToTab()
|
||||
|
||||
|
||||
@ -292,7 +278,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
|
||||
// TODO: Make this the only appcolors init
|
||||
appColors = AppColors(this@HomeActivity)
|
||||
|
||||
handleDrawerItems()
|
||||
@ -301,10 +286,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
|
||||
reloadLayoutManager()
|
||||
|
||||
if (!settings.getBoolean("infinite_loading", false)) {
|
||||
binding.recyclerView.setHasFixedSize(true)
|
||||
} else {
|
||||
if (appSettingsService.isInfiniteLoadingEnabled()) {
|
||||
handleInfiniteScroll()
|
||||
} else {
|
||||
binding.recyclerView.setHasFixedSize(true)
|
||||
}
|
||||
|
||||
handleBottomBarActions()
|
||||
@ -323,31 +308,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
customTabActivityHelper.unbindCustomTabsService(this)
|
||||
}
|
||||
|
||||
private fun handleSettings() {
|
||||
// TODO : clean this
|
||||
internalBrowser = settings.getBoolean("prefer_internal_browser", true)
|
||||
articleViewer = settings.getBoolean("prefer_article_viewer", true)
|
||||
shouldBeCardView = settings.getBoolean("card_view_active", false)
|
||||
displayUnreadCount = settings.getBoolean("display_unread_count", true)
|
||||
displayAllCount = settings.getBoolean("display_other_count", false)
|
||||
fullHeightCards = settings.getBoolean("full_height_cards", false)
|
||||
|
||||
updateSources = settings.getBoolean("update_sources", true)
|
||||
markOnScroll = settings.getBoolean("mark_on_scroll", false)
|
||||
hiddenTags = if (settings.getString("hidden_tags", "").isNotEmpty()) {
|
||||
settings.getString("hidden_tags", "").replace("\\s".toRegex(), "").split(",")
|
||||
} else {
|
||||
emptyList()
|
||||
}
|
||||
periodicRefresh = settings.getBoolean("periodic_refresh", false)
|
||||
refreshWhenChargingOnly = settings.getBoolean("refresh_when_charging", false)
|
||||
refreshMinutes = settings.getString("periodic_refresh_minutes", "360").toLong()
|
||||
|
||||
if (refreshMinutes <= 15) {
|
||||
refreshMinutes = 15
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleThemeBinding() {
|
||||
val scoop = Scoop.getInstance()
|
||||
scoop.bind(this, Toppings.PRIMARY.value, binding.toolBar)
|
||||
@ -401,16 +361,13 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
|
||||
binding.drawerContainer.addDrawerListener(drawerListener)
|
||||
|
||||
val displayAccountHeader =
|
||||
settings.getBoolean("account_header_displaying", false)
|
||||
|
||||
binding.mainDrawer.addStickyFooterItem(
|
||||
PrimaryDrawerItem().apply {
|
||||
nameRes = R.string.drawer_report_bug
|
||||
iconRes = R.drawable.ic_bug_report_black_24dp
|
||||
isIconTinted = true
|
||||
onDrawerItemClickListener = { _, _, _ ->
|
||||
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(ApiDetailsService.trackerUrl))
|
||||
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(AppSettingsService.trackerUrl))
|
||||
startActivity(browserIntent)
|
||||
false
|
||||
}
|
||||
@ -427,12 +384,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
})
|
||||
|
||||
if (displayAccountHeader) {
|
||||
if (appSettingsService.isDisplayAccountHeaderEnabled()) {
|
||||
AccountHeaderView(this).apply {
|
||||
attachToSliderView(binding.mainDrawer)
|
||||
addProfiles(
|
||||
ProfileDrawerItem().apply {
|
||||
nameText = settings.getString("url", "")
|
||||
nameText = appSettingsService.getBaseUrl()
|
||||
setBackgroundResource(R.drawable.bg)
|
||||
iconRes = R.mipmap.ic_launcher
|
||||
selectionListEnabledForSingleProfile = false
|
||||
@ -496,7 +453,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
} else {
|
||||
val filteredTags = maybeTags
|
||||
.filterNot { hiddenTags.contains(it.tag) }
|
||||
.filterNot { appSettingsService.getHiddenTags().contains(it.tag) }
|
||||
.sortedBy { it.unread == 0 }
|
||||
tagsBadge = filteredTags.map {
|
||||
createDrawerItem(it)
|
||||
@ -518,7 +475,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
} else {
|
||||
val filteredHiddenTags: List<SelfossModel.Tag> =
|
||||
maybeTags.filter { hiddenTags.contains(it.tag) }
|
||||
maybeTags.filter { appSettingsService.getHiddenTags().contains(it.tag) }
|
||||
tagsBadge = filteredHiddenTags.map {
|
||||
createDrawerItem(it)
|
||||
|
||||
@ -574,7 +531,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
}
|
||||
)
|
||||
if (hiddenTags.isNotEmpty()) {
|
||||
if (appSettingsService.getHiddenTags().isNotEmpty()) {
|
||||
binding.mainDrawer.itemAdapter.add(
|
||||
DividerDrawerItem(),
|
||||
SecondaryDrawerItem().apply {
|
||||
@ -707,7 +664,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
// This will only update the layout manager if settings changed
|
||||
when (currentManager) {
|
||||
is StaggeredGridLayoutManager ->
|
||||
if (!shouldBeCardView) {
|
||||
if (!appSettingsService.isCardViewEnabled()) {
|
||||
layoutManager = GridLayoutManager(
|
||||
this,
|
||||
calculateNoOfColumns()
|
||||
@ -715,7 +672,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
binding.recyclerView.layoutManager = layoutManager
|
||||
}
|
||||
is GridLayoutManager ->
|
||||
if (shouldBeCardView) {
|
||||
if (appSettingsService.isCardViewEnabled()) {
|
||||
layoutManager = StaggeredGridLayoutManager(
|
||||
calculateNoOfColumns(),
|
||||
StaggeredGridLayoutManager.VERTICAL
|
||||
@ -726,7 +683,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
else ->
|
||||
if (currentManager == null) {
|
||||
if (!shouldBeCardView) {
|
||||
if (!appSettingsService.isCardViewEnabled()) {
|
||||
layoutManager = GridLayoutManager(
|
||||
this,
|
||||
calculateNoOfColumns()
|
||||
@ -862,15 +819,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
|
||||
if (recyclerAdapter == null) {
|
||||
if (shouldBeCardView) {
|
||||
if (appSettingsService.isCardViewEnabled()) {
|
||||
recyclerAdapter =
|
||||
ItemCardAdapter(
|
||||
this,
|
||||
items,
|
||||
customTabActivityHelper,
|
||||
internalBrowser, // TODO remove and use from apidetailsservice
|
||||
articleViewer, // TODO remove and use from apidetailsservice
|
||||
fullHeightCards, // TODO remove and use from apidetailsservice
|
||||
appColors,
|
||||
) {
|
||||
updateItems(it)
|
||||
@ -881,8 +835,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
this,
|
||||
items,
|
||||
customTabActivityHelper,
|
||||
internalBrowser, // TODO remove and use from apidetailsservice
|
||||
articleViewer, // TODO remove and use from apidetailsservice
|
||||
appColors,
|
||||
) {
|
||||
updateItems(it)
|
||||
@ -905,7 +857,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
|
||||
private fun reloadBadges() {
|
||||
if (displayUnreadCount || displayAllCount) {
|
||||
if (appSettingsService.isDisplayUnreadCountEnabled() || appSettingsService.isDisplayAllCountEnabled()) {
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
repository.reloadBadges()
|
||||
reloadBadgeContent()
|
||||
@ -914,12 +866,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
|
||||
private fun reloadBadgeContent() {
|
||||
if (displayUnreadCount) {
|
||||
if (appSettingsService.isDisplayUnreadCountEnabled()) {
|
||||
tabNewBadge
|
||||
.setText(repository.badgeUnread.toString())
|
||||
.maybeShow()
|
||||
}
|
||||
if (displayAllCount) {
|
||||
if (appSettingsService.isDisplayAllCountEnabled()) {
|
||||
tabArchiveBadge
|
||||
.setText(repository.badgeAll.toString())
|
||||
.maybeShow()
|
||||
@ -1038,8 +990,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
return true
|
||||
}
|
||||
R.id.action_disconnect -> {
|
||||
val settings = Settings()
|
||||
settings.clear()
|
||||
appSettingsService.clearAll()
|
||||
val intent = Intent(this, LoginActivity::class.java)
|
||||
this.startActivity(intent)
|
||||
this@HomeActivity.finish()
|
||||
@ -1062,15 +1013,15 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
|
||||
private fun handleRecurringTask() {
|
||||
if (periodicRefresh) {
|
||||
if (appSettingsService.isPeriodicRefreshEnabled()) {
|
||||
val myConstraints = Constraints.Builder()
|
||||
.setRequiresBatteryNotLow(true)
|
||||
.setRequiresCharging(refreshWhenChargingOnly)
|
||||
.setRequiresCharging(appSettingsService.isRefreshWhenChargingOnlyEnabled())
|
||||
.setRequiresStorageNotLow(true)
|
||||
.build()
|
||||
|
||||
val backgroundWork =
|
||||
PeriodicWorkRequestBuilder<LoadingWorker>(refreshMinutes, TimeUnit.MINUTES)
|
||||
PeriodicWorkRequestBuilder<LoadingWorker>(appSettingsService.getRefreshMinutes(), TimeUnit.MINUTES)
|
||||
.setConstraints(myConstraints)
|
||||
.addTag("selfoss-loading")
|
||||
.build()
|
||||
@ -1078,9 +1029,5 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
WorkManager.getInstance(baseContext).enqueueUniquePeriodicWork("selfoss-loading", ExistingPeriodicWorkPolicy.KEEP, backgroundWork)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleOfflineActions() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,8 +16,8 @@ import bou.amine.apps.readerforselfossv2.android.databinding.ActivityLoginBindin
|
||||
import bou.amine.apps.readerforselfossv2.android.themes.AppColors
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.isBaseUrlValid
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.mikepenz.aboutlibraries.LibsBuilder
|
||||
import com.russhwolf.settings.Settings
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@ -25,19 +25,19 @@ import org.kodein.di.DIAware
|
||||
import org.kodein.di.android.closestDI
|
||||
import org.kodein.di.instance
|
||||
|
||||
class LoginActivity() : AppCompatActivity(), DIAware {
|
||||
class LoginActivity : AppCompatActivity(), DIAware {
|
||||
|
||||
private var inValidCount: Int = 0
|
||||
private var isWithSelfSignedCert = false
|
||||
private var isWithLogin = false
|
||||
private var isWithHTTPLogin = false
|
||||
|
||||
private val settings = Settings()
|
||||
private lateinit var appColors: AppColors
|
||||
private lateinit var binding: ActivityLoginBinding
|
||||
|
||||
override val di by closestDI()
|
||||
private val repository : Repository by instance()
|
||||
private val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
appColors = AppColors(this@LoginActivity)
|
||||
@ -52,7 +52,7 @@ class LoginActivity() : AppCompatActivity(), DIAware {
|
||||
|
||||
handleBaseUrlFail()
|
||||
|
||||
if (settings.getString("url", "").isNotEmpty()) {
|
||||
if (appSettingsService.getBaseUrl().isNotEmpty()) {
|
||||
goToMain()
|
||||
}
|
||||
|
||||
@ -117,11 +117,8 @@ class LoginActivity() : AppCompatActivity(), DIAware {
|
||||
}
|
||||
|
||||
private fun preferenceError(t: Throwable) {
|
||||
settings.remove("url")
|
||||
settings.remove("login")
|
||||
settings.remove("httpUserName")
|
||||
settings.remove("password")
|
||||
settings.remove("httpPassword")
|
||||
appSettingsService.resetLoginInformation()
|
||||
|
||||
binding.urlView.error = getString(R.string.wrong_infos)
|
||||
binding.loginView.error = getString(R.string.wrong_infos)
|
||||
binding.passwordView.error = getString(R.string.wrong_infos)
|
||||
@ -199,7 +196,7 @@ class LoginActivity() : AppCompatActivity(), DIAware {
|
||||
} else {
|
||||
showProgress(true)
|
||||
|
||||
repository.refreshLoginInformation(url, login, password, httpLogin, httpPassword, isWithSelfSignedCert)
|
||||
repository.refreshLoginInformation(url, login, password, isWithSelfSignedCert)
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val result = repository.login()
|
||||
|
@ -18,7 +18,7 @@ import bou.amine.apps.readerforselfossv2.android.viewmodel.AppViewModel
|
||||
import bou.amine.apps.readerforselfossv2.dao.DriverFactory
|
||||
import bou.amine.apps.readerforselfossv2.dao.ReaderForSelfossDB
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.ApiDetailsService
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.ftinc.scoop.Scoop
|
||||
@ -48,12 +48,10 @@ class MyApp : MultiDexApplication(), DIAware {
|
||||
private val viewModel: AppViewModel by instance()
|
||||
private val connectivityStatus: ConnectivityStatus by instance()
|
||||
private val driverFactory: DriverFactory by instance()
|
||||
private lateinit var settings : Settings
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
Napier.base(DebugAntilog())
|
||||
settings = Settings()
|
||||
|
||||
initDrawerImageLoader()
|
||||
|
||||
@ -90,11 +88,11 @@ class MyApp : MultiDexApplication(), DIAware {
|
||||
|
||||
val name = getString(R.string.notification_channel_sync)
|
||||
val importance = NotificationManager.IMPORTANCE_LOW
|
||||
val mChannel = NotificationChannel(ApiDetailsService.syncChannelId, name, importance)
|
||||
val mChannel = NotificationChannel(AppSettingsService.syncChannelId, name, importance)
|
||||
|
||||
val newItemsChannelname = getString(R.string.new_items_channel_sync)
|
||||
val newItemsChannelimportance = NotificationManager.IMPORTANCE_DEFAULT
|
||||
val newItemsChannelmChannel = NotificationChannel(ApiDetailsService.newItemsChannelId, newItemsChannelname, newItemsChannelimportance)
|
||||
val newItemsChannelmChannel = NotificationChannel(AppSettingsService.newItemsChannelId, newItemsChannelname, newItemsChannelimportance)
|
||||
|
||||
notificationManager.createNotificationChannel(mChannel)
|
||||
notificationManager.createNotificationChannel(newItemsChannelmChannel)
|
||||
|
@ -16,8 +16,8 @@ import bou.amine.apps.readerforselfossv2.android.themes.AppColors
|
||||
import bou.amine.apps.readerforselfossv2.android.themes.Toppings
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.ftinc.scoop.Scoop
|
||||
import com.russhwolf.settings.Settings
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@ -27,7 +27,6 @@ import org.kodein.di.instance
|
||||
|
||||
class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
|
||||
private var markOnScroll: Boolean = false
|
||||
private var currentItem: Int = 0
|
||||
private lateinit var appColors: AppColors
|
||||
|
||||
@ -35,12 +34,9 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
|
||||
private lateinit var binding: ActivityReaderBinding
|
||||
|
||||
private var activeAlignment: Int = 1
|
||||
private val JUSTIFY = 1
|
||||
private val ALIGN_LEFT = 2
|
||||
|
||||
override val di by closestDI()
|
||||
private val repository: Repository by instance()
|
||||
private val appSettingsService: AppSettingsService by instance()
|
||||
|
||||
private fun showMenuItem(willAddToFavorite: Boolean) {
|
||||
if (willAddToFavorite) {
|
||||
@ -58,8 +54,6 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
showMenuItem(false)
|
||||
}
|
||||
|
||||
private var settings = Settings()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
appColors = AppColors(this)
|
||||
@ -76,9 +70,6 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||
|
||||
markOnScroll = settings.getBoolean("mark_on_scroll", false)
|
||||
activeAlignment = settings.getInt("text_align", JUSTIFY)
|
||||
|
||||
if (allItems.isEmpty()) {
|
||||
finish()
|
||||
}
|
||||
@ -98,10 +89,9 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
}
|
||||
|
||||
private fun readItem(item: SelfossModel.Item) {
|
||||
if (markOnScroll) {
|
||||
if (appSettingsService.isMarkOnScrollEnabled()) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
repository.markAsRead(item)
|
||||
// TODO: Handle failure
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -142,7 +132,7 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
}
|
||||
|
||||
private fun alignmentMenu() {
|
||||
val showJustify = activeAlignment == ALIGN_LEFT
|
||||
val showJustify = appSettingsService.getActiveAllignment() == AppSettingsService.ALIGN_LEFT
|
||||
toolbarMenu.findItem(R.id.align_left).isVisible = !showJustify
|
||||
toolbarMenu.findItem(R.id.align_justify).isVisible = showJustify
|
||||
}
|
||||
@ -211,21 +201,19 @@ class ReaderActivity : AppCompatActivity(), DIAware {
|
||||
}
|
||||
}
|
||||
R.id.align_left -> {
|
||||
activeAlignment = ALIGN_LEFT
|
||||
switchAlignmentSetting()
|
||||
switchAlignmentSetting(AppSettingsService.ALIGN_LEFT)
|
||||
refreshFragment()
|
||||
}
|
||||
R.id.align_justify -> {
|
||||
activeAlignment = JUSTIFY
|
||||
switchAlignmentSetting()
|
||||
switchAlignmentSetting(AppSettingsService.JUSTIFY)
|
||||
refreshFragment()
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
private fun switchAlignmentSetting() {
|
||||
settings.putInt("text_align", activeAlignment)
|
||||
private fun switchAlignmentSetting(allignment: Int) {
|
||||
appSettingsService.changeAllignment(allignment)
|
||||
alignmentMenu()
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularBitmapDrawable
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded
|
||||
import bou.amine.apps.readerforselfossv2.utils.getIcon
|
||||
import bou.amine.apps.readerforselfossv2.utils.getThumbnail
|
||||
@ -34,9 +35,6 @@ class ItemCardAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
private val helper: CustomTabActivityHelper,
|
||||
private val internalBrowser: Boolean,
|
||||
private val articleViewer: Boolean,
|
||||
private val fullHeightCards: Boolean,
|
||||
override val appColors: AppColors,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
) : ItemsAdapter<ItemCardAdapter.ViewHolder>() {
|
||||
@ -47,6 +45,7 @@ class ItemCardAdapter(
|
||||
|
||||
override val di: DI by closestDI(app)
|
||||
override val repository : Repository by instance()
|
||||
override val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = CardItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
@ -66,7 +65,7 @@ class ItemCardAdapter(
|
||||
|
||||
binding.sourceTitleAndDate.text = itm.sourceAndDateText(repository.dateUtils)
|
||||
|
||||
if (!fullHeightCards) {
|
||||
if (!appSettingsService.isFullHeightCardsEnabled()) {
|
||||
binding.itemImage.maxHeight = imageMaxHeight
|
||||
binding.itemImage.scaleType = ScaleType.CENTER_CROP
|
||||
}
|
||||
@ -146,8 +145,8 @@ class ItemCardAdapter(
|
||||
bindingAdapterPosition,
|
||||
items[bindingAdapterPosition].getLinkDecoded(),
|
||||
customTabsIntent,
|
||||
internalBrowser,
|
||||
articleViewer,
|
||||
appSettingsService.isInternalBrowserEnabled(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app
|
||||
)
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularBitmapDrawable
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded
|
||||
import bou.amine.apps.readerforselfossv2.utils.getIcon
|
||||
import bou.amine.apps.readerforselfossv2.utils.getThumbnail
|
||||
@ -27,8 +28,6 @@ class ItemListAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
private val helper: CustomTabActivityHelper,
|
||||
private val internalBrowser: Boolean,
|
||||
private val articleViewer: Boolean,
|
||||
override val appColors: AppColors,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
) : ItemsAdapter<ItemListAdapter.ViewHolder>() {
|
||||
@ -37,6 +36,7 @@ class ItemListAdapter(
|
||||
|
||||
override val di: DI by closestDI(app)
|
||||
override val repository : Repository by instance()
|
||||
override val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = ListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
@ -94,8 +94,8 @@ class ItemListAdapter(
|
||||
bindingAdapterPosition,
|
||||
items[bindingAdapterPosition].getLinkDecoded(),
|
||||
customTabsIntent,
|
||||
internalBrowser,
|
||||
articleViewer,
|
||||
appSettingsService.isInternalBrowserEnabled(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app
|
||||
)
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import bou.amine.apps.readerforselfossv2.android.R
|
||||
import bou.amine.apps.readerforselfossv2.android.themes.AppColors
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import bou.amine.apps.readerforselfossv2.utils.ItemType
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@ -18,6 +19,7 @@ import org.kodein.di.DIAware
|
||||
abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>(), DIAware {
|
||||
abstract var items: ArrayList<SelfossModel.Item>
|
||||
abstract val repository: Repository
|
||||
abstract val appSettingsService: AppSettingsService
|
||||
abstract val app: Activity
|
||||
abstract val appColors: AppColors
|
||||
abstract val updateItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
@ -92,8 +94,6 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
private fun unreadItemAtIndex(position: Int, showSnackbar: Boolean = true) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
repository.unmarkAsRead(items[position])
|
||||
// Todo: SharedItems.unreadItem(app, api, db, items[position])
|
||||
// TODO: update db
|
||||
|
||||
}
|
||||
notifyItemChanged(position)
|
||||
|
@ -17,7 +17,7 @@ import bou.amine.apps.readerforselfossv2.android.model.preloadImages
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.network.isNetworkAccessible
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.ApiDetailsService
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.russhwolf.settings.Settings
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -31,33 +31,32 @@ class LoadingWorker(val context: Context, params: WorkerParameters) : Worker(con
|
||||
|
||||
override val di by lazy { (applicationContext as MyApp).di }
|
||||
private val repository : Repository by instance()
|
||||
private val appSettingsService : AppSettingsService by instance()
|
||||
|
||||
override fun doWork(): Result {
|
||||
val settings = Settings()
|
||||
val periodicRefresh = settings.getBoolean("periodic_refresh", false)
|
||||
if (periodicRefresh && isNetworkAccessible(context)) {
|
||||
if (appSettingsService.isPeriodicRefreshEnabled() && isNetworkAccessible(context)) {
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val notificationManager =
|
||||
applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
val notification =
|
||||
NotificationCompat.Builder(applicationContext, ApiDetailsService.syncChannelId)
|
||||
NotificationCompat.Builder(applicationContext, AppSettingsService.syncChannelId)
|
||||
.setContentTitle(context.getString(R.string.loading_notification_title))
|
||||
.setContentText(context.getString(R.string.loading_notification_text))
|
||||
.setOngoing(true)
|
||||
.setPriority(PRIORITY_LOW)
|
||||
.setChannelId(ApiDetailsService.syncChannelId)
|
||||
.setChannelId(AppSettingsService.syncChannelId)
|
||||
.setSmallIcon(R.drawable.ic_stat_cloud_download_black_24dp)
|
||||
|
||||
notificationManager.notify(1, notification.build())
|
||||
|
||||
val notifyNewItems = settings.getBoolean("notify_new_items", false)
|
||||
|
||||
repository.handleDBActions()
|
||||
|
||||
launch {
|
||||
handleNewItemsNotification(repository.tryToCacheItemsAndGetNewOnes(), notifyNewItems, notificationManager)
|
||||
if (appSettingsService.isNotifyNewItemsEnabled()) {
|
||||
launch {
|
||||
handleNewItemsNotification(repository.tryToCacheItemsAndGetNewOnes(), notificationManager)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -66,7 +65,6 @@ override fun doWork(): Result {
|
||||
|
||||
private fun handleNewItemsNotification(
|
||||
newItems: List<SelfossModel.Item>?,
|
||||
notifyNewItems: Boolean,
|
||||
notificationManager: NotificationManager
|
||||
) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
@ -74,7 +72,7 @@ override fun doWork(): Result {
|
||||
|
||||
|
||||
val newSize = apiItems.filter { it.unread }.size
|
||||
if (notifyNewItems && newSize > 0) {
|
||||
if (newSize > 0) {
|
||||
|
||||
val intent = Intent(context, MainActivity::class.java).apply {
|
||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
@ -87,7 +85,7 @@ override fun doWork(): Result {
|
||||
val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, pflags)
|
||||
|
||||
val newItemsNotification =
|
||||
NotificationCompat.Builder(applicationContext, ApiDetailsService.newItemsChannelId)
|
||||
NotificationCompat.Builder(applicationContext, AppSettingsService.newItemsChannelId)
|
||||
.setContentTitle(context.getString(R.string.new_items_notification_title))
|
||||
.setContentText(
|
||||
context.getString(
|
||||
@ -96,7 +94,7 @@ override fun doWork(): Result {
|
||||
)
|
||||
)
|
||||
.setPriority(PRIORITY_DEFAULT)
|
||||
.setChannelId(ApiDetailsService.newItemsChannelId)
|
||||
.setChannelId(AppSettingsService.newItemsChannelId)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setAutoCancel(true)
|
||||
.setSmallIcon(R.drawable.ic_tab_fiber_new_black_24dp)
|
||||
|
@ -31,6 +31,7 @@ import bou.amine.apps.readerforselfossv2.android.utils.customtabs.CustomTabActiv
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.getBitmapInputStream
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded
|
||||
import bou.amine.apps.readerforselfossv2.utils.getImages
|
||||
import bou.amine.apps.readerforselfossv2.utils.getThumbnail
|
||||
@ -74,8 +75,7 @@ class ArticleFragment : Fragment(), DIAware {
|
||||
|
||||
override val di : DI by closestDI()
|
||||
private val repository: Repository by instance()
|
||||
|
||||
private var settings = Settings()
|
||||
private val appSettingsService: AppSettingsService by instance()
|
||||
|
||||
private var typeface: Typeface? = null
|
||||
private var resId: Int = 0
|
||||
@ -114,10 +114,10 @@ class ArticleFragment : Fragment(), DIAware {
|
||||
contentSource = item.sourceAndDateText(repository.dateUtils)
|
||||
allImages = item.getImages()
|
||||
|
||||
fontSize = settings.getString("reader_font_size", "16").toInt()
|
||||
staticBar = settings.getBoolean("reader_static_bar", false)
|
||||
fontSize = appSettingsService.getFontSize()
|
||||
staticBar = appSettingsService.isStaticBarEnabled()
|
||||
font = appSettingsService.getFont()
|
||||
|
||||
font = settings.getString("reader_font", "")
|
||||
if (font.isNotEmpty()) {
|
||||
resId = requireContext().resources.getIdentifier(font, "font", requireContext().packageName)
|
||||
typeface = try {
|
||||
@ -239,7 +239,7 @@ class ArticleFragment : Fragment(), DIAware {
|
||||
.setTitle(requireContext().getString(R.string.webview_dialog_issue_title))
|
||||
.setPositiveButton(android.R.string.ok
|
||||
) { _, _ ->
|
||||
settings.putBoolean("prefer_article_viewer", false)
|
||||
appSettingsService.disableArticleViewer()
|
||||
requireActivity().finish()
|
||||
}
|
||||
.create()
|
||||
@ -255,7 +255,7 @@ class ArticleFragment : Fragment(), DIAware {
|
||||
}
|
||||
|
||||
private fun refreshAlignment() {
|
||||
textAlignment = when (settings.getInt("text_align", 1)) {
|
||||
textAlignment = when (appSettingsService.getActiveAllignment()) {
|
||||
1 -> "justify"
|
||||
2 -> "left"
|
||||
else -> "justify"
|
||||
|
@ -14,8 +14,9 @@ import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import bou.amine.apps.readerforselfossv2.android.R
|
||||
import bou.amine.apps.readerforselfossv2.android.databinding.ActivitySettingsBinding
|
||||
import bou.amine.apps.readerforselfossv2.android.themes.AppColors
|
||||
import bou.amine.apps.readerforselfossv2.android.themes.Toppings
|
||||
import bou.amine.apps.readerforselfossv2.service.ApiDetailsService
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
import com.ftinc.scoop.Scoop
|
||||
import com.russhwolf.settings.Settings
|
||||
import java.lang.NumberFormatException
|
||||
@ -174,12 +175,7 @@ class SettingsActivity : AppCompatActivity(),
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
val id = item.itemId
|
||||
if (id == R.id.clear) {
|
||||
val settings = Settings()
|
||||
settings.remove("color_primary")
|
||||
settings.remove("color_primary_dark")
|
||||
settings.remove("color_accent")
|
||||
settings.remove("color_accent_dark")
|
||||
settings.remove("dark_theme")
|
||||
AppColors.resetColors()
|
||||
requireActivity().recreate()
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
@ -196,17 +192,17 @@ class SettingsActivity : AppCompatActivity(),
|
||||
setPreferencesFromResource(R.xml.pref_links, rootKey)
|
||||
|
||||
preferenceManager.findPreference<Preference>("trackerLink")?.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
openUrl(Uri.parse(ApiDetailsService.trackerUrl))
|
||||
openUrl(Uri.parse(AppSettingsService.trackerUrl))
|
||||
true
|
||||
}
|
||||
|
||||
preferenceManager.findPreference<Preference>("sourceLink")?.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
openUrl(Uri.parse(ApiDetailsService.sourceUrl))
|
||||
openUrl(Uri.parse(AppSettingsService.sourceUrl))
|
||||
false
|
||||
}
|
||||
|
||||
preferenceManager.findPreference<Preference>("translation")?.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
openUrl(Uri.parse(ApiDetailsService.translationUrl))
|
||||
openUrl(Uri.parse(AppSettingsService.translationUrl))
|
||||
false
|
||||
}
|
||||
}
|
||||
|
@ -58,4 +58,15 @@ class AppColors(a: Activity) {
|
||||
a.resources.getColor(R.color.grey_900)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun resetColors() {
|
||||
val settings = Settings()
|
||||
settings.remove("color_primary")
|
||||
settings.remove("color_primary_dark")
|
||||
settings.remove("color_accent")
|
||||
settings.remove("color_accent_dark")
|
||||
settings.remove("dark_theme")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,33 +0,0 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.utils.glide
|
||||
|
||||
import android.content.Context
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.getUnsafeHttpClient
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.GlideBuilder
|
||||
import com.bumptech.glide.Registry
|
||||
import com.bumptech.glide.load.model.GlideUrl
|
||||
import com.bumptech.glide.module.GlideModule
|
||||
import com.russhwolf.settings.Settings
|
||||
import java.io.InputStream
|
||||
|
||||
class SelfSignedGlideModule : GlideModule {
|
||||
|
||||
override fun applyOptions(context: Context?, builder: GlideBuilder?) {
|
||||
}
|
||||
|
||||
override fun registerComponents(context: Context?, glide: Glide?, registry: Registry?) {
|
||||
|
||||
if (context != null) {
|
||||
val settings = Settings()
|
||||
if (settings.getBoolean("isSelfSignedCert", false)) {
|
||||
val client = getUnsafeHttpClient().build()
|
||||
|
||||
registry?.append(
|
||||
GlideUrl::class.java,
|
||||
InputStream::class.java,
|
||||
com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader.Factory(client)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user