From f7557459ce6ff74dec258c0053cb68b4b58fbaec Mon Sep 17 00:00:00 2001
From: Smart Tool Factory <smarttoolfactory@icloud.com>
Date: Thu, 24 Sep 2020 10:01:03 +0300
Subject: [PATCH] update adapters

---
 app/src/main/res/layout/activity_main.xml     |  2 +-
 buildSrc/src/main/java/Version.kt             |  2 +-
 config/detekt/detekt.yml                      |  2 +-
 .../com/smarttoolfactory/home/HomeFragment.kt |  2 +-
 .../home/adapter/PostListAdapter.kt           |  4 +--
 .../home/util/ViewBindings.kt                 |  9 ++++--
 .../core/ui/adapter/BaseListAdapter.kt        |  7 ++---
 .../ui/fragment/BaseDataBindingFragment.kt    | 29 ++++++++++++++-----
 .../navhost/BaseDynamicNavHostFragment.kt     |  3 +-
 ...sions.kt => DynamicNavigationExtension.kt} |  0
 ...esFlowTest.kt => PostDaoCoroutinesTest.kt} |  2 +-
 ...inesRxJavaTest.kt => PostDaoRxJavaTest.kt} |  2 +-
 ...utinesTestSuite.kt => PostDaoTestSuite.kt} |  6 ++--
 .../data/db/PostDaoRxJava3.kt                 |  7 -----
 .../smarttoolfactory/data/model/PostEntity.kt |  9 ++++++
 .../domain/di/DomainModule.kt                 | 18 ------------
 .../domain/di/DomainModuleDependencies.kt     | 24 ---------------
 .../usecase/GetPostListUseCaseFlowTest.kt     |  2 --
 18 files changed, 51 insertions(+), 79 deletions(-)
 rename libraries/core/src/main/java/com/smarttoolfactory/core/util/{NavigationExtensions.kt => DynamicNavigationExtension.kt} (100%)
 rename libraries/data/src/androidTest/java/com/smarttoolfactory/data/{PostDaoCoroutinesCoroutinesFlowTest.kt => PostDaoCoroutinesTest.kt} (98%)
 rename libraries/data/src/androidTest/java/com/smarttoolfactory/data/{PostDaoCoroutinesRxJavaTest.kt => PostDaoRxJavaTest.kt} (99%)
 rename libraries/data/src/androidTest/java/com/smarttoolfactory/data/{PostDaoCoroutinesTestSuite.kt => PostDaoTestSuite.kt} (60%)
 delete mode 100644 libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModule.kt
 delete mode 100644 libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModuleDependencies.kt

diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index e33589b..5dea676 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -18,7 +18,7 @@
             app:layout_constraintBottom_toBottomOf="parent"
 
             app:defaultNavHost="true"
