mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 12:09:45 +01:00
Various updates
This commit is contained in:
parent
8eb2f78a23
commit
b492c8a576
@ -1,229 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectCodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
|
||||
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
|
||||
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
|
||||
<value />
|
||||
</option>
|
||||
<option name="IMPORT_LAYOUT_TABLE">
|
||||
<value>
|
||||
<package name="android" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="com" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="junit" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="net" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="org" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="java" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="javax" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="" withSubpackages="true" static="false" />
|
||||
<emptyLine />
|
||||
<package name="" withSubpackages="true" static="true" />
|
||||
<emptyLine />
|
||||
</value>
|
||||
</option>
|
||||
<option name="RIGHT_MARGIN" value="100" />
|
||||
<AndroidXmlCodeStyleSettings>
|
||||
<option name="USE_CUSTOM_SETTINGS" value="true" />
|
||||
</AndroidXmlCodeStyleSettings>
|
||||
<Objective-C-extensions>
|
||||
<file>
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
|
||||
</file>
|
||||
<class>
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
|
||||
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
|
||||
</class>
|
||||
<extensions>
|
||||
<pair source="cpp" header="h" />
|
||||
<pair source="c" header="h" />
|
||||
</extensions>
|
||||
</Objective-C-extensions>
|
||||
<XML>
|
||||
<option name="XML_KEEP_LINE_BREAKS" value="false" />
|
||||
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
|
||||
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
|
||||
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
||||
</XML>
|
||||
<codeStyleSettings language="XML">
|
||||
<option name="FORCE_REARRANGE_MODE" value="1" />
|
||||
<indentOptions>
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
</indentOptions>
|
||||
<arrangement>
|
||||
<rules>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:android</NAME>
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:.*</NAME>
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:id</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:name</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>name</NAME>
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>style</NAME>
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:layout_width</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:layout_height</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:layout_.*</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:width</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:height</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
</rules>
|
||||
</arrangement>
|
||||
</codeStyleSettings>
|
||||
</value>
|
||||
</option>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" />
|
||||
</component>
|
||||
</project>
|
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile default="true" name="Default" enabled="true" />
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
@ -1,7 +0,0 @@
|
||||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="allowReplaceRegexp" value="true" />
|
||||
<option name="notice" value="Nextcloud Talk application @author Mario Danic Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>." />
|
||||
<option name="myName" value="GPL3" />
|
||||
</copyright>
|
||||
</component>
|
@ -1,7 +0,0 @@
|
||||
<component name="CopyrightManager">
|
||||
<settings default="GPL3">
|
||||
<module2copyright>
|
||||
<element module="Project Files" copyright="GPL3" />
|
||||
</module2copyright>
|
||||
</settings>
|
||||
</component>
|
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="PROJECT" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
@ -1,4 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
</project>
|
@ -2,10 +2,8 @@
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/Projects-talk-android.iml" filepath="$PROJECT_DIR$/Projects-talk-android.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/talk-android.iml" filepath="$PROJECT_DIR$/talk-android.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/app/talk-android-app.iml" filepath="$PROJECT_DIR$/app/talk-android-app.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
@ -27,6 +27,7 @@ import coil.transform.CircleCropTransformation
|
||||
import com.nextcloud.talk.R
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.models.database.UserEntity
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
||||
@ -39,7 +40,7 @@ class MentionAutocompleteItem(
|
||||
val objectId: String?,
|
||||
val displayName: String?,
|
||||
var source: String?,
|
||||
private val currentUser: UserEntity
|
||||
private val currentUser: UserNgEntity
|
||||
) : AbstractFlexibleItem<UserItem.UserItemViewHolder>(), IFilterable<String> {
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
|
@ -309,18 +309,14 @@ public class AccountVerificationController extends BaseController {
|
||||
@Override
|
||||
public void onNext(UserProfileOverall userProfileOverall) {
|
||||
String displayName = null;
|
||||
if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
|
||||
.getDisplayName())) {
|
||||
displayName = userProfileOverall.getOcs().getData()
|
||||
.getDisplayName();
|
||||
} else if (!TextUtils.isEmpty(userProfileOverall.getOcs().getData()
|
||||
.getDisplayNameAlt())) {
|
||||
displayName = userProfileOverall.getOcs().getData()
|
||||
.getDisplayNameAlt();
|
||||
if (!TextUtils.isEmpty(userProfileOverall.ocs.data.displayName)) {
|
||||
displayName = userProfileOverall.ocs.data.displayName;
|
||||
} else if (!TextUtils.isEmpty(userProfileOverall.ocs.data.displayNameAlt)) {
|
||||
displayName = userProfileOverall.ocs.data.displayNameAlt;
|
||||
}
|
||||
|
||||
if (!TextUtils.isEmpty(displayName)) {
|
||||
storeProfile(displayName, userProfileOverall.getOcs().getData().getUserId());
|
||||
storeProfile(displayName, userProfileOverall.ocs.data.userId);
|
||||
} else {
|
||||
if (getActivity() != null) {
|
||||
getActivity().runOnUiThread(
|
||||
@ -356,28 +352,28 @@ public class AccountVerificationController extends BaseController {
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.BACKGROUND)
|
||||
public void onMessageEvent(EventStatus eventStatus) {
|
||||
if (eventStatus.getEventType().equals(EventStatus.EventType.PUSH_REGISTRATION)) {
|
||||
if (internalAccountId == eventStatus.getUserId()
|
||||
&& !eventStatus.isAllGood()
|
||||
if (EventStatus.EventType.PUSH_REGISTRATION == eventStatus.eventType) {
|
||||
if (internalAccountId == eventStatus.userId
|
||||
&& !eventStatus.allGood
|
||||
&& getActivity() != null) {
|
||||
getActivity().runOnUiThread(
|
||||
() -> progressText.setText(progressText.getText().toString() + "\n" +
|
||||
getResources().getString(R.string.nc_push_disabled)));
|
||||
}
|
||||
fetchAndStoreCapabilities();
|
||||
} else if (eventStatus.getEventType().equals(EventStatus.EventType.CAPABILITIES_FETCH)) {
|
||||
if (internalAccountId == eventStatus.getUserId() && !eventStatus.isAllGood()) {
|
||||
} else if (EventStatus.EventType.CAPABILITIES_FETCH == eventStatus.eventType) {
|
||||
if (internalAccountId == eventStatus.userId && !eventStatus.allGood) {
|
||||
if (getActivity() != null) {
|
||||
getActivity().runOnUiThread(
|
||||
() -> progressText.setText(progressText.getText().toString() + "\n" +
|
||||
getResources().getString(R.string.nc_capabilities_failed)));
|
||||
}
|
||||
abortVerification();
|
||||
} else if (internalAccountId == eventStatus.getUserId() && eventStatus.isAllGood()) {
|
||||
} else if (internalAccountId == eventStatus.userId && eventStatus.allGood) {
|
||||
fetchAndStoreExternalSignalingSettings();
|
||||
}
|
||||
} else if (eventStatus.getEventType().equals(EventStatus.EventType.SIGNALING_SETTINGS)) {
|
||||
if (internalAccountId == eventStatus.getUserId() && !eventStatus.isAllGood()) {
|
||||
} else if (EventStatus.EventType.SIGNALING_SETTINGS == eventStatus.eventType) {
|
||||
if (internalAccountId == eventStatus.userId && !eventStatus.allGood) {
|
||||
if (getActivity() != null) {
|
||||
getActivity().runOnUiThread(
|
||||
() -> progressText.setText(progressText.getText().toString() + "\n" +
|
||||
|
@ -1259,8 +1259,8 @@ class CallController(args: Bundle) : BaseController() {
|
||||
|
||||
if (webSocketClient == null) {
|
||||
webSocketClient = WebSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
||||
externalSignalingServer!!.externalSignalingServer,
|
||||
conversationUser, externalSignalingServer!!.externalSignalingTicket,
|
||||
externalSignalingServer!!.externalSignalingServer!!,
|
||||
conversationUser!!, externalSignalingServer!!.externalSignalingTicket,
|
||||
TextUtils.isEmpty(credentials)
|
||||
)
|
||||
} else {
|
||||
|
@ -650,7 +650,7 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
|
||||
private fun setupMentionAutocomplete() {
|
||||
val elevation = 6f
|
||||
val backgroundDrawable = ColorDrawable(resources!!.getColor(R.color.bg_default))
|
||||
val presenter = MentionAutocompletePresenter(applicationContext, roomToken)
|
||||
val presenter = MentionAutocompletePresenter(applicationContext!!, roomToken)
|
||||
val callback = MentionAutocompleteCallback(
|
||||
activity,
|
||||
conversationUser, messageInput
|
||||
|
@ -756,8 +756,7 @@ class ConversationInfoController(args: Bundle) : BaseController(),
|
||||
|
||||
putExtra(
|
||||
Intent.EXTRA_TEXT, ShareUtils.getStringForIntent(
|
||||
context, conversation!!.password,
|
||||
userUtils, conversation
|
||||
context, conversation!!.password, conversation!!
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -173,7 +173,7 @@ public class EntryMenuController extends BaseController {
|
||||
} else if (operationCode == 7) {
|
||||
if (getActivity() != null) {
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, ShareUtils.getStringForIntent(getActivity(),
|
||||
editText.getText().toString(), userUtils, conversation));
|
||||
editText.getText().toString(), conversation));
|
||||
Intent intent = new Intent(shareIntent);
|
||||
intent.setComponent(new ComponentName(packageName, name));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
@ -24,9 +24,9 @@ import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class EventStatus {
|
||||
private long userId;
|
||||
private EventType eventType;
|
||||
private boolean allGood;
|
||||
public long userId;
|
||||
public EventType eventType;
|
||||
public boolean allGood;
|
||||
|
||||
public EventStatus(long userId, EventType eventType, boolean allGood) {
|
||||
this.userId = userId;
|
||||
|
@ -1,95 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.jobs;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
import autodagger.AutoInjector;
|
||||
import com.nextcloud.talk.api.NcApi;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.events.EventStatus;
|
||||
import com.nextcloud.talk.models.RetrofitBucket;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import javax.inject.Inject;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class AddParticipantsToConversation extends Worker {
|
||||
@Inject
|
||||
NcApi ncApi;
|
||||
|
||||
@Inject
|
||||
UserUtils userUtils;
|
||||
|
||||
@Inject
|
||||
EventBus eventBus;
|
||||
|
||||
public AddParticipantsToConversation(@NonNull Context context,
|
||||
@NonNull WorkerParameters workerParams) {
|
||||
super(context, workerParams);
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Result doWork() {
|
||||
Data data = getInputData();
|
||||
String[] selectedUserIds = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_USERS());
|
||||
String[] selectedGroupIds = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_GROUPS());
|
||||
UserEntity user = userUtils.getUserWithInternalId(
|
||||
data.getLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), -1));
|
||||
String conversationToken = data.getString(BundleKeys.INSTANCE.getKEY_TOKEN());
|
||||
String credentials = ApiUtils.getCredentials(user.getUsername(), user.getToken());
|
||||
|
||||
RetrofitBucket retrofitBucket;
|
||||
for (String userId : selectedUserIds) {
|
||||
retrofitBucket =
|
||||
ApiUtils.getRetrofitBucketForAddParticipant(user.getBaseUrl(), conversationToken,
|
||||
userId);
|
||||
|
||||
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe();
|
||||
}
|
||||
|
||||
for (String groupId : selectedGroupIds) {
|
||||
retrofitBucket =
|
||||
ApiUtils.getRetrofitBucketForAddGroupParticipant(user.getBaseUrl(), conversationToken,
|
||||
groupId);
|
||||
|
||||
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe();
|
||||
}
|
||||
|
||||
eventBus.post(new EventStatus(user.getId(), EventStatus.EventType.PARTICIPANTS_UPDATE, true));
|
||||
return Result.success();
|
||||
}
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.jobs
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.CoroutineWorker
|
||||
import androidx.work.Worker
|
||||
import androidx.work.WorkerParameters
|
||||
import autodagger.AutoInjector
|
||||
import com.nextcloud.talk.api.NcApi
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
||||
import com.nextcloud.talk.events.EventStatus
|
||||
import com.nextcloud.talk.models.RetrofitBucket
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SELECTED_GROUPS
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SELECTED_USERS
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_TOKEN
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import javax.inject.Inject
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication::class)
|
||||
class AddParticipantsToConversation(context: Context,
|
||||
workerParams: WorkerParameters) : CoroutineWorker(context, workerParams), KoinComponent {
|
||||
@JvmField
|
||||
@Inject
|
||||
var ncApi: NcApi? = null
|
||||
|
||||
val eventBus: EventBus by inject()
|
||||
val usersRepository: UsersRepository by inject()
|
||||
|
||||
override suspend fun doWork(): Result {
|
||||
val data = inputData
|
||||
val selectedUserIds = data.getStringArray(KEY_SELECTED_USERS)
|
||||
val selectedGroupIds = data.getStringArray(KEY_SELECTED_GROUPS)
|
||||
val user = usersRepository.getUserWithId(data.getLong(KEY_INTERNAL_USER_ID, -1))
|
||||
val conversationToken = data.getString(KEY_TOKEN)
|
||||
val credentials = ApiUtils.getCredentials(user.username, user.token)
|
||||
var retrofitBucket: RetrofitBucket
|
||||
for (userId in selectedUserIds!!) {
|
||||
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipant(user.baseUrl, conversationToken,
|
||||
userId)
|
||||
ncApi!!.addParticipant(credentials, retrofitBucket.url, retrofitBucket.queryMap)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe()
|
||||
}
|
||||
for (groupId in selectedGroupIds!!) {
|
||||
retrofitBucket = ApiUtils.getRetrofitBucketForAddGroupParticipant(user.baseUrl, conversationToken,
|
||||
groupId)
|
||||
ncApi!!.addParticipant(credentials, retrofitBucket.url, retrofitBucket.queryMap)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe()
|
||||
}
|
||||
eventBus.post(EventStatus(user.id, EventStatus.EventType.PARTICIPANTS_UPDATE, true))
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
init {
|
||||
sharedApplication
|
||||
?.componentApplication
|
||||
?.inject(this)
|
||||
}
|
||||
}
|
@ -1,165 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.jobs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
import autodagger.AutoInjector;
|
||||
import com.bluelinelabs.logansquare.LoganSquare;
|
||||
import com.nextcloud.talk.api.NcApi;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.events.EventStatus;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
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 io.reactivex.Observer;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import java.io.IOException;
|
||||
import java.net.CookieManager;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import okhttp3.JavaNetCookieJar;
|
||||
import okhttp3.OkHttpClient;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class CapabilitiesWorker extends Worker {
|
||||
public static final String TAG = "CapabilitiesWorker";
|
||||
|
||||
@Inject
|
||||
UserUtils userUtils;
|
||||
|
||||
@Inject
|
||||
Retrofit retrofit;
|
||||
|
||||
@Inject
|
||||
EventBus eventBus;
|
||||
|
||||
@Inject
|
||||
OkHttpClient okHttpClient;
|
||||
|
||||
NcApi ncApi;
|
||||
|
||||
public CapabilitiesWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
|
||||
super(context, workerParams);
|
||||
}
|
||||
|
||||
private void updateUser(CapabilitiesOverall capabilitiesOverall, UserEntity internalUserEntity) {
|
||||
try {
|
||||
userUtils.createOrUpdateUser(null, null,
|
||||
null, null,
|
||||
null, null, null, internalUserEntity.getId(),
|
||||
LoganSquare.serialize(capabilitiesOverall.getOcs().getData().getCapabilities()), null,
|
||||
null)
|
||||
.blockingSubscribe(new Observer<UserEntity>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(UserEntity userEntity) {
|
||||
eventBus.post(new EventStatus(userEntity.getId(),
|
||||
EventStatus.EventType.CAPABILITIES_FETCH, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
eventBus.post(new EventStatus(internalUserEntity.getId(),
|
||||
EventStatus.EventType.CAPABILITIES_FETCH, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Failed to create or update user");
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Result doWork() {
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
|
||||
Data data = getInputData();
|
||||
|
||||
long internalUserId = data.getLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), -1);
|
||||
|
||||
UserEntity userEntity;
|
||||
List userEntityObjectList = new ArrayList();
|
||||
|
||||
if (internalUserId == -1
|
||||
|| (userEntity = userUtils.getUserWithInternalId(internalUserId)) == null) {
|
||||
userEntityObjectList = userUtils.getUsers();
|
||||
} else {
|
||||
userEntityObjectList.add(userEntity);
|
||||
}
|
||||
|
||||
for (Object userEntityObject : userEntityObjectList) {
|
||||
UserEntity internalUserEntity = (UserEntity) userEntityObject;
|
||||
|
||||
ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new
|
||||
JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class);
|
||||
|
||||
ncApi.getCapabilities(ApiUtils.getCredentials(internalUserEntity.getUsername(),
|
||||
internalUserEntity.getToken()),
|
||||
ApiUtils.getUrlForCapabilities(internalUserEntity.getBaseUrl()))
|
||||
.retry(3)
|
||||
.blockingSubscribe(new Observer<CapabilitiesOverall>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(CapabilitiesOverall capabilitiesOverall) {
|
||||
updateUser(capabilitiesOverall, internalUserEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
eventBus.post(new EventStatus(internalUserEntity.getId(),
|
||||
EventStatus.EventType.CAPABILITIES_FETCH, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
}
|
103
app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.kt
Normal file
103
app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.kt
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.jobs
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.CoroutineWorker
|
||||
import androidx.work.WorkerParameters
|
||||
import autodagger.AutoInjector
|
||||
import com.nextcloud.talk.api.NcApi
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.events.EventStatus
|
||||
import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
|
||||
import io.reactivex.Observer
|
||||
import io.reactivex.disposables.Disposable
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import okhttp3.JavaNetCookieJar
|
||||
import okhttp3.OkHttpClient
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import retrofit2.Retrofit
|
||||
import java.net.CookieManager
|
||||
import java.util.*
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication::class)
|
||||
class CapabilitiesWorker(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams), KoinComponent {
|
||||
val retrofit: Retrofit by inject()
|
||||
val eventBus: EventBus by inject()
|
||||
val okHttpClient: OkHttpClient by inject()
|
||||
val usersRepository: UsersRepository by inject()
|
||||
var ncApi: NcApi? = null
|
||||
|
||||
private fun updateUser(capabilitiesOverall: CapabilitiesOverall, internalUserEntity: UserNgEntity) {
|
||||
internalUserEntity.capabilities = capabilitiesOverall.ocs.data.capabilities
|
||||
runBlocking {
|
||||
val result = usersRepository.updateUser(internalUserEntity)
|
||||
eventBus!!.post(EventStatus(internalUserEntity.id,
|
||||
EventStatus.EventType.CAPABILITIES_FETCH, result > 0))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override suspend fun doWork(): Result {
|
||||
val data = inputData
|
||||
val internalUserId = data.getLong(KEY_INTERNAL_USER_ID, -1)
|
||||
var userEntity: UserNgEntity?
|
||||
var userEntityObjectList: MutableList<UserNgEntity> = ArrayList()
|
||||
if (internalUserId == -1L || usersRepository.getUserWithId(internalUserId) == null) {
|
||||
userEntityObjectList = usersRepository.getUsers().toMutableList()
|
||||
} else {
|
||||
userEntity = usersRepository.getUserWithId(internalUserId)
|
||||
userEntityObjectList.add(userEntity)
|
||||
}
|
||||
|
||||
for (userEntityObject in userEntityObjectList) {
|
||||
val internalUserEntity = userEntityObject
|
||||
ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build()).build().create(NcApi::class.java)
|
||||
ncApi!!.getCapabilities(ApiUtils.getCredentials(internalUserEntity.username,
|
||||
internalUserEntity.token),
|
||||
ApiUtils.getUrlForCapabilities(internalUserEntity.baseUrl))
|
||||
.retry(3)
|
||||
.blockingSubscribe(object : Observer<CapabilitiesOverall> {
|
||||
override fun onSubscribe(d: Disposable) {}
|
||||
override fun onNext(capabilitiesOverall: CapabilitiesOverall) {
|
||||
updateUser(capabilitiesOverall, internalUserEntity)
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
eventBus.post(EventStatus(internalUserEntity.id,
|
||||
EventStatus.EventType.CAPABILITIES_FETCH, false))
|
||||
}
|
||||
|
||||
override fun onComplete() {}
|
||||
})
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "CapabilitiesWorker"
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.jobs;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
import autodagger.AutoInjector;
|
||||
import com.nextcloud.talk.api.NcApi;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.events.EventStatus;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.models.json.generic.GenericOverall;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.net.CookieManager;
|
||||
import javax.inject.Inject;
|
||||
import okhttp3.JavaNetCookieJar;
|
||||
import okhttp3.OkHttpClient;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class LeaveConversationWorker extends Worker {
|
||||
@Inject
|
||||
Retrofit retrofit;
|
||||
|
||||
@Inject
|
||||
OkHttpClient okHttpClient;
|
||||
|
||||
@Inject
|
||||
UserUtils userUtils;
|
||||
|
||||
@Inject
|
||||
EventBus eventBus;
|
||||
|
||||
NcApi ncApi;
|
||||
|
||||
public LeaveConversationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
|
||||
super(context, workerParams);
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Result doWork() {
|
||||
Data data = getInputData();
|
||||
long operationUserId = data.getLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), -1);
|
||||
String conversationToken = data.getString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN());
|
||||
UserEntity operationUser = userUtils.getUserWithId(operationUserId);
|
||||
|
||||
if (operationUser != null) {
|
||||
String credentials =
|
||||
ApiUtils.getCredentials(operationUser.getUsername(), operationUser.getToken());
|
||||
ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new
|
||||
JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class);
|
||||
|
||||
EventStatus eventStatus = new EventStatus(operationUser.getId(),
|
||||
EventStatus.EventType.CONVERSATION_UPDATE, true);
|
||||
|
||||
ncApi.removeSelfFromRoom(credentials,
|
||||
ApiUtils.getUrlForRemoveSelfFromRoom(operationUser.getBaseUrl(), conversationToken))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe(new Observer<GenericOverall>() {
|
||||
Disposable disposable;
|
||||
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
disposable = d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(GenericOverall genericOverall) {
|
||||
eventBus.postSticky(eventStatus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
disposable.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.jobs
|
||||
|
||||
import android.content.Context
|
||||
import androidx.work.Worker
|
||||
import androidx.work.WorkerParameters
|
||||
import autodagger.AutoInjector
|
||||
import com.nextcloud.talk.api.NcApi
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.events.EventStatus
|
||||
import com.nextcloud.talk.models.json.generic.GenericOverall
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.newarch.local.models.getCredentials
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
|
||||
import io.reactivex.Observer
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import okhttp3.JavaNetCookieJar
|
||||
import okhttp3.OkHttpClient
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import retrofit2.Retrofit
|
||||
import java.net.CookieManager
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication::class)
|
||||
class LeaveConversationWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams), KoinComponent {
|
||||
val retrofit: Retrofit by inject()
|
||||
val okHttpClient: OkHttpClient by inject()
|
||||
val eventBus: EventBus by inject()
|
||||
val usersRepository: UsersRepository by inject()
|
||||
var ncApi: NcApi? = null
|
||||
override fun doWork(): Result {
|
||||
val data = inputData
|
||||
val operationUserId = data.getLong(KEY_INTERNAL_USER_ID, -1)
|
||||
val conversationToken = data.getString(KEY_ROOM_TOKEN)
|
||||
val operationUser: UserNgEntity? = usersRepository.getUserWithId(operationUserId)
|
||||
if (operationUser != null) {
|
||||
val credentials = operationUser.getCredentials()
|
||||
ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(JavaNetCookieJar(CookieManager())).build()).build().create(NcApi::class.java)
|
||||
val eventStatus = EventStatus(operationUser.id,
|
||||
EventStatus.EventType.CONVERSATION_UPDATE, true)
|
||||
ncApi!!.removeSelfFromRoom(credentials,
|
||||
ApiUtils.getUrlForRemoveSelfFromRoom(operationUser.baseUrl, conversationToken))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.blockingSubscribe(object : Observer<GenericOverall?> {
|
||||
var disposable: Disposable? = null
|
||||
override fun onSubscribe(d: Disposable) {
|
||||
disposable = d
|
||||
}
|
||||
|
||||
override fun onNext(t: GenericOverall) {
|
||||
eventBus.postSticky(eventStatus)
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {}
|
||||
override fun onComplete() {
|
||||
disposable!!.dispose()
|
||||
}
|
||||
})
|
||||
}
|
||||
return Result.success()
|
||||
}
|
||||
}
|
@ -67,7 +67,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA
|
||||
import com.nextcloud.talk.models.RingtoneSettings
|
||||
import com.nextcloud.talk.models.SignatureVerification
|
||||
import com.nextcloud.talk.models.database.ArbitraryStorageEntity
|
||||
import com.nextcloud.talk.models.database.UserEntity
|
||||
import com.nextcloud.talk.models.json.chat.ChatUtils
|
||||
import com.nextcloud.talk.models.json.conversations.Conversation
|
||||
import com.nextcloud.talk.models.json.conversations.Conversation.ConversationType.GROUP_CONVERSATION
|
||||
|
@ -1,160 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.jobs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.OneTimeWorkRequest;
|
||||
import androidx.work.WorkManager;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
import autodagger.AutoInjector;
|
||||
import com.bluelinelabs.logansquare.LoganSquare;
|
||||
import com.nextcloud.talk.api.NcApi;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.events.EventStatus;
|
||||
import com.nextcloud.talk.models.ExternalSignalingServer;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class SignalingSettingsWorker extends Worker {
|
||||
private static final String TAG = "SignalingSettingsJob";
|
||||
|
||||
@Inject
|
||||
UserUtils userUtils;
|
||||
|
||||
@Inject
|
||||
NcApi ncApi;
|
||||
|
||||
@Inject
|
||||
EventBus eventBus;
|
||||
|
||||
public SignalingSettingsWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
|
||||
super(context, workerParams);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Result doWork() {
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
|
||||
Data data = getInputData();
|
||||
|
||||
long internalUserId = data.getLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), -1);
|
||||
|
||||
List<UserEntity> userEntityList = new ArrayList<>();
|
||||
UserEntity userEntity;
|
||||
if (internalUserId == -1
|
||||
|| (userEntity = userUtils.getUserWithInternalId(internalUserId)) == null) {
|
||||
userEntityList = userUtils.getUsers();
|
||||
} else {
|
||||
userEntityList.add(userEntity);
|
||||
}
|
||||
|
||||
for (int i = 0; i < userEntityList.size(); i++) {
|
||||
userEntity = userEntityList.get(i);
|
||||
UserEntity finalUserEntity = userEntity;
|
||||
ncApi.getSignalingSettings(
|
||||
ApiUtils.getCredentials(userEntity.getUsername(), userEntity.getToken()),
|
||||
ApiUtils.getUrlForSignalingSettings(userEntity.getBaseUrl()))
|
||||
.blockingSubscribe(new Observer<SignalingSettingsOverall>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(SignalingSettingsOverall signalingSettingsOverall) {
|
||||
ExternalSignalingServer externalSignalingServer;
|
||||
externalSignalingServer = new ExternalSignalingServer();
|
||||
externalSignalingServer.setExternalSignalingServer(
|
||||
signalingSettingsOverall.getOcs().getSettings().getExternalSignalingServer());
|
||||
externalSignalingServer.setExternalSignalingTicket(
|
||||
signalingSettingsOverall.getOcs().getSettings().getExternalSignalingTicket());
|
||||
|
||||
try {
|
||||
userUtils.createOrUpdateUser(null, null, null, null, null,
|
||||
null, null, finalUserEntity.getId(), null, null,
|
||||
LoganSquare.serialize(externalSignalingServer))
|
||||
.subscribe(new Observer<UserEntity>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(UserEntity userEntity) {
|
||||
eventBus.post(new EventStatus(finalUserEntity.getId(),
|
||||
EventStatus.EventType.SIGNALING_SETTINGS, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
eventBus.post(new EventStatus(finalUserEntity.getId(),
|
||||
EventStatus.EventType.SIGNALING_SETTINGS, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Failed to serialize external signaling server");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
eventBus.post(
|
||||
new EventStatus(finalUserEntity.getId(), EventStatus.EventType.SIGNALING_SETTINGS,
|
||||
false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
OneTimeWorkRequest websocketConnectionsWorker =
|
||||
new OneTimeWorkRequest.Builder(WebsocketConnectionsWorker.class).build();
|
||||
WorkManager.getInstance().enqueue(websocketConnectionsWorker);
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.jobs
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.work.*
|
||||
import autodagger.AutoInjector
|
||||
import com.bluelinelabs.logansquare.LoganSquare
|
||||
import com.nextcloud.talk.api.NcApi
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
||||
import com.nextcloud.talk.events.EventStatus
|
||||
import com.nextcloud.talk.jobs.WebsocketConnectionsWorker
|
||||
import com.nextcloud.talk.models.ExternalSignalingServer
|
||||
import com.nextcloud.talk.models.database.UserEntity
|
||||
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.newarch.local.models.getCredentials
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils
|
||||
import io.reactivex.Observer
|
||||
import io.reactivex.disposables.Disposable
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import java.io.IOException
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication::class)
|
||||
class SignalingSettingsWorker(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams), KoinComponent {
|
||||
@JvmField @Inject
|
||||
var ncApi: NcApi? = null
|
||||
val eventBus: EventBus by inject()
|
||||
val usersRepository: UsersRepository by inject()
|
||||
|
||||
override suspend fun doWork(): Result {
|
||||
sharedApplication
|
||||
?.componentApplication
|
||||
?.inject(this)
|
||||
val data = inputData
|
||||
val internalUserId = data.getLong(KEY_INTERNAL_USER_ID, -1)
|
||||
var userEntityList: MutableList<UserNgEntity?> = ArrayList<UserNgEntity?>()
|
||||
var userEntity: UserNgEntity?
|
||||
if (internalUserId == -1L || usersRepository.getUserWithId(internalUserId) == null) {
|
||||
userEntityList = usersRepository.getUsers().toMutableList()
|
||||
} else {
|
||||
userEntity = usersRepository.getUserWithId(internalUserId)
|
||||
userEntityList.add(userEntity)
|
||||
}
|
||||
for (i in userEntityList.indices) {
|
||||
userEntity = userEntityList[i]
|
||||
val finalUserEntity: UserNgEntity? = userEntity
|
||||
ncApi!!.getSignalingSettings(
|
||||
userEntity!!.getCredentials(),
|
||||
ApiUtils.getUrlForSignalingSettings(userEntity.baseUrl))
|
||||
.blockingSubscribe(object : Observer<SignalingSettingsOverall> {
|
||||
override fun onSubscribe(d: Disposable) {}
|
||||
override fun onNext(signalingSettingsOverall: SignalingSettingsOverall) {
|
||||
val externalSignalingServer: ExternalSignalingServer
|
||||
externalSignalingServer = ExternalSignalingServer()
|
||||
externalSignalingServer.externalSignalingServer = signalingSettingsOverall.ocs.settings.externalSignalingServer
|
||||
externalSignalingServer.externalSignalingTicket = signalingSettingsOverall.ocs.settings.externalSignalingTicket
|
||||
val user = usersRepository.getUserWithId(userEntity.id)
|
||||
user.externalSignaling = externalSignalingServer
|
||||
runBlocking {
|
||||
val result = usersRepository.updateUser(user)
|
||||
eventBus.post(EventStatus(user.id,
|
||||
EventStatus.EventType.SIGNALING_SETTINGS, result > 0))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
eventBus.post(EventStatus(finalUserEntity!!.id,
|
||||
EventStatus.EventType.SIGNALING_SETTINGS, false))
|
||||
}
|
||||
|
||||
override fun onComplete() {}
|
||||
})
|
||||
}
|
||||
val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build()
|
||||
WorkManager.getInstance().enqueue(websocketConnectionsWorker)
|
||||
return Result.success()
|
||||
}
|
||||
}
|
@ -62,7 +62,7 @@ class WebsocketConnectionsWorker(
|
||||
if (!userEntity.externalSignaling!!.externalSignalingServer.isNullOrEmpty() &&
|
||||
!userEntity.externalSignaling!!.externalSignalingTicket.isNullOrEmpty()) {
|
||||
WebSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
||||
userEntity.externalSignaling!!.externalSignalingServer,
|
||||
userEntity.externalSignaling!!.externalSignalingServer!!,
|
||||
userEntity, userEntity.externalSignaling!!.externalSignalingTicket,
|
||||
false
|
||||
)
|
||||
|
@ -29,12 +29,12 @@ import org.parceler.Parcel;
|
||||
@JsonObject
|
||||
public class Mention {
|
||||
@JsonField(name = "id")
|
||||
String id;
|
||||
public String id;
|
||||
|
||||
@JsonField(name = "label")
|
||||
String label;
|
||||
public String label;
|
||||
|
||||
// type of user (guests or users or calls)
|
||||
@JsonField(name = "source")
|
||||
String source;
|
||||
public String source;
|
||||
}
|
||||
|
@ -31,5 +31,5 @@ import org.parceler.Parcel;
|
||||
@JsonObject
|
||||
public class MentionOCS extends GenericOCS {
|
||||
@JsonField(name = "data")
|
||||
List<Mention> data;
|
||||
public List<Mention> data;
|
||||
}
|
||||
|
@ -29,5 +29,5 @@ import org.parceler.Parcel;
|
||||
@JsonObject
|
||||
public class MentionOverall {
|
||||
@JsonField(name = "ocs")
|
||||
MentionOCS ocs;
|
||||
public MentionOCS ocs;
|
||||
}
|
||||
|
@ -30,8 +30,8 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class AuthParametersWebSocketMessage {
|
||||
@JsonField(name = "userid")
|
||||
String userid;
|
||||
public String userid;
|
||||
|
||||
@JsonField(name = "ticket")
|
||||
String ticket;
|
||||
public String ticket;
|
||||
}
|
||||
|
@ -30,8 +30,8 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class AuthWebSocketMessage {
|
||||
@JsonField(name = "url")
|
||||
String url;
|
||||
public String url;
|
||||
|
||||
@JsonField(name = "params")
|
||||
AuthParametersWebSocketMessage authParametersWebSocketMessage;
|
||||
public AuthParametersWebSocketMessage authParametersWebSocketMessage;
|
||||
}
|
||||
|
@ -30,5 +30,5 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class HelloOverallWebSocketMessage extends BaseWebSocketMessage {
|
||||
@JsonField(name = "hello")
|
||||
HelloWebSocketMessage helloWebSocketMessage;
|
||||
public HelloWebSocketMessage helloWebSocketMessage;
|
||||
}
|
||||
|
@ -30,11 +30,11 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class HelloWebSocketMessage {
|
||||
@JsonField(name = "version")
|
||||
String version;
|
||||
public String version;
|
||||
|
||||
@JsonField(name = "resumeid")
|
||||
String resumeid;
|
||||
public String resumeid;
|
||||
|
||||
@JsonField(name = "auth")
|
||||
AuthWebSocketMessage authWebSocketMessage;
|
||||
public AuthWebSocketMessage authWebSocketMessage;
|
||||
}
|
||||
|
@ -30,5 +30,5 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class RequestOfferOverallWebSocketMessage extends BaseWebSocketMessage {
|
||||
@JsonField(name = "message")
|
||||
RequestOfferSignalingMessage requestOfferOverallWebSocketMessage;
|
||||
public RequestOfferSignalingMessage requestOfferOverallWebSocketMessage;
|
||||
}
|
||||
|
@ -30,8 +30,8 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class RequestOfferSignalingMessage {
|
||||
@JsonField(name = "recipient")
|
||||
ActorWebSocketMessage actorWebSocketMessage;
|
||||
public ActorWebSocketMessage actorWebSocketMessage;
|
||||
|
||||
@JsonField(name = "data")
|
||||
SignalingDataWebSocketMessageForOffer signalingDataWebSocketMessageForOffer;
|
||||
public SignalingDataWebSocketMessageForOffer signalingDataWebSocketMessageForOffer;
|
||||
}
|
||||
|
@ -30,5 +30,5 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class RoomOverallWebSocketMessage extends BaseWebSocketMessage {
|
||||
@JsonField(name = "room")
|
||||
RoomWebSocketMessage roomWebSocketMessage;
|
||||
public RoomWebSocketMessage roomWebSocketMessage;
|
||||
}
|
||||
|
@ -30,8 +30,8 @@ import org.parceler.Parcel;
|
||||
@Parcel
|
||||
public class SignalingDataWebSocketMessageForOffer {
|
||||
@JsonField(name = "type")
|
||||
String type;
|
||||
public String type;
|
||||
|
||||
@JsonField(name = "roomType")
|
||||
String roomType;
|
||||
public String roomType;
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ class ConversationsListViewModel constructor(
|
||||
val searchQuery = MutableLiveData<String>()
|
||||
val currentUserLiveData: LiveData<UserNgEntity> = usersRepository.getActiveUserLiveData()
|
||||
val conversationsLiveData = Transformations.switchMap(currentUserLiveData) {
|
||||
if (!LOADING.equals(viewState.value)) {
|
||||
if (LOADING != viewState.value) {
|
||||
viewState.value = LOADING
|
||||
}
|
||||
conversationsRepository.getConversationsForUser(it.id)
|
||||
@ -192,8 +192,7 @@ class ConversationsListViewModel constructor(
|
||||
// TODO, make sure we ask for password if needed
|
||||
putExtra(
|
||||
Intent.EXTRA_TEXT, ShareUtils.getStringForIntent(
|
||||
context, null,
|
||||
userUtils, conversation
|
||||
context, null, conversation
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -21,7 +21,6 @@
|
||||
package com.nextcloud.talk.newarch.utils
|
||||
|
||||
import com.nextcloud.talk.models.database.UserEntity
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
|
||||
fun UserEntity.getCredentials() = ApiUtils.getCredentials(username, token)
|
||||
|
@ -1,159 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.presenters;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import autodagger.AutoInjector;
|
||||
import com.nextcloud.talk.adapters.items.MentionAutocompleteItem;
|
||||
import com.nextcloud.talk.api.NcApi;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.models.json.mention.Mention;
|
||||
import com.nextcloud.talk.models.json.mention.MentionOverall;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
import com.otaliastudios.autocomplete.RecyclerViewPresenter;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class MentionAutocompletePresenter extends RecyclerViewPresenter<Mention>
|
||||
implements FlexibleAdapter.OnItemClickListener {
|
||||
@Inject
|
||||
NcApi ncApi;
|
||||
@Inject
|
||||
UserUtils userUtils;
|
||||
private UserEntity currentUser;
|
||||
private FlexibleAdapter<AbstractFlexibleItem> adapter;
|
||||
private Context context;
|
||||
|
||||
private String roomToken;
|
||||
|
||||
private List<AbstractFlexibleItem> abstractFlexibleItemList = new ArrayList<>();
|
||||
|
||||
public MentionAutocompletePresenter(Context context) {
|
||||
super(context);
|
||||
this.context = context;
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
currentUser = userUtils.getCurrentUser();
|
||||
}
|
||||
|
||||
public MentionAutocompletePresenter(Context context, String roomToken) {
|
||||
super(context);
|
||||
this.roomToken = roomToken;
|
||||
this.context = context;
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
currentUser = userUtils.getCurrentUser();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RecyclerView.Adapter instantiateAdapter() {
|
||||
adapter = new FlexibleAdapter<>(abstractFlexibleItemList, context, false);
|
||||
adapter.addListener(this);
|
||||
return adapter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onQuery(@Nullable CharSequence query) {
|
||||
|
||||
String queryString;
|
||||
if (query != null && query.length() > 1) {
|
||||
queryString = String.valueOf(query.subSequence(1, query.length()));
|
||||
} else {
|
||||
queryString = "";
|
||||
}
|
||||
|
||||
adapter.setFilter(queryString);
|
||||
ncApi.getMentionAutocompleteSuggestions(
|
||||
ApiUtils.getCredentials(currentUser.getUsername(), currentUser
|
||||
.getToken()), ApiUtils.getUrlForMentionSuggestions(currentUser.getBaseUrl(), roomToken),
|
||||
queryString, 5)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.retry(3)
|
||||
.subscribe(new Observer<MentionOverall>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(MentionOverall mentionOverall) {
|
||||
List<Mention> mentionsList = mentionOverall.getOcs().getData();
|
||||
|
||||
if (mentionsList.size() == 0) {
|
||||
adapter.clear();
|
||||
} else {
|
||||
List<AbstractFlexibleItem> internalAbstractFlexibleItemList = new ArrayList<>();
|
||||
for (Mention mention : mentionsList) {
|
||||
internalAbstractFlexibleItemList.add(
|
||||
new MentionAutocompleteItem(mention.getId(),
|
||||
mention.getLabel(), mention.getSource(),
|
||||
currentUser));
|
||||
}
|
||||
|
||||
if (adapter.getItemCount() != 0) {
|
||||
adapter.clear();
|
||||
}
|
||||
|
||||
adapter.updateDataSet(internalAbstractFlexibleItemList);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
adapter.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onItemClick(View view, int position) {
|
||||
Mention mention = new Mention();
|
||||
MentionAutocompleteItem mentionAutocompleteItem =
|
||||
(MentionAutocompleteItem) adapter.getItem(position);
|
||||
if (mentionAutocompleteItem != null) {
|
||||
mention.setId(mentionAutocompleteItem.getObjectId());
|
||||
mention.setLabel(mentionAutocompleteItem.getDisplayName());
|
||||
mention.setSource(mentionAutocompleteItem.getSource());
|
||||
dispatchClick(mention);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.presenters
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import autodagger.AutoInjector
|
||||
import com.nextcloud.talk.adapters.items.MentionAutocompleteItem
|
||||
import com.nextcloud.talk.api.NcApi
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
||||
import com.nextcloud.talk.models.json.mention.Mention
|
||||
import com.nextcloud.talk.models.json.mention.MentionOverall
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.newarch.local.models.getCredentials
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import com.otaliastudios.autocomplete.RecyclerViewPresenter
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication::class)
|
||||
class MentionAutocompletePresenter : RecyclerViewPresenter<Mention?>, FlexibleAdapter.OnItemClickListener, KoinComponent {
|
||||
@JvmField @Inject
|
||||
var ncApi: NcApi? = null
|
||||
|
||||
val usersRepository: UsersRepository by inject()
|
||||
private var currentUser: UserNgEntity?
|
||||
private var adapter: FlexibleAdapter<AbstractFlexibleItem<*>>? = null
|
||||
private var internalContext: Context
|
||||
private var roomToken: String? = null
|
||||
private val abstractFlexibleItemList: List<AbstractFlexibleItem<*>> = ArrayList()
|
||||
|
||||
constructor(context: Context) : super(context) {
|
||||
this.internalContext = context
|
||||
sharedApplication
|
||||
?.componentApplication
|
||||
?.inject(this)
|
||||
currentUser = usersRepository.getActiveUser()
|
||||
}
|
||||
|
||||
constructor(context: Context, roomToken: String?) : super(context) {
|
||||
this.roomToken = roomToken
|
||||
this.internalContext = context
|
||||
sharedApplication
|
||||
?.componentApplication
|
||||
?.inject(this)
|
||||
currentUser = usersRepository.getActiveUser()
|
||||
}
|
||||
|
||||
override fun instantiateAdapter(): RecyclerView.Adapter<*> {
|
||||
adapter = FlexibleAdapter(abstractFlexibleItemList, context, false)
|
||||
adapter!!.addListener(this)
|
||||
return adapter!!
|
||||
}
|
||||
|
||||
override fun onQuery(query: CharSequence?) {
|
||||
val queryString: String
|
||||
queryString = if (query != null && query.length > 1) {
|
||||
query.subSequence(1, query.length).toString()
|
||||
} else {
|
||||
""
|
||||
}
|
||||
adapter!!.setFilter(queryString)
|
||||
ncApi!!.getMentionAutocompleteSuggestions(
|
||||
currentUser!!.getCredentials(), ApiUtils.getUrlForMentionSuggestions(currentUser!!.baseUrl, roomToken),
|
||||
queryString, 5)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.retry(3)
|
||||
.subscribe(object : io.reactivex.Observer<MentionOverall> {
|
||||
override fun onSubscribe(d: Disposable) {}
|
||||
override fun onNext(mentionOverall: MentionOverall) {
|
||||
val mentionsList: List<Mention> = mentionOverall.ocs.data
|
||||
if (mentionsList.isEmpty()) {
|
||||
adapter!!.clear()
|
||||
} else {
|
||||
val internalAbstractFlexibleItemList: MutableList<AbstractFlexibleItem<*>> = ArrayList()
|
||||
for (mention in mentionsList) {
|
||||
internalAbstractFlexibleItemList.add(
|
||||
MentionAutocompleteItem(mention.id,
|
||||
mention.label, mention.source,
|
||||
currentUser!!))
|
||||
}
|
||||
if (adapter!!.itemCount != 0) {
|
||||
adapter!!.clear()
|
||||
}
|
||||
adapter!!.updateDataSet(internalAbstractFlexibleItemList)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
adapter!!.clear()
|
||||
}
|
||||
|
||||
override fun onComplete() {}
|
||||
})
|
||||
}
|
||||
|
||||
override fun onItemClick(view: View, position: Int): Boolean {
|
||||
val mention = Mention()
|
||||
val mentionAutocompleteItem = adapter!!.getItem(position) as MentionAutocompleteItem?
|
||||
if (mentionAutocompleteItem != null) {
|
||||
mention.id = mentionAutocompleteItem.objectId
|
||||
mention.label = mentionAutocompleteItem.displayName
|
||||
mention.source = mentionAutocompleteItem.source
|
||||
dispatchClick(mention)
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.utils;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.nextcloud.talk.R;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.models.json.conversations.Conversation;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
|
||||
public class ShareUtils {
|
||||
|
||||
public static String getStringForIntent(Context context, @Nullable String password,
|
||||
UserUtils userUtils, Conversation conversation) {
|
||||
UserEntity userEntity = userUtils.getCurrentUser();
|
||||
|
||||
String shareString = "";
|
||||
if (userEntity != null && context != null) {
|
||||
shareString = String.format(context.getResources().getString(R.string.nc_share_text),
|
||||
userEntity.getBaseUrl(), conversation.getToken());
|
||||
|
||||
if (!TextUtils.isEmpty(password)) {
|
||||
shareString +=
|
||||
String.format(context.getResources().getString(R.string.nc_share_text_pass), password);
|
||||
}
|
||||
}
|
||||
|
||||
return shareString;
|
||||
}
|
||||
}
|
48
app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt
Normal file
48
app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.nextcloud.talk.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.text.TextUtils
|
||||
import com.nextcloud.talk.R
|
||||
import com.nextcloud.talk.models.json.conversations.Conversation
|
||||
import com.nextcloud.talk.newarch.domain.repository.offline.UsersRepository
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
|
||||
object ShareUtils: KoinComponent {
|
||||
val usersRepository: UsersRepository by inject()
|
||||
|
||||
@JvmStatic
|
||||
fun getStringForIntent(context: Context?, password: String?, conversation: Conversation): String {
|
||||
val userEntity: UserNgEntity? = usersRepository.getActiveUser()
|
||||
var shareString = ""
|
||||
if (userEntity != null && context != null) {
|
||||
shareString = java.lang.String.format(context.resources.getString(R.string.nc_share_text),
|
||||
userEntity.baseUrl, conversation.token)
|
||||
if (!TextUtils.isEmpty(password)) {
|
||||
shareString += String.format(context.resources.getString(R.string.nc_share_text_pass), password)
|
||||
}
|
||||
}
|
||||
return shareString
|
||||
}
|
||||
}
|
@ -1,184 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.webrtc;
|
||||
|
||||
import autodagger.AutoInjector;
|
||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||
import com.nextcloud.talk.models.database.UserEntity;
|
||||
import com.nextcloud.talk.models.json.signaling.NCMessageWrapper;
|
||||
import com.nextcloud.talk.models.json.websocket.ActorWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.AuthParametersWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.AuthWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.CallWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.HelloOverallWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.HelloWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.RequestOfferOverallWebSocketMessage;
|
||||
import com.nextcloud.talk.models.json.websocket.RequestOfferSignalingMessage;
|
||||
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.newarch.local.models.UserNgEntity;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.inject.Inject;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class WebSocketConnectionHelper {
|
||||
private static Map<Long, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
|
||||
|
||||
@Inject
|
||||
OkHttpClient okHttpClient;
|
||||
|
||||
public WebSocketConnectionHelper() {
|
||||
NextcloudTalkApplication.Companion.getSharedApplication()
|
||||
.getComponentApplication()
|
||||
.inject(this);
|
||||
}
|
||||
|
||||
public static synchronized MagicWebSocketInstance getMagicWebSocketInstanceForUserId(
|
||||
long userId) {
|
||||
if (userId != -1 && magicWebSocketInstanceMap.containsKey(userId)) {
|
||||
return magicWebSocketInstanceMap.get(userId);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(
|
||||
String url, UserNgEntity userEntity, String webSocketTicket, boolean isGuest) {
|
||||
String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://");
|
||||
|
||||
if (generatedURL.endsWith("/")) {
|
||||
generatedURL += "spreed";
|
||||
} else {
|
||||
generatedURL += "/spreed";
|
||||
}
|
||||
|
||||
long userId = isGuest ? -1 : userEntity.getId();
|
||||
|
||||
MagicWebSocketInstance magicWebSocketInstance;
|
||||
if (userId != -1
|
||||
&& magicWebSocketInstanceMap.containsKey(userEntity.getId())
|
||||
&& (magicWebSocketInstance = magicWebSocketInstanceMap.get(userEntity.getId())) != null) {
|
||||
return magicWebSocketInstance;
|
||||
} else {
|
||||
if (userId == -1) {
|
||||
deleteExternalSignalingInstanceForUserEntity(userId);
|
||||
}
|
||||
magicWebSocketInstance =
|
||||
new MagicWebSocketInstance(userEntity, generatedURL, webSocketTicket);
|
||||
magicWebSocketInstanceMap.put(userEntity.getId(), magicWebSocketInstance);
|
||||
return magicWebSocketInstance;
|
||||
}
|
||||
}
|
||||
|
||||
public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) {
|
||||
MagicWebSocketInstance magicWebSocketInstance;
|
||||
if ((magicWebSocketInstance = magicWebSocketInstanceMap.get(id)) != null) {
|
||||
if (magicWebSocketInstance.isConnected()) {
|
||||
magicWebSocketInstance.sendBye();
|
||||
magicWebSocketInstanceMap.remove(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HelloOverallWebSocketMessage getAssembledHelloModel(UserNgEntity userEntity, String ticket) {
|
||||
HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
|
||||
helloOverallWebSocketMessage.setType("hello");
|
||||
HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage();
|
||||
helloWebSocketMessage.setVersion("1.0");
|
||||
AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage();
|
||||
authWebSocketMessage.setUrl(
|
||||
ApiUtils.getUrlForExternalServerAuthBackend(userEntity.getBaseUrl()));
|
||||
AuthParametersWebSocketMessage authParametersWebSocketMessage =
|
||||
new AuthParametersWebSocketMessage();
|
||||
authParametersWebSocketMessage.setTicket(ticket);
|
||||
authParametersWebSocketMessage.setUserid(userEntity.getUserId());
|
||||
authWebSocketMessage.setAuthParametersWebSocketMessage(authParametersWebSocketMessage);
|
||||
helloWebSocketMessage.setAuthWebSocketMessage(authWebSocketMessage);
|
||||
helloOverallWebSocketMessage.setHelloWebSocketMessage(helloWebSocketMessage);
|
||||
return helloOverallWebSocketMessage;
|
||||
}
|
||||
|
||||
HelloOverallWebSocketMessage getAssembledHelloModelForResume(String resumeId) {
|
||||
HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
|
||||
helloOverallWebSocketMessage.setType("hello");
|
||||
HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage();
|
||||
helloWebSocketMessage.setVersion("1.0");
|
||||
helloWebSocketMessage.setResumeid(resumeId);
|
||||
helloOverallWebSocketMessage.setHelloWebSocketMessage(helloWebSocketMessage);
|
||||
return helloOverallWebSocketMessage;
|
||||
}
|
||||
|
||||
RoomOverallWebSocketMessage getAssembledJoinOrLeaveRoomModel(String roomId, String sessionId) {
|
||||
RoomOverallWebSocketMessage roomOverallWebSocketMessage = new RoomOverallWebSocketMessage();
|
||||
roomOverallWebSocketMessage.setType("room");
|
||||
RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage();
|
||||
roomWebSocketMessage.setRoomId(roomId);
|
||||
roomWebSocketMessage.setSessiondId(sessionId);
|
||||
roomOverallWebSocketMessage.setRoomWebSocketMessage(roomWebSocketMessage);
|
||||
return roomOverallWebSocketMessage;
|
||||
}
|
||||
|
||||
RequestOfferOverallWebSocketMessage getAssembledRequestOfferModel(String sessionId,
|
||||
String roomType) {
|
||||
RequestOfferOverallWebSocketMessage requestOfferOverallWebSocketMessage =
|
||||
new RequestOfferOverallWebSocketMessage();
|
||||
requestOfferOverallWebSocketMessage.setType("message");
|
||||
|
||||
RequestOfferSignalingMessage requestOfferSignalingMessage = new RequestOfferSignalingMessage();
|
||||
|
||||
ActorWebSocketMessage actorWebSocketMessage = new ActorWebSocketMessage();
|
||||
actorWebSocketMessage.setType("session");
|
||||
actorWebSocketMessage.setSessionId(sessionId);
|
||||
requestOfferSignalingMessage.setActorWebSocketMessage(actorWebSocketMessage);
|
||||
|
||||
SignalingDataWebSocketMessageForOffer signalingDataWebSocketMessageForOffer =
|
||||
new SignalingDataWebSocketMessageForOffer();
|
||||
signalingDataWebSocketMessageForOffer.setRoomType(roomType);
|
||||
signalingDataWebSocketMessageForOffer.setType("requestoffer");
|
||||
requestOfferSignalingMessage.setSignalingDataWebSocketMessageForOffer(
|
||||
signalingDataWebSocketMessageForOffer);
|
||||
|
||||
requestOfferOverallWebSocketMessage.setRequestOfferOverallWebSocketMessage(
|
||||
requestOfferSignalingMessage);
|
||||
return requestOfferOverallWebSocketMessage;
|
||||
}
|
||||
|
||||
CallOverallWebSocketMessage getAssembledCallMessageModel(NCMessageWrapper ncMessageWrapper) {
|
||||
CallOverallWebSocketMessage callOverallWebSocketMessage = new CallOverallWebSocketMessage();
|
||||
callOverallWebSocketMessage.setType("message");
|
||||
|
||||
CallWebSocketMessage callWebSocketMessage = new CallWebSocketMessage();
|
||||
|
||||
ActorWebSocketMessage actorWebSocketMessage = new ActorWebSocketMessage();
|
||||
actorWebSocketMessage.setType("session");
|
||||
actorWebSocketMessage.setSessionId(ncMessageWrapper.getSignalingMessage().getTo());
|
||||
callWebSocketMessage.setRecipientWebSocketMessage(actorWebSocketMessage);
|
||||
callWebSocketMessage.setNcSignalingMessage(ncMessageWrapper.getSignalingMessage());
|
||||
|
||||
callOverallWebSocketMessage.setCallWebSocketMessage(callWebSocketMessage);
|
||||
return callOverallWebSocketMessage;
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Nextcloud Talk application
|
||||
*
|
||||
* @author Mario Danic
|
||||
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.nextcloud.talk.webrtc
|
||||
|
||||
import com.nextcloud.talk.models.json.signaling.NCMessageWrapper
|
||||
import com.nextcloud.talk.models.json.websocket.*
|
||||
import com.nextcloud.talk.newarch.local.models.UserNgEntity
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import okhttp3.OkHttpClient
|
||||
import org.koin.core.KoinComponent
|
||||
import org.koin.core.inject
|
||||
import java.util.*
|
||||
|
||||
class WebSocketConnectionHelper: KoinComponent {
|
||||
val okHttpClient: OkHttpClient by inject()
|
||||
|
||||
fun getAssembledHelloModel(userEntity: UserNgEntity, ticket: String?): HelloOverallWebSocketMessage {
|
||||
val helloOverallWebSocketMessage = HelloOverallWebSocketMessage()
|
||||
helloOverallWebSocketMessage.type = "hello"
|
||||
val helloWebSocketMessage = HelloWebSocketMessage()
|
||||
helloWebSocketMessage.version = "1.0"
|
||||
val authWebSocketMessage = AuthWebSocketMessage()
|
||||
authWebSocketMessage.url =
|
||||
ApiUtils.getUrlForExternalServerAuthBackend(userEntity.baseUrl)
|
||||
val authParametersWebSocketMessage = AuthParametersWebSocketMessage()
|
||||
authParametersWebSocketMessage.ticket = ticket
|
||||
authParametersWebSocketMessage.userid = userEntity.userId
|
||||
authWebSocketMessage.authParametersWebSocketMessage = authParametersWebSocketMessage
|
||||
helloWebSocketMessage.authWebSocketMessage = authWebSocketMessage
|
||||
helloOverallWebSocketMessage.helloWebSocketMessage = helloWebSocketMessage
|
||||
return helloOverallWebSocketMessage
|
||||
}
|
||||
|
||||
fun getAssembledHelloModelForResume(resumeId: String?): HelloOverallWebSocketMessage {
|
||||
val helloOverallWebSocketMessage = HelloOverallWebSocketMessage()
|
||||
helloOverallWebSocketMessage.type = "hello"
|
||||
val helloWebSocketMessage = HelloWebSocketMessage()
|
||||
helloWebSocketMessage.version = "1.0"
|
||||
helloWebSocketMessage.resumeid = resumeId
|
||||
helloOverallWebSocketMessage.helloWebSocketMessage = helloWebSocketMessage
|
||||
return helloOverallWebSocketMessage
|
||||
}
|
||||
|
||||
fun getAssembledJoinOrLeaveRoomModel(roomId: String?, sessionId: String?): RoomOverallWebSocketMessage {
|
||||
val roomOverallWebSocketMessage = RoomOverallWebSocketMessage()
|
||||
roomOverallWebSocketMessage.type = "room"
|
||||
val roomWebSocketMessage = RoomWebSocketMessage()
|
||||
roomWebSocketMessage.roomId = roomId
|
||||
roomWebSocketMessage.sessiondId = sessionId
|
||||
roomOverallWebSocketMessage.roomWebSocketMessage = roomWebSocketMessage
|
||||
return roomOverallWebSocketMessage
|
||||
}
|
||||
|
||||
fun getAssembledRequestOfferModel(sessionId: String?,
|
||||
roomType: String?): RequestOfferOverallWebSocketMessage {
|
||||
val requestOfferOverallWebSocketMessage = RequestOfferOverallWebSocketMessage()
|
||||
requestOfferOverallWebSocketMessage.type = "message"
|
||||
val requestOfferSignalingMessage = RequestOfferSignalingMessage()
|
||||
val actorWebSocketMessage = ActorWebSocketMessage()
|
||||
actorWebSocketMessage.type = "session"
|
||||
actorWebSocketMessage.sessionId = sessionId
|
||||
requestOfferSignalingMessage.actorWebSocketMessage = actorWebSocketMessage
|
||||
val signalingDataWebSocketMessageForOffer = SignalingDataWebSocketMessageForOffer()
|
||||
signalingDataWebSocketMessageForOffer.roomType = roomType
|
||||
signalingDataWebSocketMessageForOffer.type = "requestoffer"
|
||||
requestOfferSignalingMessage.signalingDataWebSocketMessageForOffer =
|
||||
signalingDataWebSocketMessageForOffer
|
||||
requestOfferOverallWebSocketMessage.requestOfferOverallWebSocketMessage =
|
||||
requestOfferSignalingMessage
|
||||
return requestOfferOverallWebSocketMessage
|
||||
}
|
||||
|
||||
fun getAssembledCallMessageModel(ncMessageWrapper: NCMessageWrapper): CallOverallWebSocketMessage {
|
||||
val callOverallWebSocketMessage = CallOverallWebSocketMessage()
|
||||
callOverallWebSocketMessage.type = "message"
|
||||
val callWebSocketMessage = CallWebSocketMessage()
|
||||
val actorWebSocketMessage = ActorWebSocketMessage()
|
||||
actorWebSocketMessage.type = "session"
|
||||
actorWebSocketMessage.sessionId = ncMessageWrapper.signalingMessage.to
|
||||
callWebSocketMessage.recipientWebSocketMessage = actorWebSocketMessage
|
||||
callWebSocketMessage.ncSignalingMessage = ncMessageWrapper.signalingMessage
|
||||
callOverallWebSocketMessage.callWebSocketMessage = callWebSocketMessage
|
||||
return callOverallWebSocketMessage
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val magicWebSocketInstanceMap: MutableMap<Long, MagicWebSocketInstance> = HashMap()
|
||||
@Synchronized
|
||||
fun getMagicWebSocketInstanceForUserId(
|
||||
userId: Long): MagicWebSocketInstance? {
|
||||
return if (userId != -1L && magicWebSocketInstanceMap.containsKey(userId)) {
|
||||
magicWebSocketInstanceMap[userId]
|
||||
} else null
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun getExternalSignalingInstanceForServer(
|
||||
url: String, userEntity: UserNgEntity, webSocketTicket: String?, isGuest: Boolean): MagicWebSocketInstance? {
|
||||
var generatedURL = url.replace("https://", "wss://").replace("http://", "ws://")
|
||||
generatedURL += if (generatedURL.endsWith("/")) {
|
||||
"spreed"
|
||||
} else {
|
||||
"/spreed"
|
||||
}
|
||||
val userId = if (isGuest) -1 else userEntity.id
|
||||
var magicWebSocketInstance: MagicWebSocketInstance
|
||||
if (userId != -1L && magicWebSocketInstanceMap.containsKey(userEntity.id)) {
|
||||
return magicWebSocketInstanceMap[userEntity.id] as MagicWebSocketInstance
|
||||
} else {
|
||||
if (userId == -1L) {
|
||||
deleteExternalSignalingInstanceForUserEntity(userId)
|
||||
}
|
||||
magicWebSocketInstance = MagicWebSocketInstance(userEntity, generatedURL, webSocketTicket!!)
|
||||
magicWebSocketInstanceMap[userEntity.id] = magicWebSocketInstance
|
||||
return magicWebSocketInstance
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@Synchronized
|
||||
fun deleteExternalSignalingInstanceForUserEntity(id: Long) {
|
||||
var magicWebSocketInstance: MagicWebSocketInstance
|
||||
if (magicWebSocketInstanceMap[id].also { magicWebSocketInstance = it!! } != null) {
|
||||
if (magicWebSocketInstance.isConnected) {
|
||||
magicWebSocketInstance.sendBye()
|
||||
magicWebSocketInstanceMap.remove(id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -22,7 +22,7 @@
|
||||
buildscript {
|
||||
|
||||
ext {
|
||||
kotlin_version = '1.3.50'
|
||||
kotlin_version = '1.3.61'
|
||||
}
|
||||
|
||||
repositories {
|
||||
@ -33,9 +33,8 @@ buildscript {
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.2'
|
||||
classpath 'com.android.tools.build:gradle:3.5.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
|
||||
classpath "io.realm:realm-gradle-plugin:6.0.0"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
@ -44,7 +43,7 @@ buildscript {
|
||||
|
||||
configurations.all {
|
||||
// check for updates every build
|
||||
resolutionStrategy.cacheChangingModulesFor 3600, 'seconds'
|
||||
//resolutionStrategy.cacheChangingModulesFor 3600, 'seconds'
|
||||
}
|
||||
|
||||
allprojects {
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
# Specifies the JVM arguments used for the daemon process.
|
||||
# The setting is particularly useful for tweaking memory settings.
|
||||
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
|
||||
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=2048m
|
||||
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
Loading…
Reference in New Issue
Block a user