Merge pull request #2852 from nextcloud/bugfix/noid/fixWebsocketConnection

Fix to get websocketInstance
This commit is contained in:
Marcel Hibbe 2023-03-10 16:25:47 +01:00 committed by GitHub
commit abd609c388
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 54 additions and 62 deletions

View File

@ -61,6 +61,7 @@ import com.nextcloud.talk.dagger.modules.ViewModelModule
import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.AccountRemovalWorker
import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.CapabilitiesWorker
import com.nextcloud.talk.jobs.SignalingSettingsWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker
import com.nextcloud.talk.jobs.WebsocketConnectionsWorker
import com.nextcloud.talk.ui.theme.ThemeModule import com.nextcloud.talk.ui.theme.ThemeModule
import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.ClosedInterfaceImpl
import com.nextcloud.talk.utils.DeviceUtils import com.nextcloud.talk.utils.DeviceUtils
@ -176,23 +177,7 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver {
ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync() ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync()
DeviceUtils.ignoreSpecialBatteryFeatures() DeviceUtils.ignoreSpecialBatteryFeatures()
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() initWorkers()
val periodicCapabilitiesUpdateWork = PeriodicWorkRequest.Builder(
CapabilitiesWorker::class.java,
HALF_DAY,
TimeUnit.HOURS
).build()
val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build()
val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build()
WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork)
WorkManager.getInstance(applicationContext).enqueue(capabilitiesUpdateWork)
WorkManager.getInstance(applicationContext).enqueue(signalingSettingsWork)
WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
"DailyCapabilitiesUpdateWork",
ExistingPeriodicWorkPolicy.REPLACE,
periodicCapabilitiesUpdateWork
)
val config = BundledEmojiCompatConfig(this) val config = BundledEmojiCompatConfig(this)
config.setReplaceAll(true) config.setReplaceAll(true)
@ -203,6 +188,31 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver {
NotificationUtils.registerNotificationChannels(applicationContext, appPreferences) NotificationUtils.registerNotificationChannels(applicationContext, appPreferences)
} }
private fun initWorkers() {
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build()
val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build()
val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build()
WorkManager.getInstance(applicationContext)
.beginWith(accountRemovalWork)
.then(capabilitiesUpdateWork)
.then(signalingSettingsWork)
.then(websocketConnectionsWorker)
.enqueue()
val periodicCapabilitiesUpdateWork = PeriodicWorkRequest.Builder(
CapabilitiesWorker::class.java,
HALF_DAY,
TimeUnit.HOURS
).build()
WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
"DailyCapabilitiesUpdateWork",
ExistingPeriodicWorkPolicy.REPLACE,
periodicCapabilitiesUpdateWork
)
}
override fun onTerminate() { override fun onTerminate() {
super.onTerminate() super.onTerminate()
sharedApplication = null sharedApplication = null

View File

@ -48,6 +48,7 @@ import com.nextcloud.talk.events.EventStatus
import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.CapabilitiesWorker
import com.nextcloud.talk.jobs.PushRegistrationWorker import com.nextcloud.talk.jobs.PushRegistrationWorker
import com.nextcloud.talk.jobs.SignalingSettingsWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker
import com.nextcloud.talk.jobs.WebsocketConnectionsWorker
import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.capabilities.Capabilities
import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall
import com.nextcloud.talk.models.json.generic.Status import com.nextcloud.talk.models.json.generic.Status
@ -434,11 +435,15 @@ class AccountVerificationController(args: Bundle? = null) :
Data.Builder() Data.Builder()
.putLong(KEY_INTERNAL_USER_ID, internalAccountId) .putLong(KEY_INTERNAL_USER_ID, internalAccountId)
.build() .build()
val signalingSettings = val signalingSettings = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java)
OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java) .setInputData(userData)
.setInputData(userData) .build()
.build() val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build()
WorkManager.getInstance().enqueue(signalingSettings)
WorkManager.getInstance(applicationContext!!)
.beginWith(signalingSettings)
.then(websocketConnectionsWorker)
.enqueue()
} }
private fun proceedWithLogin() { private fun proceedWithLogin() {

View File

@ -1783,6 +1783,7 @@ class ChatController(args: Bundle) :
eventBus.register(this) eventBus.register(this)
setupWebsocket()
webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener) webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
if (conversationUser?.userId != "?" && if (conversationUser?.userId != "?" &&
@ -2002,15 +2003,6 @@ class ChatController(args: Bundle) :
logConversationInfos("joinRoomWithPassword#onNext") logConversationInfos("joinRoomWithPassword#onNext")
// FIXME The web socket should be set up in onAttach(). It is currently setup after joining the
// room to "ensure" (rather, increase the chances) that the WebsocketConnectionsWorker job
// was able to finish and, therefore, that the web socket instance can be got.
setupWebsocket()
// Ensure that the listener is added if the web socket instance was not set up yet when
// onAttach() was called.
webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
if (isFirstMessagesProcessing) { if (isFirstMessagesProcessing) {
pullChatMessages(false) pullChatMessages(false)
} else { } else {
@ -2103,15 +2095,6 @@ class ChatController(args: Bundle) :
"", "",
sessionIdAfterRoomJoined sessionIdAfterRoomJoined
) )
} else {
Log.e(TAG, "magicWebSocketInstance or currentConversation were null! Failed to leave the room!")
if (BuildConfig.DEBUG) {
Toast.makeText(
context,
"magicWebSocketInstance or currentConversation were null! Failed to leave the room!",
Toast.LENGTH_LONG
).show()
}
} }
sessionIdAfterRoomJoined = "0" sessionIdAfterRoomJoined = "0"
@ -2224,11 +2207,10 @@ class ChatController(args: Bundle) :
if (conversationUser == null) { if (conversationUser == null) {
return return
} }
webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUserId(conversationUser.id!!)
webSocketInstance = WebSocketConnectionHelper.getMagicWebSocketInstanceForUserId(conversationUser.id!!)
if (webSocketInstance == null) { if (webSocketInstance == null) {
Log.d(TAG, "magicWebSocketInstance became null") Log.d(TAG, "webSocketInstance not set up. This should only happen when not using the HPB")
} }
} }

