From b12ab265cbe766b3bb5c389748dd2329f8b0227e Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:50:12 +0530 Subject: [PATCH 01/62] lottie dependency added --- feature_mybooks/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/feature_mybooks/build.gradle b/feature_mybooks/build.gradle index 11e0c6c6..b9464c6f 100644 --- a/feature_mybooks/build.gradle +++ b/feature_mybooks/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation(LibraryDependency.GLIDE) kapt(LibraryDependency.GLIDE_COMPILER) implementation(LibraryDependency.KOIN_X_VIEWMODEL) + implementation(LibraryDependency.LOTTIE) } From ec082d85abfe3c3f95ac98cca792e201d74dc149 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:50:34 +0530 Subject: [PATCH 02/62] dimen resource added --- feature_mybooks/src/main/res/values/dimens.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 feature_mybooks/src/main/res/values/dimens.xml diff --git a/feature_mybooks/src/main/res/values/dimens.xml b/feature_mybooks/src/main/res/values/dimens.xml new file mode 100644 index 00000000..b2506fad --- /dev/null +++ b/feature_mybooks/src/main/res/values/dimens.xml @@ -0,0 +1,10 @@ + + + 16dp + 24dp + 2dp + 16dp + 90dp + 16dp + 8dp + \ No newline at end of file From f45d46864eb110e5e6140cd3a170e721ebd9b705 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:50:50 +0530 Subject: [PATCH 03/62] string resource added --- feature_mybooks/src/main/res/values/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 feature_mybooks/src/main/res/values/strings.xml diff --git a/feature_mybooks/src/main/res/values/strings.xml b/feature_mybooks/src/main/res/values/strings.xml new file mode 100644 index 00000000..c5631a76 --- /dev/null +++ b/feature_mybooks/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + + My Books + navigate to previous screen + No Books found in Storage + book thumbnail image + + \ No newline at end of file From 2fadcde2debc354965faea555a047501dc5c9f1f Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:51:15 +0530 Subject: [PATCH 04/62] no book found layout added --- .../main/res/layout/layout_no_books_found.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 feature_mybooks/src/main/res/layout/layout_no_books_found.xml diff --git a/feature_mybooks/src/main/res/layout/layout_no_books_found.xml b/feature_mybooks/src/main/res/layout/layout_no_books_found.xml new file mode 100644 index 00000000..8c904685 --- /dev/null +++ b/feature_mybooks/src/main/res/layout/layout_no_books_found.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file From 3fe29536be6340d5d59939badb50f0c818f3c296 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:51:37 +0530 Subject: [PATCH 05/62] book item layout added --- .../main/res/layout/my_books_item_layout.xml | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 feature_mybooks/src/main/res/layout/my_books_item_layout.xml diff --git a/feature_mybooks/src/main/res/layout/my_books_item_layout.xml b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml new file mode 100644 index 00000000..eb79c671 --- /dev/null +++ b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 67936f9f871df04679e1dfa93eaae20549464644 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Mon, 18 May 2020 23:51:58 +0530 Subject: [PATCH 06/62] fragment UI layout added --- .../res/layout/fragment_mybooks_layout.xml | 90 +++++++++++++++++-- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml index 73bd022a..f3529746 100644 --- a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml +++ b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml @@ -1,17 +1,93 @@ - + - + + + + + + + + + + + android:layout_height="wrap_content" + android:clipToPadding="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/bookStats"/> + + + + + + - \ No newline at end of file From 7eb7391c6e61bfde07a61d28b5f206a167590933 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:31:05 +0530 Subject: [PATCH 07/62] added action to navigate to Book Details screen --- common/src/main/res/navigation/nav_graph.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/src/main/res/navigation/nav_graph.xml b/common/src/main/res/navigation/nav_graph.xml index f8221fd6..dcd89cb9 100644 --- a/common/src/main/res/navigation/nav_graph.xml +++ b/common/src/main/res/navigation/nav_graph.xml @@ -38,8 +38,11 @@ + Date: Tue, 19 May 2020 15:31:49 +0530 Subject: [PATCH 08/62] domain model added for local books --- .../feature_mybooks/data/model/LocalBookDomainModel.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt new file mode 100644 index 00000000..7f6848f2 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt @@ -0,0 +1,9 @@ +package com.allsoftdroid.audiobook.feature_mybooks.data.model + +data class LocalBookDomainModel ( + val bookTitle:String, + val bookIdentifier:String, + val bookAuthor:String, + val bookChaptersDownloaded:String, + val fileNames:List +) \ No newline at end of file From 9fb24399f4756c0be59b628a70d2eb5a2f4523d3 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:32:27 +0530 Subject: [PATCH 09/62] implementation for local books repository --- .../repository/LocalBooksRepositoryImpl.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt new file mode 100644 index 00000000..d8b1d896 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt @@ -0,0 +1,21 @@ +package com.allsoftdroid.audiobook.feature_mybooks.data.repository + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import com.allsoftdroid.audiobook.feature_mybooks.domain.ILocalBooksRepository + +class LocalBooksRepositoryImpl : ILocalBooksRepository { + + private val list:List = emptyList() + + override suspend fun getAllBooks(): List { + return list + } + + override suspend fun removeBook(identifier: String) { + + } + + override suspend fun deleteAllChapters(identifier: String) { + + } +} \ No newline at end of file From 5c835849232769273f6d1c8741edf225f05f4489 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:33:08 +0530 Subject: [PATCH 10/62] di module added for local books module --- .../feature_mybooks/di/LocalBooksModule.kt | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt new file mode 100644 index 00000000..84b0fe42 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt @@ -0,0 +1,56 @@ +package com.allsoftdroid.audiobook.feature_mybooks.di + +import com.allsoftdroid.audiobook.feature_mybooks.presentation.LocalBooksViewModel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.core.context.loadKoinModules +import org.koin.core.context.unloadKoinModules +import org.koin.core.module.Module +import org.koin.core.qualifier.named +import org.koin.dsl.module +import kotlin.coroutines.CoroutineContext + +object LocalBooksModule { + + fun injectFeature() = + loadFeature + + fun unLoadModules(){ + unloadKoinModules( + listOf( + localBooksViewModel, + jobModule + ) + ) + } + + private val loadFeature by lazy { + loadKoinModules(listOf( + localBooksViewModel, + jobModule + )) + } + + var localBooksViewModel : Module = module { + viewModel { + LocalBooksViewModel() + } + } + + var jobModule : Module = module { + + single(named(name = SUPER_VISOR_JOB)) { + SupervisorJob() + } + + factory(named(name = VIEW_MODEL_SCOPE)) { + CoroutineScope(get(named(name = SUPER_VISOR_JOB)) as CoroutineContext + Dispatchers.Main) + } + } + + const val SUPER_VISOR_JOB = "SuperVisorJob_LocalBooks" + const val VIEW_MODEL_SCOPE = "ViewModelScope_LocalBooks" + const val BEAN_NAME = "LocalBooksFragment" +} \ No newline at end of file From 3536340450b021476702656c019841f0af51b333 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:34:00 +0530 Subject: [PATCH 11/62] local books repository contract added --- .../feature_mybooks/domain/ILocalBooksRepository.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt new file mode 100644 index 00000000..5a55d1ff --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt @@ -0,0 +1,11 @@ +package com.allsoftdroid.audiobook.feature_mybooks.domain + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel + +interface ILocalBooksRepository { + suspend fun getAllBooks():List + + suspend fun removeBook(identifier:String) + + suspend fun deleteAllChapters(identifier: String) +} \ No newline at end of file From 2a93e60093eb54388e2c875a72f5678b4b56a4cb Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:34:30 +0530 Subject: [PATCH 12/62] local books view model --- .../presentation/LocalBooksViewModel.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt new file mode 100644 index 00000000..5d47fc33 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt @@ -0,0 +1,41 @@ +package com.allsoftdroid.audiobook.feature_mybooks.presentation + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.SUPER_VISOR_JOB +import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.VIEW_MODEL_SCOPE +import com.allsoftdroid.audiobook.feature_mybooks.utils.Empty +import com.allsoftdroid.audiobook.feature_mybooks.utils.RequestStatus +import com.allsoftdroid.common.base.extension.Event +import kotlinx.coroutines.CompletableJob +import kotlinx.coroutines.CoroutineScope +import org.koin.core.KoinComponent +import org.koin.core.inject +import org.koin.core.qualifier.named + +class LocalBooksViewModel : ViewModel(),KoinComponent { + /** + * cancelling this job cancels all the job started by this viewmodel + */ + private val viewModelJob: CompletableJob by inject(named(name = SUPER_VISOR_JOB)) + + /** + * main scope for all coroutine launched by viewmodel + */ + private val viewModelScope : CoroutineScope by inject(named(name = VIEW_MODEL_SCOPE)) + + private var _requestStatus = MutableLiveData>() + val requestStatus : LiveData> = _requestStatus + + init { + _requestStatus.value = Event(Empty) + } + + + //cancel the job when viewmodel is not longer in use + override fun onCleared() { + super.onCleared() + viewModelJob.cancel() + } +} \ No newline at end of file From cb3099d7da18c005ce521a49323b0b2ce0583112 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:35:18 +0530 Subject: [PATCH 13/62] ui element listener added --- .../feature_mybooks/MyBooksFragment.kt | 28 ----- .../presentation/MyBooksFragment.kt | 103 ++++++++++++++++++ 2 files changed, 103 insertions(+), 28 deletions(-) delete mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/MyBooksFragment.kt create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/MyBooksFragment.kt deleted file mode 100644 index ff57539c..00000000 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/MyBooksFragment.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.allsoftdroid.audiobook.feature_mybooks - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.activity.OnBackPressedCallback -import com.allsoftdroid.audiobook.feature_mybooks.databinding.FragmentMybooksLayoutBinding -import com.allsoftdroid.common.base.fragment.BaseUIFragment - -class MyBooksFragment : BaseUIFragment() { - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val dataBinding:FragmentMybooksLayoutBinding = inflateLayout(inflater, - R.layout.fragment_mybooks_layout,container,false) - - return dataBinding.root - } - - override fun handleBackPressEvent(callback: OnBackPressedCallback) { - callback.isEnabled = false - requireActivity().onBackPressed() - } -} \ No newline at end of file diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt new file mode 100644 index 00000000..6417cc25 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -0,0 +1,103 @@ +package com.allsoftdroid.audiobook.feature_mybooks.presentation + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.allsoftdroid.audiobook.feature_mybooks.R +import com.allsoftdroid.audiobook.feature_mybooks.databinding.FragmentMybooksLayoutBinding +import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule +import com.allsoftdroid.audiobook.feature_mybooks.presentation.recyclerView.ItemClickedListener +import com.allsoftdroid.audiobook.feature_mybooks.presentation.recyclerView.LocalBookAdapter +import com.allsoftdroid.audiobook.feature_mybooks.presentation.recyclerView.OptionsClickedListener +import com.allsoftdroid.audiobook.feature_mybooks.utils.Empty +import com.allsoftdroid.audiobook.feature_mybooks.utils.Started +import com.allsoftdroid.audiobook.feature_mybooks.utils.Success +import com.allsoftdroid.common.base.fragment.BaseUIFragment +import org.koin.core.KoinComponent +import org.koin.core.inject + +class MyBooksFragment : BaseUIFragment(),KoinComponent { + + private val localBooksViewModel : LocalBooksViewModel by inject() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val dataBinding:FragmentMybooksLayoutBinding = inflateLayout(inflater, + R.layout.fragment_mybooks_layout,container,false) + + LocalBooksModule.injectFeature() + + dataBinding.lifecycleOwner = viewLifecycleOwner + + val adapter = LocalBookAdapter( + this.requireActivity(), + + ItemClickedListener { + Toast.makeText(this.requireActivity(), it,Toast.LENGTH_SHORT).show() + }, + + OptionsClickedListener( + onDeleteBook = { + Toast.makeText(this.requireActivity(), "Delete:"+it.bookTitle,Toast.LENGTH_SHORT).show() + }, + + onRemoveChapters = { + Toast.makeText(this.requireActivity(), "Delete All:"+it.bookTitle,Toast.LENGTH_SHORT).show() + } + ) + ) + + dataBinding.recyclerViewBooks.adapter = adapter + + //recycler view layout manager + dataBinding.recyclerViewBooks.apply { + layoutManager = LinearLayoutManager(context) + } + + dataBinding.toolbarBackArrow.setOnClickListener { + onBackPressed() + } + + localBooksViewModel.requestStatus.observe(viewLifecycleOwner, Observer { + it.getContentIfNotHandled()?.let { status-> + when(status){ + is Empty -> { + dataBinding.loadingProgressbar.visibility = View.GONE + dataBinding.noLocalBooks.visibility = View.VISIBLE + dataBinding.bookCount.visibility = View.GONE + dataBinding.recyclerViewBooks.visibility = View.GONE + } + + is Started -> { + dataBinding.loadingProgressbar.visibility = View.VISIBLE + dataBinding.noLocalBooks.visibility = View.GONE + dataBinding.bookCount.visibility = View.GONE + dataBinding.recyclerViewBooks.visibility = View.GONE + } + + is Success -> { + dataBinding.loadingProgressbar.visibility = View.GONE + dataBinding.noLocalBooks.visibility = View.GONE + dataBinding.bookCount.visibility = View.VISIBLE + dataBinding.recyclerViewBooks.visibility = View.VISIBLE + } + } + } + }) + + return dataBinding.root + } + + override fun handleBackPressEvent(callback: OnBackPressedCallback) { + callback.isEnabled = false + requireActivity().onBackPressed() + } +} \ No newline at end of file From 229f20f6de487864bff6311001b2f69484f912a0 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:36:42 +0530 Subject: [PATCH 14/62] local books list adapter added --- .../recyclerView/LocalBookAdapter.kt | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookAdapter.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookAdapter.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookAdapter.kt new file mode 100644 index 00000000..a7ba0198 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookAdapter.kt @@ -0,0 +1,108 @@ +package com.allsoftdroid.audiobook.feature_mybooks.presentation.recyclerView + +import android.annotation.SuppressLint +import android.content.Context +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.PopupMenu +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.allsoftdroid.audiobook.feature_mybooks.R +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import timber.log.Timber + +class LocalBookAdapter( + private val context: Context, + private val itemClickedListener: ItemClickedListener, + private val optionsClickedListener: OptionsClickedListener +): ListAdapter(RandomBookDiffCallback()) { + + /** + * Create view Holder of type BookViewHolder + */ + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return LocalBookItemViewHolder.from(parent) + } + + /** + * Bind the ViewHolder with the data item + */ + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when(holder){ + is LocalBookItemViewHolder ->{ + val dataItem = getItem(position) + holder.bind(dataItem,itemClickedListener) + + holder.buttonViewOptions.setOnClickListener { + showPopupMenu(dataItem,it) + } + } + + else -> throw Exception("View Holder type is unknown:$holder") + } + } + + private fun showPopupMenu(localBook: LocalBookDomainModel,view: View) { + val popUp = PopupMenu(context,view) + popUp.inflate(R.menu.local_books_option_menu) + + popUp.setOnMenuItemClickListener { + when (it.itemId){ + R.id.ItemOptions_removeAllChapters -> { + optionsClickedListener.onRemoveChaptersClicked(localBook) + } + + R.id.ItemOptions_removeBook -> { + + optionsClickedListener.onDeleteBookClicked(localBook) + Timber.d("remove clicked for ${localBook.bookTitle}") + } + } + + return@setOnMenuItemClickListener false + } + popUp.show() + } +} + + +/** +class to smartly check for difference in new loaded list and old list +It enhance the performance of the recycler view + */ +class RandomBookDiffCallback : DiffUtil.ItemCallback(){ + /** + * Compare items based on identifier fields + */ + override fun areItemsTheSame(oldItem: LocalBookDomainModel, newItem: LocalBookDomainModel): Boolean { + return oldItem.bookIdentifier==newItem.bookIdentifier + } + + /** + * Check every fields to verify for same content. + */ + @SuppressLint("DiffUtilEquals") + override fun areContentsTheSame(oldItem: LocalBookDomainModel, newItem: LocalBookDomainModel): Boolean { + /* + Since book is data class so here all the fields are automatically checked + */ + return oldItem == newItem + } + +} + +/* +listener to check for the click event + */ +class ItemClickedListener(val clickListener : (identifier : String)->Unit){ + fun onItemClicked(listenLater : LocalBookDomainModel) = clickListener(listenLater.bookIdentifier) +} + +class OptionsClickedListener( + val onDeleteBook : (identifier : LocalBookDomainModel)->Unit, + val onRemoveChapters : (identifier : LocalBookDomainModel)->Unit) +{ + fun onDeleteBookClicked(listenLater : LocalBookDomainModel) = onDeleteBook(listenLater) + fun onRemoveChaptersClicked(listenLater : LocalBookDomainModel) = onRemoveChapters(listenLater) +} From b21bbc3aa9b26e1967ddc4e40ce00a84b72ee806 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:37:11 +0530 Subject: [PATCH 15/62] local books list item view holder --- .../recyclerView/LocalBookItemViewHolder.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookItemViewHolder.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookItemViewHolder.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookItemViewHolder.kt new file mode 100644 index 00000000..a0b93525 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/recyclerView/LocalBookItemViewHolder.kt @@ -0,0 +1,31 @@ +package com.allsoftdroid.audiobook.feature_mybooks.presentation.recyclerView + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import com.allsoftdroid.audiobook.feature_mybooks.databinding.MyBooksItemLayoutBinding + +class LocalBookItemViewHolder private constructor(private val binding : MyBooksItemLayoutBinding) : RecyclerView.ViewHolder(binding.root) { + + lateinit var buttonViewOptions: View + + // bind the data to the view + fun bind(item: LocalBookDomainModel, itemClickedListener: ItemClickedListener) { + binding.book = item + binding.clickListener = itemClickedListener + buttonViewOptions = binding.ItemOptions + binding.executePendingBindings() + } + + //construct the viewholder + companion object { + fun from(parent: ViewGroup): LocalBookItemViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = MyBooksItemLayoutBinding.inflate(layoutInflater, parent, false) + + return LocalBookItemViewHolder(binding) + } + } +} \ No newline at end of file From fbfc67b2c25a4a501682bb098b07f23243ca5a0f Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:37:48 +0530 Subject: [PATCH 16/62] request status model added --- .../audiobook/feature_mybooks/utils/RequestStatus.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/RequestStatus.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/RequestStatus.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/RequestStatus.kt new file mode 100644 index 00000000..f8deb683 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/RequestStatus.kt @@ -0,0 +1,9 @@ +package com.allsoftdroid.audiobook.feature_mybooks.utils + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel + +sealed class RequestStatus + +data class Success(val list : List) : RequestStatus() +object Empty : RequestStatus() +object Started : RequestStatus() From 617264861adaeb260c72111ed3c1bf63d8cfb99f Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:39:00 +0530 Subject: [PATCH 17/62] id and layout renamed --- .../src/main/res/layout/fragment_mybooks_layout.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml index f3529746..bf07cf31 100644 --- a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml +++ b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml @@ -30,19 +30,19 @@ android:contentDescription="@string/navigate_to_previous_screen" /> + app:layout_constraintTop_toBottomOf="@+id/bookCount"/> - + layout="@layout/layout_no_books_found_local_storage"/> From 49bf0e3962c1cf4abec6f76e43dff4e08108ed78 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:39:24 +0530 Subject: [PATCH 18/62] renamed to fix layout bug --- ..._books_found.xml => layout_no_books_found_local_storage.xml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename feature_mybooks/src/main/res/layout/{layout_no_books_found.xml => layout_no_books_found_local_storage.xml} (95%) diff --git a/feature_mybooks/src/main/res/layout/layout_no_books_found.xml b/feature_mybooks/src/main/res/layout/layout_no_books_found_local_storage.xml similarity index 95% rename from feature_mybooks/src/main/res/layout/layout_no_books_found.xml rename to feature_mybooks/src/main/res/layout/layout_no_books_found_local_storage.xml index 8c904685..b8e1e814 100644 --- a/feature_mybooks/src/main/res/layout/layout_no_books_found.xml +++ b/feature_mybooks/src/main/res/layout/layout_no_books_found_local_storage.xml @@ -24,5 +24,5 @@ android:textStyle="bold" android:layout_gravity="center_horizontal" android:textColor="@color/black" - android:text="@string/no_books_found"/> + android:text="@string/myBooks_no_books_found"/> \ No newline at end of file From 2d5774073f34bc5acb4c370c610039d598d422b7 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:40:18 +0530 Subject: [PATCH 19/62] options menu --- .../src/main/res/menu/local_books_option_menu.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 feature_mybooks/src/main/res/menu/local_books_option_menu.xml diff --git a/feature_mybooks/src/main/res/menu/local_books_option_menu.xml b/feature_mybooks/src/main/res/menu/local_books_option_menu.xml new file mode 100644 index 00000000..87a7ffe3 --- /dev/null +++ b/feature_mybooks/src/main/res/menu/local_books_option_menu.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file From 1abb659c4e00b00ce6144d350eb524a083271f9c Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:40:47 +0530 Subject: [PATCH 20/62] resource added for options menu --- feature_mybooks/src/main/res/values/strings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/res/values/strings.xml b/feature_mybooks/src/main/res/values/strings.xml index c5631a76..02fc000e 100644 --- a/feature_mybooks/src/main/res/values/strings.xml +++ b/feature_mybooks/src/main/res/values/strings.xml @@ -1,8 +1,10 @@ - My Books + My Books navigate to previous screen - No Books found in Storage + No Books found in Storage book thumbnail image + Remove All Chapters + Delete Book \ No newline at end of file From 019d492414947aa0dd64394efd97121aaa6dda64 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 15:42:40 +0530 Subject: [PATCH 21/62] data binding added and click listener added --- .../src/main/res/layout/my_books_item_layout.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/feature_mybooks/src/main/res/layout/my_books_item_layout.xml b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml index eb79c671..edb8906d 100644 --- a/feature_mybooks/src/main/res/layout/my_books_item_layout.xml +++ b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml @@ -2,6 +2,16 @@ + + + + + + @@ -40,6 +52,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:padding="@dimen/card_padding" + android:onClick="@{()->clickListener.onItemClicked(book)}" android:textAppearance="@style/TextAppearance.AppCompat.Small" app:layout_constraintStart_toStartOf="@id/item_title" app:layout_constraintTop_toBottomOf="@+id/item_title" @@ -50,6 +63,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:padding="@dimen/card_padding" + android:onClick="@{()->clickListener.onItemClicked(book)}" android:textAppearance="@style/TextAppearance.AppCompat.Small" app:layout_constraintEnd_toEndOf="@id/item_title" app:layout_constraintStart_toEndOf="@id/item_author" From b29b59dcb1fd9f5c421b644accd0932cd7e758f9 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:17:06 +0530 Subject: [PATCH 22/62] database dependency added --- feature_mybooks/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/feature_mybooks/build.gradle b/feature_mybooks/build.gradle index b9464c6f..460a1bed 100644 --- a/feature_mybooks/build.gradle +++ b/feature_mybooks/build.gradle @@ -43,6 +43,7 @@ android { dependencies { implementation(project(path: ModuleDependency.LIBRARY_COMMON)) + implementation(project(path: ModuleDependency.DATABASE)) implementation(LibraryDependency.GLIDE) kapt(LibraryDependency.GLIDE_COMPILER) From 4e8ea61f4a432ce2f48f9d529be73c3ebbfb91bb Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:17:31 +0530 Subject: [PATCH 23/62] book metadata model --- .../audiobook/feature_mybooks/data/model/BookMetadata.kt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/BookMetadata.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/BookMetadata.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/BookMetadata.kt new file mode 100644 index 00000000..89b7d779 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/BookMetadata.kt @@ -0,0 +1,7 @@ +package com.allsoftdroid.audiobook.feature_mybooks.data.model + +data class BookMetadata( + val title:String, + val author:String, + val totalTracks:Int +) \ No newline at end of file From 6c0ee5afe62a5e617cbc5adbde2abff33d8274f1 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:17:55 +0530 Subject: [PATCH 24/62] added total chapter parameter --- .../feature_mybooks/data/model/LocalBookDomainModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt index 7f6848f2..fe482516 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookDomainModel.kt @@ -4,6 +4,7 @@ data class LocalBookDomainModel ( val bookTitle:String, val bookIdentifier:String, val bookAuthor:String, - val bookChaptersDownloaded:String, + val bookChaptersDownloaded:Int, + val totalChapters:Int, val fileNames:List ) \ No newline at end of file From c4ccb5b92ea1aa60155f52924643b76dee64964c Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:18:25 +0530 Subject: [PATCH 25/62] local book file model added --- .../audiobook/feature_mybooks/data/model/LocalBookFiles.kt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookFiles.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookFiles.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookFiles.kt new file mode 100644 index 00000000..4a7b4cd3 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/model/LocalBookFiles.kt @@ -0,0 +1,6 @@ +package com.allsoftdroid.audiobook.feature_mybooks.data.model + +data class LocalBookFiles( + val identifier:String, + val filePath:List +) \ No newline at end of file From 8777516ee4b7c0a8989b22097e68ca130f15e876 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:18:54 +0530 Subject: [PATCH 26/62] repository added for getting metadata --- .../repository/BookMetadataRepositoryImpl.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt new file mode 100644 index 00000000..f9e668ee --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt @@ -0,0 +1,26 @@ +package com.allsoftdroid.audiobook.feature_mybooks.data.repository + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.BookMetadata +import com.allsoftdroid.audiobook.feature_mybooks.domain.IBookMetadataRepository +import com.allsoftdroid.database.metadataCacheDB.MetadataDao +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class BookMetadataRepositoryImpl( + private val metadataDao: MetadataDao, + private val dispatcher: CoroutineDispatcher = Dispatchers.IO +):IBookMetadataRepository { + override suspend fun getBookMetadata(identifier: String): BookMetadata = + withContext(dispatcher){ + val metadata = metadataDao.getMetadata(identifier) + val tracks = metadataDao.getTrackDetails(metadata_id = identifier,formatContains = "64") + + metadata.value?.let { dbMetadata -> + tracks.value?.let { dbTracks-> + return@withContext BookMetadata(title = dbMetadata.title,author = dbMetadata.creator,totalTracks = dbTracks.size) + } + } + return@withContext BookMetadata(title ="",author = "",totalTracks = 0) + } +} \ No newline at end of file From 3f66d97665ad15dd236e5d726d2d213f440b5916 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:19:27 +0530 Subject: [PATCH 27/62] implementation added for get all books --- .../repository/LocalBooksRepositoryImpl.kt | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt index d8b1d896..3a8ad108 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt @@ -1,21 +1,55 @@ package com.allsoftdroid.audiobook.feature_mybooks.data.repository -import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import android.app.Application +import android.os.Environment +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookFiles import com.allsoftdroid.audiobook.feature_mybooks.domain.ILocalBooksRepository - -class LocalBooksRepositoryImpl : ILocalBooksRepository { - - private val list:List = emptyList() - - override suspend fun getAllBooks(): List { - return list - } +import com.allsoftdroid.common.base.network.ArchiveUtils +import com.allsoftdroid.common.base.utils.LocalFilesForBook +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import timber.log.Timber + +class LocalBooksRepositoryImpl( + private val dispatcher: CoroutineDispatcher=Dispatchers.IO, + private val application: Application +) : ILocalBooksRepository { + + override suspend fun getLocalBookFiles(): List = + withContext(dispatcher){ + val localBookFiles = mutableListOf() + + val rootFolder = ArchiveUtils.getDownloadsRootFolder(application) + Timber.d("Root Folder is $rootFolder") + + val directory = Environment.getExternalStoragePublicDirectory("$rootFolder/AudioBooks/") + val bookIds = directory.listFiles()?.map { + it.absolutePath.split("/").last() + } + + Timber.d("BookIds are $bookIds") + + val localFilesForBook = LocalFilesForBook(application) + + bookIds?.map {bookId-> + val files = localFilesForBook.getDownloadedFilesList(bookId) + if(files.isNullOrEmpty()){ + localBookFiles.add(LocalBookFiles(identifier = bookId,filePath = emptyList())) + }else{ + Timber.i("$bookId : Found ${files.size} files") + localBookFiles.add(LocalBookFiles(identifier = bookId,filePath = files)) + } + } + + return@withContext localBookFiles + } override suspend fun removeBook(identifier: String) { - + //delete sub-directory } override suspend fun deleteAllChapters(identifier: String) { - + //delete all the files in the sub-directory } } \ No newline at end of file From 2a7fa51fec08744ad74cc535832dd55744ea8dd4 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:19:58 +0530 Subject: [PATCH 28/62] di added for local books module --- .../feature_mybooks/di/LocalBooksModule.kt | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt index 84b0fe42..6d9f9e39 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt @@ -1,6 +1,14 @@ package com.allsoftdroid.audiobook.feature_mybooks.di +import com.allsoftdroid.audiobook.feature_mybooks.data.repository.BookMetadataRepositoryImpl +import com.allsoftdroid.audiobook.feature_mybooks.data.repository.LocalBooksRepositoryImpl +import com.allsoftdroid.audiobook.feature_mybooks.domain.IBookMetadataRepository +import com.allsoftdroid.audiobook.feature_mybooks.domain.ILocalBooksRepository +import com.allsoftdroid.audiobook.feature_mybooks.domain.LocalBookListUsecase import com.allsoftdroid.audiobook.feature_mybooks.presentation.LocalBooksViewModel +import com.allsoftdroid.database.bookListDB.DatabaseAudioBook +import com.allsoftdroid.database.common.AudioBookDatabase +import com.allsoftdroid.database.metadataCacheDB.MetadataDao import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -21,6 +29,7 @@ object LocalBooksModule { unloadKoinModules( listOf( localBooksViewModel, + dataModule, jobModule ) ) @@ -29,13 +38,44 @@ object LocalBooksModule { private val loadFeature by lazy { loadKoinModules(listOf( localBooksViewModel, + usecaseModule, + dataModule, jobModule )) } var localBooksViewModel : Module = module { viewModel { - LocalBooksViewModel() + LocalBooksViewModel( + bookListUsecase = get() + ) + } + } + + var usecaseModule : Module = module { + factory { + LocalBookListUsecase( + localBooksRepository = get(), + bookMetadataRepository = get() + ) + } + } + + var dataModule : Module = module { + factory { + LocalBooksRepositoryImpl( + application = get() + ) as ILocalBooksRepository + } + + factory { + BookMetadataRepositoryImpl( + metadataDao = get(named(name = BEAN_NAME)) + ) as IBookMetadataRepository + } + + single(named(name = BEAN_NAME)) { + AudioBookDatabase.getDatabase(get()).metadataDao() as MetadataDao } } @@ -52,5 +92,5 @@ object LocalBooksModule { const val SUPER_VISOR_JOB = "SuperVisorJob_LocalBooks" const val VIEW_MODEL_SCOPE = "ViewModelScope_LocalBooks" - const val BEAN_NAME = "LocalBooksFragment" + private const val BEAN_NAME = "LocalBooksFragment" } \ No newline at end of file From b69d3384f23876512ecf0ece8dbaee3c8bd1aa27 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:20:37 +0530 Subject: [PATCH 29/62] contract for metadata repository --- .../feature_mybooks/domain/IBookMetadataRepository.kt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/IBookMetadataRepository.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/IBookMetadataRepository.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/IBookMetadataRepository.kt new file mode 100644 index 00000000..4c88d6d7 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/IBookMetadataRepository.kt @@ -0,0 +1,7 @@ +package com.allsoftdroid.audiobook.feature_mybooks.domain + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.BookMetadata + +interface IBookMetadataRepository { + suspend fun getBookMetadata(identifier:String):BookMetadata +} \ No newline at end of file From 474d34226baaea4122690257dd2d97f57d51d398 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 22:20:57 +0530 Subject: [PATCH 30/62] contract for local books repository --- .../audiobook/feature_mybooks/domain/ILocalBooksRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt index 5a55d1ff..b5c50031 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/ILocalBooksRepository.kt @@ -1,9 +1,9 @@ package com.allsoftdroid.audiobook.feature_mybooks.domain -import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookFiles interface ILocalBooksRepository { - suspend fun getAllBooks():List + suspend fun getLocalBookFiles():List suspend fun removeBook(identifier:String) From 5ccc67e254376421f55e2e90858fdecffef387b5 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:01:02 +0530 Subject: [PATCH 31/62] instance is scoped --- .../feature/book_details/di/BookDetailsModule.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/di/BookDetailsModule.kt b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/di/BookDetailsModule.kt index 91a85dc0..77caee32 100644 --- a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/di/BookDetailsModule.kt +++ b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/di/BookDetailsModule.kt @@ -115,7 +115,7 @@ object BookDetailsModule { factory { MetadataRepositoryImpl( - metadataDao = get(), + metadataDao = get(named(name = METADATA_DAO)), bookId = getProperty(PROPERTY_BOOK_ID), metadataDataSource = get(), saveInDatabase = get(named(name = METADATA_DATABASE))) as IMetadataRepository @@ -123,7 +123,7 @@ object BookDetailsModule { factory { TrackListRepositoryImpl( - metadataDao = get(), + metadataDao = get(named(name = METADATA_DAO)), bookId = getProperty(PROPERTY_BOOK_ID) ) as ITrackListRepository } @@ -158,7 +158,7 @@ object BookDetailsModule { AudioBookDatabase.getDatabase(get()).listenLaterDao() } - single { + single(named(name = METADATA_DAO)) { AudioBookDatabase.getDatabase(get()).metadataDao() } @@ -167,7 +167,7 @@ object BookDetailsModule { } single(named(name = METADATA_DATABASE)) { - SaveMetadataInDatabase.setup(metadataDao = get()) as SaveInDatabase + SaveMetadataInDatabase.setup(metadataDao = get(named(name = METADATA_DAO))) as SaveInDatabase } single { @@ -185,4 +185,5 @@ object BookDetailsModule { const val PROPERTY_BOOK_ID = "bookDetails_book_id" private const val METADATA_DATABASE = "SaveMetadataInDatabase" + private const val METADATA_DAO ="MetadataDao_BookDetailsModule" } \ No newline at end of file From e06a559f8be9ea0f2ca2d44b3c003763633dc354 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:01:27 +0530 Subject: [PATCH 32/62] usecase added for book list --- .../domain/LocalBookListUsecase.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt new file mode 100644 index 00000000..bb418567 --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt @@ -0,0 +1,41 @@ +package com.allsoftdroid.audiobook.feature_mybooks.domain + +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import timber.log.Timber + +class LocalBookListUsecase( + private val localBooksRepository: ILocalBooksRepository, + private val bookMetadataRepository: IBookMetadataRepository +) { + + suspend fun getBookList():List{ + // Read all the sub-directory of the folder and use it as id to get the books details from DB + // If Book id matches get the details and return the list else ignore the bookId + //Use localBookForFiles to get the content in the file and missing + val localBooks = mutableListOf() + + val localFiles = localBooksRepository.getLocalBookFiles() + Timber.d("local files size is ${localFiles.size}") + + for (file in localFiles){ + + val metadata = bookMetadataRepository.getBookMetadata(file.identifier) + Timber.d("Metadata is : ${metadata.title}") + Timber.d("File is : ${file.filePath}") + + if (metadata.title.isNotEmpty()){ + localBooks.add( + LocalBookDomainModel( + bookTitle = metadata.title, + bookIdentifier = file.identifier, + bookAuthor = metadata.author, + bookChaptersDownloaded = file.filePath.size, + totalChapters = metadata.totalTracks, + fileNames = file.filePath + )) + } + } + + return localBooks + } +} \ No newline at end of file From 9de487fb4394b2abd1ea46f84b8dad3fb8ee8975 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:02:03 +0530 Subject: [PATCH 33/62] submit list to adapter on success --- .../audiobook/feature_mybooks/presentation/MyBooksFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt index 6417cc25..9fd1bcf1 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -88,6 +88,8 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { dataBinding.noLocalBooks.visibility = View.GONE dataBinding.bookCount.visibility = View.VISIBLE dataBinding.recyclerViewBooks.visibility = View.VISIBLE + + adapter.submitList(status.list) } } } From a7e2113d2a085835fb6691284333e82ab4089080 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:02:50 +0530 Subject: [PATCH 34/62] load book list implemented --- .../presentation/LocalBooksViewModel.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt index 5d47fc33..cee04f52 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt @@ -5,16 +5,22 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.SUPER_VISOR_JOB import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.VIEW_MODEL_SCOPE +import com.allsoftdroid.audiobook.feature_mybooks.domain.LocalBookListUsecase import com.allsoftdroid.audiobook.feature_mybooks.utils.Empty import com.allsoftdroid.audiobook.feature_mybooks.utils.RequestStatus +import com.allsoftdroid.audiobook.feature_mybooks.utils.Started +import com.allsoftdroid.audiobook.feature_mybooks.utils.Success import com.allsoftdroid.common.base.extension.Event import kotlinx.coroutines.CompletableJob import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.koin.core.KoinComponent import org.koin.core.inject import org.koin.core.qualifier.named -class LocalBooksViewModel : ViewModel(),KoinComponent { +class LocalBooksViewModel( + private val bookListUsecase: LocalBookListUsecase +) : ViewModel(),KoinComponent { /** * cancelling this job cancels all the job started by this viewmodel */ @@ -29,9 +35,21 @@ class LocalBooksViewModel : ViewModel(),KoinComponent { val requestStatus : LiveData> = _requestStatus init { - _requestStatus.value = Event(Empty) + loadBooks() } + fun loadBooks(){ + viewModelScope.launch { + _requestStatus.value = Event(Started) + + val books = bookListUsecase.getBookList() + if(books.isEmpty()){ + _requestStatus.value = Event(Empty) + }else{ + _requestStatus.value = Event(Success(books)) + } + } + } //cancel the job when viewmodel is not longer in use override fun onCleared() { From c8ade62e552b4e996aaca2af3fa87a4bc15a4cf0 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:53:37 +0530 Subject: [PATCH 35/62] added method to return nonLive data --- .../allsoftdroid/database/metadataCacheDB/MetadataDao.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/database/src/main/java/com/allsoftdroid/database/metadataCacheDB/MetadataDao.kt b/database/src/main/java/com/allsoftdroid/database/metadataCacheDB/MetadataDao.kt index 742296aa..eeeb6968 100644 --- a/database/src/main/java/com/allsoftdroid/database/metadataCacheDB/MetadataDao.kt +++ b/database/src/main/java/com/allsoftdroid/database/metadataCacheDB/MetadataDao.kt @@ -23,6 +23,9 @@ interface MetadataDao{ @Query("SELECT * FROM metadata_table where metadata_id=:bookId") fun getMetadata( bookId : String):LiveData + @Query("SELECT * FROM metadata_table where metadata_id=:bookId") + fun getMetadataNonLive( bookId : String):DatabaseMetadataEntity + /** * Get album details for the specified audio book * @param metadata_id unique id given to audio book @@ -50,6 +53,9 @@ interface MetadataDao{ @Query("SELECT * FROM MediaTrack_Table where track_album_id=:metadata_id and format like '%' || :formatContains || '%'") fun getTrackDetails(metadata_id:String,formatContains:String):LiveData> + @Query("SELECT * FROM MediaTrack_Table where track_album_id=:metadata_id and format like '%' || :formatContains || '%'") + fun getTrackDetailsNonLive(metadata_id:String,formatContains:String):List + /** * get list of media VBR track files for the given album id . here album id is same as metadata id so we will * use complex sql queries to get VBR files From b44aef028713055b8d79842c2e2f6b5c1497fc50 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:54:16 +0530 Subject: [PATCH 36/62] implementation changed to handle non live data --- .../repository/BookMetadataRepositoryImpl.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt index f9e668ee..44b58c3c 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/BookMetadataRepositoryImpl.kt @@ -11,16 +11,17 @@ class BookMetadataRepositoryImpl( private val metadataDao: MetadataDao, private val dispatcher: CoroutineDispatcher = Dispatchers.IO ):IBookMetadataRepository { - override suspend fun getBookMetadata(identifier: String): BookMetadata = - withContext(dispatcher){ - val metadata = metadataDao.getMetadata(identifier) - val tracks = metadataDao.getTrackDetails(metadata_id = identifier,formatContains = "64") + override suspend fun getBookMetadata(identifier: String): BookMetadata { - metadata.value?.let { dbMetadata -> - tracks.value?.let { dbTracks-> - return@withContext BookMetadata(title = dbMetadata.title,author = dbMetadata.creator,totalTracks = dbTracks.size) - } - } - return@withContext BookMetadata(title ="",author = "",totalTracks = 0) + return withContext(dispatcher){ + val metadata = metadataDao.getMetadataNonLive(identifier) + val tracks = metadataDao.getTrackDetailsNonLive(metadata_id = identifier,formatContains = "64") + + if(metadata==null || tracks.isEmpty()) { + return@withContext BookMetadata(title ="",author = "",totalTracks =0) + }else{ + return@withContext BookMetadata(title =metadata.title,author = metadata.creator,totalTracks = tracks.size) + } } + } } \ No newline at end of file From d901ed7226815c8ce8c35ef1440e57cd7d5f4dff Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:55:03 +0530 Subject: [PATCH 37/62] comments removed --- .../feature_mybooks/domain/LocalBookListUsecase.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt index bb418567..8e3afe54 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt @@ -9,9 +9,7 @@ class LocalBookListUsecase( ) { suspend fun getBookList():List{ - // Read all the sub-directory of the folder and use it as id to get the books details from DB - // If Book id matches get the details and return the list else ignore the bookId - //Use localBookForFiles to get the content in the file and missing + val localBooks = mutableListOf() val localFiles = localBooksRepository.getLocalBookFiles() @@ -20,6 +18,8 @@ class LocalBookListUsecase( for (file in localFiles){ val metadata = bookMetadataRepository.getBookMetadata(file.identifier) + + Timber.d("File Identifier is : ${file.identifier}") Timber.d("Metadata is : ${metadata.title}") Timber.d("File is : ${file.filePath}") From 75e1bf4ecff05f8a409bc051ceb30861e61972be Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:55:24 +0530 Subject: [PATCH 38/62] logging added --- .../feature_mybooks/presentation/LocalBooksViewModel.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt index cee04f52..0a752410 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.launch import org.koin.core.KoinComponent import org.koin.core.inject import org.koin.core.qualifier.named +import timber.log.Timber class LocalBooksViewModel( private val bookListUsecase: LocalBookListUsecase @@ -40,12 +41,15 @@ class LocalBooksViewModel( fun loadBooks(){ viewModelScope.launch { + Timber.d("sending started response") _requestStatus.value = Event(Started) val books = bookListUsecase.getBookList() if(books.isEmpty()){ + Timber.d("books is empty sending empty response") _requestStatus.value = Event(Empty) }else{ + Timber.d("books is not empty sending response") _requestStatus.value = Event(Success(books)) } } From 208c198933f9bea6852366c51f9986f42a751812 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Tue, 19 May 2020 23:55:40 +0530 Subject: [PATCH 39/62] logging added --- .../audiobook/feature_mybooks/presentation/MyBooksFragment.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt index 9fd1bcf1..2daf33b1 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -20,6 +20,7 @@ import com.allsoftdroid.audiobook.feature_mybooks.utils.Success import com.allsoftdroid.common.base.fragment.BaseUIFragment import org.koin.core.KoinComponent import org.koin.core.inject +import timber.log.Timber class MyBooksFragment : BaseUIFragment(),KoinComponent { @@ -70,6 +71,7 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { it.getContentIfNotHandled()?.let { status-> when(status){ is Empty -> { + Timber.d("Empty result") dataBinding.loadingProgressbar.visibility = View.GONE dataBinding.noLocalBooks.visibility = View.VISIBLE dataBinding.bookCount.visibility = View.GONE @@ -77,6 +79,7 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { } is Started -> { + Timber.d("Started the request") dataBinding.loadingProgressbar.visibility = View.VISIBLE dataBinding.noLocalBooks.visibility = View.GONE dataBinding.bookCount.visibility = View.GONE @@ -84,6 +87,7 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { } is Success -> { + Timber.d("Received result:${status.list}") dataBinding.loadingProgressbar.visibility = View.GONE dataBinding.noLocalBooks.visibility = View.GONE dataBinding.bookCount.visibility = View.VISIBLE From f255a4eef985b99f3297e182c4ba229d8ba96bc5 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:30:57 +0530 Subject: [PATCH 40/62] redundant code removed --- .../feature_listen_later_ui/utils/BindingUtils.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/feature_listen_later_ui/src/main/java/com/allsoftdroid/audiobook/feature_listen_later_ui/utils/BindingUtils.kt b/feature_listen_later_ui/src/main/java/com/allsoftdroid/audiobook/feature_listen_later_ui/utils/BindingUtils.kt index 24bfba9d..8edfbdd6 100644 --- a/feature_listen_later_ui/src/main/java/com/allsoftdroid/audiobook/feature_listen_later_ui/utils/BindingUtils.kt +++ b/feature_listen_later_ui/src/main/java/com/allsoftdroid/audiobook/feature_listen_later_ui/utils/BindingUtils.kt @@ -7,6 +7,7 @@ import com.allsoftdroid.audiobook.feature_listen_later_ui.R import com.allsoftdroid.audiobook.feature_listen_later_ui.data.model.ListenLaterItemDomainModel import com.allsoftdroid.common.base.extension.CreateImageOverlay import com.allsoftdroid.common.base.network.ArchiveUtils +import com.allsoftdroid.common.base.utils.BindingUtils.getNormalizedText import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions @@ -63,12 +64,4 @@ fun TextView.setBookDuration(item: ListenLaterItemDomainModel?){ item?.let { text = it.duration } -} - -private fun getNormalizedText(text:String?,limit:Int):String{ - if(text?.length?:0>limit){ - return text?.substring(0,limit-3)+"..." - } - - return text?:"" } \ No newline at end of file From f062e1377a4baeaf3d24c944babfcf436e099cce Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:32:00 +0530 Subject: [PATCH 41/62] binding adapter added for my books module --- .../feature_mybooks/utils/BindingUtil.kt | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt new file mode 100644 index 00000000..314009bb --- /dev/null +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt @@ -0,0 +1,65 @@ +package com.allsoftdroid.audiobook.feature_mybooks.utils + +import android.widget.ImageView +import android.widget.TextView +import androidx.databinding.BindingAdapter +import com.allsoftdroid.audiobook.feature_mybooks.R +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel +import com.allsoftdroid.common.base.extension.CreateImageOverlay +import com.allsoftdroid.common.base.network.ArchiveUtils +import com.allsoftdroid.common.base.utils.BindingUtils.getNormalizedText +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions + +@BindingAdapter("bookImage") +fun setImageUrl(imageView: ImageView, item: LocalBookDomainModel?) { + + item?.let { + val url = ArchiveUtils.getThumbnail(item.bookIdentifier) + + Glide + .with(imageView.context) + .asBitmap() + .load(url) + .override(250,250) + .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) + .dontAnimate() + .apply( + RequestOptions() + .placeholder(R.drawable.loading_animation) + .error( + CreateImageOverlay + .with(imageView.context) + .buildOverlay(front = R.drawable.ic_book_play,back = R.drawable.gradiant_background) + ) + ) + .into(imageView) + } +} + + +/* +Binding adapter for updating the title in list items + */ +@BindingAdapter("bookTitle") +fun TextView.setBookTitle(item: LocalBookDomainModel?){ + item?.let { + text = getNormalizedText(item.bookTitle, 30) + } +} + +@BindingAdapter("bookAuthor") +fun TextView.setBookAuthor(item: LocalBookDomainModel?){ + item?.let { + text = + getNormalizedText(item.bookAuthor, 30) + } +} + +@BindingAdapter("bookChapterCount") +fun TextView.setBookDuration(item: LocalBookDomainModel?){ + item?.let { + text = "${it.bookChaptersDownloaded}/${it.totalChapters} Chapters" + } +} \ No newline at end of file From 226b7223418418d4acc8cb82fbe2ae7dfac049bf Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:32:50 +0530 Subject: [PATCH 42/62] dark background drawable added --- .../drawable/background_round_corner_dark_border.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 feature_mybooks/src/main/res/drawable/background_round_corner_dark_border.xml diff --git a/feature_mybooks/src/main/res/drawable/background_round_corner_dark_border.xml b/feature_mybooks/src/main/res/drawable/background_round_corner_dark_border.xml new file mode 100644 index 00000000..e0826a52 --- /dev/null +++ b/feature_mybooks/src/main/res/drawable/background_round_corner_dark_border.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file From d2490cc5533e8988b602a914fc3ae7ca911be4e5 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:33:44 +0530 Subject: [PATCH 43/62] ui modified --- .../main/res/layout/my_books_item_layout.xml | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/feature_mybooks/src/main/res/layout/my_books_item_layout.xml b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml index edb8906d..8a57d1c4 100644 --- a/feature_mybooks/src/main/res/layout/my_books_item_layout.xml +++ b/feature_mybooks/src/main/res/layout/my_books_item_layout.xml @@ -15,7 +15,6 @@ @@ -29,8 +28,11 @@ android:layout_width="@dimen/book_image_height" android:layout_height="@dimen/book_image_height" android:adjustViewBounds="true" + android:background="@drawable/background_round_corner_dark_border" + android:padding="@dimen/padding_min" android:onClick="@{()->clickListener.onItemClicked(book)}" android:contentDescription="@string/thumbnail" + app:bookImage="@{book}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent"/> @@ -41,8 +43,11 @@ android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:id="@+id/item_title" android:textStyle="bold" + android:textColor="@color/black" + android:layout_marginStart="@dimen/card_margin_end" android:padding="@dimen/card_padding" android:onClick="@{()->clickListener.onItemClicked(book)}" + app:bookTitle="@{book}" app:layout_constraintEnd_toStartOf="@id/ItemOptions" app:layout_constraintStart_toEndOf="@id/item_image" app:layout_constraintTop_toTopOf="@id/item_image"/> @@ -51,30 +56,45 @@ android:id="@+id/item_author" android:layout_width="0dp" android:layout_height="wrap_content" + android:textColor="@color/black" android:padding="@dimen/card_padding" android:onClick="@{()->clickListener.onItemClicked(book)}" android:textAppearance="@style/TextAppearance.AppCompat.Small" + app:bookAuthor="@{book}" app:layout_constraintStart_toStartOf="@id/item_title" app:layout_constraintTop_toBottomOf="@+id/item_title" app:layout_constraintBottom_toBottomOf="parent"/> + + + app:layout_constraintStart_toEndOf="@id/downloadedChapters" + app:layout_constraintTop_toTopOf="@id/downloadedChapters" + app:layout_constraintBottom_toBottomOf="@id/downloadedChapters"/> Date: Wed, 20 May 2020 11:34:08 +0530 Subject: [PATCH 44/62] resource updated --- feature_mybooks/src/main/res/values/dimens.xml | 11 +++++++++-- feature_mybooks/src/main/res/values/strings.xml | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/res/values/dimens.xml b/feature_mybooks/src/main/res/values/dimens.xml index b2506fad..04ca0094 100644 --- a/feature_mybooks/src/main/res/values/dimens.xml +++ b/feature_mybooks/src/main/res/values/dimens.xml @@ -1,10 +1,17 @@ + 4dp 16dp 24dp + 2dp + 8dp + + 16dp 16dp + 8dp + 90dp - 16dp - 8dp + + 16dp \ No newline at end of file diff --git a/feature_mybooks/src/main/res/values/strings.xml b/feature_mybooks/src/main/res/values/strings.xml index 02fc000e..5b5d3626 100644 --- a/feature_mybooks/src/main/res/values/strings.xml +++ b/feature_mybooks/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ Remove All Chapters Delete Book + Number of chapters available locally \ No newline at end of file From c0e6e9de6f180a09e6e426b3723639ff48873cd2 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:49:05 +0530 Subject: [PATCH 45/62] added argument placeholder --- feature_mybooks/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature_mybooks/src/main/res/values/strings.xml b/feature_mybooks/src/main/res/values/strings.xml index 5b5d3626..abf3be0c 100644 --- a/feature_mybooks/src/main/res/values/strings.xml +++ b/feature_mybooks/src/main/res/values/strings.xml @@ -8,4 +8,6 @@ Remove All Chapters Delete Book Number of chapters available locally + %1d Books in Storage + %d/%d Chapters \ No newline at end of file From 0fa481f50dac865559c49ca410a6bbe417ed2ca7 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:49:27 +0530 Subject: [PATCH 46/62] added argument placeholder --- .../allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt index 314009bb..7a7ea5e5 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/utils/BindingUtil.kt @@ -60,6 +60,6 @@ fun TextView.setBookAuthor(item: LocalBookDomainModel?){ @BindingAdapter("bookChapterCount") fun TextView.setBookDuration(item: LocalBookDomainModel?){ item?.let { - text = "${it.bookChaptersDownloaded}/${it.totalChapters} Chapters" + text = context.getString(R.string.chapters_label,it.bookChaptersDownloaded,it.totalChapters) } } \ No newline at end of file From 1e08a99311305d2ccc644daf05ea1de1c61dd291 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 11:50:00 +0530 Subject: [PATCH 47/62] added text in book counts --- .../feature_mybooks/presentation/MyBooksFragment.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt index 2daf33b1..c0b175e4 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -90,10 +90,14 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { Timber.d("Received result:${status.list}") dataBinding.loadingProgressbar.visibility = View.GONE dataBinding.noLocalBooks.visibility = View.GONE - dataBinding.bookCount.visibility = View.VISIBLE - dataBinding.recyclerViewBooks.visibility = View.VISIBLE adapter.submitList(status.list) + dataBinding.recyclerViewBooks.visibility = View.VISIBLE + + dataBinding.bookCount.apply { + visibility = View.VISIBLE + text = requireActivity().getString(R.string.books_in_storage,status.list.size) + } } } } From 7c4eea673a23f707ea2efc1816061c62008bd8ec Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 12:00:28 +0530 Subject: [PATCH 48/62] load from memory cache if available --- .../presentation/LocalBooksViewModel.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt index 0a752410..980a4ed8 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt @@ -3,6 +3,7 @@ package com.allsoftdroid.audiobook.feature_mybooks.presentation import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.allsoftdroid.audiobook.feature_mybooks.data.model.LocalBookDomainModel import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.SUPER_VISOR_JOB import com.allsoftdroid.audiobook.feature_mybooks.di.LocalBooksModule.VIEW_MODEL_SCOPE import com.allsoftdroid.audiobook.feature_mybooks.domain.LocalBookListUsecase @@ -32,14 +33,13 @@ class LocalBooksViewModel( */ private val viewModelScope : CoroutineScope by inject(named(name = VIEW_MODEL_SCOPE)) + private var _books:List? = null + private var _requestStatus = MutableLiveData>() val requestStatus : LiveData> = _requestStatus - init { - loadBooks() - } - fun loadBooks(){ + private fun loadBooks(){ viewModelScope.launch { Timber.d("sending started response") _requestStatus.value = Event(Started) @@ -51,10 +51,22 @@ class LocalBooksViewModel( }else{ Timber.d("books is not empty sending response") _requestStatus.value = Event(Success(books)) + _books = books } } } + fun loadFromCacheOrReload(){ + + val books = _books + + if (books.isNullOrEmpty()){ + loadBooks() + }else{ + _requestStatus.value = Event(Success(books)) + } + } + //cancel the job when viewmodel is not longer in use override fun onCleared() { super.onCleared() From e1bf0f23aa6840aaf2c6f9437dde542fb65e522d Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 12:00:59 +0530 Subject: [PATCH 49/62] load data in resume --- .../presentation/MyBooksFragment.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt index c0b175e4..b268d9e1 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -6,7 +6,9 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.activity.OnBackPressedCallback +import androidx.core.os.bundleOf import androidx.lifecycle.Observer +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.allsoftdroid.audiobook.feature_mybooks.R import com.allsoftdroid.audiobook.feature_mybooks.databinding.FragmentMybooksLayoutBinding @@ -41,8 +43,12 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { val adapter = LocalBookAdapter( this.requireActivity(), - ItemClickedListener { - Toast.makeText(this.requireActivity(), it,Toast.LENGTH_SHORT).show() + ItemClickedListener {bookId-> + //Navigate to display page + val bundle = bundleOf("bookId" to bookId) + + this.findNavController() + .navigate(R.id.action_MyBooksFragment_to_AudioBookDetailsFragment,bundle) }, OptionsClickedListener( @@ -110,4 +116,9 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { callback.isEnabled = false requireActivity().onBackPressed() } + + override fun onResume() { + super.onResume() + localBooksViewModel.loadFromCacheOrReload() + } } \ No newline at end of file From ae1acc8ccbdacf0138a3a4004078fae5bd63a54c Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 15:32:20 +0530 Subject: [PATCH 50/62] delete book and chapters implemented --- .../repository/LocalBooksRepositoryImpl.kt | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt index 3a8ad108..37633445 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt @@ -10,12 +10,15 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber +import java.io.File class LocalBooksRepositoryImpl( private val dispatcher: CoroutineDispatcher=Dispatchers.IO, private val application: Application ) : ILocalBooksRepository { + private val localFilesForBook = LocalFilesForBook(application) + override suspend fun getLocalBookFiles(): List = withContext(dispatcher){ val localBookFiles = mutableListOf() @@ -30,8 +33,6 @@ class LocalBooksRepositoryImpl( Timber.d("BookIds are $bookIds") - val localFilesForBook = LocalFilesForBook(application) - bookIds?.map {bookId-> val files = localFilesForBook.getDownloadedFilesList(bookId) if(files.isNullOrEmpty()){ @@ -46,10 +47,56 @@ class LocalBooksRepositoryImpl( } override suspend fun removeBook(identifier: String) { - //delete sub-directory + withContext(dispatcher){ + val rootFolder = ArchiveUtils.getDownloadsRootFolder(application) + Timber.d("Root Folder is $rootFolder") + + val directory = Environment.getExternalStoragePublicDirectory("$rootFolder/AudioBooks/") + val books = directory.listFiles()?.filter { + it.absolutePath.split("/").last() == identifier + } + + Timber.d("Books to be removed are : $books") + + books?.let { + it.forEach { folder -> + try { + deleteRecursive(folder) + }catch (e:Exception){ + Timber.e("Error: can't remove $folder") + } + } + } + } } override suspend fun deleteAllChapters(identifier: String) { - //delete all the files in the sub-directory + withContext(dispatcher){ + val removeFiles = localFilesForBook.getDownloadedFilesList(identifier) + + removeFiles?.let {filePaths -> + Timber.d("Files to be removed are: $filePaths") + + filePaths.forEach { + try { + val file = File(it) + deleteRecursive(file) + }catch (e:Exception){ + Timber.e("Error: can't remove $it") + } + } + } + } + } + + private fun deleteRecursive(fileOrDirectory: File){ + + if(fileOrDirectory.isDirectory){ + fileOrDirectory.listFiles()?.forEach { + deleteRecursive(it) + } + } + + fileOrDirectory.delete() } } \ No newline at end of file From 1c5abee279d88f4a4165f74e04fdebd31ef1b188 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 15:32:35 +0530 Subject: [PATCH 51/62] delete book and chapters implemented --- .../feature_mybooks/domain/LocalBookListUsecase.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt index 8e3afe54..4e447119 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/domain/LocalBookListUsecase.kt @@ -38,4 +38,12 @@ class LocalBookListUsecase( return localBooks } + + suspend fun removeBook(bookId:String){ + localBooksRepository.removeBook(bookId) + } + + suspend fun removeChapters(bookId: String){ + localBooksRepository.deleteAllChapters(bookId) + } } \ No newline at end of file From b731d30966534bc25bcf8902e9b8763da0eef3fb Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 15:33:03 +0530 Subject: [PATCH 52/62] delete book and chapters implemented --- .../presentation/LocalBooksViewModel.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt index 980a4ed8..a14d6e46 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/LocalBooksViewModel.kt @@ -67,6 +67,20 @@ class LocalBooksViewModel( } } + fun removeBook(identifier:String){ + viewModelScope.launch { + bookListUsecase.removeBook(identifier) + loadBooks() + } + } + + fun removeAllChapters(identifier: String){ + viewModelScope.launch { + bookListUsecase.removeChapters(identifier) + loadBooks() + } + } + //cancel the job when viewmodel is not longer in use override fun onCleared() { super.onCleared() From f9771910cdd234f40ed8404748f25eeb462daa70 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 15:33:32 +0530 Subject: [PATCH 53/62] toast removed and called book or chapters delete --- .../feature_mybooks/presentation/MyBooksFragment.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt index b268d9e1..71b01d1b 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/presentation/MyBooksFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.core.os.bundleOf import androidx.lifecycle.Observer @@ -53,11 +52,11 @@ class MyBooksFragment : BaseUIFragment(),KoinComponent { OptionsClickedListener( onDeleteBook = { - Toast.makeText(this.requireActivity(), "Delete:"+it.bookTitle,Toast.LENGTH_SHORT).show() + localBooksViewModel.removeBook(it.bookIdentifier) }, onRemoveChapters = { - Toast.makeText(this.requireActivity(), "Delete All:"+it.bookTitle,Toast.LENGTH_SHORT).show() + localBooksViewModel.removeAllChapters(it.bookIdentifier) } ) ) From b0b8db164eca80d5aed4a00d19d6b228a82de687 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 15:50:42 +0530 Subject: [PATCH 54/62] dependency is injected via constructor --- .../data/repository/LocalBooksRepositoryImpl.kt | 5 ++--- .../audiobook/feature_mybooks/di/LocalBooksModule.kt | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt index 37633445..cd31d443 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/data/repository/LocalBooksRepositoryImpl.kt @@ -14,11 +14,10 @@ import java.io.File class LocalBooksRepositoryImpl( private val dispatcher: CoroutineDispatcher=Dispatchers.IO, - private val application: Application + private val application: Application, + private val localFilesForBook:LocalFilesForBook ) : ILocalBooksRepository { - private val localFilesForBook = LocalFilesForBook(application) - override suspend fun getLocalBookFiles(): List = withContext(dispatcher){ val localBookFiles = mutableListOf() diff --git a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt index 6d9f9e39..1c05728d 100644 --- a/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt +++ b/feature_mybooks/src/main/java/com/allsoftdroid/audiobook/feature_mybooks/di/LocalBooksModule.kt @@ -6,7 +6,6 @@ import com.allsoftdroid.audiobook.feature_mybooks.domain.IBookMetadataRepository import com.allsoftdroid.audiobook.feature_mybooks.domain.ILocalBooksRepository import com.allsoftdroid.audiobook.feature_mybooks.domain.LocalBookListUsecase import com.allsoftdroid.audiobook.feature_mybooks.presentation.LocalBooksViewModel -import com.allsoftdroid.database.bookListDB.DatabaseAudioBook import com.allsoftdroid.database.common.AudioBookDatabase import com.allsoftdroid.database.metadataCacheDB.MetadataDao import kotlinx.coroutines.CoroutineScope @@ -64,7 +63,8 @@ object LocalBooksModule { var dataModule : Module = module { factory { LocalBooksRepositoryImpl( - application = get() + application = get(), + localFilesForBook = get() ) as ILocalBooksRepository } From 47df2f41d8bda932ee49d3f30541d39767ce6b5e Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 22:20:57 +0530 Subject: [PATCH 55/62] module unloading removed --- .../com/allsoftdroid/audiobook/presentation/MainActivity.kt | 2 -- .../feature_book/presentation/AudioBookListFragment.kt | 5 ----- .../feature_mini_player/presentation/MiniPlayerFragment.kt | 1 - 3 files changed, 8 deletions(-) diff --git a/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt b/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt index 1bf326c9..aa1ce0cc 100644 --- a/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt +++ b/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt @@ -259,7 +259,6 @@ class MainActivity : BaseActivity() { layoutParams = layout } } - } private fun performAction(event: AudioPlayerEvent){ @@ -321,7 +320,6 @@ class MainActivity : BaseActivity() { stopAudioService() disposables.dispose() downloader.Destroy() - AppModule.unloadModule() } private fun stopAudioService(){ diff --git a/feature_book/src/main/java/com/allsoftdroid/feature_book/presentation/AudioBookListFragment.kt b/feature_book/src/main/java/com/allsoftdroid/feature_book/presentation/AudioBookListFragment.kt index 05a2c654..a0615abf 100644 --- a/feature_book/src/main/java/com/allsoftdroid/feature_book/presentation/AudioBookListFragment.kt +++ b/feature_book/src/main/java/com/allsoftdroid/feature_book/presentation/AudioBookListFragment.kt @@ -274,9 +274,4 @@ class AudioBookListFragment : BaseUIFragment(){ } } } - - override fun onDestroy() { - super.onDestroy() - FeatureBookModule.unLoadModules() - } } \ No newline at end of file diff --git a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt index 7b6dca27..e2ee040c 100644 --- a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt +++ b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt @@ -47,6 +47,5 @@ class MiniPlayerFragment : BaseContainerFragment() { override fun onDestroy() { super.onDestroy() - FeatureMiniPlayerModule.unloadModule() } } \ No newline at end of file From df4ff9fecfc86b43f697bacacd08de1f9634e65d Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Wed, 20 May 2020 22:44:28 +0530 Subject: [PATCH 56/62] fixed bug --- .../book_details/utils/FakeAudioDataSource.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/feature_book_details/src/test/java/com/allsoftdroid/feature/book_details/utils/FakeAudioDataSource.kt b/feature_book_details/src/test/java/com/allsoftdroid/feature/book_details/utils/FakeAudioDataSource.kt index 0efd915f..fd6138a6 100644 --- a/feature_book_details/src/test/java/com/allsoftdroid/feature/book_details/utils/FakeAudioDataSource.kt +++ b/feature_book_details/src/test/java/com/allsoftdroid/feature/book_details/utils/FakeAudioDataSource.kt @@ -2,6 +2,7 @@ package com.allsoftdroid.feature.book_details.utils import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import com.allsoftdroid.common.test.getOrAwaitValue import com.allsoftdroid.database.metadataCacheDB.MetadataDao import com.allsoftdroid.database.metadataCacheDB.entity.DatabaseAlbumEntity import com.allsoftdroid.database.metadataCacheDB.entity.DatabaseMetadataEntity @@ -17,6 +18,10 @@ class FakeMetadataSource(private val _metadataLiveData: MutableLiveData { return _albumEntity @@ -34,6 +39,13 @@ class FakeMetadataSource(private val _metadataLiveData: MutableLiveData { + return _tracks.getOrAwaitValue() + } + override fun getTrackDetailsVBR(metadata_id: String): LiveData> { return _tracks } From f0376f35ae6c9f8471c10755c29c059658beafeb Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 10:43:55 +0530 Subject: [PATCH 57/62] toolbar title changed to begin from left --- .../src/main/res/layout/fragment_mybooks_layout.xml | 7 ++++--- feature_mybooks/src/main/res/values/dimens.xml | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml index bf07cf31..6e627321 100644 --- a/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml +++ b/feature_mybooks/src/main/res/layout/fragment_mybooks_layout.xml @@ -20,8 +20,8 @@ diff --git a/feature_mybooks/src/main/res/values/dimens.xml b/feature_mybooks/src/main/res/values/dimens.xml index 04ca0094..8d3c3561 100644 --- a/feature_mybooks/src/main/res/values/dimens.xml +++ b/feature_mybooks/src/main/res/values/dimens.xml @@ -14,4 +14,5 @@ 90dp 16dp + 24dp \ No newline at end of file From 5146572867ad823c03c98079982dfc6aab45f99c Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 10:44:22 +0530 Subject: [PATCH 58/62] toolbar title changed to begin from left --- .../layout/fragment_listen_later_layout.xml | 19 ++++++++++--------- .../src/main/res/values/dimens.xml | 4 ++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/feature_listen_later_ui/src/main/res/layout/fragment_listen_later_layout.xml b/feature_listen_later_ui/src/main/res/layout/fragment_listen_later_layout.xml index 52f02260..39e2b656 100644 --- a/feature_listen_later_ui/src/main/res/layout/fragment_listen_later_layout.xml +++ b/feature_listen_later_ui/src/main/res/layout/fragment_listen_later_layout.xml @@ -17,7 +17,7 @@ android:layout_height="?actionBarSize" app:layout_constraintEnd_toEndOf="parent" android:background="@color/black" - android:padding="2dp" + android:padding="@dimen/padding_min" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:id="@+id/toolbar" @@ -25,11 +25,11 @@ @@ -38,8 +38,9 @@ android:id="@+id/toolbar_title" android:textColor="@color/white" android:layout_width="0dp" + android:layout_marginStart="@dimen/margin_normal" android:textAppearance="@style/TextAppearance.AppCompat.Large" - android:gravity="center" + android:gravity="start|center_vertical" android:text="@string/toolbar_title_text" android:layout_height="match_parent" android:layout_weight="1"/> @@ -47,7 +48,7 @@ diff --git a/feature_listen_later_ui/src/main/res/values/dimens.xml b/feature_listen_later_ui/src/main/res/values/dimens.xml index 45d56c8b..ec0aea26 100644 --- a/feature_listen_later_ui/src/main/res/values/dimens.xml +++ b/feature_listen_later_ui/src/main/res/values/dimens.xml @@ -3,4 +3,8 @@ 24dp 16dp 90dp + + 2dp + 24dp + 16dp \ No newline at end of file From c9c5dc6f55377f99ed6a1180e6216dcfa0a2b692 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 11:07:43 +0530 Subject: [PATCH 59/62] color changed to purple --- feature_downloader/src/main/res/drawable/ic_close_circle.xml | 2 +- feature_downloader/src/main/res/drawable/ic_delete.xml | 2 +- feature_downloader/src/main/res/drawable/ic_file_music.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feature_downloader/src/main/res/drawable/ic_close_circle.xml b/feature_downloader/src/main/res/drawable/ic_close_circle.xml index 8c3303c8..6a920e0a 100644 --- a/feature_downloader/src/main/res/drawable/ic_close_circle.xml +++ b/feature_downloader/src/main/res/drawable/ic_close_circle.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file diff --git a/feature_downloader/src/main/res/drawable/ic_delete.xml b/feature_downloader/src/main/res/drawable/ic_delete.xml index ef65fba8..c8b20470 100644 --- a/feature_downloader/src/main/res/drawable/ic_delete.xml +++ b/feature_downloader/src/main/res/drawable/ic_delete.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file diff --git a/feature_downloader/src/main/res/drawable/ic_file_music.xml b/feature_downloader/src/main/res/drawable/ic_file_music.xml index 986cc4d5..a08cca0c 100644 --- a/feature_downloader/src/main/res/drawable/ic_file_music.xml +++ b/feature_downloader/src/main/res/drawable/ic_file_music.xml @@ -4,5 +4,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + \ No newline at end of file From 900884acecb9ff2eba1d9f21b131b1bb6cef3baf Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 11:08:34 +0530 Subject: [PATCH 60/62] text color and style changed --- .../src/main/res/layout/recycler_download_item.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/feature_downloader/src/main/res/layout/recycler_download_item.xml b/feature_downloader/src/main/res/layout/recycler_download_item.xml index e5964b91..eb37bdb1 100644 --- a/feature_downloader/src/main/res/layout/recycler_download_item.xml +++ b/feature_downloader/src/main/res/layout/recycler_download_item.xml @@ -15,7 +15,8 @@ android:id="@+id/textView_download_file_name" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:layout_width="0dp" - android:textColor="@color/colorItem" + android:textColor="@color/colorPrimary" + android:textStyle="bold" android:layout_weight="1" android:layout_height="wrap_content" /> @@ -48,6 +49,7 @@ style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="0dp" android:paddingEnd="@dimen/padding_standard" + android:paddingStart="@dimen/standard_padding_min" android:layout_weight="3" android:layout_gravity="center" android:layout_height="wrap_content" /> From 2c5f156815db0f0d6758f053f571d40d159ac0a2 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 11:08:59 +0530 Subject: [PATCH 61/62] text color changed --- feature_downloader/src/main/res/layout/layout_empty_content.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_downloader/src/main/res/layout/layout_empty_content.xml b/feature_downloader/src/main/res/layout/layout_empty_content.xml index 24a8ad8f..dcad6dbe 100644 --- a/feature_downloader/src/main/res/layout/layout_empty_content.xml +++ b/feature_downloader/src/main/res/layout/layout_empty_content.xml @@ -20,7 +20,7 @@ android:text="@string/emptyView_download_message" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:layout_width="wrap_content" - android:textColor="@color/colorItem" + android:textColor="@color/colorPrimary" android:layout_marginBottom="@dimen/margin_standard" android:layout_height="wrap_content" /> \ No newline at end of file From c64839f2384df82e1ee5bc34dccaec138cc2bc78 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Thu, 21 May 2020 11:09:25 +0530 Subject: [PATCH 62/62] background color removed --- .../src/main/res/layout/activity_download_management.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/feature_downloader/src/main/res/layout/activity_download_management.xml b/feature_downloader/src/main/res/layout/activity_download_management.xml index c5eb111e..50c390ac 100644 --- a/feature_downloader/src/main/res/layout/activity_download_management.xml +++ b/feature_downloader/src/main/res/layout/activity_download_management.xml @@ -2,7 +2,6 @@