From 7aa4743a324ed19f0810a3dcbcf37a6ee44897a6 Mon Sep 17 00:00:00 2001
From: Mario Danic <mario@lovelyhq.com>
Date: Fri, 10 Aug 2018 22:09:06 +0200
Subject: [PATCH] Start using new api holder for jobs

Signed-off-by: Mario Danic <mario@lovelyhq.com>
---
 .../talk/jobs/AccountRemovalWorker.java       | 16 ++++-----
 .../talk/jobs/CapabilitiesWorker.java         |  5 ++-
 .../talk/jobs/NotificationWorker.java         | 34 +++++++++++--------
 .../nextcloud/talk/models/database/User.java  |  3 +-
 .../com/nextcloud/talk/utils/PushUtils.java   | 22 ++++--------
 ...der.java => ApplicationWideApiHolder.java} | 13 +++++--
 6 files changed, 49 insertions(+), 44 deletions(-)
 rename app/src/main/java/com/nextcloud/talk/utils/singletons/{ApiHolder.java => ApplicationWideApiHolder.java} (88%)

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<GenericOverall>() {
                                 @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<Void>() {
                                                     @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<RoomOverall>() {
                     @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<NotificationOverall>() {
                     @Override
@@ -164,16 +164,16 @@ public class NotificationWorker extends Worker {
                             decryptedPushMessage.setText(notification.getMessage());
                         }
 
-                        HashMap<String, HashMap<String, String>> subjectRichParametersRichParameters = notification
+                        HashMap<String, HashMap<String, String>> subjectRichParameters = notification
                                 .getSubjectRichParameters();
 
-                        if (subjectRichParametersRichParameters != null && subjectRichParametersRichParameters
-                                .size() > 0 && subjectRichParametersRichParameters.containsKey("call")
-                                && subjectRichParametersRichParameters.containsKey("user")) {
-                            HashMap<String, String> callHashMap = subjectRichParametersRichParameters.get("call");
-                            HashMap<String, String> userHashMap = subjectRichParametersRichParameters.get("user");
+                        if (subjectRichParameters != null && subjectRichParameters
+                                .size() > 0 && subjectRichParameters.containsKey("call")
+                                && subjectRichParameters.containsKey("user")) {
+                            HashMap<String, String> callHashMap = subjectRichParameters.get("call");
+                            HashMap<String, String> 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<PushRegistrationOverall>() {
@@ -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<Void>() {
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<Long, NcApi> ncApiHashMap;
+    @SuppressLint("UseSparseArrays")
+    private Map<Long, NcApi> 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));
             }
         }