mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-16 09:15:30 +01:00
Merge pull request #2852 from nextcloud/bugfix/noid/fixWebsocketConnection
Fix to get websocketInstance
This commit is contained in:
commit
abd609c388
@ -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
|
||||||
|
@ -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() {
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user