Jelajahi Sumber

Added clearing all subscriptions when activity stops

Vadik Sirekanyan 7 tahun lalu
induk
melakukan
72bf7b1460

+ 35 - 0
app/src/main/java/com/sirekanyan/knigopis/common/BaseActivity.kt

@@ -0,0 +1,35 @@
+package com.sirekanyan.knigopis.common
+
+import android.support.v7.app.AppCompatActivity
+import io.reactivex.Completable
+import io.reactivex.Flowable
+import io.reactivex.Observable
+import io.reactivex.Single
+import io.reactivex.disposables.CompositeDisposable
+
+abstract class BaseActivity : AppCompatActivity() {
+
+    private val disposables = CompositeDisposable()
+
+    fun <T> Flowable<T>.bind(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit) {
+        disposables.add(subscribe(onSuccess, onError))
+    }
+
+    fun <T> Observable<T>.bind(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit) {
+        disposables.add(subscribe(onSuccess, onError))
+    }
+
+    fun <T> Single<T>.bind(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit) {
+        disposables.add(subscribe(onSuccess, onError))
+    }
+
+    fun Completable.bind(onSuccess: () -> Unit, onError: (Throwable) -> Unit) {
+        disposables.add(subscribe(onSuccess, onError))
+    }
+
+    override fun onStop() {
+        super.onStop()
+        disposables.clear()
+    }
+
+}

+ 7 - 8
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -7,7 +7,6 @@ import android.net.Uri
 import android.os.Bundle
 import android.provider.Settings
 import android.support.v7.app.AlertDialog
-import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.RecyclerView
 import android.support.v7.widget.Toolbar
@@ -54,7 +53,7 @@ private const val VERSION_CLICK_COUNT_OFF = 1
 private const val VERSION_CLICK_COUNT_ON = 12
 private const val CURRENT_TAB_KEY = "current_tab"
 
