From deaa761736ff9b10911e9ab7d41ed01e178f4f15 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Apr 2018 12:46:33 +0200 Subject: [PATCH] Up the game on performance & reliability Signed-off-by: Mario Danic --- .../application/NextcloudTalkApplication.java | 6 +- .../AccountVerificationController.java | 444 +++++++++++------- .../talk/controllers/SettingsController.java | 2 +- .../nextcloud/talk/events/EventStatus.java | 41 ++ .../nextcloud/talk/jobs/CapabilitiesJob.java | 14 +- .../com/nextcloud/talk/utils/PushUtils.java | 19 +- .../talk/utils/database/user/UserUtils.java | 10 + app/src/main/res/values/strings.xml | 2 + 8 files changed, 370 insertions(+), 168 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/events/EventStatus.java diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index 24fdd61a5..41373b203 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/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() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java index d6998d475..e370b9ade 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java +++ b/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 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,157 +176,231 @@ 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() { + @Override + public void onSubscribe(Disposable d) { + disposables.add(d); } - checkEverything(); - }, throwable -> { - if (checkForcedHttps) { - determineBaseUrlProtocol(false); - } else { - abortVerification(); + @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() { + } - }, () -> { - statusQueryDisposable.dispose(); }); } - private void checkEverything() { - String credentials = ApiUtils.getCredentials(username, token); - cookieManager.getCookieStore().removeAll(); - - roomsQueryDisposable = ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(baseUrl)) + private void findServerTalkApp(String credentials) { + ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(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))); + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + disposables.add(d); + } - 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)); + @Override + public void onNext(RoomsOverall roomsOverall) { + fetchProfile(credentials); + } - 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(); - } + @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)))); + } - 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)); + ApplicationWideMessageHolder.getInstance().setMessageType( + ApplicationWideMessageHolder.MessageType.SERVER_WITHOUT_TALK); - new JobRequest.Builder(PushRegistrationJob.TAG). - setUpdateCurrent(true).startNow().build().schedule(); + abortVerification(); + } - PersistableBundleCompat persistableBundleCompat = new - PersistableBundleCompat(); - persistableBundleCompat.putLong(BundleKeys - .KEY_INTERNAL_USER_ID, userEntity.getId()); + @Override + public void onComplete() { - 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)); + } + }); } - 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 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() { + @Override + public void onSubscribe(Disposable d) { + disposables.add(d); + } - if (profileQueryDisposable != null && !profileQueryDisposable.isDisposed()) { - profileQueryDisposable.dispose(); - profileQueryDisposable = null; - } + @Override + public void onNext(UserEntity userEntity) { + internalAccountId = userEntity.getId(); - if (dbQueryDisposable != null && !dbQueryDisposable.isDisposed()) { - dbQueryDisposable.dispose(); - dbQueryDisposable = null; - } + registerForPush(); + } - if (statusQueryDisposable != null && !statusQueryDisposable.isDisposed()) { - statusQueryDisposable.dispose(); - statusQueryDisposable = null; + @Override + public void onError(Throwable e) { + progressText.setText(progressText.getText().toString() + + "\n" + + getResources().getString( + R.string.nc_display_name_not_stored)); + abortVerification(); + + } + + @Override + public void onComplete() { + + } + }); + } + + private void fetchProfile(String credentials) { + ncApi.getUserProfile(credentials, + ApiUtils.getUrlForUserProfile(baseUrl)) + .subscribeOn(Schedulers.newThread()) + .subscribe(new Observer() { + @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 registerForPush() { + new JobRequest.Builder(PushRegistrationJob.TAG). + setUpdateCurrent(true).startNow().build().schedule(); + } + + @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))); + } + 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(); } } } + 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 protected void onDestroyView(@NonNull View view) { super.onDestroyView(view); @@ -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() { + if (getActivity() != null) { + getActivity().runOnUiThread(() -> { + new Handler().postDelayed(() -> getRouter().popToRoot(), 7500); + }); + } + } + + @Override + public void onError(Throwable e) { + + } + }); + } else { + if (getActivity() != null) { + getActivity().runOnUiThread(() -> { + new Handler().postDelayed(() -> getRouter().popToRoot(), 7500); + }); } - - @Override - public void onComplete() { - new Handler().postDelayed(() -> getRouter().popToRoot(), 7500); - } - - @Override - public void onError(Throwable e) { - - } - }); + } } 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); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index a3a9958f2..d713b2d46 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/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()); diff --git a/app/src/main/java/com/nextcloud/talk/events/EventStatus.java b/app/src/main/java/com/nextcloud/talk/events/EventStatus.java new file mode 100644 index 000000000..a0eea0bf9 --- /dev/null +++ b/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 + * + * 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 . + */ + +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 + } + +} diff --git a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesJob.java b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesJob.java index b6427bde9..263189fe6 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesJob.java +++ b/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 diff --git a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java index 26290767c..0d6e2d5b1 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/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() { - } }); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java index a947c8222..562bd82bf 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java +++ b/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(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58fd28da9..7ebac42e2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,8 @@ Display name fetched + Push notifications disabled + Failed to fetch capabilities, aborting Display name couldn\'t be fetched, aborting %1$s app found %1$s app not installed on the server, aborting