UserActivity.kt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.sirekanyan.knigopis.feature.user
  2. import android.content.ClipData
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.os.Bundle
  6. import android.support.v7.widget.LinearLayoutManager
  7. import android.view.Menu
  8. import android.view.MenuItem
  9. import com.sirekanyan.knigopis.R
  10. import com.sirekanyan.knigopis.common.BaseActivity
  11. import com.sirekanyan.knigopis.common.MAX_BOOK_PRIORITY
  12. import com.sirekanyan.knigopis.common.extensions.*
  13. import com.sirekanyan.knigopis.common.functions.extra
  14. import com.sirekanyan.knigopis.common.functions.logError
  15. import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
  16. import com.sirekanyan.knigopis.common.view.dialog.createDialogItem
  17. import com.sirekanyan.knigopis.common.view.header.HeaderItemDecoration
  18. import com.sirekanyan.knigopis.common.view.header.StickyHeaderImpl
  19. import com.sirekanyan.knigopis.createParameters
  20. import com.sirekanyan.knigopis.feature.book.createNewBookIntent
  21. import com.sirekanyan.knigopis.model.BookDataModel
  22. import com.sirekanyan.knigopis.model.BookModel
  23. import com.sirekanyan.knigopis.repository.Configuration
  24. import kotlinx.android.synthetic.main.user_activity.*
  25. import org.koin.android.ext.android.inject
  26. private val EXTRA_USER_ID = extra("user_id")
  27. private val EXTRA_USER_NAME = extra("user_name")
  28. private val EXTRA_USER_PHOTO = extra("user_photo")
  29. fun Context.createUserIntent(id: String, name: String, avatar: String?): Intent =
  30. Intent(this, UserActivity::class.java)
  31. .putExtra(EXTRA_USER_ID, id)
  32. .putExtra(EXTRA_USER_NAME, name)
  33. .putExtra(EXTRA_USER_PHOTO, avatar)
  34. class UserActivity : BaseActivity() {
  35. private val config by inject<Configuration>()
  36. private val interactor by inject<UserInteractor>()
  37. private val dialogs by inject<DialogFactory>(parameters = createParameters())
  38. private val userId by lazy { intent.getStringExtra(EXTRA_USER_ID) }
  39. private val books = mutableListOf<BookModel>()
  40. private val booksAdapter = UserBooksAdapter(::onBookLongClicked)
  41. private lateinit var unsubscribeOption: MenuItem
  42. override fun onCreate(savedInstanceState: Bundle?) {
  43. if (config.isDarkTheme) {
  44. setTheme(R.style.DarkAppTheme)
  45. }
  46. super.onCreate(savedInstanceState)
  47. setContentView(R.layout.user_activity)
  48. toolbar.title = intent.getStringExtra(EXTRA_USER_NAME)
  49. toolbarImage.setCircleImage(
  50. intent.getStringExtra(EXTRA_USER_PHOTO),
  51. R.drawable.oval_dark_placeholder_background
  52. )
  53. toolbarImage.setElevationRes(R.dimen.image_view_elevation)
  54. setSupportActionBar(toolbar)
  55. fab.setOnClickListener { view ->
  56. interactor.addFriend(userId)
  57. .doOnSubscribe { fab.startCollapseAnimation() }
  58. .doFinally { fab.startExpandAnimation() }
  59. .bind({
  60. fab.setOnClickListener(null)
  61. fab.isSelected = true
  62. fab.setImageResource(R.drawable.ic_done)
  63. }, {
  64. logError("Cannot update subscription", it)
  65. view.snackbar(R.string.common_error_network)
  66. fab.isSelected = false
  67. fab.setImageResource(R.drawable.ic_person_add)
  68. })
  69. }
  70. supportActionBar?.setDisplayHomeAsUpEnabled(true)
  71. val layoutManager = LinearLayoutManager(this)
  72. userBooksRecyclerView.layoutManager = layoutManager
  73. userBooksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(books)))
  74. userBooksRecyclerView.adapter = booksAdapter
  75. }
  76. override fun onStart() {
  77. super.onStart()
  78. interactor.getBooks(userId)
  79. .doOnSubscribe {
  80. userBooksProgressBar.showNow()
  81. userBooksErrorPlaceholder.hideNow()
  82. userBooksRecyclerView.hideNow()
  83. }
  84. .doFinally { userBooksProgressBar.hide() }
  85. .doOnSuccess { userBooksRecyclerView.show() }
  86. .doOnError { userBooksErrorPlaceholder.show() }
  87. .bind({
  88. books.clear()
  89. books.addAll(it)
  90. booksAdapter.submitList(it)
  91. onBooksLoaded()
  92. }, {
  93. logError("Cannot load user books", it)
  94. })
  95. }
  96. override fun onCreateOptionsMenu(menu: Menu): Boolean {
  97. menuInflater.inflate(R.menu.user_menu, menu)
  98. unsubscribeOption = menu.findItem(R.id.option_unsubscribe)
  99. return true
  100. }
  101. override fun onOptionsItemSelected(item: MenuItem): Boolean {
  102. return when (item.itemId) {
  103. android.R.id.home -> {
  104. onBackPressed()
  105. true
  106. }
  107. R.id.option_copy -> {
  108. val link = "http://www.knigopis.com/#/user/books?u=$userId"
  109. systemClipboardManager.primaryClip = ClipData.newPlainText(null, link)
  110. toast(R.string.user_info_copied, link)
  111. true
  112. }
  113. R.id.option_unsubscribe -> {
  114. interactor.removeFriend(userId)
  115. .bind({}, {
  116. logError("Cannot unsubscribe", it)
  117. toast(R.string.user_error_unsubscribe)
  118. })
  119. true
  120. }
  121. else -> false
  122. }
  123. }
  124. private fun onBooksLoaded() {
  125. interactor.isFriend(userId)
  126. .bind({ isSubscribed ->
  127. if (isSubscribed) {
  128. unsubscribeOption.isVisible = true
  129. } else {
  130. fab.showNow()
  131. fab.startExpandAnimation()
  132. }
  133. }, {
  134. logError("Cannot check subscription", it)
  135. })
  136. }
  137. private fun onBookLongClicked(book: BookDataModel) {
  138. dialogs.showDialog(
  139. resources.getFullTitleString(book.title, book.author),
  140. createDialogItem(R.string.user_button_todo, R.drawable.ic_playlist_add) {
  141. startActivity(createNewBookIntent(book.title, book.author))
  142. },
  143. createDialogItem(R.string.user_button_done, R.drawable.ic_playlist_add_check) {
  144. startActivity(createNewBookIntent(book.title, book.author, MAX_BOOK_PRIORITY))
  145. }
  146. )
  147. }
  148. }