Преглед на файлове

Addev view and presenter for main screen

Vadik Sirekanyan преди 7 години
родител
ревизия
4227b48590

+ 3 - 0
app/src/main/java/com/sirekanyan/knigopis/common/extensions/Activity.kt

@@ -3,6 +3,9 @@ package com.sirekanyan.knigopis.common.extensions
 import android.app.Activity
 import android.view.View
 
+fun Activity.getRootView(): View =
+    findViewById(android.R.id.content)
+
 fun Activity.showKeyboard(view: View) {
     if (view.requestFocus()) {
         systemInputMethodManager.showSoftInput(view, 0)

+ 16 - 43
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -38,7 +38,6 @@ import com.sirekanyan.knigopis.model.CurrentTab.*
 import com.sirekanyan.knigopis.repository.*
 import com.tbruyelle.rxpermissions2.RxPermissions
 import io.reactivex.Flowable
-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.notes_page.*
@@ -50,7 +49,7 @@ private const val ULOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
 private const val CURRENT_TAB_KEY = "current_tab"
 
-class MainActivity : BaseActivity(), Router {
+class MainActivity : BaseActivity(), Router, MainPresenter.Router {
 
     private val api by inject<Endpoint>()
     private val config by inject<Configuration>()
@@ -75,9 +74,8 @@ class MainActivity : BaseActivity(), Router {
         setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
-        booksRecyclerView.adapter = booksAdapter
-        usersRecyclerView.adapter = usersAdapter
-        notesRecyclerView.adapter = notesAdapter
+        val view = MainViewImpl(getRootView(), booksAdapter, usersAdapter, notesAdapter)
+        MainPresenterImpl(view, this, config).apply { view.callbacks = this }
         booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(allBooks)))
         val currentTabId = savedInstanceState?.getInt(CURRENT_TAB_KEY)
         val currentTab = currentTabId?.let { CurrentTab.getByItemId(it) }
@@ -85,12 +83,6 @@ class MainActivity : BaseActivity(), Router {
         refresh(currentTab ?: defaultTab)
         initNavigationView()
         initToolbar(toolbar)
-        addBookButton.setOnClickListener {
-            startActivityForResult(
-                createNewBookIntent(),
-                BOOK_REQUEST_CODE
-            )
-        }
         booksRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
             override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                 when {
@@ -174,6 +166,18 @@ class MainActivity : BaseActivity(), Router {
         }
     }
 
+    override fun openProfileScreen() {
+        startActivity(createProfileIntent())
+    }
+
+    override fun reopenScreen() {
+        recreate()
+    }
+
+    override fun openNewBookScreen() {
+        startActivityForResult(createNewBookIntent(), BOOK_REQUEST_CODE)
+    }
+
     private fun initNavigationView() {
         if (auth.isAuthorized()) {
             bottomNavigation.show()
@@ -188,37 +192,6 @@ class MainActivity : BaseActivity(), Router {
     }
 
     private fun initToolbar(toolbar: Toolbar) {
-        toolbar.inflateMenu(R.menu.options)
-        toolbar.setOnMenuItemClickListener { item ->
-            when (item.itemId) {
-                R.id.option_login -> {
-                    login()
-                    true
-                }
-                R.id.option_profile -> {
-                    startActivity(createProfileIntent())
-                    true
-                }
-                R.id.option_about -> {
-                    val dialogView = View.inflate(this, R.layout.about, null)
-                    dialogView.aboutAppVersion.text = BuildConfig.VERSION_NAME
-                    AlertDialog.Builder(this).setView(dialogView).show()
-                    true
-                }
-                R.id.option_dark_theme -> {
-                    item.isChecked = !item.isChecked
-                    config.isDarkTheme = item.isChecked
-                    recreate()
-                    true
-                }
-                R.id.option_clear_cache -> {
-                    getSharedPreferences("cached", MODE_PRIVATE).edit().clear().apply()
-                    cacheDir.deleteRecursively()
-                    true
-                }
-                else -> false
-            }
-        }
         loginOption = toolbar.menu.findItem(R.id.option_login)
         profileOption = toolbar.menu.findItem(R.id.option_profile)
         val darkThemeOption = toolbar.menu.findItem(R.id.option_dark_theme)
@@ -233,7 +206,7 @@ class MainActivity : BaseActivity(), Router {
         }
     }
 
-    private fun login() {
+    override fun login() {
         RxPermissions(this).requestEach(READ_PHONE_STATE).bind({
             when {
                 it.granted -> {

+ 43 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -0,0 +1,43 @@
+package com.sirekanyan.knigopis.feature
+
+import com.sirekanyan.knigopis.repository.Configuration
+
+interface MainPresenter {
+
+    interface Router {
+        fun login()
+        fun openProfileScreen()
+        fun reopenScreen()
+        fun openNewBookScreen()
+    }
+
+}
+
+class MainPresenterImpl(
+    private val view: MainView,
+    private val router: MainPresenter.Router,
+    private val config: Configuration
+) : MainPresenter, MainView.Callbacks {
+
+    override fun onLoginOptionClicked() {
+        router.login()
+    }
+
+    override fun onProfileOptionClicked() {
+        router.openProfileScreen()
+    }
+
+    override fun onAboutOptionClicked() {
+        view.showAboutDialog()
+    }
+
+    override fun onDarkThemeOptionClicked(isChecked: Boolean) {
+        config.isDarkTheme = isChecked
+        router.reopenScreen()
+    }
+
+    override fun onAddBookClicked() {
+        router.openNewBookScreen()
+    }
+
+}

+ 87 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -0,0 +1,87 @@
+package com.sirekanyan.knigopis.feature
+
+import android.content.Context.MODE_PRIVATE
+import android.support.v7.app.AlertDialog
+import android.view.View
+import com.sirekanyan.knigopis.BuildConfig
+import com.sirekanyan.knigopis.R
+import com.sirekanyan.knigopis.feature.books.BooksAdapter
+import com.sirekanyan.knigopis.feature.notes.NotesAdapter
+import com.sirekanyan.knigopis.feature.users.UsersAdapter
+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.notes_page.*
+import kotlinx.android.synthetic.main.users_page.*
+
+interface MainView {
+
+    fun showAboutDialog()
+
+    interface Callbacks {
+        fun onLoginOptionClicked()
+        fun onProfileOptionClicked()
+        fun onAboutOptionClicked()
+        fun onDarkThemeOptionClicked(isChecked: Boolean)
+        fun onAddBookClicked()
+    }
+
+}
+
+class MainViewImpl(
+    override val containerView: View,
+    booksAdapter: BooksAdapter,
+    usersAdapter: UsersAdapter,
+    notesAdapter: NotesAdapter
+) : MainView, LayoutContainer {
+
+    lateinit var callbacks: MainView.Callbacks
+    private val context = containerView.context
+
+    init {
+        toolbar.inflateMenu(R.menu.options)
+        toolbar.setOnMenuItemClickListener { item ->
+            when (item.itemId) {
+                R.id.option_login -> {
+                    callbacks.onLoginOptionClicked()
+                    true
+                }
+                R.id.option_profile -> {
+                    callbacks.onProfileOptionClicked()
+                    true
+                }
+                R.id.option_about -> {
+                    callbacks.onAboutOptionClicked()
+                    true
+                }
+                R.id.option_dark_theme -> {
+                    item.isChecked = !item.isChecked
+                    callbacks.onDarkThemeOptionClicked(item.isChecked)
+                    true
+                }
+                R.id.option_clear_cache -> {
+                    context.cacheDir.deleteRecursively()
+                    context.getSharedPreferences(COMMON_PREFS_NAME, MODE_PRIVATE)
+                        .edit().clear().apply()
+                    true
+                }
+                else -> false
+            }
+        }
+        booksRecyclerView.adapter = booksAdapter
+        usersRecyclerView.adapter = usersAdapter
+        notesRecyclerView.adapter = notesAdapter
+        addBookButton.setOnClickListener {
+            callbacks.onAddBookClicked()
+        }
+    }
+
+    override fun showAboutDialog() {
+        val dialogView = View.inflate(context, R.layout.about, null)
+        dialogView.aboutAppVersion.text = BuildConfig.VERSION_NAME
+        AlertDialog.Builder(context).setView(dialogView).show()
+    }
+
+}

+ 3 - 2
app/src/main/java/com/sirekanyan/knigopis/repository/cache/CommonCache.kt

@@ -1,13 +1,14 @@
 package com.sirekanyan.knigopis.repository.cache
 
 import android.content.Context
+import android.content.Context.MODE_PRIVATE
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import io.reactivex.Completable
 import io.reactivex.Maybe
 import java.lang.reflect.Type
 
-private const val PREFS_NAME = "cached"
+const val COMMON_PREFS_NAME = "cached"
 
 inline fun <reified T> genericType(): Type = object : TypeToken<T>() {}.type
 
@@ -24,7 +25,7 @@ class CommonCacheImpl(
     private val gson: Gson
 ) : CommonCache {
 
-    private val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
+    private val prefs = context.getSharedPreferences(COMMON_PREFS_NAME, MODE_PRIVATE)
 
     override fun <T> getFromJson(key: CacheKey, type: Type): Maybe<T> =
         Maybe.fromCallable {