Skip to content

Commit

Permalink
fixed bug with force refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
arun.sharma committed Feb 5, 2022
1 parent eb7a666 commit 9dcf5e6
Show file tree
Hide file tree
Showing 18 changed files with 118 additions and 70 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ dependencies {
implementation(project(":source-androidweekly"))
implementation(project(":source-rss"))
implementation(project(":services"))
debugImplementation(project(":devik"))
releaseImplementation(project(":devik-noop"))
// debugImplementation(project(":devik"))
// releaseImplementation(project(":devik-noop"))
implementation(Dependencies.AndroidX.Material)
implementation(Dependencies.Di.Hilt)
implementation(Dependencies.AndroidX.AppCompat)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.app.Application
import android.os.StrictMode
import androidx.work.Configuration
import com.dev.core.extensions.d
import com.dev.devik.DevikContext
//import com.dev.devik.DevikContext
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
import javax.inject.Inject
Expand All @@ -23,7 +23,7 @@ class DevUpdatesApp : Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
enableStrictMode()
DevikContext(this)
// DevikContext(this)
}

private fun enableStrictMode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ import me.arunsharma.devupdates.utils.cache.CachingProvider
import javax.inject.Inject

interface SourceConfigStore {
suspend fun getData(): List<ServiceRequest>
suspend fun fetchFromRemote(): List<ServiceRequest>
suspend fun save(data: List<ServiceRequest>)
suspend fun get(): MutableList<ServiceRequest>
suspend fun addSource(serviceRequest: ServiceRequest)
}