-class MainActivity : AppCompatActivity(), Router {
+class MainActivity : BaseActivity(), Router {
 
     private val api by inject<Endpoint>()
     private val config by inject<Configuration>()
@@ -127,7 +126,7 @@ class MainActivity : AppCompatActivity(), Router {
             normalizedUri.getQueryParameter("u")?.let { userId ->
                 api.getUser(userId)
                     .io2main()
-                    .subscribe({ user ->
+                    .bind({ user ->
                         openUserScreen(userId, user.name, user.photo)
                     }, {
                         logError("Cannot get user", it)
@@ -256,7 +255,7 @@ class MainActivity : AppCompatActivity(), Router {
     }
 
     private fun login() {
-        RxPermissions(this).requestEach(READ_PHONE_STATE).subscribe({
+        RxPermissions(this).requestEach(READ_PHONE_STATE).bind({
             when {
                 it.granted -> {
                     if (auth.isAuthorized()) {
@@ -351,7 +350,7 @@ class MainActivity : AppCompatActivity(), Router {
         bookRepository.observeBooks()
             .io2main()
             .showProgressBar()
-            .subscribe({ books ->
+            .bind({ books ->
                 booksPlaceholder.show(books.isEmpty())
                 booksErrorPlaceholder.hide()
                 allBooks.clear()
@@ -367,7 +366,7 @@ class MainActivity : AppCompatActivity(), Router {
         userRepository.observeUsers()
             .io2main()
             .showProgressBar()
-            .subscribe({ users ->
+            .bind({ users ->
                 usersPlaceholder.show(users.isEmpty())
                 usersErrorPlaceholder.hide()
                 usersAdapter.submitList(users)
@@ -381,7 +380,7 @@ class MainActivity : AppCompatActivity(), Router {
         noteRepository.observeNotes()
             .io2main()
             .showProgressBar()
-            .subscribe({ notes ->
+            .bind({ notes ->
                 notesPlaceholder.show(notes.isEmpty())
                 notesErrorPlaceholder.hide()
                 notesAdapter.submitList(notes)
@@ -443,7 +442,7 @@ class MainActivity : AppCompatActivity(), Router {
                     api.deletePlannedBook(book.id, auth.getAccessToken())
                 }
                     .io2main()
-                    .subscribe({
+                    .bind({
                         refresh(isForce = true)
                     }, {
                         toast(R.string.books_error_delete)

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

@@ -3,7 +3,6 @@ package com.sirekanyan.knigopis.feature.book
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
 import android.widget.SeekBar
 import android.widget.SeekBar.OnSeekBarChangeListener
 import com.sirekanyan.knigopis.R
@@ -55,7 +54,7 @@ fun Context.createEditBookIntent(book: BookDataModel): Intent =
             }
         }
 
-class BookActivity : AppCompatActivity() {
+class BookActivity : BaseActivity() {
 
     private val config by inject<Configuration>()
     private val repository by inject<BookRepository>()
@@ -118,7 +117,7 @@ class BookActivity : AppCompatActivity() {
                             progressMenuItem.actionView.hide()
                             saveMenuItem.isVisible = true
                         }
-                        .subscribe({
+                        .bind({
                             setResult(RESULT_OK)
                             finish()
                         }, {

+ 5 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileActivity.kt

@@ -3,7 +3,6 @@ package com.sirekanyan.knigopis.feature.profile
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.Toolbar
 import android.view.MenuItem
 import android.view.animation.AccelerateInterpolator
@@ -19,7 +18,7 @@ import org.koin.android.ext.android.inject
 
 fun Context.createProfileIntent() = Intent(this, ProfileActivity::class.java)
 
-class ProfileActivity : AppCompatActivity() {
+class ProfileActivity : BaseActivity() {
 
     private val api by inject<Endpoint>()
     private val auth by inject<KAuth>()
@@ -77,7 +76,7 @@ class ProfileActivity : AppCompatActivity() {
 
     private fun refreshProfile() {
         api.getProfile(auth.getAccessToken()).io2main()
-            .subscribe(::onRefreshProfile) {
+            .bind(::onRefreshProfile) {
                 logError("cannot get profile", it)
             }
     }
@@ -92,11 +91,11 @@ class ProfileActivity : AppCompatActivity() {
 
     private fun refreshCounters() {
         api.getFinishedBooks(auth.getAccessToken()).io2main()
-            .subscribe(::onRefreshFinishedBooks) {
+            .bind(::onRefreshFinishedBooks) {
                 logError("cannot check finished books count", it)
             }
         api.getPlannedBooks(auth.getAccessToken()).io2main()
-            .subscribe(::onRefreshPlannedBooks) {
+            .bind(::onRefreshPlannedBooks) {
                 logError("cannot check planned books count", it)
             }
     }
@@ -133,7 +132,7 @@ class ProfileActivity : AppCompatActivity() {
                 profileUrl.orEmpty()
             )
         ).io2main()
-            .subscribe({
+            .bind({
                 profileNickname.text = profileNicknameEditText.text
                 quitEditMode()
                 refreshProfile()

+ 5 - 6
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserActivity.kt

@@ -4,7 +4,6 @@ import android.content.ClipData
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.LinearLayoutManager
 import android.view.Menu
 import android.view.MenuItem
@@ -32,7 +31,7 @@ fun Context.createUserIntent(id: String, name: String, avatar: String?): Intent
         .putExtra(EXTRA_USER_NAME, name)
         .putExtra(EXTRA_USER_PHOTO, avatar)
 
-class UserActivity : AppCompatActivity() {
+class UserActivity : BaseActivity() {
 
     private val config by inject<Configuration>()
     private val interactor by inject<UserInteractor>()
@@ -59,7 +58,7 @@ class UserActivity : AppCompatActivity() {
             interactor.subscribe(userId)
                 .doOnSubscribe { fab.startCollapseAnimation() }
                 .doFinally { fab.startExpandAnimation() }
-                .subscribe({
+                .bind({
                     fab.setOnClickListener(null)
                     fab.isSelected = true
                     fab.setImageResource(R.drawable.ic_done)
@@ -88,7 +87,7 @@ class UserActivity : AppCompatActivity() {
             .doFinally { userBooksProgressBar.hide() }
             .doOnSuccess { userBooksRecyclerView.show() }
             .doOnError { userBooksErrorPlaceholder.show() }
-            .subscribe({
+            .bind({
                 books.clear()
                 books.addAll(it)
                 booksAdapter.submitList(it)
@@ -118,7 +117,7 @@ class UserActivity : AppCompatActivity() {
             }
             R.id.option_unsubscribe -> {
                 interactor.unsubscribe(userId)
-                    .subscribe({}, {
+                    .bind({}, {
                         logError("Cannot unsubscribe", it)
                         toast(R.string.user_error_unsubscribe)
                     })
@@ -130,7 +129,7 @@ class UserActivity : AppCompatActivity() {
 
     private fun onBooksLoaded() {
         interactor.isSubscribed(userId)
-            .subscribe({ isSubscribed ->
+            .bind({ isSubscribed ->
                 if (isSubscribed) {
                     unsubscribeOption.isVisible = true
                 } else {