From 2d0db3229d0e16aee62828aab8df7098e9de3bc1 Mon Sep 17 00:00:00 2001 From: maximsmolyakov Date: Mon, 29 Mar 2021 19:00:12 +0800 Subject: [PATCH 1/3] chore: update build.gradle files --- demo/demoapp/build.gradle | 10 ++++++---- demo/demoapp2/build.gradle | 10 ++++++---- demo/demoapp3/build.gradle | 10 ++++++---- demo/demoapp4/build.gradle | 10 ++++++---- rxmvi/build.gradle | 1 - 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/demo/demoapp/build.gradle b/demo/demoapp/build.gradle index 340fea1..a4158e4 100644 --- a/demo/demoapp/build.gradle +++ b/demo/demoapp/build.gradle @@ -1,17 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 defaultConfig { applicationId "com.maximcode.demoapp" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" @@ -33,6 +31,10 @@ android { jvmTarget = "1.8" } + buildFeatures { + viewBinding true + } + adbOptions { installOptions '-g', '-r' } diff --git a/demo/demoapp2/build.gradle b/demo/demoapp2/build.gradle index 75a7399..3aac7f3 100644 --- a/demo/demoapp2/build.gradle +++ b/demo/demoapp2/build.gradle @@ -1,17 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 defaultConfig { applicationId "com.maximcode.demoapp2" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" @@ -32,6 +30,10 @@ android { kotlinOptions { jvmTarget = "1.8" } + + buildFeatures { + viewBinding true + } } dependencies { diff --git a/demo/demoapp3/build.gradle b/demo/demoapp3/build.gradle index e79d12a..e208d6e 100644 --- a/demo/demoapp3/build.gradle +++ b/demo/demoapp3/build.gradle @@ -1,17 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 defaultConfig { applicationId "com.maximcode.demoapp3" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" @@ -32,6 +30,10 @@ android { kotlinOptions { jvmTarget = "1.8" } + + buildFeatures { + viewBinding true + } } dependencies { diff --git a/demo/demoapp4/build.gradle b/demo/demoapp4/build.gradle index 2c4c1ad..0327d61 100644 --- a/demo/demoapp4/build.gradle +++ b/demo/demoapp4/build.gradle @@ -1,17 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 30 defaultConfig { applicationId "com.maximcode.demoapp4" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" @@ -32,6 +30,10 @@ android { kotlinOptions { jvmTarget = "1.8" } + + buildFeatures { + viewBinding true + } } dependencies { diff --git a/rxmvi/build.gradle b/rxmvi/build.gradle index c1b330a..4ae5215 100644 --- a/rxmvi/build.gradle +++ b/rxmvi/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 30 From 8cc718d2950fa6ca4d0eb5d3fde449c178d08c18 Mon Sep 17 00:00:00 2001 From: maximsmolyakov Date: Mon, 29 Mar 2021 19:04:18 +0800 Subject: [PATCH 2/3] refactor: change the deprecated hilt annotations --- .../src/main/java/com/maximcode/demoapp/di/MainModule.kt | 4 ++-- .../java/com/maximcode/demoapp/main/CounterViewModel.kt | 6 ++++-- .../src/main/java/com/maximcode/demoapp2/di/PostsModule.kt | 4 ++-- .../java/com/maximcode/demoapp2/posts/PostsViewModel.kt | 6 ++++-- .../src/main/java/com/maximcode/demoapp3/di/AppModule.kt | 4 ++-- .../main/java/com/maximcode/demoapp3/main/MainViewModel.kt | 6 ++++-- .../src/main/java/com/maximcode/demoapp4/di/MainModule.kt | 4 ++-- .../main/java/com/maximcode/demoapp4/main/MainViewModel.kt | 6 ++++-- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/demo/demoapp/src/main/java/com/maximcode/demoapp/di/MainModule.kt b/demo/demoapp/src/main/java/com/maximcode/demoapp/di/MainModule.kt index 5b916c1..4e40851 100644 --- a/demo/demoapp/src/main/java/com/maximcode/demoapp/di/MainModule.kt +++ b/demo/demoapp/src/main/java/com/maximcode/demoapp/di/MainModule.kt @@ -33,10 +33,10 @@ import com.maximcode.rxmvi.logger.RxMviLogger import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class MainModule { @Provides fun provideStore(): Store { diff --git a/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterViewModel.kt b/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterViewModel.kt index 9873a31..a028d42 100644 --- a/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterViewModel.kt +++ b/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterViewModel.kt @@ -23,14 +23,16 @@ */ package com.maximcode.demoapp.main -import androidx.hilt.lifecycle.ViewModelInject import com.maximcode.rxmvi.core.store.Store import com.maximcode.rxmvi.utils.plusAssign import com.maximcode.rxmvi.view.RxMviViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import javax.inject.Inject -class CounterViewModel @ViewModelInject constructor( +@HiltViewModel +class CounterViewModel @Inject constructor( private val store: Store): RxMviViewModel(store) { override val disposables = CompositeDisposable() diff --git a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/di/PostsModule.kt b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/di/PostsModule.kt index c89fbd2..3e62ee4 100644 --- a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/di/PostsModule.kt +++ b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/di/PostsModule.kt @@ -34,13 +34,13 @@ import com.maximcode.rxmvi.core.store.createStore import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent import hu.akarnokd.rxjava3.retrofit.RxJava3CallAdapterFactory import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class PostsModule { @Provides diff --git a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsViewModel.kt b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsViewModel.kt index bdc7297..ff776ba 100644 --- a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsViewModel.kt +++ b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsViewModel.kt @@ -23,13 +23,15 @@ */ package com.maximcode.demoapp2.posts -import androidx.hilt.lifecycle.ViewModelInject import com.maximcode.rxmvi.core.store.Store import com.maximcode.rxmvi.utils.plusAssign import com.maximcode.rxmvi.view.RxMviViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.rxjava3.disposables.CompositeDisposable +import javax.inject.Inject -class PostsViewModel @ViewModelInject constructor( +@HiltViewModel +class PostsViewModel @Inject constructor( private val store: Store): RxMviViewModel(store) { override val disposables = CompositeDisposable() diff --git a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/di/AppModule.kt b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/di/AppModule.kt index c89103c..556cb21 100644 --- a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/di/AppModule.kt +++ b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/di/AppModule.kt @@ -30,10 +30,10 @@ import com.maximcode.rxmvi.core.store.createStore import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class AppModule { @Provides fun provideStore(): Store { diff --git a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainViewModel.kt b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainViewModel.kt index dfef62a..df748c2 100644 --- a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainViewModel.kt +++ b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainViewModel.kt @@ -23,14 +23,16 @@ */ package com.maximcode.demoapp3.main -import androidx.hilt.lifecycle.ViewModelInject import com.maximcode.rxmvi.core.store.Store import com.maximcode.rxmvi.utils.plusAssign import com.maximcode.rxmvi.view.RxMviViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import javax.inject.Inject -class MainViewModel@ViewModelInject constructor( +@HiltViewModel +class MainViewModel@Inject constructor( private val store: Store): RxMviViewModel(store) { override val disposables = CompositeDisposable() diff --git a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/di/MainModule.kt b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/di/MainModule.kt index e5ffae5..4372d5c 100644 --- a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/di/MainModule.kt +++ b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/di/MainModule.kt @@ -31,10 +31,10 @@ import com.maximcode.rxmvi.core.store.createStore import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class MainModule { @Provides fun provideStore(): Store { diff --git a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainViewModel.kt b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainViewModel.kt index a918813..0d89253 100644 --- a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainViewModel.kt +++ b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainViewModel.kt @@ -23,14 +23,16 @@ */ package com.maximcode.demoapp4.main -import androidx.hilt.lifecycle.ViewModelInject import com.maximcode.rxmvi.core.store.Store import com.maximcode.rxmvi.utils.plusAssign import com.maximcode.rxmvi.view.RxMviViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import javax.inject.Inject -class MainViewModel @ViewModelInject constructor( +@HiltViewModel +class MainViewModel @Inject constructor( private val store: Store): RxMviViewModel(store) { override val disposables = CompositeDisposable() From a3c7b19c31be8d44e6ba0f383d23ce9f03357628 Mon Sep 17 00:00:00 2001 From: maximsmolyakov Date: Mon, 29 Mar 2021 19:04:57 +0800 Subject: [PATCH 3/3] refactor: migrate to Jetpack view binding --- .../maximcode/demoapp/main/CounterActivity.kt | 30 ++++++++++--------- .../maximcode/demoapp2/posts/PostsActivity.kt | 21 ++++++------- .../demoapp2/recyclerview/RVAdapter.kt | 13 ++++---- .../maximcode/demoapp3/main/MainActivity.kt | 11 +++---- .../maximcode/demoapp4/main/MainActivity.kt | 11 +++---- 5 files changed, 44 insertions(+), 42 deletions(-) diff --git a/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterActivity.kt b/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterActivity.kt index ca60c25..bc06516 100644 --- a/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterActivity.kt +++ b/demo/demoapp/src/main/java/com/maximcode/demoapp/main/CounterActivity.kt @@ -29,16 +29,18 @@ import androidx.activity.viewModels import com.jakewharton.rxbinding4.view.clicks import com.maximcode.rxmvi.view.RxMviActivity import com.maximcode.demoapp.R +import com.maximcode.demoapp.databinding.ActivityCounterBinding import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.activity_counter.* @AndroidEntryPoint class CounterActivity : RxMviActivity() { + private lateinit var binding: ActivityCounterBinding override val viewModel: CounterViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_counter) + binding = ActivityCounterBinding.inflate(layoutInflater) + setContentView(binding.root) bindActions() } @@ -49,21 +51,21 @@ class CounterActivity : RxMviActivity() { } private fun bindActions() { - viewModel.incrementCounter(incBtnView.clicks()) - viewModel.decrementCounter(decBtnView.clicks()) - viewModel.showHint(showHintBtnView.clicks()) + viewModel.incrementCounter(binding.incBtnView.clicks()) + viewModel.decrementCounter(binding.decBtnView.clicks()) + viewModel.showHint(binding.showHintBtnView.clicks()) } private fun renderHint(state: CounterState) { when { state.isHintDisplayed -> { - showHintBtnView.text = getString(R.string.hide_hint_btn) - hintView.visibility = View.VISIBLE + binding.showHintBtnView.text = getString(R.string.hide_hint_btn) + binding.hintView.visibility = View.VISIBLE } !state.isHintDisplayed -> { - showHintBtnView.text = getString(R.string.show_hint_btn) - hintView.visibility = View.GONE + binding. showHintBtnView.text = getString(R.string.show_hint_btn) + binding.hintView.visibility = View.GONE } } } @@ -71,13 +73,13 @@ class CounterActivity : RxMviActivity() { private fun renderCounter(state: CounterState) { when { state.isCalculating -> { - progressView.visibility = View.VISIBLE - counterGroup.visibility = View.GONE + binding.progressView.visibility = View.VISIBLE + binding.counterGroup.visibility = View.GONE } else -> { - progressView.visibility = View.GONE - counterGroup.visibility = View.VISIBLE - counterView.text = state.result.toString() + binding.progressView.visibility = View.GONE + binding.counterGroup.visibility = View.VISIBLE + binding.counterView.text = state.result.toString() } } } diff --git a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsActivity.kt b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsActivity.kt index b600045..c572948 100644 --- a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsActivity.kt +++ b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/posts/PostsActivity.kt @@ -27,22 +27,23 @@ import android.os.Bundle import android.view.View import androidx.activity.viewModels import androidx.recyclerview.widget.LinearLayoutManager -import com.maximcode.demoapp2.R +import com.maximcode.demoapp2.databinding.ActivityPostsBinding import com.maximcode.demoapp2.recyclerview.RVAdapter import com.maximcode.demoapp2.recyclerview.RVMarginDecoration import com.maximcode.rxmvi.view.RxMviActivity import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.activity_posts.* @AndroidEntryPoint class PostsActivity : RxMviActivity() { + private lateinit var binding: ActivityPostsBinding override val viewModel: PostsViewModel by viewModels() private val adapter = RVAdapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_posts) + binding = ActivityPostsBinding.inflate(layoutInflater) + setContentView(binding.root) setRecyclerView() viewModel.loadPosts() @@ -50,21 +51,21 @@ class PostsActivity : RxMviActivity() { override fun render(state: PostsState) { when { - state.loading -> progressView.visibility = View.VISIBLE + state.loading -> binding.progressView.visibility = View.VISIBLE state.loaded -> { if(state.error != null) { - errorView.text = state.error.message - errorView.visibility = View.VISIBLE + binding.errorView.text = state.error.message + binding.errorView.visibility = View.VISIBLE } - progressView.visibility = View.GONE + binding.progressView.visibility = View.GONE adapter.addPosts(state.posts) } } } private fun setRecyclerView() { - recyclerView.layoutManager = LinearLayoutManager(this) - recyclerView.adapter = adapter - recyclerView.addItemDecoration(RVMarginDecoration(this, 16, 16)) + binding.recyclerView.layoutManager = LinearLayoutManager(this) + binding.recyclerView.adapter = adapter + binding.recyclerView.addItemDecoration(RVMarginDecoration(this, 16, 16)) } } diff --git a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/recyclerview/RVAdapter.kt b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/recyclerview/RVAdapter.kt index 39d5a6b..ea473b5 100644 --- a/demo/demoapp2/src/main/java/com/maximcode/demoapp2/recyclerview/RVAdapter.kt +++ b/demo/demoapp2/src/main/java/com/maximcode/demoapp2/recyclerview/RVAdapter.kt @@ -24,26 +24,23 @@ package com.maximcode.demoapp2.recyclerview import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.maximcode.demoapp2.R +import com.maximcode.demoapp2.databinding.RecyclerviewItemBinding import com.maximcode.demoapp2.dto.Post -import kotlinx.android.synthetic.main.recyclerview_item.view.* class RVAdapter(private val posts: MutableList = mutableListOf()): RecyclerView.Adapter() { - class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) { + class Holder(private val binding: RecyclerviewItemBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(post: Post) { - itemView.titleView.text = post.title - itemView.bodyView.text = post.body + binding.titleView.text = post.title + binding.bodyView.text = post.body } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { return Holder( - LayoutInflater.from(parent.context) - .inflate(R.layout.recyclerview_item, parent, false) + RecyclerviewItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) ) } diff --git a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainActivity.kt b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainActivity.kt index f267174..2e28e1f 100644 --- a/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainActivity.kt +++ b/demo/demoapp3/src/main/java/com/maximcode/demoapp3/main/MainActivity.kt @@ -25,23 +25,24 @@ package com.maximcode.demoapp3.main import android.os.Bundle import androidx.activity.viewModels -import com.maximcode.demoapp3.R import com.maximcode.rxmvi.view.RxMviActivity import com.jakewharton.rxbinding4.view.clicks +import com.maximcode.demoapp3.databinding.ActivityMainBinding import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.activity_main.* @AndroidEntryPoint class MainActivity : RxMviActivity() { + private lateinit var binding: ActivityMainBinding override val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - viewModel.showMessage(btnView.clicks()) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + viewModel.showMessage(binding.btnView.clicks()) } override fun render(state: MainState) { - myTextView.text = state.message + binding.myTextView.text = state.message } } diff --git a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainActivity.kt b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainActivity.kt index fd04e82..79e3f8c 100644 --- a/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainActivity.kt +++ b/demo/demoapp4/src/main/java/com/maximcode/demoapp4/main/MainActivity.kt @@ -26,25 +26,26 @@ package com.maximcode.demoapp4.main import android.os.Bundle import androidx.activity.viewModels import com.jakewharton.rxbinding4.widget.textChanges -import com.maximcode.demoapp4.R +import com.maximcode.demoapp4.databinding.ActivityMainBinding import com.maximcode.rxmvi.view.RxMviActivity import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.activity_main.* @AndroidEntryPoint class MainActivity: RxMviActivity() { + private lateinit var binding: ActivityMainBinding override val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - viewModel.validateText(editTextView.textChanges()) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + viewModel.validateText(binding.editTextView.textChanges()) } override fun render(state: MainState) { if(state.text.length > 4) { - editTextView.error = "The text is too long" + binding.editTextView.error = "The text is too long" } } } \ No newline at end of file