Expand All @@ -29,25 +30,29 @@ class SourceConfigStoreImpl @Inject constructor(

val appCache = AppCache(CacheConstants.CACHE_DATASOURCES)

override suspend fun getData(): List<ServiceRequest> {
val config = cachingProvider.cacheData<List<ServiceRequest>>(appCache) {
return try {
override suspend fun fetchFromRemote(): List<ServiceRequest> {
val config = cachingProvider.cacheData(appCache) {
try {
val result = serviceConfig.getConfig(AppConstants.CONFIG_URL)
result.data
result
} catch (exception: Exception){
val result = StorageUtils.getRawData(context, R.raw.sources)
val jsonAdapter = moshi.adapter(SourceConfig::class.java)
jsonAdapter.fromJson(result)?.data!!
jsonAdapter.fromJson(result)
}
}

return config
return config?.data ?: mutableListOf()
}

override suspend fun save(data: List<ServiceRequest>) {
cachingProvider.writeCacheData(appCache, SourceConfig(data = data))
}

override suspend fun get(): MutableList<ServiceRequest> {
return cachingProvider.readCacheData<SourceConfig>(appCache)?.data?.toMutableList() ?: mutableListOf()
}

override suspend fun addSource(serviceRequest: ServiceRequest) {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class RepoFeed @Inject constructor(
request.getGroupId(),
request.next?.toLong() ?: System.currentTimeMillis()
)
if (forceUpdate || cacheData.isNullOrEmpty()) {
if (forceUpdate || cacheData.isEmpty()) {
val result =
serviceIntegration[request.type.toString()]?.getData(request)
if (result is ResponseStatus.Success) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package me.arunsharma.devupdates.ui.fragments.addsource

import android.graphics.Color
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.dev.core.recyclerview.BaseRecyclerViewAdapter
import com.dev.core.recyclerview.BaseViewHolder
import com.dev.services.models.DataSource
import com.dev.services.models.ServiceRequest
import me.arunsharma.devupdates.R
import me.arunsharma.devupdates.databinding.ItemDataSourceBinding
Expand All @@ -26,6 +24,7 @@ class DataSourceAdapter(items: List<ServiceRequest>, val mListener: DataSourceAd
override fun convert(helper: VHDataSourceItem, item: ServiceRequest) {
helper.binding.ivServiceLogo.setImageResource(FeedUtils.getDrawable(item.type))
helper.binding.tvTitle.text = item.name
helper.addOnClickListener(R.id.btnDelete)
}

override fun createHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
Expand All @@ -45,12 +44,27 @@ class DataSourceAdapter(items: List<ServiceRequest>, val mListener: DataSourceAd
}

override fun onRowSelected(viewHolder: RecyclerView.ViewHolder) {
viewHolder.itemView.setBackgroundColor(ContextCompat.getColor(viewHolder.itemView.context, R.color.colorOnPrimary_80))
viewHolder.itemView.setBackgroundColor(
ContextCompat.getColor(
viewHolder.itemView.context,
R.color.colorOnPrimary_80
)
)
}

override fun onRowClear(viewHolder: RecyclerView.ViewHolder) {
viewHolder.itemView.setBackgroundColor(ContextCompat.getColor(viewHolder.itemView.context, R.color.colorOnPrimary))
viewHolder.itemView.setBackgroundColor(
ContextCompat.getColor(
viewHolder.itemView.context,
R.color.colorOnPrimary
)
)
mListener.onDragComplete()
}

fun removeItem(position: Int) {
mData.removeAt(position)
notifyItemRemoved(position)
}

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package me.arunsharma.devupdates.ui.fragments.addsource

import android.view.View
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.dev.core.base.BaseFragment
import com.dev.core.recyclerview.BaseRecyclerViewAdapter
import com.dev.core.utils.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import me.arunsharma.devupdates.R
import me.arunsharma.devupdates.databinding.FragmentAddDataSourceBinding
import me.arunsharma.devupdates.utils.SnackbarUtil

@AndroidEntryPoint
class AddDataSourceFragment : BaseFragment(R.layout.fragment_add_data_source) {
class DataSourceListFragment : BaseFragment(R.layout.fragment_add_data_source) {

private val binding by viewBinding(FragmentAddDataSourceBinding::bind)

Expand All @@ -32,7 +34,7 @@ class AddDataSourceFragment : BaseFragment(R.layout.fragment_add_data_source) {
setHasFixedSize(true)
}

viewModel.lvFetchConfig.observe(viewLifecycleOwner, { listItems ->
viewModel.lvFetchConfig.observe(viewLifecycleOwner) { listItems ->
binding.recyclerView.adapter =
DataSourceAdapter(listItems, object : DataSourceAdapter.DataSourceAdapterListener {
override fun onDragComplete() {
Expand All @@ -48,15 +50,32 @@ class AddDataSourceFragment : BaseFragment(R.layout.fragment_add_data_source) {
}).apply {
val itemTouchHelper = RecyclerViewMoveHelper.create(this)
itemTouchHelper.attachToRecyclerView(binding.recyclerView)

setOnItemChildClickListener(object :
BaseRecyclerViewAdapter.OnItemChildClickListener {
override fun onItemChildClick(view: View, position: Int) {
when (view.id) {
R.id.btnDelete -> onDeleteItem(this@apply, position)
}
}
})
}

})
}

viewModel.getServices()
}

private fun onDeleteItem(
adapter: DataSourceAdapter,
position: Int
) {
viewModel.deleteSource(adapter.mData[position])
adapter.removeItem(position)
}

companion object {
const val TAG = "AddDataSourceFragment"
fun newInstance(): AddDataSourceFragment = AddDataSourceFragment()
fun newInstance(): DataSourceListFragment = DataSourceListFragment()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package me.arunsharma.devupdates.ui.fragments.addsource
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.dev.core.base.BaseViewModel
import com.dev.services.models.ServiceItem
import com.dev.services.models.ServiceRequest
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
Expand All @@ -24,17 +23,31 @@ class VMDataSource @Inject constructor(
fun getServices() {
launchDataLoad {
withContext(Dispatchers.IO) {
val configList = sourceConfigStore.getData()
val configList = sourceConfigStore.fetchFromRemote()
_lvFetchConfig.postValue(configList)
}
}
}

fun saveConfig(data: List<ServiceRequest>){
fun saveConfig(data: List<ServiceRequest>) {
launchDataLoad {
withContext(Dispatchers.IO) {
sourceConfigStore.save(data = data)
}
}
}

fun deleteSource(item: ServiceRequest) {
launchDataLoad {
withContext(Dispatchers.IO) {
val data = sourceConfigStore.get()
data.removeAll { req ->
req.type == item.type && req.name == item.name
}
if(data.isNotEmpty()) {
sourceConfigStore.save(data = data)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ class FeedFragment : BaseFragment(R.layout.fragment_feed) {

override fun initView() {
binding.viewPager.offscreenPageLimit = 5
viewModel.lvFetchConfig.observe(viewLifecycleOwner, {
viewModel.lvFetchConfig.observe(viewLifecycleOwner) {
setUpViewPager(it)
})
}

if(viewModel.lvFetchConfig.value == null) {
viewModel.getConfig()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class VMFeed @Inject constructor(
fun getConfig() {
launchDataLoad {
withContext(Dispatchers.IO) {
val configList = sourceConfigStore.getData()
val configList = sourceConfigStore.fetchFromRemote()
_lvFetchConfig.postValue(configList.map { item ->
if (item.type == DataSource.MEDIUM) {
item.next = System.currentTimeMillis().toString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ open class VMFeedList @Inject constructor(
showLoading: Boolean = true
) {
launchDataLoad {
if (forceUpdate) {
request.next = null
}
if (showLoading) {
_lvUIState.value = FeedUIState.Loading
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package me.arunsharma.devupdates.ui.fragments.settings

import android.content.Context
import androidx.fragment.app.viewModels
import com.dev.core.base.BaseFragment
import com.dev.core.di.utils.DaggerInjectable
import com.dev.core.utils.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import me.arunsharma.devupdates.BuildConfig
import me.arunsharma.devupdates.R
import me.arunsharma.devupdates.databinding.FragmentSettingsBinding
import me.arunsharma.devupdates.ui.MainActivityListener
import me.arunsharma.devupdates.ui.fragments.addsource.AddDataSourceFragment
import me.arunsharma.devupdates.ui.fragments.addsource.DataSourceListFragment

@AndroidEntryPoint
class SettingsFragment : BaseFragment(R.layout.fragment_settings) {
Expand Down Expand Up @@ -45,7 +43,7 @@ class SettingsFragment : BaseFragment(R.layout.fragment_settings) {

binding.btnAdjustDataSource.setOnClickListener {
mActivityListener?.getNavigator()
?.openAddDataSourceFragment(activity, AddDataSourceFragment.newInstance())
?.openAddDataSourceFragment(activity, DataSourceListFragment.newInstance())
}

binding.tvVersionInfo.text = String.format("Version: %s-%d", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,18 @@ class CachingProvider @Inject constructor(@ApplicationContext val context: Conte
return result
}

inline fun <reified T> readCacheData(
appCache: AppCache
): T? {
return readCache(context, appCache.getCacheName())
}

inline fun <reified T> doNetworkCall(
appCache: AppCache,
networkCall: () -> T
): T {
val result = networkCall.invoke()
if (result != null) {
val result = networkCall()
if(result != null) {
writeCache(context, appCache.getCacheName(), result)
}
return result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ open class RefreshFeedSources @Inject constructor(
Timber.d("refreshing feeds")

withContext(defaultDispatcher) {
repository.refreshSources(sourceConfigStore.getData()) { request, newResult, cacheResult ->
repository.refreshSources(sourceConfigStore.fetchFromRemote()) { request, newResult, cacheResult ->
val newResultCreatedAt = newResult.first().createdAt
val cacheResultCreatedAt = cacheResult.firstOrNull()?.createdAt ?: 0
if ( newResultCreatedAt > cacheResultCreatedAt) {
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/res/layout/fragment_add_data_source.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,16 @@
<com.dev.core.view.ProgressLayout
android:id="@+id/progressLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="@dimen/_10sdp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvTooltip">
app:layout_constraintTop_toBottomOf="@+id/tvTooltip"
app:layout_constraintBottom_toBottomOf="parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
tools:listitem="@layout/item_data_source" />

Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/layout/item_data_source.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,16 @@


<ImageButton
android:id="@+id/btnDelete"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:background="@android:color/transparent"
android:src="@drawable/ic_delete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"
android:visibility="visible"
tools:visibility="visible"
/>

</androidx.constraintlayout.widget.ConstraintLayout>
Loading

0 comments on commit 9dcf5e6

Please sign in to comment.