diff --git a/app/build.gradle b/app/build.gradle index d66e8048b..77ee0c70e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,6 +23,7 @@ apply plugin: 'kotlin-android' apply plugin: 'findbugs' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions' +apply plugin: 'realm-android' def taskRequest = getGradle().getStartParameter().getTaskRequests().toString() if (taskRequest.contains("Gplay") || taskRequest.contains("findbugs") || taskRequest.contains("lint")) { @@ -169,8 +170,11 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation "io.reactivex.rxjava2:rxjava:2.2.11" - implementation 'com.bluelinelabs:conductor:2.1.5' - implementation 'com.bluelinelabs:conductor-support:2.1.5' + implementation 'com.bluelinelabs:conductor:3.0.0-rc1' + implementation 'com.bluelinelabs:conductor-support:3.0.0-rc1' + implementation 'com.bluelinelabs:conductor-archlifecycle:3.0.0-rc1' + implementation 'com.bluelinelabs:conductor-rxlifecycle2:3.0.0-rc1' + implementation 'com.bluelinelabs:conductor-autodispose:3.0.0-rc1' implementation 'com.squareup.okhttp3:okhttp:3.14.2' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.2' @@ -251,4 +255,5 @@ dependencies { }) findbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0' findbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.6' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java index 1c70ee675..224342a2f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java @@ -54,6 +54,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder; +import com.uber.autodispose.AutoDispose; import io.reactivex.CompletableObserver; import io.reactivex.Observer; @@ -95,8 +96,6 @@ public class AccountVerificationController extends BaseController { private long internalAccountId = -1; - private List disposables = new ArrayList<>(); - private String baseUrl; private String username; private String token; @@ -179,10 +178,10 @@ public class AccountVerificationController extends BaseController { ncApi.getServerStatus(queryUrl) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - disposables.add(d); } @Override @@ -222,10 +221,10 @@ public class AccountVerificationController extends BaseController { private void findServerTalkApp(String credentials) { ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(baseUrl)) .subscribeOn(Schedulers.io()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - disposables.add(d); } @Override @@ -259,10 +258,10 @@ public class AccountVerificationController extends BaseController { userId, null, null, appPreferences.getTemporaryClientCertAlias(), null) .subscribeOn(Schedulers.io()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - disposables.add(d); } @Override @@ -299,10 +298,10 @@ public class AccountVerificationController extends BaseController { ncApi.getUserProfile(credentials, ApiUtils.getUrlForUserProfile(baseUrl)) .subscribeOn(Schedulers.io()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - disposables.add(d); } @Override @@ -427,14 +426,6 @@ public class AccountVerificationController extends BaseController { } - private void dispose() { - for (int i = 0; i < disposables.size(); i++) { - if (!disposables.get(i).isDisposed()) { - disposables.get(i).dispose(); - } - } - } - @Override protected void onDestroyView(@NonNull View view) { super.onDestroyView(view); @@ -443,12 +434,6 @@ public class AccountVerificationController extends BaseController { } } - @Override - public void onDestroy() { - dispose(); - super.onDestroy(); - } - private void abortVerification() { if (!isAccountImport) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java index b54bc2bb0..7903ee129 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java @@ -74,6 +74,8 @@ import com.nextcloud.talk.utils.DoNotDisturbUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder; +import com.uber.autodispose.AutoDispose; + import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -198,6 +200,7 @@ public class CallNotificationController extends BaseController { .subscribeOn(Schedulers.io()) .takeWhile(observable -> !leavingScreen) .retry(3) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -247,6 +250,7 @@ public class CallNotificationController extends BaseController { .subscribeOn(Schedulers.io()) .retry(3) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index b2e61f98e..61c191b1f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -89,6 +89,7 @@ import com.stfalcon.chatkit.messages.MessageInput import com.stfalcon.chatkit.messages.MessagesList import com.stfalcon.chatkit.messages.MessagesListAdapter import com.stfalcon.chatkit.utils.DateFormatter +import com.uber.autodispose.AutoDispose import com.vanniktech.emoji.EmojiPopup import com.webianks.library.PopupBubble import io.reactivex.Observer @@ -149,7 +150,6 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter @BindView(R.id.lobby_text_view) @JvmField var conversationLobbyText: TextView? = null - val disposableList = ArrayList() var roomToken: String? = null val conversationUser: UserEntity? val roomPassword: String @@ -222,9 +222,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter if (conversationUser != null) { ncApi?.getRoom(credentials, ApiUtils.getRoom(conversationUser.baseUrl, roomToken))?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(roomOverall: RoomOverall) { @@ -261,9 +261,10 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter private fun handleFromNotification() { ncApi?.getRooms(credentials, ApiUtils.getUrlForGetRooms(conversationUser?.baseUrl)) - ?.subscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread())?.subscribe(object : Observer { + ?.subscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread()) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) + ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(roomsOverall: RoomsOverall) { @@ -664,14 +665,6 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter inConversation = false } - private fun dispose() { - for (disposable in disposableList) { - if (!disposable.isDisposed()) { - disposable.dispose() - } - } - } - private fun startPing() { if (conversationUser != null && !conversationUser.hasSpreedFeatureCapability("no-ping")) { ncApi?.pingCall(credentials, ApiUtils.getUrlForCallPing(conversationUser.baseUrl, @@ -681,9 +674,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter ?.repeatWhen { observable -> observable.delay(5000, TimeUnit.MILLISECONDS) } ?.takeWhile { observable -> inConversation } ?.retry(3) { observable -> inConversation } + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(genericOverall: GenericOverall) { @@ -711,9 +704,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.retry(3) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(roomOverall: RoomOverall) { @@ -772,9 +765,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter roomToken)) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(genericOverall: GenericOverall) { @@ -797,7 +790,6 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter override fun onError(e: Throwable) {} override fun onComplete() { - dispose() } }) } @@ -843,6 +835,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter message, conversationUser.displayName) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { @@ -939,9 +932,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.takeWhile { observable -> inConversation && !wasDetached } + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer> { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(response: Response<*>) { @@ -968,9 +961,9 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter ?.observeOn(AndroidSchedulers.mainThread()) ?.retry(3) { observable -> inConversation && !wasDetached } ?.takeWhile { observable -> inConversation && !wasDetached } + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer> { override fun onSubscribe(d: Disposable) { - disposableList.add(d) } override fun onNext(response: Response<*>) { @@ -1286,6 +1279,7 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter retrofitBucket.url, retrofitBucket.queryMap) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) + ?.`as`(AutoDispose.autoDisposable(scopeProvider)) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java index c10babf09..1574d0482 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -70,6 +70,7 @@ import com.nextcloud.talk.utils.KeyboardUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.uber.autodispose.AutoDispose; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -154,8 +155,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ NcApi ncApi; private String credentials; private UserEntity currentUser; - private Disposable contactsQueryDisposable; - private Disposable cacheQueryDisposable; private FlexibleAdapter adapter; private List contactItems; private BottomSheet bottomSheet; @@ -289,6 +288,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ retrofitBucket.getUrl(), retrofitBucket.getQueryMap()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -309,6 +309,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ roomOverall.getOcs().getData().getToken())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override @@ -452,8 +453,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ } private void fetchData(boolean startFromScratch) { - dispose(null); - alreadyFetching = true; Set shareeHashSet = new HashSet<>(); Set autocompleteUsersHashSet = new HashSet<>(); @@ -507,10 +506,10 @@ public class ContactsController extends BaseController implements SearchView.OnQ .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .retry(3) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - contactsQueryDisposable = d; } @Override @@ -691,7 +690,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); } - dispose(contactsQueryDisposable); } @@ -700,7 +698,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); } - dispose(contactsQueryDisposable); alreadyFetching = false; disengageProgressBar(); @@ -746,24 +743,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ } } - private void dispose(@Nullable Disposable disposable) { - if (disposable != null && !disposable.isDisposed()) { - disposable.dispose(); - } else if (disposable == null) { - - if (contactsQueryDisposable != null && !contactsQueryDisposable.isDisposed()) { - contactsQueryDisposable.dispose(); - contactsQueryDisposable = null; - } - - if (cacheQueryDisposable != null && !cacheQueryDisposable.isDisposed()) { - cacheQueryDisposable.dispose(); - cacheQueryDisposable = null; - } - } - } - - @Override public void onSaveViewState(@NonNull View view, @NonNull Bundle outState) { adapter.onSaveInstanceState(outState); @@ -778,12 +757,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ } } - @Override - public void onDestroy() { - super.onDestroy(); - dispose(null); - } - @Override public boolean onQueryTextChange(String newText) { if (!newText.equals("") && adapter.hasNewFilter(newText)) { @@ -910,6 +883,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ retrofitBucket.getUrl(), retrofitBucket.getQueryMap()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 0294787a1..fb202b313 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -29,12 +29,17 @@ import android.os.Bundle; import android.os.Handler; import android.text.InputType; import android.text.TextUtils; -import android.view.*; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.ProgressBar; import android.widget.RelativeLayout; + import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.widget.SearchView; import androidx.core.graphics.drawable.RoundedBitmapDrawable; import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; @@ -44,8 +49,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.work.Data; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; -import autodagger.AutoInjector; -import butterknife.BindView; + import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat; @@ -76,8 +80,8 @@ import com.nextcloud.talk.events.MoreMenuClickEvent; import com.nextcloud.talk.interfaces.ConversationMenuInterface; import com.nextcloud.talk.jobs.DeleteConversationWorker; import com.nextcloud.talk.models.database.UserEntity; -import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.conversations.Conversation; +import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.ConductorRemapping; import com.nextcloud.talk.utils.DisplayUtils; @@ -86,27 +90,32 @@ import com.nextcloud.talk.utils.animations.SharedElementTransition; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.uber.autodispose.AutoDispose; import com.yarolegovich.lovelydialog.LovelySaveStateHandler; import com.yarolegovich.lovelydialog.LovelyStandardDialog; -import eu.davidea.fastscroller.FastScroller; -import eu.davidea.flexibleadapter.FlexibleAdapter; -import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; -import io.reactivex.schedulers.Schedulers; + import org.apache.commons.lang3.builder.CompareToBuilder; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.parceler.Parcels; -import retrofit2.HttpException; -import javax.inject.Inject; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.inject.Inject; + +import autodagger.AutoInjector; +import butterknife.BindView; +import eu.davidea.fastscroller.FastScroller; +import eu.davidea.flexibleadapter.FlexibleAdapter; +import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; + @AutoInjector(NextcloudTalkApplication.class) public class ConversationsListController extends BaseController implements SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, FastScroller @@ -149,7 +158,6 @@ public class ConversationsListController extends BaseController implements Searc FloatingActionButton floatingActionButton; private UserEntity currentUser; - private Disposable roomsQueryDisposable; private FlexibleAdapter adapter; private List callItems = new ArrayList<>(); @@ -309,15 +317,14 @@ public class ConversationsListController extends BaseController implements Searc } private void fetchData(boolean fromBottomSheet) { - dispose(null); - isRefreshing = true; callItems = new ArrayList<>(); - roomsQueryDisposable = ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(currentUser.getBaseUrl())) + ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(currentUser.getBaseUrl())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(roomsOverall -> { if (adapterWasNull) { @@ -408,9 +415,7 @@ public class ConversationsListController extends BaseController implements Searc if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); } - dispose(roomsQueryDisposable); }, () -> { - dispose(roomsQueryDisposable); if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); } @@ -471,18 +476,6 @@ public class ConversationsListController extends BaseController implements Searc .popChangeHandler(new HorizontalChangeHandler()))); } - private void dispose(@Nullable Disposable disposable) { - if (disposable != null && !disposable.isDisposed()) { - disposable.dispose(); - disposable = null; - } else if (disposable == null && - roomsQueryDisposable != null && !roomsQueryDisposable.isDisposed()) { - roomsQueryDisposable.dispose(); - roomsQueryDisposable = null; - - } - } - @Override public void onSaveViewState(@NonNull View view, @NonNull Bundle outState) { saveStateHandler.saveInstanceState(outState); @@ -505,12 +498,6 @@ public class ConversationsListController extends BaseController implements Searc } } - @Override - public void onDestroy() { - super.onDestroy(); - dispose(null); - } - @Override public boolean onQueryTextChange(String newText) { if (adapter.hasNewFilter(newText) || !TextUtils.isEmpty(searchQuery)) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java index 1f71e4101..fcaf2474b 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java @@ -35,10 +35,9 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.ProgressBar; import android.widget.TextView; + import androidx.annotation.NonNull; -import autodagger.AutoInjector; -import butterknife.BindView; -import butterknife.OnClick; + import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.nextcloud.talk.R; @@ -51,15 +50,20 @@ import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder; +import com.uber.autodispose.AutoDispose; + +import java.security.cert.CertificateException; + +import javax.inject.Inject; + +import autodagger.AutoInjector; +import butterknife.BindView; +import butterknife.OnClick; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import studio.carbonylgroup.textfieldboxes.ExtendedEditText; import studio.carbonylgroup.textfieldboxes.TextFieldBoxes; -import javax.inject.Inject; -import java.security.cert.CertificateException; - @AutoInjector(NextcloudTalkApplication.class) public class ServerSelectionController extends BaseController { @@ -85,8 +89,6 @@ public class ServerSelectionController extends BaseController { @Inject AppPreferences appPreferences; - private Disposable statusQueryDisposable; - @Override protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { return inflater.inflate(R.layout.controller_server_selection, container, false); @@ -220,8 +222,6 @@ public class ServerSelectionController extends BaseController { } private void checkServerAndProceed() { - dispose(); - String url = serverEntry.getText().toString().trim(); serverEntry.setEnabled(false); @@ -245,9 +245,10 @@ public class ServerSelectionController extends BaseController { } private void checkServer(String queryUrl, boolean checkForcedHttps) { - statusQueryDisposable = ncApi.getServerStatus(queryUrl) + ncApi.getServerStatus(queryUrl) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(status -> { String productName = getResources().getString(R.string.nc_server_product_name); @@ -307,8 +308,6 @@ public class ServerSelectionController extends BaseController { certTextView.setVisibility(View.VISIBLE); } toggleProceedButton(false); - - dispose(); } }, () -> { progressBar.setVisibility(View.INVISIBLE); @@ -316,7 +315,6 @@ public class ServerSelectionController extends BaseController { providersTextView.setVisibility(View.VISIBLE); certTextView.setVisibility(View.VISIBLE); } - dispose(); }); } @@ -366,20 +364,4 @@ public class ServerSelectionController extends BaseController { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); } } - - @Override - public void onDestroy() { - super.onDestroy(); - dispose(); - } - - private void dispose() { - if (statusQueryDisposable != null && !statusQueryDisposable.isDisposed()) { - statusQueryDisposable.dispose(); - } - - statusQueryDisposable = null; - } - - } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index ceaf9cb64..2428185b7 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java @@ -67,6 +67,7 @@ import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.preferences.MagicUserInputModule; import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder; +import com.uber.autodispose.AutoDispose; import com.yarolegovich.lovelydialog.LovelySaveStateHandler; import com.yarolegovich.lovelydialog.LovelyStandardDialog; import com.yarolegovich.mp.*; @@ -156,9 +157,6 @@ public class SettingsController extends BaseController { private OnPreferenceValueChangedListener screenLockTimeoutChangeListener; private OnPreferenceValueChangedListener themeChangeListener; - private Disposable profileQueryDisposable; - private Disposable dbQueryDisposable; - @Override protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { return inflater.inflate(R.layout.controller_settings, container, false); @@ -391,7 +389,6 @@ public class SettingsController extends BaseController { getActionBar().show(); } - dispose(null); getCurrentUser(); if (!TextUtils.isEmpty(currentUser.getClientCertificate())) { @@ -500,10 +497,11 @@ public class SettingsController extends BaseController { loadAvatarImage(); - profileQueryDisposable = ncApi.getUserProfile(credentials, + ncApi.getUserProfile(credentials, ApiUtils.getUrlForUserProfile(currentUser.getBaseUrl())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(userProfileOverall -> { String displayName = null; @@ -520,23 +518,22 @@ public class SettingsController extends BaseController { if ((!TextUtils.isEmpty(displayName) && !displayName.equals(currentUser.getDisplayName()))) { - dbQueryDisposable = userUtils.createOrUpdateUser(null, + userUtils.createOrUpdateUser(null, null, null, displayName, null, null, null, currentUser.getId(), null, null, null) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(userEntityResult -> { displayNameTextView.setText(userEntityResult.getDisplayName()); }, throwable -> { - dispose(dbQueryDisposable); - }, () -> dispose(dbQueryDisposable)); + }, () -> Log.d(TAG, "")); } }, throwable -> { - dispose(profileQueryDisposable); - }, () -> dispose(profileQueryDisposable)); + }, () -> Log.d(TAG, "")); removeAccountButton.addPreferenceClickListener(view1 -> { @@ -660,27 +657,6 @@ public class SettingsController extends BaseController { settingsScreen.findViewById(R.id.settings_proxy_password_edit).setVisibility(View.GONE); } - private void dispose(@Nullable Disposable disposable) { - if (disposable != null && !disposable.isDisposed()) { - disposable.dispose(); - } else if (disposable == null) { - - if (profileQueryDisposable != null && !profileQueryDisposable.isDisposed()) { - profileQueryDisposable.dispose(); - profileQueryDisposable = null; - } else if (profileQueryDisposable != null) { - profileQueryDisposable = null; - } - - if (dbQueryDisposable != null && !dbQueryDisposable.isDisposed()) { - dbQueryDisposable.dispose(); - dbQueryDisposable = null; - } else if (dbQueryDisposable != null) { - dbQueryDisposable = null; - } - } - } - @Override protected String getTitle() { return getResources().getString(R.string.nc_settings); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java index e725ed838..1543f76ad 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SwitchAccountController.java @@ -47,6 +47,8 @@ import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.utils.AccountUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; +import com.uber.autodispose.AutoDispose; + import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; @@ -97,6 +99,7 @@ public class SwitchAccountController extends BaseController { userUtils.createOrUpdateUser(null, null, null, null, null, true, null, userEntity.getId(), null, null, null) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java index 874c8aa13..75bcbc399 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java @@ -55,6 +55,7 @@ import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder; import com.nextcloud.talk.utils.ssl.MagicTrustManager; +import com.uber.autodispose.AutoDispose; import de.cotech.hw.fido.WebViewFidoBridge; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -390,6 +391,7 @@ public class WebViewLoginController extends BaseController { null, currentUser.getId(), null, appPreferences.getTemporaryClientCertAlias(), null) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .as(AutoDispose.autoDisposable(scopeProvider)) .subscribe(userEntity -> { if (finalMessageType != null) { ApplicationWideMessageHolder.getInstance().setMessageType(finalMessageType); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java index 4fa6fa602..fcc118137 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.java @@ -33,6 +33,7 @@ import androidx.annotation.RequiresApi; import androidx.appcompat.app.ActionBar; import autodagger.AutoInjector; import com.bluelinelabs.conductor.Controller; +import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.AccountVerificationController; import com.nextcloud.talk.controllers.ServerSelectionController; @@ -40,6 +41,7 @@ import com.nextcloud.talk.controllers.SwitchAccountController; import com.nextcloud.talk.controllers.WebViewLoginController; import com.nextcloud.talk.controllers.base.providers.ActionBarProvider; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.uber.autodispose.lifecycle.LifecycleScopeProvider; import javax.inject.Inject; import java.util.ArrayList; @@ -49,6 +51,9 @@ import java.util.List; public abstract class BaseController extends ButterKnifeController { private static final String TAG = "BaseController"; + + public final LifecycleScopeProvider scopeProvider = ControllerScopeProvider.from(this); + @Inject AppPreferences appPreferences; @Inject diff --git a/build.gradle b/build.gradle index e11fc6a64..1dfd6f438 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" + classpath "io.realm:realm-gradle-plugin:6.0.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files