Jelajahi Sumber

Removed deprecated kotlin-android-extensions

sirekanian 2 tahun lalu
induk
melakukan
fbabe778ed
37 mengubah file dengan 250 tambahan dan 181 penghapusan
  1. 4 5
      app/build.gradle.kts
  2. 1 2
      app/src/main/java/com/sirekanyan/knigopis/common/android/adapter/CommonViewHolder.kt
  3. 7 6
      app/src/main/java/com/sirekanyan/knigopis/common/android/dialog/DialogFactory.kt
  4. 4 4
      app/src/main/java/com/sirekanyan/knigopis/common/android/header/StickyHeaderImpl.kt
  5. 3 3
      app/src/main/java/com/sirekanyan/knigopis/common/android/toast/CommonView.kt
  6. 9 5
      app/src/main/java/com/sirekanyan/knigopis/common/extensions/CommonView.kt
  7. 3 2
      app/src/main/java/com/sirekanyan/knigopis/common/extensions/ViewGroup.kt
  8. 1 2
      app/src/main/java/com/sirekanyan/knigopis/dependency/book.kt
  9. 1 2
      app/src/main/java/com/sirekanyan/knigopis/dependency/login.kt
  10. 5 11
      app/src/main/java/com/sirekanyan/knigopis/dependency/main.kt
  11. 1 2
      app/src/main/java/com/sirekanyan/knigopis/dependency/profile.kt
  12. 3 3
      app/src/main/java/com/sirekanyan/knigopis/dependency/user.kt
  13. 3 1
      app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt
  14. 17 12
      app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt
  15. 9 10
      app/src/main/java/com/sirekanyan/knigopis/feature/ProgressView.kt
  16. 3 2
      app/src/main/java/com/sirekanyan/knigopis/feature/book/BookActivity.kt
  17. 17 9
      app/src/main/java/com/sirekanyan/knigopis/feature/book/BookView.kt
  18. 13 6
      app/src/main/java/com/sirekanyan/knigopis/feature/books/BookDataViewHolder.kt
  19. 7 6
      app/src/main/java/com/sirekanyan/knigopis/feature/books/BookHeaderViewHolder.kt
  20. 11 7
      app/src/main/java/com/sirekanyan/knigopis/feature/books/BooksView.kt
  21. 3 2
      app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginActivity.kt
  22. 12 12
      app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginView.kt
  23. 14 6
      app/src/main/java/com/sirekanyan/knigopis/feature/notes/NoteViewHolder.kt
  24. 9 7
      app/src/main/java/com/sirekanyan/knigopis/feature/notes/NotesView.kt
  25. 3 2
      app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileActivity.kt
  26. 18 10
      app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileView.kt
  27. 3 2
      app/src/main/java/com/sirekanyan/knigopis/feature/user/UserActivity.kt
  28. 11 6
      app/src/main/java/com/sirekanyan/knigopis/feature/user/UserBookDataViewHolder.kt
  29. 7 6
      app/src/main/java/com/sirekanyan/knigopis/feature/user/UserBookHeaderViewHolder.kt
  30. 12 8
      app/src/main/java/com/sirekanyan/knigopis/feature/user/UserView.kt
  31. 11 6
      app/src/main/java/com/sirekanyan/knigopis/feature/users/UserViewHolder.kt
  32. 9 7
      app/src/main/java/com/sirekanyan/knigopis/feature/users/UsersView.kt
  33. 2 2
      app/src/main/java/com/sirekanyan/knigopis/model/DateModel.kt
  34. 2 2
      app/src/main/java/com/sirekanyan/knigopis/model/EditBookModel.kt
  35. 6 1
      app/src/main/res/layout/activity_main.xml
  36. 3 1
      app/src/main/res/layout/book_edit.xml
  37. 3 1
      app/src/main/res/layout/login_activity.xml

+ 4 - 5
app/build.gradle.kts

