From 141d450e430f37f0507d89789616ef5606d8a8fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Fri, 11 Jun 2021 15:12:22 -0400
Subject: [PATCH] build: use rxjava3

Change-Id: I2d2c3f30f45fa0f467d886d81a8c5d6b86f39543
---
 ring-android/app/build.gradle                 |  2 +-
 .../account/AccountCreationModelImpl.java     |  2 +-
 .../ring/account/AccountEditionPresenter.java |  3 +-
 .../ring/account/AccountWizardActivity.java   |  4 +-
 .../account/HomeAccountCreationFragment.java  |  2 +-
 .../account/JamiAccountSummaryFragment.java   |  8 ++--
 .../ring/account/ProfileCreationFragment.java |  2 +-
 .../cx/ring/account/RegisterNameDialog.java   |  4 +-
 .../cx/ring/adapters/ConversationAdapter.java |  8 ++--
 .../cx/ring/adapters/RingtoneAdapter.java     | 20 ++++----
 .../cx/ring/adapters/SmartListAdapter.java    |  2 +-
 .../cx/ring/application/JamiApplication.java  |  4 +-
 .../cx/ring/client/AccountSpinnerAdapter.java |  6 +--
 .../ring/client/ContactDetailsActivity.java   |  4 +-
 .../client/ConversationSelectionActivity.java |  4 +-
 .../java/cx/ring/client/HomeActivity.java     |  8 ++--
 .../java/cx/ring/client/LogsActivity.java     | 10 ++--
 .../java/cx/ring/client/RingtoneActivity.java |  7 +--
 .../ContactRequestsFragment.java              |  2 +-
 .../JamiInjectionModule.java                  |  4 +-
 .../ServiceInjectionModule.java               |  4 +-
 .../fragments/AccountMigrationFragment.java   |  5 +-
 .../java/cx/ring/fragments/CallFragment.java  |  2 +-
 .../ring/fragments/ContactPickerFragment.java |  4 +-
 .../ring/fragments/ConversationFragment.java  | 48 +++++++++----------
 .../fragments/GeneralAccountPresenter.java    |  3 +-
 .../fragments/LocationSharingFragment.java    | 12 ++---
 .../fragments/MediaPreferencePresenter.java   |  3 +-
 .../cx/ring/fragments/ShareWithFragment.java  |  4 +-
 .../cx/ring/fragments/SmartListFragment.java  |  2 +-
 .../java/cx/ring/service/DRingService.java    |  2 +-
 .../java/cx/ring/services/CameraService.java  | 14 +++---
 .../cx/ring/services/ContactServiceImpl.java  |  6 +--
 .../cx/ring/services/HardwareServiceImpl.java |  5 +-
 .../ring/services/LocationSharingService.java | 34 ++++++-------
 .../cx/ring/services/VCardServiceImpl.java    |  6 +--
 .../cx/ring/settings/AccountFragment.java     |  4 +-
 .../PluginPathPreferenceFragment.java         |  2 +-
 .../PluginsListSettingsFragment.java          |  4 +-
 .../cx/ring/tv/account/TVAccountWizard.java   |  4 +-
 .../tv/account/TVProfileCreationFragment.java |  2 +-
 .../tv/account/TVProfileEditingFragment.java  |  6 +--
 .../cx/ring/tv/account/TVShareFragment.java   |  4 +-
 .../java/cx/ring/tv/call/TVCallFragment.java  |  3 --
 .../ring/tv/camera/CustomCameraActivity.java  |  8 ++--
 .../ring/tv/contact/TVContactPresenter.java   |  3 +-
 .../conversation/TvConversationAdapter.java   | 10 ++--
 .../conversation/TvConversationFragment.java  |  8 ++--
 .../TvConversationViewHolder.java             |  2 +-
 .../java/cx/ring/tv/main/HomeActivity.java    |  4 +-
 .../java/cx/ring/tv/main/MainFragment.java    | 10 ++--
 .../java/cx/ring/tv/main/MainPresenter.java   |  5 +-
 .../tv/search/ContactSearchPresenter.java     |  5 +-
 .../java/cx/ring/utils/AndroidFileUtils.java  |  9 ++--
 .../ring/viewholders/SmartListViewHolder.java | 18 +++----
 .../java/cx/ring/views/AvatarDrawable.java    |  3 +-
 .../java/cx/ring/views/AvatarFactory.java     |  2 +-
 .../cx/ring/views/ConversationViewHolder.java |  2 +-
 .../java/cx/ring/views/ParticipantView.java   |  2 +-
 ring-android/libringclient/build.gradle       |  2 +-
 .../jami/account/AccountWizardPresenter.java  | 24 +++++-----
 .../net/jami/account/AccountWizardView.java   |  2 +-
 .../account/JamiAccountCreationPresenter.java |  5 +-
 .../account/JamiAccountSummaryPresenter.java  |  6 +--
 .../net/jami/account/LinkDevicePresenter.java |  2 +-
 .../account/ProfileCreationPresenter.java     |  5 +-
 .../java/net/jami/call/CallPresenter.java     | 16 +++----
 .../contactrequests/BlockListPresenter.java   |  3 +-
 .../ContactRequestsPresenter.java             |  7 +--
 .../contactrequests/ContactRequestsView.java  |  2 +-
 .../conversation/ConversationPresenter.java   | 12 ++---
 .../net/jami/facades/ConversationFacade.java  | 16 +++----
 .../src/main/java/net/jami/model/Account.java | 13 ++---
 .../main/java/net/jami/model/Conference.java  |  6 +--
 .../src/main/java/net/jami/model/Contact.java |  8 ++--
 .../java/net/jami/model/Conversation.java     | 14 +++---
 .../net/jami/mvp/AccountCreationModel.java    | 10 ++--
 .../main/java/net/jami/mvp/RootPresenter.java |  2 +-
 .../navigation/HomeNavigationPresenter.java   |  6 +--
 .../net/jami/services/AccountService.java     | 22 ++++-----
 .../java/net/jami/services/CallService.java   | 28 +++++------
 .../net/jami/services/ContactService.java     |  6 +--
 .../net/jami/services/HardwareService.java    | 19 ++++----
 .../net/jami/services/HistoryService.java     |  9 ++--
 .../net/jami/services/PreferencesService.java |  7 +--
 .../java/net/jami/services/VCardService.java  |  4 +-
 .../net/jami/settings/SettingsPresenter.java  |  3 +-
 .../java/net/jami/share/SharePresenter.java   |  4 +-
 .../jami/smartlist/SmartListPresenter.java    | 16 +++----
 .../net/jami/smartlist/SmartListView.java     |  2 +-
 .../jami/smartlist/SmartListViewModel.java    |  5 +-
 .../main/java/net/jami/utils/VCardUtils.java  |  4 +-
 .../net/jami/wizard/SIPCreationPresenter.java | 10 ++--
 93 files changed, 345 insertions(+), 335 deletions(-)

