Browse Source

Up the game on performance & reliability

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 7 years ago
parent
commit
deaa761736

+ 3 - 3
app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java

@@ -134,11 +134,11 @@ public class NextcloudTalkApplication extends MultiDexApplication {
         new ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync();
         DeviceUtils.ignoreSpecialBatteryFeatures();
 
-        new JobRequest.Builder(PushRegistrationJob.TAG).setUpdateCurrent(true).startNow().build().schedule();
-        new JobRequest.Builder(AccountRemovalJob.TAG).setUpdateCurrent(true).startNow().build().schedule();
+        new JobRequest.Builder(PushRegistrationJob.TAG).setUpdateCurrent(true).startNow().build().scheduleAsync();
+        new JobRequest.Builder(AccountRemovalJob.TAG).setUpdateCurrent(true).startNow().build().scheduleAsync();
 
         schedulePeriodCapabilitiesJob();
-        new JobRequest.Builder(CapabilitiesJob.TAG).setUpdateCurrent(false).startNow().build().schedule();
+        new JobRequest.Builder(CapabilitiesJob.TAG).setUpdateCurrent(false).startNow().build().scheduleAsync();
     }
 
     private void schedulePeriodCapabilitiesJob() {

+ 287 - 159
app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java

@@ -24,7 +24,6 @@ import android.content.pm.ActivityInfo;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -39,22 +38,33 @@ import com.nextcloud.talk.R;
 import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.controllers.base.BaseController;
+import com.nextcloud.talk.events.EventStatus;
 import com.nextcloud.talk.jobs.CapabilitiesJob;
 import com.nextcloud.talk.jobs.PushRegistrationJob;
+import com.nextcloud.talk.models.database.UserEntity;
+import com.nextcloud.talk.models.json.generic.Status;
+import com.nextcloud.talk.models.json.rooms.RoomsOverall;
+import com.nextcloud.talk.models.json.userprofile.UserProfileOverall;
 import com.nextcloud.talk.utils.ApiUtils;
 import com.nextcloud.talk.utils.ApplicationWideMessageHolder;
 import com.nextcloud.talk.utils.bundle.BundleKeys;
 import com.nextcloud.talk.utils.database.user.UserUtils;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
 import java.net.CookieManager;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.inject.Inject;
 
 import autodagger.AutoInjector;
 import butterknife.BindView;
 import io.reactivex.CompletableObserver;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.Observer;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 
@@ -76,13 +86,15 @@ public class AccountVerificationController extends BaseController {
     @Inject
     AppPreferences appPreferences;
 
+    @Inject
+    EventBus eventBus;
+
     @BindView(R.id.progress_text)
     TextView progressText;
 
-    private Disposable roomsQueryDisposable;
-    private Disposable profileQueryDisposable;
-    private Disposable dbQueryDisposable;
-    private Disposable statusQueryDisposable;
+    private long internalAccountId = -1;
+
+    private List<Disposable> disposables = new ArrayList<>();
 
     private String baseUrl;
     private String username;
@@ -105,6 +117,18 @@ public class AccountVerificationController extends BaseController {
         }
     }
 
+    @Override
+    protected void onAttach(@NonNull View view) {
+        super.onAttach(view);
+        eventBus.register(this);
+    }
+
+    @Override
+    protected void onDetach(@NonNull View view) {
+        super.onDetach(view);
+        eventBus.unregister(this);
+    }
+
     @Override
     protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
         return inflater.inflate(R.layout.controller_account_verification, container, false);
@@ -123,8 +147,6 @@ public class AccountVerificationController extends BaseController {
             getActionBar().hide();
         }
 
-        dispose(null);
-
         if (isAccountImport && !baseUrl.startsWith("http://") && !baseUrl.startsWith("https://") || (!TextUtils
                 .isEmpty(originalProtocol) && !baseUrl.startsWith(originalProtocol))) {
             determineBaseUrlProtocol(true);
@@ -134,6 +156,13 @@ public class AccountVerificationController extends BaseController {
 
     }
 
+    private void checkEverything() {
+        String credentials = ApiUtils.getCredentials(username, token);
+        cookieManager.getCookieStore().removeAll();
+
+        findServerTalkApp(credentials);
+    }
+
     private void determineBaseUrlProtocol(boolean checkForcedHttps) {
         cookieManager.getCookieStore().removeAll();
 
@@ -147,155 +176,229 @@ public class AccountVerificationController extends BaseController {
             queryUrl = "http://" + baseUrl + ApiUtils.getUrlPostfixForStatus();
         }
 
-        statusQueryDisposable = ncApi.getServerStatus(queryUrl)
+        ncApi.getServerStatus(queryUrl)
                 .subscribeOn(Schedulers.newThread())
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(status -> {
-                    if (checkForcedHttps) {
-                        baseUrl = "https://" + baseUrl;
-                    } else {
-                        baseUrl = "http://" + baseUrl;
+                .subscribe(new Observer<Status>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+                        disposables.add(d);
                     }
 
-                    checkEverything();
-                }, throwable -> {
-                    if (checkForcedHttps) {
-                        determineBaseUrlProtocol(false);
-                    } else {
+                    @Override
+                    public void onNext(Status status) {
+                        if (checkForcedHttps) {
+                            baseUrl = "https://" + baseUrl;
+                        } else {
+                            baseUrl = "http://" + baseUrl;
+                        }
+
+                        checkEverything();
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        if (checkForcedHttps) {
+                            determineBaseUrlProtocol(false);
+                        } else {
+                            abortVerification();
+                        }
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+    }
+
+    private void findServerTalkApp(String credentials) {
+        ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(baseUrl))
+                .subscribeOn(Schedulers.newThread())
+                .subscribe(new Observer<RoomsOverall>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+                        disposables.add(d);
+                    }
+
+                    @Override
+                    public void onNext(RoomsOverall roomsOverall) {
+                        fetchProfile(credentials);
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        if (getActivity() != null) {
+                            getActivity().runOnUiThread(() -> progressText.setText(String.format(getResources().getString(
+                                    R.string.nc_nextcloud_talk_app_not_installed), getResources().getString(R.string.nc_app_name))));
+                        }
+
+                        ApplicationWideMessageHolder.getInstance().setMessageType(
+                                ApplicationWideMessageHolder.MessageType.SERVER_WITHOUT_TALK);
+
                         abortVerification();
                     }
-                }, () -> {
-                    statusQueryDisposable.dispose();
+
+                    @Override
+                    public void onComplete() {
+
+                    }
                 });
     }
 
-    private void checkEverything() {
-        String credentials = ApiUtils.getCredentials(username, token);
-        cookieManager.getCookieStore().removeAll();
+    private void storeProfile(String credentials, String displayName, String userId) {
+        userUtils.createOrUpdateUser(username, token,
+                baseUrl, displayName, null, true,
+                userId, null, null,
+                appPreferences.getTemporaryClientCertAlias())
+                .subscribeOn(Schedulers.newThread())
+                .subscribe(new Observer<UserEntity>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+                        disposables.add(d);
+                    }
+
+                    @Override
+                    public void onNext(UserEntity userEntity) {
+                        internalAccountId = userEntity.getId();
+
+                        registerForPush();
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        progressText.setText(progressText.getText().toString() +
+                                "\n" +
+                                getResources().getString(
+                                        R.string.nc_display_name_not_stored));
+                        abortVerification();
+
+                    }
 
-        roomsQueryDisposable = ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(baseUrl))
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+    }
+
+    private void fetchProfile(String credentials) {
+        ncApi.getUserProfile(credentials,
+                ApiUtils.getUrlForUserProfile(baseUrl))
                 .subscribeOn(Schedulers.newThread())
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(roomsOverall -> {
-                    progressText.setText(String.format(getResources().getString(
-                            R.string.nc_nextcloud_talk_app_installed), getResources().getString(R.string.nc_app_name)));
-
-                    profileQueryDisposable = ncApi.getUserProfile(credentials,
-                            ApiUtils.getUrlForUserProfile(baseUrl))
-                            .subscribeOn(Schedulers.newThread())
-                            .observeOn(AndroidSchedulers.mainThread())
-                            .subscribe(userProfileOverall -> {
-                                progressText.setText(progressText.getText().toString() + "\n" +
-                                        getResources().getString(R.string.nc_display_name_fetched));
-
-                                String displayName = null;
-                                if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
-                                        .getDisplayName())) {
-                                    displayName = userProfileOverall.getOcs().getData()
-                                            .getDisplayName();
-                                } else if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
-                                        .getDisplayNameAlt())) {
-                                    displayName = userProfileOverall.getOcs().getData()
-                                            .getDisplayNameAlt();
-                                }
-
-                                if (!TextUtils.isEmpty(displayName)) {
-                                    dbQueryDisposable = userUtils.createOrUpdateUser(username, token,
-                                            baseUrl, displayName, null, true,
-                                            userProfileOverall.getOcs().getData().getUserId(), null, null,
-                                            appPreferences.getTemporaryClientCertAlias())
-                                            .subscribeOn(Schedulers.newThread())
-                                            .observeOn(AndroidSchedulers.mainThread())
-                                            .subscribe(userEntity -> {
-                                                        progressText.setText(progressText.getText().toString()
-                                                                + "\n" +
-                                                                getResources().getString(
-                                                                        R.string.nc_display_name_stored));
-
-                                                        new JobRequest.Builder(PushRegistrationJob.TAG).
-                                                                setUpdateCurrent(true).startNow().build().schedule();
-
-                                                        PersistableBundleCompat persistableBundleCompat = new
-                                                                PersistableBundleCompat();
-                                                        persistableBundleCompat.putLong(BundleKeys
-                                                                .KEY_INTERNAL_USER_ID, userEntity.getId());
-
-                                                        new JobRequest.Builder(CapabilitiesJob.TAG).setUpdateCurrent
-                                                                (false).addExtras(persistableBundleCompat).startNow()
-                                                                .build().schedule();
-
-                                                        cookieManager.getCookieStore().removeAll();
-                                                        userUtils.disableAllUsersWithoutId(userEntity.getId());
-
-                                                        if (userUtils.getUsers().size() == 1) {
-                                                            getRouter().setRoot(RouterTransaction.with(new
-                                                                    MagicBottomNavigationController())
-                                                                    .pushChangeHandler(new HorizontalChangeHandler())
-                                                                    .popChangeHandler(new HorizontalChangeHandler()));
-                                                        } else {
-                                                            if (isAccountImport) {
-                                                                ApplicationWideMessageHolder.getInstance().setMessageType(
-                                                                        ApplicationWideMessageHolder.MessageType.ACCOUNT_WAS_IMPORTED);
-                                                            }
-                                                            getRouter().popToRoot();
-                                                        }
-                                                    },
-                                                    throwable -> {
-                                                        progressText.setText(progressText.getText().toString() +
-                                                                "\n" +
-                                                                getResources().getString(
-                                                                        R.string.nc_display_name_not_stored));
-                                                        abortVerification();
-                                                    }, () -> dispose(dbQueryDisposable));
-
-                                } else {
-                                    progressText.setText(progressText.getText().toString() + "\n" +
-                                            getResources().getString(R.string.nc_display_name_not_fetched));
-                                    abortVerification();
-                                }
-                            }, throwable -> {
-                                progressText.setText(progressText.getText().toString()
-                                        + "\n" + getResources().getString(
-                                        R.string.nc_display_name_not_fetched));
-                                abortVerification();
-                            }, () -> dispose(profileQueryDisposable));
-
-                }, throwable -> {
-                    progressText.setText(String.format(getResources().getString(
-                            R.string.nc_nextcloud_talk_app_not_installed), getResources().getString(R.string.nc_app_name)));
-                    ApplicationWideMessageHolder.getInstance().setMessageType(
-                            ApplicationWideMessageHolder.MessageType.SERVER_WITHOUT_TALK);
-
-                    abortVerification();
-                }, () -> dispose(roomsQueryDisposable));
+                .subscribe(new Observer<UserProfileOverall>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+                        disposables.add(d);
+                    }
+
+                    @Override
+                    public void onNext(UserProfileOverall userProfileOverall) {
+                        String displayName = null;
+                        if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
+                                .getDisplayName())) {
+                            displayName = userProfileOverall.getOcs().getData()
+                                    .getDisplayName();
+                        } else if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
+                                .getDisplayNameAlt())) {
+                            displayName = userProfileOverall.getOcs().getData()
+                                    .getDisplayNameAlt();
+                        }
+
+                        if (!TextUtils.isEmpty(displayName)) {
+                            storeProfile(credentials, displayName, userProfileOverall.getOcs().getData().getUserId());
+                        } else {
+                            if (getActivity() != null) {
+                                getActivity().runOnUiThread(() -> progressText.setText(progressText.getText().toString() + "\n" +
+                                        getResources().getString(R.string.nc_display_name_not_fetched)));
+                            }
+                            abortVerification();
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        if (getActivity() != null) {
+                            getActivity().runOnUiThread(() -> progressText.setText(progressText.getText().toString() + "\n" +
+                                    getResources().getString(R.string.nc_display_name_not_fetched)));
+                        }
+                        abortVerification();
+
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
     }
 
