diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 59d133004..41bfe1cc8 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -21,6 +21,7 @@ package com.nextcloud.talk.api; import com.nextcloud.talk.api.models.json.call.CallOverall; +import com.nextcloud.talk.api.models.json.generic.GenericOverall; import com.nextcloud.talk.api.models.json.generic.Status; import com.nextcloud.talk.api.models.json.participants.AddParticipantOverall; import com.nextcloud.talk.api.models.json.participants.ParticipantsOverall; @@ -199,10 +200,27 @@ public interface NcApi { @QueryMap Map options); + @DELETE + Observable unregisterDeviceForNotificationsWithNextcloud(@Header("Authorization") + String authorization, + @Url String url); + @FormUrlEncoded @POST Observable registerDeviceForNotificationsWithProxy(@Header("Authorization") String authorization, @Url String url, @FieldMap Map fields); + + /* + QueryMap items are as follows: + - "deviceIdentifier": "{{deviceIdentifier}}", + - "deviceIdentifierSignature": "{{signature}}", + - "userPublicKey": "{{userPublicKey}}" + */ + @DELETE + Observable unregisterDeviceForNotificationsWithProxy(@Header("Authorization") String authorization, + @Url String url, + @QueryMap Map fields); + } diff --git a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java index bb5b9c065..9e2c1b470 100644 --- a/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java +++ b/app/src/main/java/com/nextcloud/talk/api/helpers/api/ApiHelper.java @@ -145,7 +145,7 @@ public class ApiHelper { return baseUrl + ocsApiVersion + "/apps/notifications/api/v2/push"; } - public static String getUrlPushProxy(String baseUrl) { + public static String getUrlPushProxy() { return NextcloudTalkApplication.getSharedApplication(). getApplicationContext().getResources().getString(R.string.nc_push_server_url) + "/devices"; } diff --git a/app/src/main/java/com/nextcloud/talk/api/models/json/push/PushConfigurationState.java b/app/src/main/java/com/nextcloud/talk/api/models/json/push/PushConfigurationState.java index 82a1c98d2..13597c31d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/models/json/push/PushConfigurationState.java +++ b/app/src/main/java/com/nextcloud/talk/api/models/json/push/PushConfigurationState.java @@ -43,9 +43,6 @@ public class PushConfigurationState { @JsonField(name = "userPublicKey") public String userPublicKey; - @JsonField(name = "shouldBeDeleted") - public boolean shouldBeDeleted; - @JsonField(name = "usesRegularPass") public boolean usesRegularPass; } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java index b6349802b..7250d5974 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalJob.java @@ -22,14 +22,26 @@ package com.nextcloud.talk.jobs; import android.support.annotation.NonNull; +import android.util.Log; +import com.bluelinelabs.logansquare.LoganSquare; import com.evernote.android.job.Job; +import com.nextcloud.talk.api.NcApi; +import com.nextcloud.talk.api.helpers.api.ApiHelper; +import com.nextcloud.talk.api.models.json.generic.GenericOverall; +import com.nextcloud.talk.api.models.json.push.PushConfigurationState; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.persistence.entities.UserEntity; import com.nextcloud.talk.utils.database.user.UserUtils; +import java.io.IOException; +import java.util.HashMap; + import javax.inject.Inject; import autodagger.AutoInjector; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; @AutoInjector(NextcloudTalkApplication.class) public class AccountRemovalJob extends Job { @@ -38,10 +50,82 @@ public class AccountRemovalJob extends Job { @Inject UserUtils userUtils; + @Inject + NcApi ncApi; + @NonNull @Override protected Result onRunJob(Params params) { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + + PushConfigurationState pushConfigurationState; + for(Object userEntityObject : userUtils.getUsersScheduledForDeletion()) { + UserEntity userEntity = (UserEntity) userEntityObject; + try { + pushConfigurationState = LoganSquare.parse(userEntity.getPushConfigurationState(), + PushConfigurationState.class); + PushConfigurationState finalPushConfigurationState = pushConfigurationState; + ncApi.unregisterDeviceForNotificationsWithNextcloud(ApiHelper.getCredentials(userEntity.getUsername(), + userEntity.getToken()), ApiHelper.getUrlNextcloudPush(userEntity.getBaseUrl())) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(GenericOverall genericOverall) { + if (genericOverall.getOcs().getMeta().getStatusCode().equals("200") + || genericOverall.getOcs().getMeta().getStatusCode().equals("202")) { + HashMap queryMap = new HashMap<>(); + queryMap.put("deviceIdentifier", finalPushConfigurationState.deviceIdentifier); + queryMap.put("userPublicKey", finalPushConfigurationState.getUserPublicKey()); + queryMap.put("deviceIdentifierSignature", + finalPushConfigurationState.getDeviceIdentifierSignature()); + + ncApi.unregisterDeviceForNotificationsWithProxy + (ApiHelper.getCredentials(userEntity.getUsername(), + userEntity.getToken()), ApiHelper.getUrlPushProxy(), queryMap) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Void aVoid) { + userUtils.deleteUser(userEntity.getUsername(), + userEntity.getBaseUrl()); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } catch (IOException e) { + Log.d(TAG, "Something went wrong while removing job at parsing PushConfigurationState"); + } + + } return Result.SUCCESS; } } 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 04ac5972a..02f277b8a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -178,9 +178,6 @@ public class PushUtils { return result.toString(); } - private void deleteRegistrationForAccount(UserEntity userEntity) { - } - public int generateRsa2048KeyPair() { if (!publicKeyFile.exists() && !privateKeyFile.exists()) { if (!keysFile.exists()) { @@ -246,8 +243,8 @@ public class PushUtils { } if (accountPushData != null && !accountPushData.getPushToken().equals(token) && - !accountPushData.isShouldBeDeleted() || - TextUtils.isEmpty(providerValue)) { + !userEntity.getScheduledForDeletion() || + TextUtils.isEmpty(providerValue) && !userEntity.getScheduledForDeletion()) { Map queryMap = new HashMap<>(); @@ -273,7 +270,7 @@ public class PushUtils { ncApi.registerDeviceForNotificationsWithProxy(ApiHelper.getCredentials (userEntity.getUsername(), userEntity.getToken()), - ApiHelper.getUrlPushProxy(userEntity.getBaseUrl()), proxyMap) + ApiHelper.getUrlPushProxy(), proxyMap) .subscribeOn(Schedulers.newThread()) .subscribe(new Consumer() { @Override @@ -291,7 +288,6 @@ public class PushUtils { pushConfigurationState.setUserPublicKey( pushRegistrationOverall.getOcs() .getData().getPublicKey()); - pushConfigurationState.setShouldBeDeleted(false); pushConfigurationState.setUsesRegularPass(false); userUtils.createOrUpdateUser(userEntity.getUsername(), 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 89170bfc3..668fba161 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 @@ -57,6 +57,14 @@ public class UserUtils { return findUsersQueryResult.toList(); } + public List getUsersScheduledForDeletion() { + Result findUsersQueryResult = dataStore.select(User.class).where(UserEntity.SCHEDULED_FOR_DELETION.eq(true)) + .get(); + + return findUsersQueryResult.toList(); + } + + public UserEntity getAnyUserAndSetAsActive() { Result findUserQueryResult = dataStore.select(User.class)