-            app:navGraph="@navigation/nav_graph_main"/>
+            app:navGraph="@navigation/nav_graph_main_bottom_nav"/>
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>
\ No newline at end of file
diff --git a/buildSrc/src/main/java/Version.kt b/buildSrc/src/main/java/Version.kt
index cb8eaf6..4ced500 100644
--- a/buildSrc/src/main/java/Version.kt
+++ b/buildSrc/src/main/java/Version.kt
@@ -1,6 +1,6 @@
 object PluginVersion {
     const val KOTLIN_VERSION = "1.4.0"
-    const val GRADLE_VERSION = "4.1.0-rc02"
+    const val GRADLE_VERSION = "4.1.0-rc03"
 
     const val NAV_SAFE_ARGS_VERSION = "2.3.0"
     const val KTLINT_VERSION = "9.3.0"
diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml
index d97cbcc..0070e69 100644
--- a/config/detekt/detekt.yml
+++ b/config/detekt/detekt.yml
@@ -81,7 +81,7 @@ complexity:
   LongMethod:
     active: true
     threshold: 60
-    excludes: ['**/NavigationExtensions.kt']
+    excludes: ['**/DynamicNavigationExtension.kt']
   LongParameterList:
     active: true
     functionThreshold: 6
diff --git a/features/home/src/main/java/com/smarttoolfactory/home/HomeFragment.kt b/features/home/src/main/java/com/smarttoolfactory/home/HomeFragment.kt
index 9b93b06..d8978d5 100644
--- a/features/home/src/main/java/com/smarttoolfactory/home/HomeFragment.kt
+++ b/features/home/src/main/java/com/smarttoolfactory/home/HomeFragment.kt
@@ -73,7 +73,7 @@ class HomeFragment : DynamicNavigationFragment<FragmentHomeBinding>() {
                 it?.let { event: Event<NavController?> ->
                     event.getContentIfNotHandled()?.let { navController ->
                         val appBarConfig = AppBarConfiguration(navController.graph)
-                        dataBinding!!.toolbar.setupWithNavController(navController, appBarConfig)
+                        dataBinding.toolbar.setupWithNavController(navController, appBarConfig)
                     }
                 }
             }
diff --git a/features/home/src/main/java/com/smarttoolfactory/home/adapter/PostListAdapter.kt b/features/home/src/main/java/com/smarttoolfactory/home/adapter/PostListAdapter.kt
index 65ba096..df61287 100644
--- a/features/home/src/main/java/com/smarttoolfactory/home/adapter/PostListAdapter.kt
+++ b/features/home/src/main/java/com/smarttoolfactory/home/adapter/PostListAdapter.kt
@@ -82,13 +82,13 @@ class PostDiffCallback : DiffUtil.ItemCallback<Post>() {
         oldItem: Post,
         newItem: Post
     ): Boolean {
-        return oldItem == newItem
+        return oldItem.id == newItem.id
     }
 
     override fun areContentsTheSame(
         oldItem: Post,
         newItem: Post
     ): Boolean {
-        return oldItem.id == newItem.id
+        return oldItem == newItem
     }
 }