View File

@ -112,9 +112,9 @@ public class CapabilitiesWorker extends Worker {
long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1);
List<User> userEntityObjectList = new ArrayList<>(); List<User> userEntityObjectList = new ArrayList<>();
boolean userExists = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); boolean userNotFound = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet();
if (internalUserId == -1 || !userExists) { if (internalUserId == -1 || userNotFound) {
userEntityObjectList = userManager.getUsers().blockingGet(); userEntityObjectList = userManager.getUsers().blockingGet();
} else { } else {
userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet()); userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet());

View File

@ -42,8 +42,6 @@ import javax.inject.Inject;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.work.Data; import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.Worker; import androidx.work.Worker;
import androidx.work.WorkerParameters; import androidx.work.WorkerParameters;
import autodagger.AutoInjector; import autodagger.AutoInjector;
@ -77,9 +75,9 @@ public class SignalingSettingsWorker extends Worker {
long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1);
List<User> userEntityObjectList = new ArrayList<>(); List<User> userEntityObjectList = new ArrayList<>();
boolean userExists = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); boolean userNotFound = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet();
if (internalUserId == -1 || !userExists) { if (internalUserId == -1 || userNotFound) {
userEntityObjectList = userManager.getUsers().blockingGet(); userEntityObjectList = userManager.getUsers().blockingGet();
} else { } else {
userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet()); userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet());
@ -115,6 +113,8 @@ public class SignalingSettingsWorker extends Worker {
.getExternalSignalingTicket()); .getExternalSignalingTicket());
} }
user.setExternalSignalingServer(externalSignalingServer);
userManager.saveUser(user).subscribe(new SingleObserver<Integer>() { userManager.saveUser(user).subscribe(new SingleObserver<Integer>() {
@Override @Override
public void onSubscribe(Disposable d) { public void onSubscribe(Disposable d) {
@ -157,11 +157,6 @@ public class SignalingSettingsWorker extends Worker {
}); });
} }
OneTimeWorkRequest websocketConnectionsWorker = new OneTimeWorkRequest
.Builder(WebsocketConnectionsWorker.class)
.build();
WorkManager.getInstance().enqueue(websocketConnectionsWorker);
return Result.success(); return Result.success();
} }
} }

View File

@ -48,7 +48,7 @@ import okhttp3.OkHttpClient;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class WebSocketConnectionHelper { public class WebSocketConnectionHelper {
public static final String TAG = "WebSocketConnectionHelper"; public static final String TAG = "WebSocketConnectionHelper";
private static Map<Long, WebSocketInstance> magicWebSocketInstanceMap = new HashMap<>(); private static Map<Long, WebSocketInstance> webSocketInstanceMap = new HashMap<>();
@Inject @Inject
OkHttpClient okHttpClient; OkHttpClient okHttpClient;
@ -59,11 +59,11 @@ public class WebSocketConnectionHelper {
} }
@SuppressLint("LongLogTag") @SuppressLint("LongLogTag")
public static synchronized WebSocketInstance getMagicWebSocketInstanceForUserId(long userId) { public static synchronized WebSocketInstance getWebSocketInstanceForUserId(long userId) {
WebSocketInstance webSocketInstance = magicWebSocketInstanceMap.get(userId); WebSocketInstance webSocketInstance = webSocketInstanceMap.get(userId);
if (webSocketInstance == null) { if (webSocketInstance == null) {
Log.d(TAG, "No magicWebSocketInstance found for user " + userId); Log.e(TAG, "No webSocketInstance found for user " + userId);
} }
return webSocketInstance; return webSocketInstance;
@ -83,24 +83,24 @@ public class WebSocketConnectionHelper {
long userId = isGuest ? -1 : user.getId(); long userId = isGuest ? -1 : user.getId();
WebSocketInstance webSocketInstance; WebSocketInstance webSocketInstance;
if (userId != -1 && magicWebSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = magicWebSocketInstanceMap.get(user.getId())) != null) { if (userId != -1 && webSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = webSocketInstanceMap.get(user.getId())) != null) {
return webSocketInstance; return webSocketInstance;
} else { } else {
if (userId == -1) { if (userId == -1) {
deleteExternalSignalingInstanceForUserEntity(userId); deleteExternalSignalingInstanceForUserEntity(userId);
} }
webSocketInstance = new WebSocketInstance(user, generatedURL, webSocketTicket); webSocketInstance = new WebSocketInstance(user, generatedURL, webSocketTicket);
magicWebSocketInstanceMap.put(user.getId(), webSocketInstance); webSocketInstanceMap.put(user.getId(), webSocketInstance);
return webSocketInstance; return webSocketInstance;
} }
} }
public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) { public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) {
WebSocketInstance webSocketInstance; WebSocketInstance webSocketInstance;
if ((webSocketInstance = magicWebSocketInstanceMap.get(id)) != null) { if ((webSocketInstance = webSocketInstanceMap.get(id)) != null) {
if (webSocketInstance.isConnected()) { if (webSocketInstance.isConnected()) {
webSocketInstance.sendBye(); webSocketInstance.sendBye();
magicWebSocketInstanceMap.remove(id); webSocketInstanceMap.remove(id);
} }
} }
} }