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 */