-    private void dispose(@Nullable Disposable disposable) {
-        if (disposable != null && !disposable.isDisposed()) {
-            disposable.dispose();
-            disposable = null;
-        } else if (disposable == null) {
-            if (roomsQueryDisposable != null && !roomsQueryDisposable.isDisposed()) {
-                roomsQueryDisposable.dispose();
-                roomsQueryDisposable = null;
-            }
+    private void registerForPush() {
+        new JobRequest.Builder(PushRegistrationJob.TAG).
+                setUpdateCurrent(true).startNow().build().schedule();
+    }
 
-            if (profileQueryDisposable != null && !profileQueryDisposable.isDisposed()) {
-                profileQueryDisposable.dispose();
-                profileQueryDisposable = null;
+    @Subscribe(threadMode = ThreadMode.BACKGROUND)
+    public void onMessageEvent(EventStatus eventStatus) {
+        if (eventStatus.getEventType().equals(EventStatus.EventType.PUSH_REGISTRATION)) {
+            if (internalAccountId == eventStatus.getUserId() && !eventStatus.isAllGood() && getActivity() != null) {
+                getActivity().runOnUiThread(() -> progressText.setText(progressText.getText().toString() + "\n" +
+                        getResources().getString(R.string.nc_push_disabled)));
             }
-
-            if (dbQueryDisposable != null && !dbQueryDisposable.isDisposed()) {
-                dbQueryDisposable.dispose();
-                dbQueryDisposable = null;
+            fetchAndStoreCapabilities();
+        } else if (eventStatus.getEventType().equals(EventStatus.EventType.CAPABILITIES_FETCH)) {
+            if (internalAccountId == eventStatus.getUserId() && !eventStatus.isAllGood()) {
+                if (getActivity() != null) {
+                    getActivity().runOnUiThread(() -> progressText.setText(progressText.getText().toString() + "\n" +
+                            getResources().getString(R.string.nc_capabilities_failed)));
+                }
+                abortVerification();
+            } else if (internalAccountId == eventStatus.getUserId() && eventStatus.isAllGood()) {
+                proceedWithLogin();
             }
+        }
 
-            if (statusQueryDisposable != null && !statusQueryDisposable.isDisposed()) {
-                statusQueryDisposable.dispose();
-                statusQueryDisposable = null;
-            }
+    }
+
+    private void fetchAndStoreCapabilities() {
+        PersistableBundleCompat persistableBundleCompat = new
+                PersistableBundleCompat();
+        persistableBundleCompat.putLong(BundleKeys
+                .KEY_INTERNAL_USER_ID, internalAccountId);
+
+        new JobRequest.Builder(CapabilitiesJob.TAG).setUpdateCurrent
+                (false).addExtras(persistableBundleCompat).startNow()
+                .build().scheduleAsync();
+    }
+
+    private void proceedWithLogin() {
+        cookieManager.getCookieStore().removeAll();
+        userUtils.disableAllUsersWithoutId(internalAccountId);
+
+        if (getActivity() != null) {
+            getActivity().runOnUiThread(() -> {
+                if (userUtils.getUsers().size() == 1) {
+                    getRouter().setRoot(RouterTransaction.with(new
+                            MagicBottomNavigationController())
+                            .pushChangeHandler(new HorizontalChangeHandler())
+                            .popChangeHandler(new HorizontalChangeHandler()));
+                } else {
+                    if (isAccountImport) {
+                        ApplicationWideMessageHolder.getInstance().setMessageType(
+                                ApplicationWideMessageHolder.MessageType.ACCOUNT_WAS_IMPORTED);
+                    }
+                    getRouter().popToRoot();
+                }
+            });
         }
+    }
+
 
+    private void dispose() {
+        for (int i = 0; i < disposables.size(); i++) {
+            if (!disposables.get(i).isDisposed()) {
+                disposables.get(i).dispose();
+            }
+        }
     }
 
     @Override
@@ -308,45 +411,70 @@ public class AccountVerificationController extends BaseController {
 
     @Override
     public void onDestroy() {
+        dispose();
         super.onDestroy();
-        dispose(null);
     }
 
     private void abortVerification() {
-        dispose(null);
 
         if (!isAccountImport) {
-            userUtils.deleteUser(username, baseUrl).subscribe(new CompletableObserver() {
-                @Override
-                public void onSubscribe(Disposable d) {
+            if (internalAccountId != -1) {
+                userUtils.deleteUserWithId(internalAccountId).subscribe(new CompletableObserver() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
 
-                }
+                    }
 
-                @Override
-                public void onComplete() {
-                    new Handler().postDelayed(() -> getRouter().popToRoot(), 7500);
-                }
+                    @Override
+                    public void onComplete() {
+                        if (getActivity() != null) {
+                            getActivity().runOnUiThread(() -> {
+                                new Handler().postDelayed(() -> getRouter().popToRoot(), 7500);
+                            });
+                        }
+                    }
 
-                @Override
-                public void onError(Throwable e) {
+                    @Override
+                    public void onError(Throwable e) {
 
+                    }
+                });
+            } else {
+                if (getActivity() != null) {
+                    getActivity().runOnUiThread(() -> {
+                        new Handler().postDelayed(() -> getRouter().popToRoot(), 7500);
+                    });
                 }
-            });
+            }
         } else {
             ApplicationWideMessageHolder.getInstance().setMessageType(
                     ApplicationWideMessageHolder.MessageType.FAILED_TO_IMPORT_ACCOUNT);
             new Handler().postDelayed(() -> {
                 if (getRouter().hasRootController()) {
-                    getRouter().popToRoot();
+                    if (getActivity() != null) {
+                        getActivity().runOnUiThread(() -> {
+                            getRouter().popToRoot();
+                        });
+
+                    }
                 } else {
                     if (userUtils.anyUserExists()) {
-                        getRouter().setRoot(RouterTransaction.with(new MagicBottomNavigationController())
-                                .pushChangeHandler(new HorizontalChangeHandler())
-                                .popChangeHandler(new HorizontalChangeHandler()));
+                        if (getActivity() != null) {
+                            getActivity().runOnUiThread(() -> {
+
+                                getRouter().setRoot(RouterTransaction.with(new MagicBottomNavigationController())
+                                        .pushChangeHandler(new HorizontalChangeHandler())
+                                        .popChangeHandler(new HorizontalChangeHandler()));
+                            });
+                        }
                     } else {
-                        getRouter().setRoot(RouterTransaction.with(new ServerSelectionController())
-                                .pushChangeHandler(new HorizontalChangeHandler())
-                                .popChangeHandler(new HorizontalChangeHandler()));
+                        if (getActivity() != null) {
+                            getActivity().runOnUiThread(() -> {
+                                getRouter().setRoot(RouterTransaction.with(new ServerSelectionController())
+                                        .pushChangeHandler(new HorizontalChangeHandler())
+                                        .popChangeHandler(new HorizontalChangeHandler()));
+                            });
+                        }
                     }
                 }
             }, 7500);

+ 1 - 1
app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java

@@ -362,7 +362,7 @@ public class SettingsController extends BaseController {
                 cookieManager.getCookieStore().removeAll();
                 boolean otherUserExists = userUtils.scheduleUserForDeletionWithId(userEntity.getId());
                 new JobRequest.Builder(AccountRemovalJob.TAG).setUpdateCurrent(true)
-                        .startNow().build().schedule();
+                        .startNow().build().scheduleAsync();
 
                 if (otherUserExists && getView() != null) {
                     onViewBound(getView());

+ 41 - 0
app/src/main/java/com/nextcloud/talk/events/EventStatus.java

@@ -0,0 +1,41 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.talk.events;
+
+import lombok.Data;
+
+@Data
+public class EventStatus {
+    private long userId;
+    private EventType eventType;
+    private boolean allGood;
+
+    public EventStatus(long userId, EventType eventType, boolean allGood) {
+        this.userId = userId;
+        this.eventType = eventType;
+        this.allGood = allGood;
+    }
+
+    public enum EventType {
+        PUSH_REGISTRATION, CAPABILITIES_FETCH
+    }
+
+}

+ 12 - 2
app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesJob.java

@@ -27,12 +27,15 @@ import com.bluelinelabs.logansquare.LoganSquare;
 import com.evernote.android.job.Job;
 import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.events.EventStatus;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall;
 import com.nextcloud.talk.utils.ApiUtils;
 import com.nextcloud.talk.utils.bundle.BundleKeys;
 import com.nextcloud.talk.utils.database.user.UserUtils;
 
+import org.greenrobot.eventbus.EventBus;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -57,6 +60,9 @@ public class CapabilitiesJob extends Job {
     @Inject
     Retrofit retrofit;
 
+    @Inject
+    EventBus eventBus;
+
     @Inject
     OkHttpClient okHttpClient;
 
@@ -100,6 +106,8 @@ public class CapabilitiesJob extends Job {
 
                         @Override
                         public void onError(Throwable e) {
+                            eventBus.post(new EventStatus(internalUserEntity.getId(),
+                                    EventStatus.EventType.CAPABILITIES_FETCH, false));
 
                         }
 
@@ -128,12 +136,14 @@ public class CapabilitiesJob extends Job {
 
                         @Override
                         public void onNext(UserEntity userEntity) {
-
+                            eventBus.post(new EventStatus(userEntity.getId(),
+                                    EventStatus.EventType.CAPABILITIES_FETCH, true));
                         }
 
                         @Override
                         public void onError(Throwable e) {
-
+                            eventBus.post(new EventStatus(internalUserEntity.getId(),
+                                    EventStatus.EventType.CAPABILITIES_FETCH, false));
                         }
 
                         @Override

+ 15 - 4
app/src/main/java/com/nextcloud/talk/utils/PushUtils.java

@@ -29,6 +29,7 @@ import com.bluelinelabs.logansquare.LoganSquare;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
+import com.nextcloud.talk.events.EventStatus;
 import com.nextcloud.talk.models.SignatureVerification;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.json.push.PushConfigurationState;
@@ -36,6 +37,8 @@ import com.nextcloud.talk.models.json.push.PushRegistrationOverall;
 import com.nextcloud.talk.utils.database.user.UserUtils;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 
+import org.greenrobot.eventbus.EventBus;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -79,6 +82,9 @@ public class PushUtils {
     @Inject
     AppPreferences appPreferences;
 
+    @Inject
+    EventBus eventBus;
+
     @Inject
     OkHttpClient okHttpClient;
 
@@ -327,12 +333,15 @@ public class PushUtils {
 
                                                                             @Override
                                                                             public void onNext(UserEntity userEntity) {
-
+                                                                                eventBus.post(new EventStatus(userEntity.getId(), EventStatus.EventType.PUSH_REGISTRATION, true));
                                                                             }
 
                                                                             @Override
                                                                             public void onError(Throwable e) {
-
+                                                                                eventBus.post(new EventStatus
+                                                                                        (userEntity.getId(),
+                                                                                                EventStatus.EventType
+                                                                                                        .PUSH_REGISTRATION, false));
                                                                             }
 
                                                                             @Override
@@ -349,7 +358,8 @@ public class PushUtils {
 
                                                         @Override
                                                         public void onError(Throwable e) {
-
+                                                            eventBus.post(new EventStatus(userEntity.getId(),
+                                                                    EventStatus.EventType.PUSH_REGISTRATION, false));
                                                         }
 
                                                         @Override
@@ -361,12 +371,13 @@ public class PushUtils {
 
                                         @Override
                                         public void onError(Throwable e) {
+                                            eventBus.post(new EventStatus(userEntity.getId(),
+                                                    EventStatus.EventType.PUSH_REGISTRATION, false));
 
                                         }
 
                                         @Override
                                         public void onComplete() {
-
                                         }
                                     });
                         }

+ 10 - 0
app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java

@@ -99,6 +99,16 @@ public class UserUtils {
 
     }
 
+    public Completable deleteUserWithId(long id) {
+        Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.ID.eq(id)).limit(1).get();
+
+        UserEntity user = (UserEntity) findUserQueryResult.firstOrNull();
+
+        return dataStore.delete(user)
+                .subscribeOn(Schedulers.newThread());
+
+    }
+
     public void disableAllUsersWithoutId(long userId) {
         Result findUserQueryResult = dataStore.select(User.class).where(UserEntity.ID.notEqual(userId)).get();
 

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -20,6 +20,8 @@
 
     <!-- Account verification -->
     <string name="nc_display_name_fetched">Display name fetched</string>
+    <string name="nc_push_disabled">Push notifications disabled</string>
+    <string name="nc_capabilities_failed">Failed to fetch capabilities, aborting</string>
     <string name="nc_display_name_not_fetched">Display name couldn\'t be fetched, aborting</string>
     <string name="nc_nextcloud_talk_app_installed">%1$s app found</string>
     <string name="nc_nextcloud_talk_app_not_installed">%1$s app not installed on the server, aborting</string>