diff --git a/features/home/src/main/java/com/smarttoolfactory/home/util/ViewBindings.kt b/features/home/src/main/java/com/smarttoolfactory/home/util/ViewBindings.kt
index 542d9db..9e57112 100755
--- a/features/home/src/main/java/com/smarttoolfactory/home/util/ViewBindings.kt
+++ b/features/home/src/main/java/com/smarttoolfactory/home/util/ViewBindings.kt
@@ -21,8 +21,13 @@ import com.smarttoolfactory.home.R
 @BindingAdapter("app:items")
 fun RecyclerView.setItems(items: List<Post>?) {
 
-    items?.let {
-        (adapter as ListAdapter<Post, *>)?.submitList(items)
+    try {
+        items?.let {
+            (adapter as? ListAdapter<Post, *>)?.submitList(items)
+        }
+    } catch (e: Exception) {
+        e.printStackTrace()
+        println("ViewBindings exception: ${e.message}")
     }
 }
 
diff --git a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/adapter/BaseListAdapter.kt b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/adapter/BaseListAdapter.kt
index e447b36..a7a56d6 100644
--- a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/adapter/BaseListAdapter.kt
+++ b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/adapter/BaseListAdapter.kt
@@ -1,6 +1,5 @@
 package com.smarttoolfactory.core.ui.adapter
 
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.annotation.LayoutRes
@@ -53,6 +52,7 @@ abstract class BaseListAdapter<ItemType>(
         position: Int,
         payloads: MutableList<Any>
     ) {
+        super.onBindViewHolder(holder, position, payloads)
 
         val item: ItemType? = currentList.getOrNull(position)
 
@@ -63,10 +63,7 @@ abstract class BaseListAdapter<ItemType>(
         }
     }
 
-    override fun onBindViewHolder(holder: BaseItemViewHolder, position: Int) {
-        println("🔥🔥")
-        Log.d(BaseListAdapter::class.toString(), "onBindViewHolder")
-    }
+    override fun onBindViewHolder(holder: BaseItemViewHolder, position: Int) = Unit
 
     /**
      * Called when a ViewHolder is created. ViewHolder is either created first time or
diff --git a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/BaseDataBindingFragment.kt b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/BaseDataBindingFragment.kt
index 632a677..b1bc71e 100644
--- a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/BaseDataBindingFragment.kt
+++ b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/BaseDataBindingFragment.kt
@@ -33,7 +33,7 @@ abstract class BaseDataBindingFragment<ViewBinding : ViewDataBinding> : Fragment
 
     private var _dataBinding: ViewBinding? = null
 
-    lateinit var dataBinding: ViewBinding
+    val dataBinding: ViewBinding get() = _dataBinding!!
 
     /**
      * This method gets the layout id from the derived fragment to bind to that layout via data-binding
@@ -53,14 +53,14 @@ abstract class BaseDataBindingFragment<ViewBinding : ViewDataBinding> : Fragment
         savedInstanceState: Bundle?
     ): View? {
 
+        println("🤣 ${this.javaClass.simpleName} #${this.hashCode()} onCreateView()")
+
         // Each fragment can have it's separate toolbar menu
         setHasOptionsMenu(true)
 
         _dataBinding =
             DataBindingUtil.inflate(inflater, getLayoutRes(), container, false)
 
-        dataBinding = _dataBinding!!
-
         /**
          *   🔥🔥 Using viewLifecycleOwner instead of this(fragment) makes sure that
          *   when this fragment is retrieved from back stack another observer is not added
@@ -77,19 +77,32 @@ abstract class BaseDataBindingFragment<ViewBinding : ViewDataBinding> : Fragment
             dimensions.y = rootView.height
         }
 
-        bindViews()
-
         return rootView
     }
 
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        bindViews()
+    }
+
     override fun onDestroyView() {
-        _dataBinding = null
         super.onDestroyView()
+        _dataBinding = null
+        println("🥵 ${this.javaClass.simpleName} #${this.hashCode()}  onDestroyView()")
     }
 
     /**
-     * Called from [Fragment.onCreateView] to implement bound ui items and set properties
+     * Called from [Fragment.onViewCreated] to implement bound ui items and set properties
      */
-    open fun bindViews() {
+    open fun bindViews() = Unit
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        println("😀 ${this.javaClass.simpleName} #${this.hashCode()}  onCreate()")
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        println("🥶 ${this.javaClass.simpleName} #${this.hashCode()}  onDestroy()")
     }
 }
diff --git a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/navhost/BaseDynamicNavHostFragment.kt b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/navhost/BaseDynamicNavHostFragment.kt
index c8db2e5..9e22c19 100644
--- a/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/navhost/BaseDynamicNavHostFragment.kt
+++ b/libraries/core/src/main/java/com/smarttoolfactory/core/ui/fragment/navhost/BaseDynamicNavHostFragment.kt
@@ -4,7 +4,6 @@ import android.os.Bundle
 import androidx.annotation.NavigationRes
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment
-import androidx.navigation.fragment.NavHostFragment
 import com.smarttoolfactory.core.error.NavigationException
 import com.smarttoolfactory.core.util.Event
 import com.smarttoolfactory.core.viewmodel.NavControllerViewModel
@@ -14,7 +13,7 @@ import com.smarttoolfactory.core.viewmodel.NavControllerViewModel
  * uses [BaseDynamicNavHostFragment.createDynamicNavHostFragment] function with navigation graph
  * parameter
  */
