diff --git a/app/src/gplay/java/com/nextcloud/talk/services/firebase/ChatAndCallMessagingService.kt b/app/src/gplay/java/com/nextcloud/talk/services/firebase/ChatAndCallMessagingService.kt index b32c3ee7c..53b089678 100644 --- a/app/src/gplay/java/com/nextcloud/talk/services/firebase/ChatAndCallMessagingService.kt +++ b/app/src/gplay/java/com/nextcloud/talk/services/firebase/ChatAndCallMessagingService.kt @@ -189,26 +189,18 @@ class ChatAndCallMessagingService : FirebaseMessagingService() { Log.d(TAG, this.toString()) timestamp = System.currentTimeMillis() if (delete) { - cancelExistingNotificationWithId( - applicationContext, - signatureVerification!!.userEntity!!, - notificationId - ) + cancelExistingNotificationWithId(applicationContext, signatureVerification!!.user!!, notificationId) } else if (deleteAll) { - cancelAllNotificationsForAccount(applicationContext, signatureVerification!!.userEntity!!) + cancelAllNotificationsForAccount(applicationContext, signatureVerification!!.user!!) } else if (deleteMultiple) { notificationIds!!.forEach { - cancelExistingNotificationWithId( - applicationContext, - signatureVerification!!.userEntity!!, - it - ) + cancelExistingNotificationWithId(applicationContext, signatureVerification!!.user!!, it) } } else if (type == "call") { val fullScreenIntent = Intent(applicationContext, CallNotificationActivity::class.java) val bundle = Bundle() bundle.putString(BundleKeys.KEY_ROOM_ID, decryptedPushMessage!!.id) - bundle.putParcelable(KEY_USER_ENTITY, signatureVerification!!.userEntity) + bundle.putParcelable(KEY_USER_ENTITY, signatureVerification!!.user) bundle.putBoolean(KEY_FROM_NOTIFICATION_START_CALL, true) fullScreenIntent.putExtras(bundle) @@ -226,7 +218,7 @@ class ChatAndCallMessagingService : FirebaseMessagingService() { val soundUri = getCallRingtoneUri(applicationContext!!, appPreferences) val notificationChannelId = NotificationUtils.NOTIFICATION_CHANNEL_CALLS_V4 - val uri = Uri.parse(signatureVerification!!.userEntity!!.baseUrl) + val uri = Uri.parse(signatureVerification!!.user!!.baseUrl) val baseUrl = uri.host val notification = @@ -274,18 +266,18 @@ class ChatAndCallMessagingService : FirebaseMessagingService() { var inCallOnDifferentDevice = false val apiVersion = ApiUtils.getConversationApiVersion( - signatureVerification.userEntity, + signatureVerification.user, intArrayOf(ApiUtils.APIv4, 1) ) ncApi.getPeersForCall( ApiUtils.getCredentials( - signatureVerification.userEntity!!.username, - signatureVerification.userEntity!!.token + signatureVerification.user!!.username, + signatureVerification.user!!.token ), ApiUtils.getUrlForCall( apiVersion, - signatureVerification.userEntity!!.baseUrl, + signatureVerification.user!!.baseUrl, decryptedPushMessage.id ) ) @@ -303,7 +295,7 @@ class ChatAndCallMessagingService : FirebaseMessagingService() { hasParticipantsInCall = participantList.isNotEmpty() if (hasParticipantsInCall) { for (participant in participantList) { - if (participant.actorId == signatureVerification.userEntity!!.userId && + if (participant.actorId == signatureVerification.user!!.userId && participant.actorType == Participant.ActorType.USERS ) { inCallOnDifferentDevice = true diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index b1a7f548f..e1ae1a25e 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -58,6 +58,7 @@ import com.nextcloud.talk.adapters.ParticipantDisplayItem; import com.nextcloud.talk.adapters.ParticipantsAdapter; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.databinding.CallActivityBinding; import com.nextcloud.talk.events.ConfigurationChangeEvent; import com.nextcloud.talk.events.MediaStreamEvent; @@ -66,7 +67,6 @@ import com.nextcloud.talk.events.PeerConnectionEvent; import com.nextcloud.talk.events.SessionDescriptionSendEvent; import com.nextcloud.talk.events.WebSocketCommunicationEvent; import com.nextcloud.talk.models.ExternalSignalingServer; -import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall; import com.nextcloud.talk.models.json.conversations.Conversation; import com.nextcloud.talk.models.json.conversations.RoomOverall; @@ -85,13 +85,12 @@ import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.IceServer; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; import com.nextcloud.talk.ui.dialog.AudioOutputDialog; +import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; -import com.nextcloud.talk.utils.LegacyUserEntityMapper; import com.nextcloud.talk.utils.NotificationUtils; import com.nextcloud.talk.utils.animations.PulseAnimation; import com.nextcloud.talk.utils.bundle.BundleKeys; -import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil; import com.nextcloud.talk.utils.power.PowerManagerUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; @@ -181,7 +180,7 @@ public class CallActivity extends CallBaseActivity { @Inject EventBus eventBus; @Inject - UserUtils userUtils; + UserManager userManager; @Inject AppPreferences appPreferences; @Inject @@ -228,7 +227,7 @@ public class CallActivity extends CallBaseActivity { private List iceServers; private CameraEnumerator cameraEnumerator; private String roomToken; - private UserEntity conversationUser; + private User conversationUser; private String conversationName; private String callSession; private MediaStream localStream; @@ -1209,30 +1208,14 @@ public class CallActivity extends CallBaseActivity { } Log.d(TAG, " hasExternalSignalingServer: " + hasExternalSignalingServer); - if (!conversationUser.getUserId().equals("?")) { - try { - userUtils.createOrUpdateUser(null, - null, - null, - null, - null, - null, - null, - conversationUser.getId(), - null, - null, - LoganSquare.serialize(externalSignalingServer)) - .subscribeOn(Schedulers.io()) - .subscribe(); - } catch (IOException exception) { - Log.e(TAG, "Failed to serialize external signaling server", exception); - } + if (!"?".equals(conversationUser.getUserId()) && conversationUser.getId() != null) { + Log.d(TAG, "Update externalSignalingServer for: " + conversationUser.getId() + + " / " + conversationUser.getUserId()); + userManager.updateExternalSignalingServer(conversationUser.getId(), externalSignalingServer) + .subscribeOn(Schedulers.io()) + .subscribe(); } else { - try { - conversationUser.setExternalSignalingServer(LoganSquare.serialize(externalSignalingServer)); - } catch (IOException exception) { - Log.e(TAG, "Failed to serialize external signaling server", exception); - } + conversationUser.setExternalSignalingServer(externalSignalingServer); } if (signalingSettingsOverall.getOcs().getSettings().getStunServers() != null) { @@ -1353,8 +1336,7 @@ public class CallActivity extends CallBaseActivity { ApplicationWideCurrentRoomHolder.getInstance().setSession(callSession); ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId); ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomToken(roomToken); - ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom( - LegacyUserEntityMapper.toModel(conversationUser)); + ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); callOrJoinRoomViaWebSocket(); } @@ -1417,7 +1399,7 @@ public class CallActivity extends CallBaseActivity { if (!TextUtils.isEmpty(roomToken)) { NotificationUtils.INSTANCE.cancelExistingNotificationsForRoom(getApplicationContext(), - Objects.requireNonNull(LegacyUserEntityMapper.toModel(conversationUser)), + conversationUser, roomToken); } diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java index 133337713..acaa16e64 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java @@ -46,10 +46,9 @@ import com.facebook.imagepipeline.request.ImageRequest; import com.nextcloud.talk.R; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.databinding.CallNotificationActivityBinding; import com.nextcloud.talk.events.CallNotificationClick; -import com.nextcloud.talk.models.database.CapabilitiesUtil; -import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.conversations.Conversation; import com.nextcloud.talk.models.json.conversations.RoomOverall; import com.nextcloud.talk.models.json.participants.Participant; @@ -59,6 +58,7 @@ import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.DoNotDisturbUtils; import com.nextcloud.talk.utils.NotificationUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; +import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew; import com.nextcloud.talk.utils.preferences.AppPreferences; import org.greenrobot.eventbus.EventBus; @@ -106,7 +106,7 @@ public class CallNotificationActivity extends CallBaseActivity { private List disposablesList = new ArrayList<>(); private Bundle originalBundle; private String roomId; - private UserEntity userBeingCalled; + private User userBeingCalled; private String credentials; private Conversation currentConversation; private MediaPlayer mediaPlayer; @@ -285,8 +285,8 @@ public class CallNotificationActivity extends CallBaseActivity { if (apiVersion >= 3) { boolean hasCallFlags = - CapabilitiesUtil.hasSpreedFeatureCapability(userBeingCalled, - "conversation-call-flags"); + CapabilitiesUtilNew.hasSpreedFeatureCapability(userBeingCalled, + "conversation-call-flags"); if (hasCallFlags) { if (isInCallWithVideo(currentConversation.getCallFlag())) { binding.incomingCallVoiceOrVideoTextView.setText( @@ -308,7 +308,7 @@ public class CallNotificationActivity extends CallBaseActivity { @Override public void onComplete() { - + // unused atm } }); } 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 4491edd13..7f83ce22f 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java @@ -42,6 +42,7 @@ import com.nextcloud.talk.activities.CallActivity; import com.nextcloud.talk.activities.MainActivity; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.models.SignatureVerification; import com.nextcloud.talk.models.database.ArbitraryStorageEntity; import com.nextcloud.talk.models.database.UserEntity; @@ -130,20 +131,20 @@ public class NotificationWorker extends Worker { } private void showNotificationForCallWithNoPing(Intent intent) { - UserEntity userEntity = signatureVerification.getUserEntity(); + User user = signatureVerification.getUser(); ArbitraryStorageEntity arbitraryStorageEntity; if ((arbitraryStorageEntity = arbitraryStorageUtils.getStorageSetting( - userEntity.getId(), + user.getId(), "important_conversation", intent.getExtras().getString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN()))) != null) { importantConversation = Boolean.parseBoolean(arbitraryStorageEntity.getValue()); } - int apiVersion = ApiUtils.getConversationApiVersion(userEntity, new int[] {ApiUtils.APIv4, 1}); + int apiVersion = ApiUtils.getConversationApiVersion(user, new int[] {ApiUtils.APIv4, 1}); - ncApi.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, userEntity.getBaseUrl(), + ncApi.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, user.getBaseUrl(), intent.getExtras().getString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN()))) .blockingSubscribe(new Observer() { @Override @@ -188,8 +189,8 @@ public class NotificationWorker extends Worker { } private void showNotificationWithObjectData(Intent intent) { - UserEntity userEntity = signatureVerification.getUserEntity(); - ncApi.getNotification(credentials, ApiUtils.getUrlForNotificationWithId(userEntity.getBaseUrl(), + User user = signatureVerification.getUser(); + ncApi.getNotification(credentials, ApiUtils.getUrlForNotificationWithId(user.getBaseUrl(), Long.toString(decryptedPushMessage.getNotificationId()))) .blockingSubscribe(new Observer() { @Override @@ -309,7 +310,7 @@ public class NotificationWorker extends Worker { } PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, intentFlag); - Uri uri = Uri.parse(signatureVerification.getUserEntity().getBaseUrl()); + Uri uri = Uri.parse(signatureVerification.getUser().getBaseUrl()); String baseUrl = uri.getHost(); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, "1") @@ -339,7 +340,7 @@ public class NotificationWorker extends Worker { Bundle notificationInfo = new Bundle(); notificationInfo.putLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), - signatureVerification.getUserEntity().getId()); + signatureVerification.getUser().getId()); // could be an ID or a TOKEN notificationInfo.putString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN(), decryptedPushMessage.getId()); @@ -358,12 +359,13 @@ public class NotificationWorker extends Worker { notificationBuilder.setContentIntent(pendingIntent); - String groupName = signatureVerification.getUserEntity().getId() + "@" + decryptedPushMessage.getId(); + String groupName = signatureVerification.getUser().getId() + "@" + decryptedPushMessage.getId(); notificationBuilder.setGroup(Long.toString(calculateCRC32(groupName))); StatusBarNotification activeStatusBarNotification = NotificationUtils.INSTANCE.findNotificationForRoom(context, - signatureVerification.getUserEntity(), decryptedPushMessage.getId()); + signatureVerification.getUser(), + decryptedPushMessage.getId()); // NOTE - systemNotificationId is an internal ID used on the device only. // It is NOT the same as the notification ID used in communication with the server. @@ -404,7 +406,7 @@ public class NotificationWorker extends Worker { Person.Builder person = new Person.Builder() - .setKey(signatureVerification.getUserEntity().getId() + "@" + notificationUser.getId()) + .setKey(signatureVerification.getUser().getId() + "@" + notificationUser.getId()) .setName(EmojiCompat.get().process(notificationUser.getName())) .setBot("bot".equals(userType)); @@ -413,7 +415,7 @@ public class NotificationWorker extends Worker { addMarkAsReadAction(notificationBuilder, systemNotificationId); if ("user".equals(userType) || "guest".equals(userType)) { - String baseUrl = signatureVerification.getUserEntity().getBaseUrl(); + String baseUrl = signatureVerification.getUser().getBaseUrl(); String avatarUrl = "user".equals(userType) ? ApiUtils.getUrlForAvatar(baseUrl, notificationUser.getId(), false) : ApiUtils.getUrlForGuestAvatar(baseUrl, notificationUser.getName(), false); @@ -430,7 +432,7 @@ public class NotificationWorker extends Worker { // It is NOT the same as the notification ID used in communication with the server. actualIntent.putExtra(BundleKeys.INSTANCE.getKEY_SYSTEM_NOTIFICATION_ID(), systemNotificationId); actualIntent.putExtra(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), - Objects.requireNonNull(signatureVerification.getUserEntity()).getId()); + Objects.requireNonNull(signatureVerification.getUser()).getId()); actualIntent.putExtra(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN(), decryptedPushMessage.getId()); actualIntent.putExtra(BundleKeys.KEY_MESSAGE_ID, messageId); @@ -593,22 +595,22 @@ public class NotificationWorker extends Worker { if (decryptedPushMessage.getDelete()) { NotificationUtils.INSTANCE.cancelExistingNotificationWithId( context, - signatureVerification.getUserEntity(), + signatureVerification.getUser(), decryptedPushMessage.getNotificationId()); } else if (decryptedPushMessage.getDeleteAll()) { NotificationUtils.INSTANCE.cancelAllNotificationsForAccount( context, - signatureVerification.getUserEntity()); + signatureVerification.getUser()); } else if (decryptedPushMessage.getDeleteMultiple()) { for (long notificationId : decryptedPushMessage.getNotificationIds()) { NotificationUtils.INSTANCE.cancelExistingNotificationWithId( context, - signatureVerification.getUserEntity(), + signatureVerification.getUser(), notificationId); } } else { - credentials = ApiUtils.getCredentials(signatureVerification.getUserEntity().getUsername(), - signatureVerification.getUserEntity().getToken()); + credentials = ApiUtils.getCredentials(signatureVerification.getUser().getUsername(), + signatureVerification.getUser().getToken()); ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class); @@ -632,7 +634,7 @@ public class NotificationWorker extends Worker { bundle.putString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN(), decryptedPushMessage.getId()); bundle.putParcelable(BundleKeys.INSTANCE.getKEY_USER_ENTITY(), - signatureVerification.getUserEntity()); + signatureVerification.getUser()); bundle.putBoolean(BundleKeys.INSTANCE.getKEY_FROM_NOTIFICATION_START_CALL(), startACall); diff --git a/app/src/main/java/com/nextcloud/talk/models/SignatureVerification.kt b/app/src/main/java/com/nextcloud/talk/models/SignatureVerification.kt index e07b89128..11e043c0a 100644 --- a/app/src/main/java/com/nextcloud/talk/models/SignatureVerification.kt +++ b/app/src/main/java/com/nextcloud/talk/models/SignatureVerification.kt @@ -22,11 +22,11 @@ package com.nextcloud.talk.models import android.os.Parcelable -import com.nextcloud.talk.models.database.UserEntity +import com.nextcloud.talk.data.user.model.User import kotlinx.android.parcel.Parcelize @Parcelize data class SignatureVerification( var signatureValid: Boolean = false, - var userEntity: UserEntity? = null + var user: User? = null ) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index abe79e943..3ae40b40c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -283,7 +283,8 @@ public class ChooseAccountDialogFragment extends DialogFragment { null, null, Boolean.TRUE, - null, userEntity.getId(), + null, + userEntity.getId(), null, null, null) diff --git a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt index 467742af9..cfd83b88b 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -116,6 +116,14 @@ class UserManager internal constructor(private val userRepository: UsersReposito }.map { TRUE } } + fun updateExternalSignalingServer(id: Long, externalSignalingServer: ExternalSignalingServer): Single { + return userRepository.getUserWithId(id).map { user -> + user.externalSignalingServer = externalSignalingServer + userRepository.updateUser(user) + }.toSingle() + } + + @Deprecated("Only available for migration, use updateExternalSignalingServer or create new methods") fun createOrUpdateUser( username: String?, userAttributes: UserAttributes, diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index cddae0df2..5c999ed0e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -121,7 +121,12 @@ public class ApiUtils { return baseUrl + ocsApiVersion + "/cloud/capabilities"; } + @Deprecated public static int getCallApiVersion(UserEntity capabilities, int[] versions) throws NoSupportedApiException { + return getCallApiVersion(LegacyUserEntityMapper.toModel(capabilities), versions); + } + + public static int getCallApiVersion(User capabilities, int[] versions) throws NoSupportedApiException { return getConversationApiVersion(capabilities, versions); } @@ -161,20 +166,25 @@ public class ApiUtils { return getConversationApiVersion(LegacyUserEntityMapper.toModel(user), versions); } + @Deprecated public static int getSignalingApiVersion(UserEntity user, int[] versions) throws NoSupportedApiException { + return getSignalingApiVersion(LegacyUserEntityMapper.toModel(user), versions); + } + + public static int getSignalingApiVersion(User user, int[] versions) throws NoSupportedApiException { for (int version : versions) { - if (CapabilitiesUtil.hasSpreedFeatureCapability(user, "signaling-v" + version)) { + if (CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "signaling-v" + version)) { return version; } if (version == APIv2 && - CapabilitiesUtil.hasSpreedFeatureCapability(user, "sip-support") && - !CapabilitiesUtil.hasSpreedFeatureCapability(user, "signaling-v3")) { + CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "sip-support") && + !CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "signaling-v3")) { return version; } if (version == APIv1 && - !CapabilitiesUtil.hasSpreedFeatureCapability(user, "signaling-v3")) { + !CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "signaling-v3")) { // Has no capability, we just assume it is always there when there is no v3 or later return version; } diff --git a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt index 33ebeadec..247b269d8 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt @@ -43,7 +43,6 @@ import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.RingtoneSettings -import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.preferences.AppPreferences import java.io.IOException @@ -218,20 +217,14 @@ object NotificationUtils { } } - fun cancelAllNotificationsForAccount(context: Context?, conversationUser: UserEntity) { - scanNotifications( - context, - LegacyUserEntityMapper.toModel(conversationUser)!! - ) { notificationManager, statusBarNotification, _ -> + fun cancelAllNotificationsForAccount(context: Context?, conversationUser: User) { + scanNotifications(context, conversationUser) { notificationManager, statusBarNotification, _ -> notificationManager.cancel(statusBarNotification.id) } } - fun cancelExistingNotificationWithId(context: Context?, conversationUser: UserEntity, notificationId: Long?) { - scanNotifications( - context, - LegacyUserEntityMapper.toModel(conversationUser)!! - ) { notificationManager, statusBarNotification, notification -> + fun cancelExistingNotificationWithId(context: Context?, conversationUser: User, notificationId: Long?) { + scanNotifications(context, conversationUser) { notificationManager, statusBarNotification, notification -> if (notificationId == notification.extras.getLong(BundleKeys.KEY_NOTIFICATION_ID)) { notificationManager.cancel(statusBarNotification.id) } @@ -240,13 +233,10 @@ object NotificationUtils { fun findNotificationForRoom( context: Context?, - conversationUser: UserEntity, + conversationUser: User, roomTokenOrId: String ): StatusBarNotification? { - scanNotifications( - context, - LegacyUserEntityMapper.toModel(conversationUser)!! - ) { _, statusBarNotification, notification -> + scanNotifications(context, conversationUser) { _, statusBarNotification, notification -> if (roomTokenOrId == notification.extras.getString(BundleKeys.KEY_ROOM_TOKEN)) { return statusBarNotification } @@ -254,11 +244,7 @@ object NotificationUtils { return null } - fun cancelExistingNotificationsForRoom( - context: Context?, - conversationUser: User, - roomTokenOrId: String - ) { + fun cancelExistingNotificationsForRoom(context: Context?, conversationUser: User, roomTokenOrId: String) { scanNotifications(context, conversationUser) { notificationManager, statusBarNotification, notification -> if (roomTokenOrId == notification.extras.getString(BundleKeys.KEY_ROOM_TOKEN)) { notificationManager.cancel(statusBarNotification.id) 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 4010ba9c4..d4167c2e6 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -31,11 +31,13 @@ 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.data.user.model.User; 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; import com.nextcloud.talk.models.json.push.PushRegistrationOverall; +import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; @@ -78,6 +80,9 @@ public class PushUtils { @Inject UserUtils userUtils; + @Inject + UserManager userManager; + @Inject AppPreferences appPreferences; @@ -103,27 +108,23 @@ public class PushUtils { } public SignatureVerification verifySignature(byte[] signatureBytes, byte[] subjectBytes) { - Signature signature = null; - PushConfigurationState pushConfigurationState; - PublicKey publicKey; SignatureVerification signatureVerification = new SignatureVerification(); signatureVerification.setSignatureValid(false); - List userEntities = userUtils.getUsers(); + List users = userManager.getUsers().blockingGet(); try { - signature = Signature.getInstance("SHA512withRSA"); - if (userEntities != null && userEntities.size() > 0) { - for (UserEntity userEntity : userEntities) { - if (!TextUtils.isEmpty(userEntity.getPushConfigurationState())) { - pushConfigurationState = LoganSquare.parse(userEntity.getPushConfigurationState(), - PushConfigurationState.class); + Signature signature = Signature.getInstance("SHA512withRSA"); + if (users != null && users.size() > 0) { + PublicKey publicKey; + for (User user : users) { + if (user.getPushConfigurationState() != null) { publicKey = (PublicKey) readKeyFromString(true, - pushConfigurationState.getUserPublicKey()); + user.getPushConfigurationState().getUserPublicKey()); signature.initVerify(publicKey); signature.update(subjectBytes); if (signature.verify(signatureBytes)) { signatureVerification.setSignatureValid(true); - signatureVerification.setUserEntity(userEntity); + signatureVerification.setUser(user); return signatureVerification; } } @@ -131,8 +132,6 @@ public class PushUtils { } } catch (NoSuchAlgorithmException e) { Log.d(TAG, "No such algorithm"); - } catch (IOException e) { - Log.d(TAG, "Error while trying to parse push configuration state"); } catch (InvalidKeyException e) { Log.d(TAG, "Invalid key while trying to verify"); } catch (SignatureException e) { diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java index 78d534c8b..a97b638bc 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java @@ -27,9 +27,9 @@ import android.util.Log; import com.bluelinelabs.logansquare.LoganSquare; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.events.NetworkEvent; import com.nextcloud.talk.events.WebSocketCommunicationEvent; -import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; @@ -90,7 +90,7 @@ public class MagicWebSocketInstance extends WebSocketListener { @Inject Context context; - private UserEntity conversationUser; + private User conversationUser; private String webSocketTicket; private String resumeId; private String sessionId; @@ -109,7 +109,7 @@ public class MagicWebSocketInstance extends WebSocketListener { private List messagesQueue = new ArrayList<>(); - MagicWebSocketInstance(UserEntity conversationUser, String connectionUrl, String webSocketTicket) { + MagicWebSocketInstance(User conversationUser, String connectionUrl, String webSocketTicket) { NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this); this.connectionUrl = connectionUrl; diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java index 5e52df862..282493ae6 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java @@ -24,6 +24,7 @@ import android.annotation.SuppressLint; import android.util.Log; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; import com.nextcloud.talk.models.json.websocket.ActorWebSocketMessage; @@ -39,6 +40,7 @@ import com.nextcloud.talk.models.json.websocket.RoomOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RoomWebSocketMessage; import com.nextcloud.talk.models.json.websocket.SignalingDataWebSocketMessageForOffer; import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.LegacyUserEntityMapper; import java.util.HashMap; import java.util.Map; @@ -70,7 +72,19 @@ public class WebSocketConnectionHelper { return null; } - public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, UserEntity userEntity, String webSocketTicket, boolean isGuest) { + @Deprecated + public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, + UserEntity userEntity, + String webSocketTicket, boolean isGuest) { + return getExternalSignalingInstanceForServer(url, + LegacyUserEntityMapper.toModel(userEntity), + webSocketTicket, + isGuest); + } + + public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, + User user, + String webSocketTicket, boolean isGuest) { String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://"); if (generatedURL.endsWith("/")) { @@ -79,18 +93,17 @@ public class WebSocketConnectionHelper { generatedURL += "/spreed"; } - long userId = isGuest ? -1 : userEntity.getId(); - + long userId = isGuest ? -1 : user.getId(); MagicWebSocketInstance magicWebSocketInstance; - if (userId != -1 && magicWebSocketInstanceMap.containsKey(userEntity.getId()) && (magicWebSocketInstance = magicWebSocketInstanceMap.get(userEntity.getId())) != null) { + if (userId != -1 && magicWebSocketInstanceMap.containsKey(user.getId()) && (magicWebSocketInstance = magicWebSocketInstanceMap.get(user.getId())) != null) { return magicWebSocketInstance; } else { if (userId == -1) { deleteExternalSignalingInstanceForUserEntity(userId); } - magicWebSocketInstance = new MagicWebSocketInstance(userEntity, generatedURL, webSocketTicket); - magicWebSocketInstanceMap.put(userEntity.getId(), magicWebSocketInstance); + magicWebSocketInstance = new MagicWebSocketInstance(user, generatedURL, webSocketTicket); + magicWebSocketInstanceMap.put(user.getId(), magicWebSocketInstance); return magicWebSocketInstance; } } @@ -105,19 +118,19 @@ public class WebSocketConnectionHelper { } } - HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) { - int apiVersion = ApiUtils.getSignalingApiVersion(userEntity, new int[] {ApiUtils.APIv3, 2, 1}); + HelloOverallWebSocketMessage getAssembledHelloModel(User user, String ticket) { + int apiVersion = ApiUtils.getSignalingApiVersion(user, new int[] {ApiUtils.APIv3, 2, 1}); HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage(); helloOverallWebSocketMessage.setType("hello"); HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage(); helloWebSocketMessage.setVersion("1.0"); AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage(); - authWebSocketMessage.setUrl(ApiUtils.getUrlForSignalingBackend(apiVersion, userEntity.getBaseUrl())); + authWebSocketMessage.setUrl(ApiUtils.getUrlForSignalingBackend(apiVersion, user.getBaseUrl())); AuthParametersWebSocketMessage authParametersWebSocketMessage = new AuthParametersWebSocketMessage(); authParametersWebSocketMessage.setTicket(ticket); - if (!userEntity.getUserId().equals("?")) { - authParametersWebSocketMessage.setUserid(userEntity.getUserId()); + if (!("?").equals(user.getUserId())) { + authParametersWebSocketMessage.setUserid(user.getUserId()); } authWebSocketMessage.setAuthParametersWebSocketMessage(authParametersWebSocketMessage); helloWebSocketMessage.setAuthWebSocketMessage(authWebSocketMessage); diff --git a/scripts/analysis/findbugs-results.txt b/scripts/analysis/findbugs-results.txt index dc9414b21..2d73b5e3b 100644 --- a/scripts/analysis/findbugs-results.txt +++ b/scripts/analysis/findbugs-results.txt @@ -1 +1 @@ -154 \ No newline at end of file +152 \ No newline at end of file