@@ -1,11 +1,7 @@
 plugins {
     id("com.android.application")
     id("kotlin-android")
-    id("kotlin-android-extensions")
-}
-
-androidExtensions {
-    isExperimental = true
+    id("kotlin-parcelize")
 }
 
 android {
@@ -46,6 +42,9 @@ android {
     lint {
         warningsAsErrors = true
     }
+    buildFeatures {
+        viewBinding = true
+    }
 }
 
 dependencies {

+ 1 - 2
app/src/main/java/com/sirekanyan/knigopis/common/android/adapter/CommonViewHolder.kt

@@ -2,9 +2,8 @@ package com.sirekanyan.knigopis.common.android.adapter
 
 import android.view.View
 import androidx.recyclerview.widget.RecyclerView
-import com.sirekanyan.knigopis.common.android.toast.CommonView
 
-abstract class CommonViewHolder<T>(view: View) : RecyclerView.ViewHolder(view), CommonView {
+abstract class CommonViewHolder<T>(view: View) : RecyclerView.ViewHolder(view) {
 
     protected var model: T? = null
 

+ 7 - 6
app/src/main/java/com/sirekanyan/knigopis/common/android/dialog/DialogFactory.kt

@@ -2,11 +2,12 @@ package com.sirekanyan.knigopis.common.android.dialog
 
 import android.content.Context
 import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
 import com.google.android.material.bottomsheet.BottomSheetDialog
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.extensions.inflate
-import kotlinx.android.synthetic.main.bottom_sheet_dialog_item.view.*
-import kotlinx.android.synthetic.main.bottom_sheet_dialog_view.*
 
 interface DialogFactory {
 
@@ -19,12 +20,12 @@ class BottomSheetDialogFactory(private val context: Context) : DialogFactory {
     override fun showDialog(title: String, vararg items: DialogItem) {
         val dialog = BottomSheetDialog(context)
         dialog.setContentView(R.layout.bottom_sheet_dialog_view)
-        dialog.bottomSheetTitle.text = title
-        val container = dialog.bottomSheetContainer
+        dialog.findViewById<TextView>(R.id.bottomSheetTitle)!!.text = title
+        val container = dialog.findViewById<ViewGroup>(R.id.bottomSheetContainer)!!
         items.forEach { item ->
             val itemView = container.inflate<View>(R.layout.bottom_sheet_dialog_item)
-            itemView.bottomSheetItemIcon.setImageResource(item.iconRes)
-            item.title.setValueTo(itemView.bottomSheetItemText)
+            itemView.findViewById<ImageView>(R.id.bottomSheetItemIcon).setImageResource(item.iconRes)
+            item.title.setValueTo(itemView.findViewById(R.id.bottomSheetItemText))
             itemView.setOnClickListener {
                 item.onClick()
                 dialog.dismiss()

+ 4 - 4
app/src/main/java/com/sirekanyan/knigopis/common/android/header/StickyHeaderImpl.kt

@@ -1,11 +1,11 @@
 package com.sirekanyan.knigopis.common.android.header
 
 import android.view.View
+import android.widget.TextView
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.HeadedAdapter
 import com.sirekanyan.knigopis.common.extensions.showNow
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.synthetic.main.header.view.*
 
 class StickyHeaderImpl(private val adapter: HeadedAdapter<BookModel>) : StickyHeader {
 
@@ -17,9 +17,9 @@ class StickyHeaderImpl(private val adapter: HeadedAdapter<BookModel>) : StickyHe
 
     override fun bindHeaderData(header: View, headerPosition: Int) {
         val group = adapter.getModelByPosition(headerPosition).group
-        header.headerTitle.text = group.title
-        header.headerCount.text = group.count
-        header.headerBottomDivider.showNow()
+        header.findViewById<TextView>(R.id.headerTitle).text = group.title
+        header.findViewById<TextView>(R.id.headerCount).text = group.count
+        header.findViewById<View>(R.id.headerBottomDivider).showNow()
     }
 
 }

+ 3 - 3
app/src/main/java/com/sirekanyan/knigopis/common/android/toast/CommonView.kt

@@ -1,7 +1,7 @@
 package com.sirekanyan.knigopis.common.android.toast
 
-import android.view.View
+import androidx.viewbinding.ViewBinding
 
-interface CommonView {
-    val containerView: View
+interface CommonView<T : ViewBinding> {
+    val binding: T
 }

+ 9 - 5
app/src/main/java/com/sirekanyan/knigopis/common/extensions/CommonView.kt

@@ -2,23 +2,27 @@ package com.sirekanyan.knigopis.common.extensions
 
 import android.content.Context
 import android.content.res.Resources
+import android.view.View
 import com.google.android.material.snackbar.Snackbar
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 
-val CommonView.context: Context
+val CommonView<*>.containerView: View
+    get() = binding.root
+
+val CommonView<*>.context: Context
     get() = containerView.context
 
-val CommonView.resources: Resources
+val CommonView<*>.resources: Resources
     get() = containerView.resources
 
-fun CommonView.toast(messageId: Int, vararg args: Any) {
+fun CommonView<*>.toast(messageId: Int, vararg args: Any) {
     context.showToast(messageId, *args)
 }
 
-fun CommonView.toast(messageId: Int) {
+fun CommonView<*>.toast(messageId: Int) {
     context.showToast(messageId)
 }
 
-fun CommonView.snackbar(messageId: Int) {
+fun CommonView<*>.snackbar(messageId: Int) {
     Snackbar.make(containerView, messageId, Snackbar.LENGTH_LONG).show()
 }

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/common/extensions/ViewGroup.kt

@@ -1,8 +1,9 @@
 package com.sirekanyan.knigopis.common.extensions
 
 import android.view.LayoutInflater
+import android.view.View
 import android.view.ViewGroup
 import androidx.annotation.LayoutRes
 
-inline fun <reified T> ViewGroup.inflate(@LayoutRes layout: Int) =
-    LayoutInflater.from(context).inflate(layout, this, false) as T
+inline fun <reified T : View> ViewGroup.inflate(@LayoutRes layout: Int) =
+    LayoutInflater.from(context).inflate(layout, this, false) as T

+ 1 - 2
app/src/main/java/com/sirekanyan/knigopis/dependency/book.kt

@@ -1,13 +1,12 @@
 package com.sirekanyan.knigopis.dependency
 
 import com.sirekanyan.knigopis.common.extensions.app
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.book.*
 import com.sirekanyan.knigopis.model.EditBookModel
 
 fun BookActivity.providePresenter(book: EditBookModel): BookPresenter {
     val interactor = BookInteractorImpl(app.bookRepository)
     return BookPresenterImpl(this, interactor, book).also { presenter ->
-        presenter.view = BookViewImpl(getRootView(), presenter, book)
+        presenter.view = BookViewImpl(binding, presenter, book)
     }
 }

+ 1 - 2
app/src/main/java/com/sirekanyan/knigopis/dependency/login.kt

@@ -1,6 +1,5 @@
 package com.sirekanyan.knigopis.dependency
 
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.login.LoginActivity
 import com.sirekanyan.knigopis.feature.login.LoginPresenter
 import com.sirekanyan.knigopis.feature.login.LoginPresenterImpl
@@ -8,5 +7,5 @@ import com.sirekanyan.knigopis.feature.login.LoginViewImpl
 
 fun LoginActivity.providePresenter(): LoginPresenter =
     LoginPresenterImpl(this).also { presenter ->
-        presenter.view = LoginViewImpl(getRootView(), presenter)
+        presenter.view = LoginViewImpl(binding, presenter)
     }

+ 5 - 11
app/src/main/java/com/sirekanyan/knigopis/dependency/main.kt

@@ -2,7 +2,6 @@ package com.sirekanyan.knigopis.dependency
 
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
 import com.sirekanyan.knigopis.common.extensions.app
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.*
 import com.sirekanyan.knigopis.feature.books.BooksPresenterImpl
 import com.sirekanyan.knigopis.feature.books.BooksViewImpl
@@ -11,10 +10,6 @@ import com.sirekanyan.knigopis.feature.notes.NotesViewImpl
 import com.sirekanyan.knigopis.feature.users.UsersPresenterImpl
 import com.sirekanyan.knigopis.feature.users.UsersViewImpl
 import com.sirekanyan.knigopis.model.CurrentTab.*
-import kotlinx.android.synthetic.main.activity_main.view.*
-import kotlinx.android.synthetic.main.books_page.view.*
-import kotlinx.android.synthetic.main.notes_page.view.*
-import kotlinx.android.synthetic.main.users_page.view.*
 
 fun MainActivity.providePresenter(): MainPresenter {
     val booksPresenter = BooksPresenterImpl(this, app.bookRepository)
@@ -30,21 +25,20 @@ fun MainActivity.providePresenter(): MainPresenter {
         app.config,
         app.authRepository
     ).also { mainPresenter ->
-        val rootView = getRootView()
-        val progressView = ProgressViewImpl(rootView.swipeRefresh, mainPresenter)
+        val progressView = ProgressViewImpl(binding, mainPresenter)
         val dialogs: DialogFactory = provideDialogs()
         booksPresenter.also { p ->
-            p.view = BooksViewImpl(rootView.booksPage, booksPresenter, progressView, dialogs)
+            p.view = BooksViewImpl(binding.books, booksPresenter, progressView, dialogs)
             p.parent = mainPresenter
         }
         usersPresenter.also { p ->
-            p.view = UsersViewImpl(rootView.usersPage, usersPresenter, progressView, dialogs)
+            p.view = UsersViewImpl(binding.users, usersPresenter, progressView, dialogs)
             p.parent = mainPresenter
         }
         notesPresenter.also { p ->
-            p.view = NotesViewImpl(rootView.notesPage, notesPresenter, progressView)
+            p.view = NotesViewImpl(binding.notes, notesPresenter, progressView)
             p.parent = mainPresenter
         }
-        mainPresenter.view = MainViewImpl(rootView, mainPresenter)
+        mainPresenter.view = MainViewImpl(binding, mainPresenter)
     }
 }

+ 1 - 2
app/src/main/java/com/sirekanyan/knigopis/dependency/profile.kt

@@ -1,12 +1,11 @@
 package com.sirekanyan.knigopis.dependency
 
 import com.sirekanyan.knigopis.common.extensions.app
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.profile.*
 
 fun ProfileActivity.providePresenter(): ProfilePresenter {
     val interactor = ProfileInteractorImpl(app.endpoint, app.bookRepository, app.tokenStorage)
     return ProfilePresenterImpl(this, interactor).also { presenter ->
-        presenter.view = ProfileViewImpl(getRootView(), presenter)
+        presenter.view = ProfileViewImpl(binding, presenter)
     }
 }

+ 3 - 3
app/src/main/java/com/sirekanyan/knigopis/dependency/user.kt

@@ -1,11 +1,11 @@
 package com.sirekanyan.knigopis.dependency
 
 import com.sirekanyan.knigopis.common.extensions.app
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.user.*
 
 fun UserActivity.providePresenter(id: String, name: String): UserPresenter {
     val interactor = UserInteractorImpl(app.endpoint, app.resourceProvider)
-    return UserPresenterImpl(this, interactor, id, name, app.resourceProvider)
-        .also { it.view = UserViewImpl(getRootView(), it, provideDialogs()) }
+    return UserPresenterImpl(this, interactor, id, name, app.resourceProvider).also { presenter ->
+        presenter.view = UserViewImpl(binding, presenter, provideDialogs())
+    }
 }

+ 3 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -14,6 +14,7 @@ import com.sirekanyan.knigopis.common.extensions.app
 import com.sirekanyan.knigopis.common.extensions.io2main
 import com.sirekanyan.knigopis.common.extensions.showToast
 import com.sirekanyan.knigopis.common.functions.logError
+import com.sirekanyan.knigopis.databinding.ActivityMainBinding
 import com.sirekanyan.knigopis.dependency.providePresenter
 import com.sirekanyan.knigopis.feature.book.createBookIntent
 import com.sirekanyan.knigopis.feature.books.BooksPresenter
@@ -39,6 +40,7 @@ class MainActivity : BaseActivity(),
     UsersPresenter.Router,
     NotesPresenter.Router {
 
+    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
     private val presenter by lazy { providePresenter() }
     private val api by lazy { app.endpoint }
     private val onBackPressedCallback = object : OnBackPressedCallback(true) {
@@ -52,7 +54,7 @@ class MainActivity : BaseActivity(),
     override fun onCreate(savedInstanceState: Bundle?) {
         setTheme(R.style.Theme_Knigopis)
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_main)
+        setContentView(binding.root)
         val restoredCurrentTab = savedInstanceState?.getMainState()?.currentTab
         presenter.init(restoredCurrentTab)
         onBackPressedDispatcher.addCallback(onBackPressedCallback)

+ 17 - 12
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -3,6 +3,7 @@ package com.sirekanyan.knigopis.feature
 import android.content.Context.MODE_PRIVATE
 import android.view.MenuItem
 import android.view.View
+import android.widget.TextView
 import androidx.appcompat.app.AlertDialog
 import com.sirekanyan.knigopis.BuildConfig
 import com.sirekanyan.knigopis.R
@@ -15,23 +16,17 @@ import com.sirekanyan.knigopis.common.extensions.context
 import com.sirekanyan.knigopis.common.extensions.hide
 import com.sirekanyan.knigopis.common.extensions.isNightMode
 import com.sirekanyan.knigopis.common.extensions.show
+import com.sirekanyan.knigopis.databinding.ActivityMainBinding
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.*
 import com.sirekanyan.knigopis.repository.BookSorting
 import com.sirekanyan.knigopis.repository.Theme
 import com.sirekanyan.knigopis.repository.UserSorting
 import com.sirekanyan.knigopis.repository.cache.COMMON_PREFS_NAME
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.about.view.*
-import kotlinx.android.synthetic.main.activity_main.*
-import kotlinx.android.synthetic.main.books_page.*
-import kotlinx.android.synthetic.main.default_app_bar.*
-import kotlinx.android.synthetic.main.notes_page.*
-import kotlinx.android.synthetic.main.users_page.*
 
 private val DEBUG_OPTIONS = arrayOf(R.id.debug_option_clear_cache, R.id.debug_option_toggle_theme)
 
-interface MainView : CommonView {
+interface MainView : CommonView<ActivityMainBinding> {
 
     fun showAboutDialog()
     fun showPage(tab: CurrentTab)
@@ -57,9 +52,19 @@ interface MainView : CommonView {
 }
 
 class MainViewImpl(
-    override val containerView: View,
-    private val callbacks: MainView.Callbacks
-) : MainView, LayoutContainer {
+    override val binding: ActivityMainBinding,
+    private val callbacks: MainView.Callbacks,
+) : MainView {
+
+    private val toolbar = binding.defaultAppBar.toolbar
+    private val booksPage = binding.books.booksPage
+    private val usersPage = binding.users.usersPage
+    private val notesPage = binding.notes.notesPage
+    private val addBookButton = binding.books.addBookButton
+    private val booksRecyclerView = binding.books.booksRecyclerView
+    private val usersRecyclerView = binding.users.usersRecyclerView
+    private val notesRecyclerView = binding.notes.notesRecyclerView
+    private val bottomNavigation = binding.bottomNavigation
 
     private val loginOption: MenuItem
     private val profileOption: MenuItem
@@ -126,7 +131,7 @@ class MainViewImpl(
 
     override fun showAboutDialog() {
         val dialogView = View.inflate(context, R.layout.about, null)
-        dialogView.aboutAppVersion.text = BuildConfig.VERSION_NAME
+        dialogView.findViewById<TextView>(R.id.aboutAppVersion).text = BuildConfig.VERSION_NAME
         AlertDialog.Builder(context).setView(dialogView).show()
     }
 

+ 9 - 10
app/src/main/java/com/sirekanyan/knigopis/feature/ProgressView.kt

@@ -1,15 +1,11 @@
 package com.sirekanyan.knigopis.feature
 
-import android.view.View
 import com.sirekanyan.knigopis.R
-import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.hide
-import com.sirekanyan.knigopis.common.extensions.resources
 import com.sirekanyan.knigopis.common.extensions.show
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.activity_main.*
+import com.sirekanyan.knigopis.databinding.ActivityMainBinding
 
-interface ProgressView : CommonView {
+interface ProgressView {
 
     fun showProgress()
     fun hideProgress()
@@ -22,10 +18,13 @@ interface ProgressView : CommonView {
 }
 
 class ProgressViewImpl(
-    override val containerView: View,
-    callbacks: ProgressView.Callbacks
-) : ProgressView,
-    LayoutContainer {
+    binding: ActivityMainBinding,
+    callbacks: ProgressView.Callbacks,
+) : ProgressView {
+
+    private val resources = binding.root.resources
+    private val swipeRefresh = binding.swipeRefresh
+    private val booksProgressBar = binding.booksProgressBar
 
     private val startOffset = resources.getDimensionPixelSize(R.dimen.swipe_refresh_start_offset)
     private val endOffset = resources.getDimensionPixelSize(R.dimen.swipe_refresh_end_offset)

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/book/BookActivity.kt

@@ -3,10 +3,10 @@ package com.sirekanyan.knigopis.feature.book
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
 import com.sirekanyan.knigopis.common.extensions.getParcelableExtraCompat
 import com.sirekanyan.knigopis.common.functions.extra
+import com.sirekanyan.knigopis.databinding.BookEditBinding
 import com.sirekanyan.knigopis.dependency.providePresenter
 import com.sirekanyan.knigopis.model.EditBookModel
 
@@ -17,11 +17,12 @@ fun Context.createBookIntent(book: EditBookModel): Intent =
 
 class BookActivity : BaseActivity(), BookPresenter.Router {
 
+    val binding by lazy { BookEditBinding.inflate(layoutInflater) }
     private val presenter by lazy { providePresenter(intent.getParcelableExtraCompat(EXTRA_BOOK)!!) }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.book_edit)
+        setContentView(binding.root)
         presenter.init()
     }
 

+ 17 - 9
app/src/main/java/com/sirekanyan/knigopis/feature/book/BookView.kt

@@ -1,20 +1,17 @@
 package com.sirekanyan.knigopis.feature.book
 
 import android.view.MenuItem
-import android.view.View
 import android.widget.SeekBar
 import androidx.annotation.StringRes
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.functions.createBookImageUrl
+import com.sirekanyan.knigopis.databinding.BookEditBinding
 import com.sirekanyan.knigopis.model.DateModel
 import com.sirekanyan.knigopis.model.EditBookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.book_edit.*
-import kotlinx.android.synthetic.main.default_app_bar.*
 
-interface BookView : CommonView {
+interface BookView : CommonView<BookEditBinding> {
 
     fun setTitle(@StringRes title: Int)
     fun setBook(book: EditBookModel)
@@ -36,11 +33,22 @@ interface BookView : CommonView {
 }
 
 class BookViewImpl(
-    override val containerView: View,
+    override val binding: BookEditBinding,
     callbacks: BookView.Callbacks,
-    initialBook: EditBookModel
-) : BookView,
-    LayoutContainer {
+    initialBook: EditBookModel,
+) : BookView {
+
+    private val toolbar = binding.defaultAppBar.toolbar
+    private val titleEditText = binding.titleEditText
+    private val progressSeekBar = binding.progressSeekBar
+    private val authorEditText = binding.authorEditText
+    private val notesTextArea = binding.notesTextArea
+    private val yearEditText = binding.yearEditText
+    private val monthEditText = binding.monthEditText
+    private val dayEditText = binding.dayEditText
+    private val bookImage = binding.bookImage
+    private val progressText = binding.progressText
+    private val bookDateInputGroup = binding.bookDateInputGroup
 
     private val saveMenuItem: MenuItem
     private val progressMenuItem: MenuItem

+ 13 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/books/BookDataViewHolder.kt

@@ -1,19 +1,26 @@
 package com.sirekanyan.knigopis.feature.books
 
 import android.view.View
+import android.widget.ImageView
+import android.widget.ProgressBar
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.book.*
 
 class BookDataViewHolder(
-    override val containerView: View,
+    containerView: View,
     onClick: (BookDataModel) -> Unit,
-    onLongClick: (BookDataModel) -> Unit
-) : CommonViewHolder<BookModel>(containerView),
-    LayoutContainer {
+    onLongClick: (BookDataModel) -> Unit,
+) : CommonViewHolder<BookModel>(containerView) {
+
+    private val resources = containerView.resources
+    private val bookImage = containerView.findViewById<ImageView>(R.id.bookImage)
+    private val bookTitle = containerView.findViewById<TextView>(R.id.bookTitle)
+    private val bookAuthor = containerView.findViewById<TextView>(R.id.bookAuthor)
+    private val bookProgress = containerView.findViewById<ProgressBar>(R.id.bookProgress)
 
     init {
         containerView.setOnClickListener {

+ 7 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/books/BookHeaderViewHolder.kt

@@ -1,16 +1,17 @@
 package com.sirekanyan.knigopis.feature.books
 
 import android.view.View
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.header.*
 
-class BookHeaderViewHolder(
-    override val containerView: View
-) : CommonViewHolder<BookModel>(containerView),
-    LayoutContainer {
+class BookHeaderViewHolder(containerView: View) : CommonViewHolder<BookModel>(containerView) {
+
+    private val headerTitle = containerView.findViewById<TextView>(R.id.headerTitle)
+    private val headerCount = containerView.findViewById<TextView>(R.id.headerCount)
+    private val headerDivider = containerView.findViewById<View>(R.id.headerDivider)
 
     override fun onBind(position: Int, model: BookModel) {
         val header = model as BookHeaderModel

+ 11 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/books/BooksView.kt

@@ -1,6 +1,5 @@
 package com.sirekanyan.knigopis.feature.books
 
-import android.view.View
 import androidx.appcompat.app.AlertDialog
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
@@ -10,13 +9,12 @@ import com.sirekanyan.knigopis.common.android.header.StickyHeaderImpl
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.functions.handleError
+import com.sirekanyan.knigopis.databinding.BooksPageBinding
 import com.sirekanyan.knigopis.feature.ProgressView
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.books_page.*
 
-interface BooksView : CommonView, ProgressView {
+interface BooksView : CommonView<BooksPageBinding>, ProgressView {
 
     fun updateBooks(books: List<BookModel>)
     fun showBooksError(throwable: Throwable)
@@ -36,11 +34,17 @@ interface BooksView : CommonView, ProgressView {
 }
 
 class BooksViewImpl(
-    override val containerView: View,
+    override val binding: BooksPageBinding,
     private val callbacks: BooksView.Callbacks,
     progressView: ProgressView,
-    private val dialogs: DialogFactory
-) : BooksView, LayoutContainer, ProgressView by progressView {
+    private val dialogs: DialogFactory,
+) : BooksView,
+    ProgressView by progressView {
+
+    private val booksRecyclerView = binding.booksRecyclerView
+    private val addBookButton = binding.addBookButton
+    private val booksPlaceholder = binding.booksPlaceholder
+    private val booksErrorPlaceholder = binding.booksErrorPlaceholder
 
     private val booksAdapter = BooksAdapter(callbacks::onBookClicked, callbacks::onBookLongClicked)
 

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginActivity.kt

@@ -10,8 +10,8 @@ import androidx.appcompat.app.AppCompatActivity
 import androidx.browser.customtabs.CustomTabColorSchemeParams
 import androidx.browser.customtabs.CustomTabsIntent
 import androidx.core.content.ContextCompat
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.extensions.app
+import com.sirekanyan.knigopis.databinding.LoginActivityBinding
 import com.sirekanyan.knigopis.dependency.providePresenter
 import com.sirekanyan.knigopis.feature.startMainActivity
 
@@ -24,12 +24,13 @@ fun Context.startLoginActivity() {
 
 class LoginActivity : AppCompatActivity(), LoginPresenter.Router {
 
+    val binding by lazy { LoginActivityBinding.inflate(layoutInflater) }
     private val presenter by lazy { providePresenter() }
     private val auth by lazy { app.authRepository }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.login_activity)
+        setContentView(binding.root)
         presenter.init()
     }
 

+ 12 - 12
app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginView.kt

@@ -1,18 +1,16 @@
 package com.sirekanyan.knigopis.feature.login
 
-import android.view.View
 import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
 import androidx.appcompat.app.AlertDialog
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.context
 import com.sirekanyan.knigopis.common.extensions.inflate
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.default_app_bar.*
-import kotlinx.android.synthetic.main.login_activity.*
-import kotlinx.android.synthetic.main.website_layout.view.*
+import com.sirekanyan.knigopis.databinding.LoginActivityBinding
 
-interface LoginView : CommonView {
+interface LoginView : CommonView<LoginActivityBinding> {
 
     fun addWebsite(website: Website)
     fun showNoBrowserDialog()
@@ -28,10 +26,12 @@ interface LoginView : CommonView {
 }
 
 class LoginViewImpl(
-    override val containerView: View,
-    private val callbacks: LoginView.Callbacks
-) : LoginView,
-    LayoutContainer {
+    override val binding: LoginActivityBinding,
+    private val callbacks: LoginView.Callbacks,
+) : LoginView {
+
+    private val toolbar = binding.defaultAppBar.toolbar
+    private val websitesContainer = binding.websitesContainer
 
     init {
         toolbar.setTitle(R.string.login_title)
@@ -42,8 +42,8 @@ class LoginViewImpl(
     override fun addWebsite(website: Website) {
         websitesContainer.addView(
             websitesContainer.inflate<ViewGroup>(R.layout.website_layout).also { container ->
-                container.websiteTitle.setText(website.title)
-                container.websiteLogo.setImageResource(website.icon)
+                container.findViewById<TextView>(R.id.websiteTitle).setText(website.title)
+                container.findViewById<ImageView>(R.id.websiteLogo).setImageResource(website.icon)
                 container.setOnClickListener {
                     callbacks.onWebsiteClicked(website)
                 }

+ 14 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/notes/NoteViewHolder.kt

@@ -1,18 +1,26 @@
 package com.sirekanyan.knigopis.feature.notes
 
 import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.setCircleImage
 import com.sirekanyan.knigopis.common.extensions.setSquareImage
 import com.sirekanyan.knigopis.model.NoteModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.note.*
 
 class NoteViewHolder(
-    override val containerView: View,
-    private val onClick: (NoteModel) -> Unit
-) : CommonViewHolder<NoteModel>(containerView),
-    LayoutContainer {
+    containerView: View,
+    private val onClick: (NoteModel) -> Unit,
+) : CommonViewHolder<NoteModel>(containerView) {
+
+    private val bookImage = containerView.findViewById<ImageView>(R.id.bookImage)
+    private val bookTitle = containerView.findViewById<TextView>(R.id.bookTitle)
+    private val bookAuthor = containerView.findViewById<TextView>(R.id.bookAuthor)
+    private val userNotes = containerView.findViewById<TextView>(R.id.userNotes)
+    private val userDate = containerView.findViewById<TextView>(R.id.userDate)
+    private val userNickname = containerView.findViewById<TextView>(R.id.userNickname)
+    private val userImage = containerView.findViewById<ImageView>(R.id.userImage)
 
     init {
         containerView.setOnClickListener {

+ 9 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/notes/NotesView.kt

@@ -1,16 +1,15 @@
 package com.sirekanyan.knigopis.feature.notes
 
-import android.view.View
+import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.hide
 import com.sirekanyan.knigopis.common.extensions.keepOnTop
 import com.sirekanyan.knigopis.common.extensions.show
 import com.sirekanyan.knigopis.common.functions.handleError
+import com.sirekanyan.knigopis.databinding.NotesPageBinding
 import com.sirekanyan.knigopis.feature.ProgressView
 import com.sirekanyan.knigopis.model.NoteModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.notes_page.*
 
-interface NotesView : ProgressView {
+interface NotesView : CommonView<NotesPageBinding>, ProgressView {
 
     fun updateNotes(notes: List<NoteModel>)
     fun showNotesError(throwable: Throwable)
@@ -23,13 +22,16 @@ interface NotesView : ProgressView {
 }
 
 class NotesViewImpl(
-    override val containerView: View,
+    override val binding: NotesPageBinding,
     private val callbacks: NotesView.Callbacks,
-    private val progressView: ProgressView
+    private val progressView: ProgressView,
 ) : NotesView,
-    LayoutContainer,
     ProgressView by progressView {
 
+    private val notesRecyclerView = binding.notesRecyclerView
+    private val notesPlaceholder = binding.notesPlaceholder
+    private val notesErrorPlaceholder = binding.notesErrorPlaceholder
+
     private val notesAdapter = NotesAdapter(callbacks::onNoteClicked)
 
     init {

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileActivity.kt

@@ -3,20 +3,21 @@ package com.sirekanyan.knigopis.feature.profile
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
 import com.sirekanyan.knigopis.common.functions.createProfileShareIntent
+import com.sirekanyan.knigopis.databinding.ProfileActivityBinding
 import com.sirekanyan.knigopis.dependency.providePresenter
 
 fun Context.createProfileIntent() = Intent(this, ProfileActivity::class.java)
 
 class ProfileActivity : BaseActivity(), ProfilePresenter.Router {
 
+    val binding by lazy { ProfileActivityBinding.inflate(layoutInflater) }
     private val presenter by lazy(::providePresenter)
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.profile_activity)
+        setContentView(binding.root)
         presenter.init()
     }
 

+ 18 - 10
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileView.kt

@@ -1,20 +1,18 @@
 package com.sirekanyan.knigopis.feature.profile
 
 import android.view.MenuItem
-import android.view.View
 import android.view.animation.AccelerateInterpolator
 import android.view.inputmethod.EditorInfo
 import androidx.appcompat.widget.Toolbar
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.*
+import com.sirekanyan.knigopis.databinding.ProfileActivityBinding
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.ProfileModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.profile_activity.*
 import java.util.*
 
-interface ProfileView : CommonView {
+interface ProfileView : CommonView<ProfileActivityBinding> {
 
     val isEditMode: Boolean
     val isProfileChanged: Boolean
@@ -28,7 +26,7 @@ interface ProfileView : CommonView {
     fun setBooks(
         todo: Stack<BookDataModel>,
         doing: Stack<BookDataModel>,
-        done: Stack<BookDataModel>
+        done: Stack<BookDataModel>,
     )
 
     interface Callbacks {
@@ -42,10 +40,20 @@ interface ProfileView : CommonView {
 }
 
 class ProfileViewImpl(
-    override val containerView: View,
-    private val callbacks: ProfileView.Callbacks
-) : ProfileView,
-    LayoutContainer {
+    override val binding: ProfileActivityBinding,
+    private val callbacks: ProfileView.Callbacks,
+) : ProfileView {
+
+    private val profileNicknameSwitcher = binding.profileNicknameSwitcher
+    private val profileNickname = binding.profileNickname
+    private val profileNicknameEditText = binding.profileNicknameEditText
+    private val profileToolbar = binding.profileToolbar
+    private val profileAvatar = binding.profileAvatar
+    private val profileTodoCount = binding.profileTodoCount
+    private val profileDoingCount = binding.profileDoingCount
+    private val profileDoneCount = binding.profileDoneCount
+    private val topProfileSpace = binding.topProfileSpace
+    private val randomProfileBook = binding.randomProfileBook
 
     private lateinit var editOption: MenuItem
     override val isEditMode get() = profileNicknameSwitcher.displayedChild == 1
@@ -109,7 +117,7 @@ class ProfileViewImpl(
     override fun setBooks(
         todo: Stack<BookDataModel>,
         doing: Stack<BookDataModel>,
-        done: Stack<BookDataModel>
+        done: Stack<BookDataModel>,
     ) {
         mapOf(
             profileTodoCount to todo,

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserActivity.kt

@@ -4,10 +4,10 @@ import android.content.ClipData
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
 import com.sirekanyan.knigopis.common.extensions.systemClipboardManager
 import com.sirekanyan.knigopis.common.functions.extra
+import com.sirekanyan.knigopis.databinding.UserActivityBinding
 import com.sirekanyan.knigopis.dependency.providePresenter
 import com.sirekanyan.knigopis.feature.book.createBookIntent
 import com.sirekanyan.knigopis.model.EditBookModel
@@ -22,6 +22,7 @@ fun Context.createUserIntent(id: String, name: String): Intent =
 
 class UserActivity : BaseActivity(), UserPresenter.Router {
 
+    val binding by lazy { UserActivityBinding.inflate(layoutInflater) }
     private val presenter by lazy {
         providePresenter(
             checkNotNull(intent.getStringExtra(EXTRA_USER_ID)),
@@ -31,7 +32,7 @@ class UserActivity : BaseActivity(), UserPresenter.Router {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.user_activity)
+        setContentView(binding.root)
         presenter.init()
     }
 

+ 11 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserBookDataViewHolder.kt

@@ -1,19 +1,24 @@
 package com.sirekanyan.knigopis.feature.user
 
 import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.setSquareImage
 import com.sirekanyan.knigopis.common.extensions.showNow
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.user_book.*
 
 class UserBookDataViewHolder(
-    override val containerView: View,
-    private val onClick: (BookDataModel) -> Unit
-) : CommonViewHolder<BookModel>(containerView),
-    LayoutContainer {
+    containerView: View,
+    private val onClick: (BookDataModel) -> Unit,
+) : CommonViewHolder<BookModel>(containerView) {
+
+    private val bookTitle = containerView.findViewById<TextView>(R.id.bookTitle)
+    private val bookAuthor = containerView.findViewById<TextView>(R.id.bookAuthor)
+    private val bookNotes = containerView.findViewById<TextView>(R.id.bookNotes)
+    private val bookImage = containerView.findViewById<ImageView>(R.id.bookImage)
 
     init {
         containerView.setOnLongClickListener {

+ 7 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserBookHeaderViewHolder.kt

@@ -1,17 +1,18 @@
 package com.sirekanyan.knigopis.feature.user
 
 import android.view.View
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.showNow
 import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.header.*
 
-class UserBookHeaderViewHolder(
-    override val containerView: View
-) : CommonViewHolder<BookModel>(containerView),
-    LayoutContainer {
+class UserBookHeaderViewHolder(containerView: View) : CommonViewHolder<BookModel>(containerView) {
+
+    private val headerTitle = containerView.findViewById<TextView>(R.id.headerTitle)
+    private val headerCount = containerView.findViewById<TextView>(R.id.headerCount)
+    private val headerDivider = containerView.findViewById<View>(R.id.headerDivider)
 
     override fun onBind(position: Int, model: BookModel) {
         val header = model as BookHeaderModel

+ 12 - 8
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserView.kt

@@ -1,7 +1,6 @@
 package com.sirekanyan.knigopis.feature.user
 
 import android.view.MenuItem
-import android.view.View
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
@@ -10,12 +9,11 @@ import com.sirekanyan.knigopis.common.android.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.android.header.StickyHeaderImpl
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.*
+import com.sirekanyan.knigopis.databinding.UserActivityBinding
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.user_activity.*
 
-interface UserView : CommonView {
+interface UserView : CommonView<UserActivityBinding> {
 
     fun setTitle(title: String)
     fun setImage(url: String?)
@@ -43,15 +41,21 @@ interface UserView : CommonView {
 }
 
 class UserViewImpl(
-    override val containerView: View,
+    override val binding: UserActivityBinding,
     private val callbacks: UserView.Callbacks,
-    private val dialogs: DialogFactory
-) : UserView,
-    LayoutContainer {
+    private val dialogs: DialogFactory,
+) : UserView {
 
     private val unsubscribeOption: MenuItem
     private val booksAdapter = UserBooksAdapter(callbacks::onBookLongClicked)
 
+    private val toolbar = binding.toolbar
+    private val fab = binding.fab
+    private val userBooksRecyclerView = binding.userBooksRecyclerView
+    private val userImage = binding.userImage
+    private val userBooksProgressBar = binding.userBooksProgressBar
+    private val userBooksErrorPlaceholder = binding.userBooksErrorPlaceholder
+
     init {
         initToolbar(callbacks)
         unsubscribeOption = toolbar.menu.findItem(R.id.option_unsubscribe)

+ 11 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/users/UserViewHolder.kt

@@ -1,18 +1,23 @@
 package com.sirekanyan.knigopis.feature.users
 
 import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.setCircleImage
 import com.sirekanyan.knigopis.model.UserModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.user.*
 
 class UserViewHolder(
-    override val containerView: View,
+    containerView: View,
     private val onClick: (UserModel) -> Unit,
-    private val onLongClick: (UserModel) -> Unit
-) : CommonViewHolder<UserModel>(containerView),
-    LayoutContainer {
+    private val onLongClick: (UserModel) -> Unit,
+) : CommonViewHolder<UserModel>(containerView) {
+
+    private val userImage = containerView.findViewById<ImageView>(R.id.userImage)
+    private val userNickname = containerView.findViewById<TextView>(R.id.userNickname)
+    private val totalBooksCount = containerView.findViewById<TextView>(R.id.totalBooksCount)
+    private val newBooksCount = containerView.findViewById<TextView>(R.id.newBooksCount)
 
     init {
         containerView.setOnClickListener {

+ 9 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/users/UsersView.kt

@@ -1,20 +1,19 @@
 package com.sirekanyan.knigopis.feature.users
 
-import android.view.View
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
 import com.sirekanyan.knigopis.common.android.dialog.DialogItem
 import com.sirekanyan.knigopis.common.android.dialog.createDialogItem
+import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.hide
 import com.sirekanyan.knigopis.common.extensions.keepOnTop
 import com.sirekanyan.knigopis.common.extensions.show
 import com.sirekanyan.knigopis.common.functions.handleError
+import com.sirekanyan.knigopis.databinding.UsersPageBinding
 import com.sirekanyan.knigopis.feature.ProgressView
 import com.sirekanyan.knigopis.model.ProfileItem
 import com.sirekanyan.knigopis.model.UserModel
-import kotlinx.android.extensions.LayoutContainer
-import kotlinx.android.synthetic.main.users_page.*
 
-interface UsersView : ProgressView {
+interface UsersView : CommonView<UsersPageBinding>, ProgressView {
 
     fun updateUsers(users: List<UserModel>)
     fun showUsersError(throwable: Throwable)
@@ -30,14 +29,17 @@ interface UsersView : ProgressView {
 }
 
 class UsersViewImpl(
-    override val containerView: View,
+    override val binding: UsersPageBinding,
     private val callbacks: UsersView.Callbacks,
     private val progressView: ProgressView,
-    private val dialogs: DialogFactory
+    private val dialogs: DialogFactory,
 ) : UsersView,
-    LayoutContainer,
     ProgressView by progressView {
 
+    private val usersRecyclerView = binding.usersRecyclerView
+    private val usersPlaceholder = binding.usersPlaceholder
+    private val usersErrorPlaceholder = binding.usersErrorPlaceholder
+
     private val usersAdapter = UsersAdapter(callbacks::onUserClicked, callbacks::onUserLongClicked)
 
     init {

+ 2 - 2
app/src/main/java/com/sirekanyan/knigopis/model/DateModel.kt

@@ -1,7 +1,7 @@
 package com.sirekanyan.knigopis.model
 
 import android.os.Parcelable
-import kotlinx.android.parcel.Parcelize
+import kotlinx.parcelize.Parcelize
 
 val EMPTY_DATE = DateModel("", "", "")
 
@@ -9,7 +9,7 @@ val EMPTY_DATE = DateModel("", "", "")
 data class DateModel(
     val year: String,
     val month: String,
-    val day: String
+    val day: String,
 ) : Parcelable {
     fun isEmpty() = this == EMPTY_DATE
 }

+ 2 - 2
app/src/main/java/com/sirekanyan/knigopis/model/EditBookModel.kt

@@ -2,7 +2,7 @@ package com.sirekanyan.knigopis.model
 
 import android.os.Parcelable
 import com.sirekanyan.knigopis.MAX_BOOK_PRIORITY
-import kotlinx.android.parcel.Parcelize
+import kotlinx.parcelize.Parcelize
 
 val EMPTY_BOOK = EditBookModel(BookAction.NEW)
 
@@ -20,7 +20,7 @@ class EditBookModel(
     val author: String = "",
     val progress: Int = 0,
     val date: DateModel = EMPTY_DATE,
-    val notes: String = ""
+    val notes: String = "",
 ) : Parcelable {
     val isFinished get() = id != null && progress == MAX_BOOK_PRIORITY
     val isPlanned get() = id != null && progress != MAX_BOOK_PRIORITY

+ 6 - 1
app/src/main/res/layout/activity_main.xml

@@ -7,7 +7,9 @@
     android:layout_height="match_parent"
     tools:ignore="MergeRootFrame">
 
-    <include layout="@layout/default_app_bar" />
+    <include
+        android:id="@+id/defaultAppBar"
+        layout="@layout/default_app_bar" />
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swipeRefresh"
@@ -19,15 +21,18 @@
             android:layout_height="match_parent">
 
             <include
+                android:id="@+id/books"
                 layout="@layout/books_page"
                 android:visibility="gone"
                 tools:visibility="visible" />
 
             <include
+                android:id="@+id/users"
                 layout="@layout/users_page"
                 android:visibility="gone" />
 
             <include
+                android:id="@+id/notes"
                 layout="@layout/notes_page"
                 android:visibility="gone" />
 

+ 3 - 1
app/src/main/res/layout/book_edit.xml

@@ -8,7 +8,9 @@
     android:orientation="vertical"
     tools:ignore="Autofill">
 
-    <include layout="@layout/default_app_bar" />
+    <include
+        android:id="@+id/defaultAppBar"
+        layout="@layout/default_app_bar" />
 
     <ScrollView
         android:layout_width="match_parent"

+ 3 - 1
app/src/main/res/layout/login_activity.xml

@@ -4,7 +4,9 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <include layout="@layout/default_app_bar" />
+    <include
+        android:id="@+id/defaultAppBar"
+        layout="@layout/default_app_bar" />
 
     <ScrollView
         android:layout_width="match_parent"