diff --git a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java index 2d76e2416..5cb8c5143 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/AccountRemovalWorker.java @@ -37,9 +37,9 @@ import com.nextcloud.talk.models.json.generic.GenericOverall; import com.nextcloud.talk.models.json.push.PushConfigurationState; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.database.user.UserUtils; +import com.nextcloud.talk.utils.singletons.ApplicationWideApiHolder; import java.io.IOException; -import java.net.CookieManager; import java.util.HashMap; import java.util.zip.CRC32; @@ -50,7 +50,6 @@ import autodagger.AutoInjector; import io.reactivex.CompletableObserver; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; -import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import retrofit2.Retrofit; @@ -75,6 +74,7 @@ public class AccountRemovalWorker extends Worker { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); PushConfigurationState pushConfigurationState; + String credentials; for (Object userEntityObject : userUtils.getUsersScheduledForDeletion()) { UserEntity userEntity = (UserEntity) userEntityObject; try { @@ -83,11 +83,12 @@ public class AccountRemovalWorker extends Worker { PushConfigurationState.class); PushConfigurationState finalPushConfigurationState = pushConfigurationState; - ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new - JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class); + ncApi = ApplicationWideApiHolder.getInstance().getNcApiInstanceForAccountId(userEntity.getId(), null); + credentials = ApiUtils.getCredentials(userEntity.getUserId(), userEntity.getToken()); - ncApi.unregisterDeviceForNotificationsWithNextcloud(ApiUtils.getCredentials(userEntity.getUsername(), - userEntity.getToken()), ApiUtils.getUrlNextcloudPush(userEntity.getBaseUrl())) + String finalCredentials = credentials; + ncApi.unregisterDeviceForNotificationsWithNextcloud(credentials, ApiUtils.getUrlNextcloudPush(userEntity + .getBaseUrl())) .blockingSubscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -105,8 +106,7 @@ public class AccountRemovalWorker extends Worker { finalPushConfigurationState.getDeviceIdentifierSignature()); ncApi.unregisterDeviceForNotificationsWithProxy - (ApiUtils.getCredentials(userEntity.getUsername(), - userEntity.getToken()), ApiUtils.getUrlPushProxy(), queryMap) + (finalCredentials, ApiUtils.getUrlPushProxy(), queryMap) .blockingSubscribe(new Observer() { @Override public void onSubscribe(Disposable d) { diff --git a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java index 313d32b6b..4f093bdca 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java @@ -32,6 +32,7 @@ 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 com.nextcloud.talk.utils.singletons.ApplicationWideApiHolder; import org.greenrobot.eventbus.EventBus; @@ -46,7 +47,6 @@ import androidx.work.Worker; import autodagger.AutoInjector; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; -import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import retrofit2.Retrofit; @@ -124,8 +124,7 @@ public class CapabilitiesWorker extends Worker { for (Object userEntityObject : userEntityObjectList) { UserEntity internalUserEntity = (UserEntity) userEntityObject; - ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new - JavaNetCookieJar(new java.net.CookieManager())).build()).build().create(NcApi.class); + ncApi = ApplicationWideApiHolder.getInstance().getNcApiInstanceForAccountId(internalUserEntity.getId(), null); ncApi.getCapabilities(ApiUtils.getCredentials(internalUserEntity.getUsername(), internalUserEntity.getToken()), ApiUtils.getUrlForCapabilities(internalUserEntity.getBaseUrl())) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java index 7c711c7bf..a1d157419 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java @@ -60,6 +60,7 @@ import com.nextcloud.talk.utils.PushUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.nextcloud.talk.utils.singletons.ApplicationWideApiHolder; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; import com.nextcloud.talk.utils.singletons.ApplicationWideStateHolder; @@ -93,7 +94,6 @@ public class NotificationWorker extends Worker { @Inject AppPreferences appPreferences; - @Inject NcApi ncApi; private DecryptedPushMessage decryptedPushMessage; @@ -101,10 +101,11 @@ public class NotificationWorker extends Worker { private SignatureVerification signatureVerification; private String conversationType = ""; + private String credentials; + private void showNotificationForCallWithNoPing(Intent intent) { UserEntity userEntity = signatureVerification.getUserEntity(); - ncApi.getRoom(ApiUtils.getCredentials(userEntity.getUserId(), - userEntity.getToken()), ApiUtils.getRoom(userEntity.getBaseUrl(), + ncApi.getRoom(credentials, ApiUtils.getRoom(userEntity.getBaseUrl(), intent.getExtras().getString(BundleKeys.KEY_ROOM_TOKEN))) .blockingSubscribe(new Observer() { @Override @@ -142,8 +143,7 @@ public class NotificationWorker extends Worker { private void showMessageNotificationWithObjectData(Intent intent) { UserEntity userEntity = signatureVerification.getUserEntity(); - ncApi.getNotification(ApiUtils.getCredentials(userEntity.getUserId(), - userEntity.getToken()), ApiUtils.getUrlForNotificationWithId(userEntity.getBaseUrl(), + ncApi.getNotification(credentials, ApiUtils.getUrlForNotificationWithId(userEntity.getBaseUrl(), Long.toString(decryptedPushMessage.getNotificationId()))) .blockingSubscribe(new Observer() { @Override @@ -164,16 +164,16 @@ public class NotificationWorker extends Worker { decryptedPushMessage.setText(notification.getMessage()); } - HashMap> subjectRichParametersRichParameters = notification + HashMap> subjectRichParameters = notification .getSubjectRichParameters(); - if (subjectRichParametersRichParameters != null && subjectRichParametersRichParameters - .size() > 0 && subjectRichParametersRichParameters.containsKey("call") - && subjectRichParametersRichParameters.containsKey("user")) { - HashMap callHashMap = subjectRichParametersRichParameters.get("call"); - HashMap userHashMap = subjectRichParametersRichParameters.get("user"); + if (subjectRichParameters != null && subjectRichParameters + .size() > 0 && subjectRichParameters.containsKey("call") + && subjectRichParameters.containsKey("user")) { + HashMap callHashMap = subjectRichParameters.get("call"); + HashMap userHashMap = subjectRichParameters.get("user"); - if (callHashMap.containsKey("call-type")) { + if (callHashMap != null && callHashMap.size() > 0 && callHashMap.containsKey("call-type")) { conversationType = callHashMap.get("call-type"); if ("one2one".equals(conversationType)) { @@ -374,8 +374,12 @@ public class NotificationWorker extends Worker { decryptedPushMessage = LoganSquare.parse(new String(decryptedSubject), DecryptedPushMessage.class); - boolean hasChatSupport = signatureVerification.getUserEntity().hasSpreedCapabilityWithName - ("chat-v2"); + ncApi = ApplicationWideApiHolder.getInstance().getNcApiInstanceForAccountId(signatureVerification.getUserEntity().getId(), null); + credentials = ApiUtils.getCredentials(signatureVerification.getUserEntity().getUserId(), + signatureVerification.getUserEntity().getToken()); + + boolean hasChatSupport = signatureVerification.getUserEntity(). + hasSpreedCapabilityWithName("chat-v2"); boolean isInTheSameRoomAsNotification = (ApplicationWideCurrentRoomHolder.getInstance(). getCurrentRoomId().equals(decryptedPushMessage.getId()) || @@ -452,7 +456,7 @@ public class NotificationWorker extends Worker { Log.d(TAG, "Invalid private key " + e1.getLocalizedMessage()); } } catch (Exception exception) { - Log.d(TAG, "Something went very wrong" + exception.getLocalizedMessage()); + Log.d(TAG, "Something went very wrong " + exception.getLocalizedMessage()); } return Result.SUCCESS; } diff --git a/app/src/main/java/com/nextcloud/talk/models/database/User.java b/app/src/main/java/com/nextcloud/talk/models/database/User.java index db419f664..58cc9fb1a 100644 --- a/app/src/main/java/com/nextcloud/talk/models/database/User.java +++ b/app/src/main/java/com/nextcloud/talk/models/database/User.java @@ -79,7 +79,8 @@ public interface User extends Parcelable, Persistable, Serializable { if (getCapabilities() != null) { try { Capabilities capabilities = LoganSquare.parse(getCapabilities(), Capabilities.class); - if (capabilities.getSpreedCapability() != null && capabilities.getSpreedCapability().getFeatures() != null) { + if (capabilities != null && capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getFeatures() != null) { return capabilities.getSpreedCapability().getFeatures().contains(capabilityName); } } catch (IOException e) { 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 0d6e2d5b1..04a67b540 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -36,6 +36,7 @@ import com.nextcloud.talk.models.json.push.PushConfigurationState; import com.nextcloud.talk.models.json.push.PushRegistrationOverall; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.nextcloud.talk.utils.singletons.ApplicationWideApiHolder; import org.greenrobot.eventbus.EventBus; @@ -44,7 +45,6 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.net.CookieManager; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactory; @@ -68,9 +68,6 @@ import autodagger.AutoInjector; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import okhttp3.JavaNetCookieJar; -import okhttp3.OkHttpClient; -import retrofit2.Retrofit; @AutoInjector(NextcloudTalkApplication.class) public class PushUtils { @@ -85,12 +82,6 @@ public class PushUtils { @Inject EventBus eventBus; - @Inject - OkHttpClient okHttpClient; - - @Inject - Retrofit retrofit; - NcApi ncApi; private File keysFile; @@ -231,6 +222,7 @@ public class PushUtils { String token = appPreferences.getPushToken(); if (!TextUtils.isEmpty(token)) { + String credentials; String pushTokenHash = generateSHA512Hash(token).toLowerCase(); PublicKey devicePublicKey = (PublicKey) readKeyFromFile(true); if (devicePublicKey != null) { @@ -268,11 +260,12 @@ public class PushUtils { queryMap.put("devicePublicKey", publicKey); queryMap.put("proxyServer", proxyServer); - ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new - JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class); + ncApi = ApplicationWideApiHolder.getInstance().getNcApiInstanceForAccountId(userEntity.getId(), null); + credentials = ApiUtils.getCredentials(userEntity.getUserId(), userEntity.getToken()); + String finalCredentials = credentials; ncApi.registerDeviceForNotificationsWithNextcloud( - ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()), + credentials, ApiUtils.getUrlNextcloudPush(userEntity.getBaseUrl()), queryMap) .subscribeOn(Schedulers.newThread()) .subscribe(new Observer() { @@ -293,8 +286,7 @@ public class PushUtils { .getData().getPublicKey()); - ncApi.registerDeviceForNotificationsWithProxy(ApiUtils.getCredentials - (userEntity.getUsername(), userEntity.getToken()), + ncApi.registerDeviceForNotificationsWithProxy(finalCredentials, ApiUtils.getUrlPushProxy(), proxyMap) .subscribeOn(Schedulers.newThread()) .subscribe(new Observer() { diff --git a/app/src/main/java/com/nextcloud/talk/utils/singletons/ApiHolder.java b/app/src/main/java/com/nextcloud/talk/utils/singletons/ApplicationWideApiHolder.java similarity index 88% rename from app/src/main/java/com/nextcloud/talk/utils/singletons/ApiHolder.java rename to app/src/main/java/com/nextcloud/talk/utils/singletons/ApplicationWideApiHolder.java index 11d43afac..e3f62577c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/singletons/ApiHolder.java +++ b/app/src/main/java/com/nextcloud/talk/utils/singletons/ApplicationWideApiHolder.java @@ -20,6 +20,7 @@ package com.nextcloud.talk.utils.singletons; +import android.annotation.SuppressLint; import android.support.annotation.Nullable; import android.text.TextUtils; @@ -29,6 +30,7 @@ import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.utils.database.user.UserUtils; import java.util.HashMap; +import java.util.Map; import javax.inject.Inject; @@ -39,7 +41,8 @@ import retrofit2.Retrofit; public class ApiHolder { private static final String TAG = "ApiHolder"; - private HashMap ncApiHashMap; + @SuppressLint("UseSparseArrays") + private Map ncApiHashMap; @Inject UserUtils userUtils; @@ -53,15 +56,21 @@ public class ApiHolder { return holder; } + @SuppressLint("UseSparseArrays") public NcApi getNcApiInstanceForAccountId(long accountId, @Nullable String baseUrl) { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + + if (ncApiHashMap == null) { + ncApiHashMap = new HashMap<>(); + } + if (!ncApiHashMap.containsKey(accountId)) { UserEntity userAccount = userUtils.getUserWithId(accountId); if (userAccount == null || !TextUtils.isEmpty(baseUrl)) { retrofit = retrofit.newBuilder().baseUrl(baseUrl).build(); return retrofit.create(NcApi.class); } else { - retrofit = retrofit.newBuilder().baseUrl(userAccount.getBaseUrl()).build(); + retrofit = retrofit.newBuilder().baseUrl(userAccount.getBaseUrl() + "/").build(); ncApiHashMap.put(accountId, retrofit.create(NcApi.class)); } }