diff --git a/ring-android/app/build.gradle b/ring-android/app/build.gradle
index e66d9b40a..86ef27d9f 100644
--- a/ring-android/app/build.gradle
+++ b/ring-android/app/build.gradle
@@ -119,7 +119,7 @@ dependencies {
     annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
 
     // RxAndroid
-    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
+    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
 
     implementation 'com.jsibbold:zoomage:1.2.0'
     implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.2'
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java b/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
index 1217a0056..aa4173dd1 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
@@ -30,7 +30,7 @@ import ezvcard.property.FormattedName;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AccountCreationModelImpl extends AccountCreationModel implements Serializable {
 
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java b/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
index 41eab5b62..13b0d722b 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
@@ -25,7 +25,8 @@ import javax.inject.Named;
 import net.jami.model.Account;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class AccountEditionPresenter extends RootPresenter<AccountEditionView> {
     private final AccountService mAccountService;
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java b/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
index a46f7c0e8..7a695a0f7 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
@@ -54,8 +54,8 @@ import cx.ring.mvp.BaseActivity;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.utils.VCardUtils;
 import ezvcard.VCard;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AccountWizardActivity extends BaseActivity<AccountWizardPresenter> implements AccountWizardView {
     static final String TAG = AccountWizardActivity.class.getName();
diff --git a/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
index 0136a9846..a5352ba5a 100644
--- a/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
@@ -41,7 +41,7 @@ import cx.ring.application.JamiApplication;
 import cx.ring.databinding.FragAccHomeCreateBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 
 public class HomeAccountCreationFragment extends BaseSupportFragment<HomeAccountCreationPresenter> implements HomeAccountCreationView {
     private static final int ARCHIVE_REQUEST_CODE = 42;
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
index 162fbcb08..7e9043ee0 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
@@ -82,10 +82,10 @@ import cx.ring.utils.BitmapUtils;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.views.AvatarDrawable;
 import cx.ring.views.SwitchButton;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class JamiAccountSummaryFragment extends BaseSupportFragment<JamiAccountSummaryPresenter> implements
         RegisterNameDialog.RegisterNameDialogListener,
diff --git a/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java b/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
index 79225f3e8..764ee026a 100644
--- a/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
@@ -56,7 +56,7 @@ import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class ProfileCreationFragment extends BaseSupportFragment<ProfileCreationPresenter> implements ProfileCreationView {
     public static final String TAG = ProfileCreationFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java b/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
index 872e08a3f..f192b82e4 100644
--- a/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
@@ -42,8 +42,8 @@ import cx.ring.databinding.FragRegisterNameBinding;
 import net.jami.services.AccountService;
 import cx.ring.utils.RegisteredNameFilter;
 import cx.ring.utils.RegisteredNameTextWatcher;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.Disposable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.Disposable;
 
 public class RegisterNameDialog extends DialogFragment {
     static final String TAG = RegisterNameDialog.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
index 9c516366e..f0400896a 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
@@ -93,8 +93,8 @@ import cx.ring.utils.GlideApp;
 import cx.ring.utils.GlideOptions;
 import cx.ring.utils.ResourceMapper;
 import cx.ring.views.ConversationViewHolder;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
 
 public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHolder> {
     private final static String TAG = ConversationAdapter.class.getSimpleName();
@@ -144,7 +144,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo
                 .override(mPictureMaxSize)
                 .transform(new RoundedCorners(corner));
         timestampUpdateTimer = Observable.interval(10, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                .startWith(0L);
+                .startWithItem(0L);
     }
 
     /**
@@ -513,7 +513,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo
                     ((ImageView) viewHolder.btnAccept).setImageResource(R.drawable.baseline_play_arrow_24);
                 });
                 viewHolder.compositeDisposable.add(Observable.interval(1L, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                        .startWith(0L)
+                        .startWithItem(0L)
                         .subscribe(t -> {
                             int pS = player.getCurrentPosition() / 1000;
                             int dS = player.getDuration() / 1000;
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
index 7b6b9d75e..a22acb9c6 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
@@ -37,24 +37,24 @@ import java.io.IOException;
 import java.util.List;
 
 import cx.ring.R;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
+
 import net.jami.model.Ringtone;
 import net.jami.utils.Log;
-import io.reactivex.Observable;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
 
 public class RingtoneAdapter extends RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder> {
 
     private final String TAG = RingtoneAdapter.class.getSimpleName();
-    private List<Ringtone> ringtoneList;
+    private final List<Ringtone> ringtoneList;
     private int currentlySelectedPosition = 1; // default item
-    private MediaPlayer mp = new MediaPlayer();
-    private Subject<Ringtone> ringtoneSubject = PublishSubject.create();
-
-    class RingtoneViewHolder extends RecyclerView.ViewHolder {
-        private TextView name;
-        private ImageView isSelected, isPlaying, ringtoneIcon;
+    private final MediaPlayer mp = new MediaPlayer();
+    private final Subject<Ringtone> ringtoneSubject = PublishSubject.create();
 
+    static class RingtoneViewHolder extends RecyclerView.ViewHolder {
+        private final TextView name;
+        private final ImageView isSelected, isPlaying, ringtoneIcon;
 
         RingtoneViewHolder(View view) {
             super(view);
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
index 2ed8a07ee..c83d8a9fe 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
@@ -24,7 +24,7 @@ import cx.ring.databinding.ItemSmartlistBinding;
 import cx.ring.databinding.ItemSmartlistHeaderBinding;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 import android.os.Parcelable;
 import android.view.LayoutInflater;
diff --git a/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java b/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
index a8e2035c7..5161c3344 100644
--- a/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
+++ b/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
@@ -72,8 +72,8 @@ import cx.ring.dependencyinjection.ServiceInjectionModule;
 import cx.ring.service.DRingService;
 import cx.ring.service.JamiJobService;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.Completable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public abstract class JamiApplication extends Application {
     private static final String TAG = JamiApplication.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
index 3d397063c..99f8ff951 100644
--- a/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
@@ -37,9 +37,9 @@ import cx.ring.R;
 import cx.ring.databinding.ItemToolbarSelectedBinding;
 import cx.ring.databinding.ItemToolbarSpinnerBinding;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AccountSpinnerAdapter extends ArrayAdapter<Account> {
     private static final String TAG = AccountSpinnerAdapter.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java b/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
index 3e1a9f1ab..e3d37ffb0 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
@@ -71,8 +71,8 @@ import cx.ring.fragments.ConversationFragment;
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.utils.ConversationPath;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactDetailsActivity extends AppCompatActivity {
     private static final String TAG = ContactDetailsActivity.class.getName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
index 5d0a7cc11..77b60d7ca 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
@@ -47,8 +47,8 @@ import net.jami.services.CallService;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.ConversationPath;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ConversationSelectionActivity extends AppCompatActivity {
     private final static String TAG = ConversationSelectionActivity.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index f6ce8841e..12a722d7f 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -92,10 +92,10 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.views.SwitchButton;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class HomeActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener,
         Spinner.OnItemSelectedListener, Colorable {
diff --git a/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java b/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
index 07f7d2cd6..4cc27d633 100644
--- a/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
@@ -50,11 +50,11 @@ import cx.ring.application.JamiApplication;
 import cx.ring.databinding.ActivityLogsBinding;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import io.reactivex.Maybe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class LogsActivity extends AppCompatActivity {
     private static final String TAG = LogsActivity.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java b/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
index 1eb2f8628..069fbdaaf 100644
--- a/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
@@ -59,9 +59,10 @@ import net.jami.model.ConfigKey;
 import net.jami.model.Ringtone;
 import net.jami.services.AccountService;
 import cx.ring.utils.AndroidFileUtils;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.Disposable;
+
 import net.jami.utils.Log;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
 
 public class RingtoneActivity extends AppCompatActivity {
 
@@ -366,7 +367,7 @@ public class RingtoneActivity extends AppCompatActivity {
                 cr.takePersistableUriPermission(uri, takeFlags);
                 AndroidFileUtils.getCacheFile(this, uri)
                         .observeOn(AndroidSchedulers.mainThread())
-                        .subscribe(file -> onFileFound(file),
+                        .subscribe(this::onFileFound,
                                 err -> Toast.makeText(this, "Can't load ringtone !", Toast.LENGTH_SHORT).show());
             }
         }
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
index a8171d6b5..e43507f9d 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
@@ -45,7 +45,7 @@ import cx.ring.mvp.BaseSupportFragment;
 import net.jami.smartlist.SmartListViewModel;
 
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactRequestsFragment extends BaseSupportFragment<ContactRequestsPresenter> implements ContactRequestsView,
         SmartListViewHolder.SmartListListeners {
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
index a8e387cfc..85878a2cf 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
@@ -24,8 +24,8 @@ import android.content.Context;
 import cx.ring.application.JamiApplication;
 import dagger.Module;
 import dagger.Provides;
-import io.reactivex.Scheduler;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Scheduler;
 
 @Module
 public class JamiInjectionModule {
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
index 5bf1bfb89..35214e764 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
@@ -52,8 +52,8 @@ import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.services.VCardServiceImpl;
 import dagger.Module;
 import dagger.Provides;
-import io.reactivex.Scheduler;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Scheduler;
 
 @Module
 public class ServiceInjectionModule {
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
index 9f47d587b..99ec80a0f 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
@@ -45,12 +45,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.databinding.FragAccountMigrationBinding;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+
 import net.jami.model.Account;
 import net.jami.model.AccountConfig;
 import net.jami.model.ConfigKey;
 import net.jami.services.AccountService;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
 
 public class AccountMigrationFragment extends Fragment {
     public static final String ACCOUNT_ID = "ACCOUNT_ID";
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 05774ee7a..3092a0220 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -127,7 +127,7 @@ import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.MediaButtonsHelper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class CallFragment extends BaseSupportFragment<CallPresenter> implements CallView, MediaButtonsHelper.MediaButtonsHelperCallback, RecyclerPickerLayoutManager.ItemSelectedListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
index e7b51b4c9..0a3fa87fb 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
@@ -31,8 +31,8 @@ import net.jami.model.Contact;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.viewholders.SmartListViewHolder;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactPickerFragment extends BottomSheetDialogFragment {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 037ad09f0..ec1c548c8 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -33,8 +33,8 @@ import android.content.Intent;
 import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
-import android.graphics.Typeface;
 import android.content.res.Resources;
+import android.graphics.Typeface;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
@@ -56,8 +56,6 @@ import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.google.android.material.snackbar.Snackbar;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.view.menu.MenuBuilder;
@@ -71,6 +69,21 @@ import androidx.recyclerview.widget.DefaultItemAnimator;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.google.android.material.snackbar.Snackbar;
+
+import net.jami.conversation.ConversationPresenter;
+import net.jami.conversation.ConversationView;
+import net.jami.daemon.JamiService;
+import net.jami.model.Account;
+import net.jami.model.Contact;
+import net.jami.model.Conversation;
+import net.jami.model.DataTransfer;
+import net.jami.model.Error;
+import net.jami.model.Interaction;
+import net.jami.model.Phone;
+import net.jami.model.Uri;
+import net.jami.services.NotificationService;
+
 import java.io.File;
 import java.util.HashMap;
 import java.util.List;
@@ -83,39 +96,26 @@ import cx.ring.client.CallActivity;
 import cx.ring.client.ContactDetailsActivity;
 import cx.ring.client.ConversationActivity;
 import cx.ring.client.HomeActivity;
-import cx.ring.views.AvatarFactory;
-import net.jami.conversation.ConversationPresenter;
-import net.jami.conversation.ConversationView;
 import cx.ring.databinding.FragConversationBinding;
 import cx.ring.interfaces.Colorable;
-
-import net.jami.daemon.JamiService;
-import net.jami.model.Account;
-import net.jami.model.Contact;
-import net.jami.model.Conversation;
-import net.jami.model.Interaction;
-import net.jami.model.DataTransfer;
-import net.jami.model.Phone;
-import net.jami.model.Error;
-import net.jami.model.Uri;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.service.DRingService;
-import cx.ring.services.LocationSharingService;
-import net.jami.services.NotificationService;
+import cx.ring.service.LocationSharingService;
 import cx.ring.services.NotificationServiceImpl;
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.ConversationPath;
+import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.MediaButtonsHelper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import cx.ring.views.AvatarFactory;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 import static android.app.Activity.RESULT_OK;
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
index ff00edfe7..32690a975 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
@@ -31,7 +31,8 @@ import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.services.HardwareService;
 import net.jami.services.PreferencesService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class GeneralAccountPresenter extends RootPresenter<GeneralAccountView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
index 05714a4e6..0e5147747 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
@@ -82,12 +82,12 @@ import cx.ring.databinding.FragLocationSharingBinding;
 import cx.ring.services.LocationSharingService;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.TouchClickListener;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class LocationSharingFragment extends Fragment {
     private static final String TAG = LocationSharingFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
index ca5882631..15085da4d 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
@@ -32,7 +32,8 @@ import net.jami.model.ConfigKey;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.services.DeviceRuntimeService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class MediaPreferencePresenter extends RootPresenter<MediaPreferenceView>
 {
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
index fd739b2ee..3671a9289 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
@@ -50,8 +50,8 @@ import cx.ring.client.ConversationActivity;
 import cx.ring.databinding.FragSharewithBinding;
 import cx.ring.utils.ConversationPath;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ShareWithFragment extends Fragment {
     private final static String TAG = ShareWithFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
index 8984f9094..0e223106b 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
@@ -74,7 +74,7 @@ import cx.ring.utils.ClipboardHelper;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class SmartListFragment extends BaseSupportFragment<SmartListPresenter> implements SearchView.OnQueryTextListener,
         SmartListViewHolder.SmartListListeners,
diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
index 743ac70b2..7961014f7 100644
--- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
@@ -74,7 +74,7 @@ import net.jami.services.PreferencesService;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class DRingService extends Service {
     private static final String TAG = DRingService.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraService.java b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
index 711390b92..5dbf140e4 100644
--- a/ring-android/app/src/main/java/cx/ring/services/CameraService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
@@ -73,13 +73,13 @@ import net.jami.daemon.StringMap;
 import net.jami.daemon.UintVect;
 import net.jami.utils.Tuple;
 import cx.ring.views.AutoFitTextureView;
-import io.reactivex.Completable;
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class CameraService {
     private static final String TAG = CameraService.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
index 91d412c9b..cf9cccf02 100644
--- a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
@@ -47,9 +47,9 @@ import javax.inject.Inject;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.views.AvatarFactory;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class ContactServiceImpl extends ContactService {
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
index 5800dac5a..e5ec57866 100644
--- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
@@ -56,9 +56,10 @@ import cx.ring.utils.BluetoothWrapper;
 import net.jami.services.HardwareService;
 import net.jami.utils.Log;
 import cx.ring.utils.Ringer;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+
 import net.jami.utils.Tuple;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
 
 public class HardwareServiceImpl extends HardwareService implements AudioManager.OnAudioFocusChangeListener, BluetoothWrapper.BluetoothChangeListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java b/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
index def031e9f..334b2da52 100644
--- a/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
@@ -71,15 +71,15 @@ import net.jami.services.AccountService;
 import net.jami.services.CallService;
 
 import cx.ring.utils.ConversationPath;
-import io.reactivex.Observable;
-import io.reactivex.ObservableSource;
-import io.reactivex.Observer;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableSource;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class LocationSharingService extends Service implements LocationListener {
     private static final String TAG = "LocationSharingService";
@@ -103,7 +103,7 @@ public class LocationSharingService extends Service implements LocationListener
     private boolean started = false;
 
     private LocationManager mLocationManager;
-    private NotificationManager mNoticationManager;
+    private NotificationManager mNotificationManager;
     private SharedPreferences mPreferences;
     private Handler mHandler;
 
@@ -126,10 +126,10 @@ public class LocationSharingService extends Service implements LocationListener
 
     public Observable<Long> getContactSharingExpiration(ConversationPath path) {
         return Observable.timer(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                .startWith(0L)
+                .startWithItem(0L)
                 .repeat()
                 .map(i -> contactLocationShare.get(path).getTime() - SystemClock.elapsedRealtime())
-                .onErrorResumeNext((ObservableSource<Long>) Observer::onComplete);
+                .onErrorComplete();
     }
 
     @Override
@@ -137,7 +137,7 @@ public class LocationSharingService extends Service implements LocationListener
         ((JamiApplication) getApplication()).getInjectionComponent().inject(this);
 
         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
-        mNoticationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         mPreferences = getSharedPreferences(PREFERENCES_LOCATION, Context.MODE_PRIVATE);
         mHandler = new Handler(getMainLooper());
         String posLongitude = mPreferences.getString(PREFERENCES_KEY_POS_LONG, null);
@@ -220,7 +220,7 @@ public class LocationSharingService extends Service implements LocationListener
                         }));
             } else {
                 mDisposableBag.add(getNotification(now)
-                        .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                        .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
             }
         }
         else if (ACTION_STOP.equals(action)) {
@@ -253,7 +253,7 @@ public class LocationSharingService extends Service implements LocationListener
                 started = false;
             } else {
                 mDisposableBag.add(getNotification(now)
-                        .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                        .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
             }
         }
         return START_NOT_STICKY;
@@ -382,7 +382,7 @@ public class LocationSharingService extends Service implements LocationListener
             started = false;
         } else if (changed) {
             mDisposableBag.add(getNotification(now.getTime())
-                    .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                    .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
         }
     }
 
@@ -391,7 +391,7 @@ public class LocationSharingService extends Service implements LocationListener
             return;
         long now = SystemClock.uptimeMillis();
         mDisposableBag.add(getNotification(now)
-                .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
         mHandler.postAtTime(this::refreshNotificationTimer, now + (30 * 1000));
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
index 098259f9e..f7e860f4d 100644
--- a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
@@ -38,9 +38,9 @@ import ezvcard.VCard;
 import ezvcard.parameter.ImageType;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
-import io.reactivex.Maybe;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class VCardServiceImpl extends VCardService {
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java b/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
index cb7f393d9..b712255c6 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
@@ -40,8 +40,8 @@ import cx.ring.account.JamiAccountSummaryFragment;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragAccountBinding;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 import net.jami.services.AccountService;
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
index 2638f6c70..56c1d2574 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
@@ -43,7 +43,7 @@ import cx.ring.R;
 import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragPluginsPathPreferenceBinding;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 
 public class PluginPathPreferenceFragment extends Fragment implements PathListAdapter.PathListItemListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
index 10eae2020..0c503ca28 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
@@ -30,8 +30,8 @@ import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragPluginsListSettingsBinding;
 import cx.ring.plugins.PluginUtils;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class PluginsListSettingsFragment extends Fragment implements PluginsListAdapter.PluginListItemListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
index 433b67003..72a392148 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
@@ -42,8 +42,8 @@ import net.jami.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseActivity;
 import net.jami.utils.VCardUtils;
 import ezvcard.VCard;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TVAccountWizard
         extends BaseActivity<AccountWizardPresenter>
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
index 1fa905d90..e844557cc 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
@@ -53,7 +53,7 @@ import net.jami.mvp.AccountCreationModel;
 import cx.ring.tv.camera.CustomCameraActivity;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class TVProfileCreationFragment extends JamiGuidedStepFragment<ProfileCreationPresenter>
         implements ProfileCreationView {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
index 3300106f8..646aa46eb 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
@@ -49,9 +49,9 @@ import cx.ring.tv.camera.CustomCameraActivity;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.BitmapUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TVProfileEditingFragment extends JamiGuidedStepFragment<HomeNavigationPresenter>
         implements HomeNavigationView {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
index 45d56eb91..5dc6994b1 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
@@ -40,8 +40,8 @@ import net.jami.share.ShareViewModel;
 import net.jami.utils.Log;
 import net.jami.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TVShareFragment extends BaseSupportFragment<SharePresenter> implements GenericView<ShareViewModel> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
index 6c411718f..39b372e7f 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
@@ -94,7 +94,6 @@ import cx.ring.utils.ActionHelper;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.disposables.CompositeDisposable;
 
 public class TVCallFragment extends BaseSupportFragment<CallPresenter> implements CallView {
 
@@ -112,7 +111,6 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement
 
     // Screen wake lock for incoming call
     private Runnable runnable;
-    private final CompositeDisposable mCompositeDisposable = new CompositeDisposable();
     private int mPreviewWidth = 720, mPreviewHeight = 1280;
     private int mPreviewWidthRot = 720, mPreviewHeightRot = 1280;
     private PowerManager.WakeLock mScreenWakeLock;
@@ -264,7 +262,6 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        mCompositeDisposable.clear();
         if (mScreenWakeLock != null && mScreenWakeLock.isHeld()) {
             mScreenWakeLock.release();
         }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java b/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
index bb58ab536..2c503874d 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
@@ -45,10 +45,10 @@ import cx.ring.R;
 import cx.ring.databinding.CamerapickerBinding;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 @SuppressWarnings("deprecation")
 public class CustomCameraActivity extends Activity {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
index 527218aae..410f956e0 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
@@ -34,8 +34,9 @@ import net.jami.services.AccountService;
 import net.jami.services.VCardService;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.ConversationPath;
+import io.reactivex.rxjava3.core.Scheduler;
+
 import net.jami.utils.VCardUtils;
-import io.reactivex.Scheduler;
 
 public class TVContactPresenter extends RootPresenter<TVContactView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
index 0eb649d75..048f508ff 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
@@ -84,9 +84,9 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.GlideApp;
 import cx.ring.utils.GlideOptions;
 import cx.ring.utils.ResourceMapper;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationViewHolder> {
     private final static String TAG = TvConversationAdapter.class.getSimpleName();
@@ -134,7 +134,7 @@ public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationVi
         timestampUpdateTimer = Observable.interval(10, TimeUnit.SECONDS)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
-                .startWith(0L);
+                .startWithItem(0L);
     }
 
     /**
@@ -584,7 +584,7 @@ public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationVi
                     viewHolder.compositeDisposable.add(Observable.interval(1L, TimeUnit.SECONDS)
                             .subscribeOn(Schedulers.io())
                             .observeOn(AndroidSchedulers.mainThread())
-                            .startWith(0L)
+                            .startWithItem(0L)
                             .subscribe(t -> {
                                 int pS = player.getCurrentPosition() / 1000;
                                 int dS = player.getDuration() / 1000;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
index 0e93ea008..23c5ff6c9 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
@@ -81,10 +81,10 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import net.jami.utils.StringUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TvConversationFragment extends BaseSupportFragment<ConversationPresenter> implements ConversationView {
     private static final String TAG = TvConversationFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
index 1a038a773..de78c6acf 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
@@ -33,7 +33,7 @@ import android.widget.TextView;
 import androidx.recyclerview.widget.RecyclerView;
 
 import cx.ring.R;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TvConversationViewHolder extends RecyclerView.ViewHolder {
     public TextView mMsgTxt;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
index e24566ffe..d1b351edc 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
@@ -34,8 +34,8 @@ import javax.inject.Inject;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.tv.account.TVAccountWizard;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class HomeActivity extends FragmentActivity {
     private BackgroundManager mBackgroundManager;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
index 92d37c83f..93a909e58 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
@@ -92,11 +92,11 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import net.jami.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class MainFragment extends BaseBrowseFragment<MainPresenter> implements MainView {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
index e3df05af6..c3515f2a8 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
@@ -34,8 +34,9 @@ import net.jami.mvp.RootPresenter;
 import net.jami.navigation.HomeNavigationViewModel;
 import net.jami.services.AccountService;
 import net.jami.smartlist.SmartListViewModel;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class MainPresenter extends RootPresenter<MainView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
index 1c5edc46b..ba0994e23 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
@@ -33,8 +33,9 @@ import net.jami.services.AccountService;
 import net.jami.services.HardwareService;
 import net.jami.services.VCardService;
 import net.jami.smartlist.SmartListViewModel;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.PublishSubject;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class ContactSearchPresenter extends RootPresenter<ContactSearchView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java b/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
index 73455d21b..8e0299a44 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
@@ -55,9 +55,9 @@ import androidx.annotation.NonNull;
 import net.jami.model.Conversation;
 import net.jami.utils.FileUtils;
 
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AndroidFileUtils {
 
@@ -310,7 +310,8 @@ public class AndroidFileUtils {
      * @param uri uri of the
      * @return Single<File> which points to the newly created copy in the cache
      */
-    public static @NonNull Single<File> getCacheFile(@NonNull Context context, @NonNull Uri uri) {
+    public static @NonNull
+    Single<File> getCacheFile(@NonNull Context context, @NonNull Uri uri) {
         ContentResolver contentResolver = context.getContentResolver();
         File cacheDir = context.getCacheDir();
         return Single.fromCallable(() -> {
diff --git a/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java b/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
index 61e03b2d4..d3e6d16cd 100644
--- a/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
@@ -22,6 +22,7 @@ package cx.ring.viewholders;
 import android.content.Context;
 import android.graphics.Typeface;
 import android.text.format.DateUtils;
+import android.util.Log;
 import android.view.View;
 
 import androidx.annotation.NonNull;
@@ -32,15 +33,12 @@ import net.jami.model.ContactEvent;
 import net.jami.model.Interaction;
 import net.jami.smartlist.SmartListViewModel;
 
-import java.util.concurrent.TimeUnit;
-
 import cx.ring.R;
 import cx.ring.databinding.ItemSmartlistBinding;
 import cx.ring.databinding.ItemSmartlistHeaderBinding;
 import cx.ring.utils.ResourceMapper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Observable;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class SmartListViewHolder extends RecyclerView.ViewHolder {
     public final ItemSmartlistBinding binding;
@@ -66,13 +64,11 @@ public class SmartListViewHolder extends RecyclerView.ViewHolder {
         compositeDisposable.clear();
 
         if (binding != null) {
-            compositeDisposable.add(Observable.create(e -> itemView.setOnClickListener(e::onNext))
-                    .throttleFirst(1000, TimeUnit.MILLISECONDS)
-                    .subscribe(v -> clickListener.onItemClick(smartListViewModel)));
-            Observable<Boolean> isSelected = smartListViewModel.getSelected();
-            if (isSelected != null) {
-                compositeDisposable.add(isSelected.subscribe(binding.itemLayout::setActivated));
-            }
+            itemView.setOnClickListener(v -> clickListener.onItemClick(smartListViewModel));
+            compositeDisposable.add(smartListViewModel.getSelected().subscribe(selected -> {
+                Log.w("SmartListViewHolder", "selected " + selected + " " + smartListViewModel.getContactName());
+                binding.itemLayout.setActivated(selected);
+            }));
             itemView.setOnLongClickListener(v -> {
                 clickListener.onItemLongClick(smartListViewModel);
                 return true;
diff --git a/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java b/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
index 66987a724..b8ec20818 100644
--- a/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
+++ b/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
@@ -35,7 +35,6 @@ import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
 import android.text.TextUtils;
-import android.util.Log;
 import android.util.TypedValue;
 
 import androidx.annotation.NonNull;
@@ -55,7 +54,7 @@ import java.util.List;
 import cx.ring.R;
 import cx.ring.services.VCardServiceImpl;
 import cx.ring.utils.DeviceUtils;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AvatarDrawable extends Drawable {
     private static final String TAG = AvatarDrawable.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java b/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
index dcb979b08..59a0e59dc 100644
--- a/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
+++ b/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
@@ -38,7 +38,7 @@ import net.jami.model.Conversation;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.BitmapUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AvatarFactory {
 
diff --git a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
index 10b4c2152..12eaa4428 100644
--- a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
@@ -35,7 +35,7 @@ import android.widget.TextView;
 
 import cx.ring.R;
 import cx.ring.adapters.ConversationAdapter;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ConversationViewHolder extends RecyclerView.ViewHolder {
     public ConversationAdapter.MessageType type;
diff --git a/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java b/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
index 831aad32b..057ba1c77 100644
--- a/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
+++ b/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
@@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 
 import cx.ring.databinding.ItemConferenceParticipantBinding;
-import io.reactivex.disposables.Disposable;
+import io.reactivex.rxjava3.disposables.Disposable;
 
 public class ParticipantView extends RecyclerView.ViewHolder {
     public final ItemConferenceParticipantBinding binding;
diff --git a/ring-android/libringclient/build.gradle b/ring-android/libringclient/build.gradle
index 7ab42b7dc..1c2cde6f8 100644
--- a/ring-android/libringclient/build.gradle
+++ b/ring-android/libringclient/build.gradle
@@ -20,7 +20,7 @@ dependencies {
     testImplementation 'junit:junit:4.13.2'
 
     // RxJava
-    implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
+    implementation 'io.reactivex.rxjava3:rxjava:3.0.10'
 
     // gson
     implementation 'com.google.code.gson:gson:2.8.7'
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
index fb55e4fd9..0a8722aad 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
@@ -19,10 +19,6 @@
  */
 package net.jami.account;
 
-import net.jami.services.AccountService;
-import net.jami.services.DeviceRuntimeService;
-import net.jami.services.PreferencesService;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -35,20 +31,24 @@ import net.jami.model.ConfigKey;
 import net.jami.model.Settings;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.mvp.RootPresenter;
+import net.jami.services.AccountService;
+import net.jami.services.DeviceRuntimeService;
+import net.jami.services.PreferencesService;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
 
 public class AccountWizardPresenter extends RootPresenter<net.jami.account.AccountWizardView> {
 
     public static final String TAG = AccountWizardPresenter.class.getSimpleName();
 
-    private final net.jami.services.AccountService mAccountService;
-    private final net.jami.services.PreferencesService mPreferences;
-    private final net.jami.services.DeviceRuntimeService mDeviceService;
+    private final AccountService mAccountService;
+    private final PreferencesService mPreferences;
+    private final DeviceRuntimeService mDeviceService;
     private final Scheduler mUiScheduler;
 
     //private boolean mCreationError = false;
@@ -56,7 +56,7 @@ public class AccountWizardPresenter extends RootPresenter<net.jami.account.Accou
     private String mAccountType;
     private AccountCreationModel mAccountCreationModel;
 
-    private Observable<net.jami.model.Account> newAccount;
+    private Observable<Account> newAccount;
 
     @Inject
     public AccountWizardPresenter(AccountService accountService,
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
index 870113748..7d927c1a5 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
@@ -22,7 +22,7 @@ package net.jami.account;
 import net.jami.model.Account;
 import net.jami.mvp.AccountCreationModel;
 import ezvcard.VCard;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public interface AccountWizardView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
index d8217fe8a..f09359c8d 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
@@ -30,8 +30,9 @@ import javax.inject.Named;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.mvp.RootPresenter;
 import net.jami.utils.StringUtils;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.PublishSubject;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class JamiAccountCreationPresenter extends RootPresenter<net.jami.account.JamiAccountCreationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
index a0a1b5f9b..88dd843b0 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
@@ -38,9 +38,9 @@ import net.jami.utils.VCardUtils;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class JamiAccountSummaryPresenter extends RootPresenter<net.jami.account.JamiAccountSummaryView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
index 510d4d697..9c914ad71 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
@@ -30,7 +30,7 @@ import javax.inject.Named;
 import net.jami.model.Account;
 import net.jami.mvp.RootPresenter;
 
-import io.reactivex.Scheduler;
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class LinkDevicePresenter extends RootPresenter<LinkDeviceView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
index e347c5393..ab2fb1e7d 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
@@ -27,8 +27,9 @@ import javax.inject.Inject;
 
 import net.jami.mvp.RootPresenter;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
 
 public class ProfileCreationPresenter extends RootPresenter<net.jami.account.ProfileCreationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java b/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
index a11fe3eac..ddb94f4d0 100644
--- a/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
@@ -45,14 +45,14 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Observer;
-import io.reactivex.Scheduler;
-import io.reactivex.annotations.NonNull;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class CallPresenter extends RootPresenter<CallView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
index 4fd93b32b..ca74a14c6 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
@@ -30,7 +30,8 @@ import net.jami.model.Contact;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class BlockListPresenter extends RootPresenter<BlockListView> {
     static private final String TAG = BlockListPresenter.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
index 4c66792b5..03ff087a2 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
@@ -32,9 +32,10 @@ import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.smartlist.SmartListViewModel;
 import net.jami.utils.Log;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.BehaviorSubject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
 
 public class ContactRequestsPresenter extends RootPresenter<net.jami.contactrequests.ContactRequestsView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
index b94d7ad23..ca32ddac2 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
@@ -24,7 +24,7 @@ import java.util.List;
 import net.jami.model.Uri;
 import net.jami.smartlist.SmartListViewModel;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public interface ContactRequestsView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
index d106a517b..5463e3ca5 100644
--- a/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
@@ -50,12 +50,12 @@ import java.io.File;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class ConversationPresenter extends RootPresenter<ConversationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java b/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
index 01aef0be3..bf4812873 100644
--- a/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
+++ b/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
@@ -52,13 +52,13 @@ import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class ConversationFacade {
 
@@ -370,7 +370,7 @@ public class ConversationFacade {
     private Observable<SmartListViewModel> observeConversation(Account account, Conversation conversation, boolean hasPresence) {
         return Observable.merge(account.getConversationSubject()
                         .filter(c -> c == conversation)
-                        .startWith(conversation),
+                        .startWithItem(conversation),
                 mContactService
                         .observeContact(conversation.getAccountId(), conversation.getContacts(), hasPresence))
                 .map(e -> new SmartListViewModel(conversation, hasPresence));
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Account.java b/ring-android/libringclient/src/main/java/net/jami/model/Account.java
index eaabc395a..c41dfaf8a 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Account.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Account.java
@@ -37,12 +37,13 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import ezvcard.VCard;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Account {
     private static final String TAG = Account.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Conference.java b/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
index cab4c8964..efc9b29d9 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
@@ -28,9 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Conference {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Contact.java b/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
index 996a40607..4740a0438 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
@@ -25,10 +25,10 @@ import net.jami.utils.StringUtils;
 import java.util.ArrayList;
 import java.util.Date;
 
-import io.reactivex.Emitter;
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Emitter;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Contact {
     protected static final String TAG = Contact.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java b/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
index db047ac28..44ff694a2 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
@@ -36,13 +36,13 @@ import java.util.NavigableMap;
 import java.util.Set;
 import java.util.TreeMap;
 
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.SingleSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.SingleSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Conversation extends ConversationHistory {
     private static final String TAG = Conversation.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java b/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
index 37f7343e0..f5ec2f399 100644
--- a/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
+++ b/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
@@ -25,10 +25,10 @@ import java.io.File;
 import java.io.Serializable;
 
 import ezvcard.VCard;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class AccountCreationModel implements Serializable {
 
@@ -44,7 +44,7 @@ public abstract class AccountCreationModel implements Serializable {
     transient private net.jami.model.Account newAccount = null;
     transient private Object photo = null;
 
-    transient private Observable<net.jami.model.Account> account;
+    transient private Observable<Account> account;
     transient protected final Subject<AccountCreationModel> profile = BehaviorSubject.createDefault(this);
 
     public AccountCreationModel() {
diff --git a/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java b/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
index 51885e717..58b57c7b5 100644
--- a/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
@@ -21,7 +21,7 @@ package net.jami.mvp;
 
 import java.lang.ref.WeakReference;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public abstract class RootPresenter<T> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
index 45ecfb11f..8640f713a 100644
--- a/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
@@ -38,9 +38,9 @@ import net.jami.utils.VCardUtils;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class HomeNavigationPresenter extends RootPresenter<HomeNavigationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java b/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
index f732512be..15bae636b 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
@@ -74,15 +74,15 @@ import javax.inject.Named;
 
 import ezvcard.Ezvcard;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.SingleSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.SingleSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 /**
  * This service handles the accounts
@@ -500,7 +500,7 @@ public class AccountService {
         })
                 .flatMap(account -> accountSubject
                         .filter(acc -> acc.getAccountID().equals(account.getAccountID()))
-                        .startWith(account))
+                        .startWithItem(account))
                 .subscribeOn(Schedulers.from(mExecutor));
     }
 
@@ -1895,7 +1895,7 @@ public class AccountService {
     public Observable<DataTransfer> observeDataTransfer(DataTransfer transfer) {
         return dataTransferSubject
                 .filter(t -> t == transfer)
-                .startWith(transfer);
+                .startWithItem(transfer);
     }
 
     public void setProxyEnabled(boolean enabled) {
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/CallService.java b/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
index d5904ea3b..92dd5ac04 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
@@ -45,11 +45,11 @@ import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.PublishSubject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class CallService {
 
@@ -93,12 +93,12 @@ public class CallService {
 
         return conferenceSubject
                 .filter(c -> c == conf)
-                .startWith(conf)
+                .startWithItem(conf)
                 .map(Conference::getParticipants)
                 .switchMap(list -> Observable.fromIterable(list)
                         .flatMap(call -> callSubject.filter(c -> c == call)))
                 .map(call -> conf)
-                .startWith(conf);
+                .startWithItem(conf);
     }
 
     public Observable<Conference> getConfUpdates(final String confId) {
@@ -213,7 +213,7 @@ public class CallService {
 
         ConferenceEntity conferenceEntity = new ConferenceEntity(conference);
         return conferenceSubject
-                .startWith(conference)
+                .startWithItem(conference)
                 .filter(conf -> {
                     Log.w(TAG, "getConfUpdates filter " + conf.getConfId() + " " + conf.getParticipants().size() + " (tracked " + conferenceEntity.conference.getConfId() + " " + conferenceEntity.conference.getParticipants().size() + ")");
                     if (conf == conferenceEntity.conference) {
@@ -242,7 +242,7 @@ public class CallService {
     }
     private Observable<Call> getCallUpdates(final Call call) {
         return callSubject.filter(c -> c == call)
-                .startWith(call)
+                .startWithItem(call)
                 .takeWhile(c -> c.getCallStatus() != Call.CallStatus.OVER);
     }
     /*public Observable<SipCall> getCallUpdates(final String callId) {
@@ -457,12 +457,10 @@ public class CallService {
     }
 
     public Completable cancelMessage(final String accountId, final long messageID) {
-        return Completable
-                .fromAction(() -> {
-                    Log.i(TAG, "CancelMessage() running...   Account ID:  " + accountId + " " + "Message ID " + " " + messageID);
-                    JamiService.cancelMessage(accountId, messageID);
-                })
-                .subscribeOn(Schedulers.from(mExecutor));
+        return Completable.fromAction(() -> {
+            Log.i(TAG, "CancelMessage() running...   Account ID:  " + accountId + " " + "Message ID " + " " + messageID);
+            JamiService.cancelMessage(accountId, messageID);
+        }).subscribeOn(Schedulers.from(mExecutor));
     }
 
     private Call getCurrentCallForId(String callId) {
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java b/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
index 382453eee..5762b1496 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
@@ -36,9 +36,9 @@ import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
 
 /**
  * This service handles the contacts
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java b/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
index 037fb6235..80249df32 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
@@ -37,15 +37,16 @@ import net.jami.model.Call;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import net.jami.utils.Tuple;
-import io.reactivex.Completable;
-import io.reactivex.Emitter;
-import io.reactivex.Observable;
-import io.reactivex.ObservableOnSubscribe;
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Emitter;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableOnSubscribe;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class HardwareService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java b/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
index 02ba0257a..5e460b2df 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
@@ -35,10 +35,11 @@ import net.jami.model.TextMessage;
 import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
-import io.reactivex.Completable;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public abstract class HistoryService {
     private static final String TAG = HistoryService.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java b/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
index aaa6a3ce7..f5b36bcb6 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
@@ -25,9 +25,10 @@ import java.util.Set;
 import javax.inject.Inject;
 
 import net.jami.model.Settings;
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class PreferencesService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java b/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
index 25d77ba41..899995d75 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
@@ -24,8 +24,8 @@ import java.io.File;
 import net.jami.model.Account;
 import net.jami.utils.Tuple;
 import ezvcard.VCard;
-import io.reactivex.Maybe;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Single;
 
 public abstract class VCardService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java b/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
index 3fc7d85e7..e71001547 100644
--- a/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
@@ -29,7 +29,8 @@ import net.jami.mvp.GenericView;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.PreferencesService;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class SettingsPresenter extends RootPresenter<GenericView<Settings>>  {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java b/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
index 61661b19f..ec1ebb811 100644
--- a/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
@@ -27,8 +27,8 @@ import javax.inject.Inject;
 import net.jami.mvp.GenericView;
 import net.jami.mvp.RootPresenter;
 
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class SharePresenter extends RootPresenter<GenericView<ShareViewModel>> {
     private final net.jami.services.AccountService mAccountService;
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
index da3d8043b..a51cd8fac 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
@@ -35,14 +35,14 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class SmartListPresenter extends RootPresenter<SmartListView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
index 8664c5fb6..a043e9a5d 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
@@ -24,7 +24,7 @@ import java.util.List;
 import net.jami.model.Uri;
 import net.jami.mvp.BaseView;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public interface SmartListView extends BaseView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
index 8ca3f7923..ff126999d 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
@@ -28,8 +28,9 @@ import net.jami.model.Contact;
 import net.jami.model.Conversation;
 import net.jami.model.Interaction;
 import net.jami.model.Uri;
-import io.reactivex.Observable;
-import io.reactivex.Single;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
 
 public class SmartListViewModel
 {
diff --git a/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java b/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
index b49650b31..bb9c56335 100644
--- a/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
+++ b/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
@@ -34,8 +34,8 @@ import ezvcard.property.FormattedName;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public final class VCardUtils {
     public static final String TAG = VCardUtils.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
index 193d7e6e9..bbf6da804 100644
--- a/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
@@ -40,8 +40,9 @@ import ezvcard.VCard;
 import ezvcard.property.FormattedName;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.observers.DisposableObserver;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.observers.DisposableObserver;
 
 public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
 
@@ -78,7 +79,6 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
      * Attempts to register the account specified by the form. If there are form errors (invalid or missing fields, etc.), the
      * errors are presented and no actual creation attempt is made.
      *
-     * @param alias         Alias account value
      * @param hostname      hostname account value
      * @param username      username account value
      * @param password      password account value
@@ -137,7 +137,7 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
                 .observeOn(mUiScheduler)
                 .subscribeWith(new DisposableObserver<Account>() {
                     @Override
-                    public void onNext(Account account) {
+                    public void onNext(@NonNull Account account) {
                         mAccount = account;
                         switch (account.getRegistrationState()) {
                             case AccountConfig.STATE_REGISTERED:
@@ -162,7 +162,7 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
                     }
 
                     @Override
-                    public void onError(Throwable e) {
+                    public void onError(@NonNull Throwable e) {
                         getView().showRegistrationError();
                         dispose();
                     }
-- 
GitLab