MainActivity.kt 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package com.sirekanyan.knigopis.feature
  2. import android.Manifest.permission.READ_PHONE_STATE
  3. import android.content.Intent
  4. import android.content.Intent.ACTION_VIEW
  5. import android.net.Uri
  6. import android.os.Bundle
  7. import android.provider.Settings
  8. import android.support.v7.app.AlertDialog
  9. import com.sirekanyan.knigopis.R
  10. import com.sirekanyan.knigopis.common.BaseActivity
  11. import com.sirekanyan.knigopis.common.extensions.io2main
  12. import com.sirekanyan.knigopis.common.extensions.startActivityOrNull
  13. import com.sirekanyan.knigopis.common.extensions.toast
  14. import com.sirekanyan.knigopis.common.functions.logError
  15. import com.sirekanyan.knigopis.createParameters
  16. import com.sirekanyan.knigopis.feature.book.createEditBookIntent
  17. import com.sirekanyan.knigopis.feature.book.createNewBookIntent
  18. import com.sirekanyan.knigopis.feature.profile.createProfileIntent
  19. import com.sirekanyan.knigopis.feature.user.createUserIntent
  20. import com.sirekanyan.knigopis.feature.users.getMainState
  21. import com.sirekanyan.knigopis.feature.users.saveMainState
  22. import com.sirekanyan.knigopis.model.BookDataModel
  23. import com.sirekanyan.knigopis.repository.Configuration
  24. import com.sirekanyan.knigopis.repository.Endpoint
  25. import com.sirekanyan.knigopis.repository.KAuth
  26. import com.tbruyelle.rxpermissions2.RxPermissions
  27. import org.koin.android.ext.android.inject
  28. private const val ULOGIN_REQUEST_CODE = 0
  29. private const val BOOK_REQUEST_CODE = 1
  30. class MainActivity : BaseActivity(), MainPresenter.Router {
  31. private val presenter by inject<MainPresenter>(parameters = createParameters(this))
  32. private val api by inject<Endpoint>()
  33. private val config by inject<Configuration>()
  34. private val auth by inject<KAuth>()
  35. private var userLoggedIn = false
  36. private var booksChanged = false
  37. override fun onCreate(savedInstanceState: Bundle?) {
  38. setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
  39. super.onCreate(savedInstanceState)
  40. setContentView(R.layout.activity_main)
  41. presenter.init(savedInstanceState?.getMainState())
  42. }
  43. override fun onStart() {
  44. super.onStart()
  45. presenter.refreshOptionsMenu()
  46. auth.requestAccessToken().bind({
  47. presenter.refreshOptionsMenu()
  48. if (userLoggedIn) {
  49. userLoggedIn = false
  50. presenter.refresh()
  51. }
  52. }, {
  53. logError("cannot check credentials", it)
  54. })
  55. if (booksChanged) {
  56. booksChanged = false
  57. presenter.refresh(isForce = true)
  58. }
  59. intent.data?.also { userUrl ->
  60. intent.data = null
  61. val normalizedUri = Uri.parse(userUrl.toString().replaceFirst("/#/", "/"))
  62. normalizedUri.getQueryParameter("u")?.let { userId ->
  63. api.getUser(userId)
  64. .io2main()
  65. .bind({ user ->
  66. openUserScreen(userId, user.name, user.photo)
  67. }, {
  68. logError("Cannot get user", it)
  69. })
  70. }
  71. }
  72. }
  73. override fun onStop() {
  74. super.onStop()
  75. presenter.stop()
  76. }
  77. override fun onSaveInstanceState(outState: Bundle) {
  78. super.onSaveInstanceState(outState)
  79. presenter.state?.let { outState.saveMainState(it) }
  80. }
  81. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  82. when (requestCode) {
  83. ULOGIN_REQUEST_CODE -> {
  84. if (resultCode == RESULT_OK && data != null) {
  85. auth.saveTokenResponse(data)
  86. userLoggedIn = true
  87. }
  88. }
  89. BOOK_REQUEST_CODE -> {
  90. booksChanged = resultCode == RESULT_OK
  91. }
  92. }
  93. }
  94. override fun onBackPressed() {
  95. if (!presenter.back()) {
  96. super.onBackPressed()
  97. }
  98. }
  99. override fun openProfileScreen() {
  100. startActivity(createProfileIntent())
  101. }
  102. override fun openNewBookScreen() {
  103. startActivityForResult(createNewBookIntent(), BOOK_REQUEST_CODE)
  104. }
  105. override fun openBookScreen(book: BookDataModel) {
  106. startActivityForResult(createEditBookIntent(book), BOOK_REQUEST_CODE)
  107. }
  108. override fun openUserScreen(id: String, name: String, image: String?) {
  109. startActivity(createUserIntent(id, name, image))
  110. }
  111. override fun openWebPage(uri: Uri) {
  112. startActivityOrNull(Intent(ACTION_VIEW, uri)) ?: toast(R.string.users_info_no_browser)
  113. }
  114. override fun reopenScreen() {
  115. recreate()
  116. }
  117. override fun login() {
  118. RxPermissions(this).requestEach(READ_PHONE_STATE).bind({
  119. when {
  120. it.granted -> {
  121. if (auth.isAuthorized()) {
  122. auth.logout()
  123. presenter.refresh()
  124. } else {
  125. startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
  126. }
  127. presenter.refreshOptionsMenu()
  128. }
  129. it.shouldShowRequestPermissionRationale -> {
  130. AlertDialog.Builder(this)
  131. .setTitle(R.string.permissions_title_no_access)
  132. .setMessage(R.string.permissions_message_no_access)
  133. .setPositiveButton(R.string.common_button_retry) { _, _ ->
  134. login()
  135. }
  136. .setNegativeButton(R.string.common_button_cancel, null)
  137. .setCancelable(false)
  138. .show()
  139. }
  140. else -> {
  141. AlertDialog.Builder(this)
  142. .setTitle(R.string.permissions_title_request)
  143. .setMessage(R.string.permissions_message_request)
  144. .setPositiveButton(R.string.permissions_button_settings) { _, _ ->
  145. startActivity(
  146. Intent(
  147. Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
  148. Uri.fromParts("package", packageName, null)
  149. )
  150. )
  151. }
  152. .setNegativeButton(R.string.common_button_cancel, null)
  153. .setCancelable(false)
  154. .show()
  155. }
  156. }
  157. }, {
  158. logError("cannot request permission", it)
  159. })
  160. }
  161. }