-class BaseDynamicNavHostFragment : NavHostFragment() {
+class BaseDynamicNavHostFragment : DynamicNavHostFragment() {
 
     private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
 
diff --git a/libraries/core/src/main/java/com/smarttoolfactory/core/util/NavigationExtensions.kt b/libraries/core/src/main/java/com/smarttoolfactory/core/util/DynamicNavigationExtension.kt
similarity index 100%
rename from libraries/core/src/main/java/com/smarttoolfactory/core/util/NavigationExtensions.kt
rename to libraries/core/src/main/java/com/smarttoolfactory/core/util/DynamicNavigationExtension.kt
diff --git a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesCoroutinesFlowTest.kt b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTest.kt
similarity index 98%
rename from libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesCoroutinesFlowTest.kt
rename to libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTest.kt
index 59cd809..c00df15 100644
--- a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesCoroutinesFlowTest.kt
+++ b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTest.kt
@@ -20,7 +20,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
-class PostDaoCoroutinesCoroutinesFlowTest {
+class PostDaoCoroutinesTest {
 
     companion object {
         val postEntityList =
diff --git a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesRxJavaTest.kt b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoRxJavaTest.kt
similarity index 99%
rename from libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesRxJavaTest.kt
rename to libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoRxJavaTest.kt
index 8129761..f22b87b 100644
--- a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesRxJavaTest.kt
+++ b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoRxJavaTest.kt
@@ -15,7 +15,7 @@ import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 
-class PostDaoCoroutinesRxJavaTest {
+class PostDaoRxJavaTest {
 
     companion object {
         val postEntityList =
diff --git a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTestSuite.kt b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoTestSuite.kt
similarity index 60%
rename from libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTestSuite.kt
rename to libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoTestSuite.kt
index 4c96d02..dca2ab8 100644
--- a/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoCoroutinesTestSuite.kt
+++ b/libraries/data/src/androidTest/java/com/smarttoolfactory/data/PostDaoTestSuite.kt
@@ -6,7 +6,7 @@ import org.junit.runners.Suite
 // Runs all unit tests with JUnit4.
 @RunWith(Suite::class)
 @Suite.SuiteClasses(
-    PostDaoCoroutinesCoroutinesFlowTest::class,
-    PostDaoCoroutinesRxJavaTest::class
+    PostDaoCoroutinesTest::class,
+    PostDaoRxJavaTest::class
 )
-class PostDaoCoroutinesTestSuite
+class PostDaoTestSuite
diff --git a/libraries/data/src/main/java/com/smarttoolfactory/data/db/PostDaoRxJava3.kt b/libraries/data/src/main/java/com/smarttoolfactory/data/db/PostDaoRxJava3.kt
index 383b37a..f28f598 100755
--- a/libraries/data/src/main/java/com/smarttoolfactory/data/db/PostDaoRxJava3.kt
+++ b/libraries/data/src/main/java/com/smarttoolfactory/data/db/PostDaoRxJava3.kt
@@ -5,7 +5,6 @@ import androidx.room.Delete
 import androidx.room.Insert
 import androidx.room.OnConflictStrategy
 import androidx.room.Query
-import androidx.room.Update
 import com.smarttoolfactory.data.model.PostEntity
 import io.reactivex.rxjava3.core.Completable
 import io.reactivex.rxjava3.core.Maybe
@@ -68,10 +67,4 @@ interface PostDaoRxJava3 {
 //     */
 //    @Query("SELECT * FROM post ORDER BY displayCount DESC")
 //    suspend fun getDisplayedMostPosts(): List<PostEntity>
-
-    /**
-     * Update a post's favorite or display count status.
-     */
-    @Update
-    fun updatePostFavoriteOrSelectStatus(postEntity: PostEntity)
 }
diff --git a/libraries/data/src/main/java/com/smarttoolfactory/data/model/PostEntity.kt b/libraries/data/src/main/java/com/smarttoolfactory/data/model/PostEntity.kt
index 29fa418..2e5c3fe 100644
--- a/libraries/data/src/main/java/com/smarttoolfactory/data/model/PostEntity.kt
+++ b/libraries/data/src/main/java/com/smarttoolfactory/data/model/PostEntity.kt
@@ -28,6 +28,15 @@ data class PostEntity(
  *
  * * Status of the [PostEntity] with [PostEntity.id] or [PostStatus.postId] belong to current user
  * logged in with [PostStatus.userAccountId] or -1 if any user hasn't logged in
+ *
+ * * 🔥 Raw STATEMENT:  "CREATE TABLE IF NOT EXISTS `post_status`
+ *  (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ *  `userAccountId` INTEGER NOT NULL,
+ *  `postId` INTEGER NOT NULL,
+ *  `displayCount` INTEGER NOT NULL,
+ *  `isFavorite` INTEGER NOT NULL,
+ *  FOREIGN KEY(`postId`) REFERENCES `post`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )"
+ *
  */
 @Entity(
     tableName = "post_status",
diff --git a/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModule.kt b/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModule.kt
deleted file mode 100644
index a9613b8..0000000
--- a/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModule.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-// package com.smarttoolfactory.domain.di
-//
-// import com.smarttoolfactory.domain.dispatcher.UseCaseDispatchers
-// import dagger.Module
-// import dagger.Provides
-// import dagger.hilt.InstallIn
-// import dagger.hilt.android.components.ApplicationComponent
-// import kotlinx.coroutines.Dispatchers
-//
-// @Module
-// @InstallIn(ApplicationComponent::class)
-// class DomainModule {
-//
-//    @Provides
-//    fun provideUseCaseDispatchers(): UseCaseDispatchers {
-//        return UseCaseDispatchers(Dispatchers.IO, Dispatchers.Default, Dispatchers.Main)
-//    }
-// }
diff --git a/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModuleDependencies.kt b/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModuleDependencies.kt
deleted file mode 100644
index 0d742ca..0000000
--- a/libraries/domain/src/main/java/com/smarttoolfactory/domain/di/DomainModuleDependencies.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-// package com.smarttoolfactory.domain.di
-//
-// import com.smarttoolfactory.data.repository.PostStatusRepository
-// import com.smarttoolfactory.domain.usecase.GetPostListUseCaseFlow
-// import com.smarttoolfactory.domain.usecase.GetPostListUseCaseRxJava3
-// import com.smarttoolfactory.domain.usecase.GetPostsWithStatusUseCaseFlow
-// import dagger.hilt.EntryPoint
-// import dagger.hilt.InstallIn
-// import dagger.hilt.android.components.ApplicationComponent
-//
-// @EntryPoint
-// @InstallIn(ApplicationComponent::class)
-// interface DomainModuleDependencies {
-//
-//    /*
-//     Provision methods to provide dependencies to components that depend on this component
-//   */
-//
-//    fun postStatusRepository(): PostStatusRepository
-//
-//    fun getPostListUseCaseFlow(): GetPostListUseCaseFlow
-//    fun getPostListUseCaseRxJava3(): GetPostListUseCaseRxJava3
-//    fun getPostsWithStatusUseCaseFlow(): GetPostsWithStatusUseCaseFlow
-// }
diff --git a/libraries/domain/src/test/java/com/smarttoolfactory/domain/usecase/GetPostListUseCaseFlowTest.kt b/libraries/domain/src/test/java/com/smarttoolfactory/domain/usecase/GetPostListUseCaseFlowTest.kt
index 5258e38..c8bfcf9 100644
--- a/libraries/domain/src/test/java/com/smarttoolfactory/domain/usecase/GetPostListUseCaseFlowTest.kt
+++ b/libraries/domain/src/test/java/com/smarttoolfactory/domain/usecase/GetPostListUseCaseFlowTest.kt
@@ -50,8 +50,6 @@ class GetPostListUseCaseFlowTest {
         @RegisterExtension
         val testCoroutineExtension = TestCoroutineExtension()
 
-        val testCoroutineScope = testCoroutineExtension.testCoroutineScope
-
         /*
             Mock Post data
          */