diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 8c3e2da02..64040be10 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -43,8 +43,8 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.bottomsheet.items.BasicListItemWithImage import com.nextcloud.talk.bottomsheet.items.listItemsWithImage import com.nextcloud.talk.contacts.ContactsActivity -import com.nextcloud.talk.conversationinfoedit.ConversationInfoEditActivity import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel +import com.nextcloud.talk.conversationinfoedit.ConversationInfoEditActivity import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityConversationInfoBinding import com.nextcloud.talk.events.EventStatus @@ -69,12 +69,13 @@ import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.repositories.conversations.ConversationsRepository import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.utils.ApiUtils -import com.nextcloud.talk.utils.SpreedFeatures +import com.nextcloud.talk.utils.CapabilitiesUtil import com.nextcloud.talk.utils.ConversationUtils import com.nextcloud.talk.utils.DateConstants import com.nextcloud.talk.utils.DateUtils +import com.nextcloud.talk.utils.ShareUtils +import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.bundle.BundleKeys -import com.nextcloud.talk.utils.CapabilitiesUtil import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule import eu.davidea.flexibleadapter.FlexibleAdapter @@ -161,7 +162,6 @@ class ConversationInfoActivity : conversationToken = intent.getStringExtra(BundleKeys.KEY_ROOM_TOKEN)!! hasAvatarSpacing = intent.getBooleanExtra(BundleKeys.KEY_ROOM_ONE_TO_ONE, false) credentials = ApiUtils.getCredentials(conversationUser.username, conversationUser.token)!! - initObservers() } @@ -203,6 +203,17 @@ class ConversationInfoActivity : is ConversationInfoViewModel.GetRoomSuccessState -> { conversation = state.conversationModel viewModel.getCapabilities(conversationUser, conversationToken, conversation!!) + if (ConversationUtils.isNoteToSelfConversation(conversation)) { + binding.shareConversationButton.visibility = GONE + } + binding.shareConversationButton.setOnClickListener { + ShareUtils.shareConversationLink( + this, + conversationUser.baseUrl, + conversation?.token, + conversation?.name + ) + } } is ConversationInfoViewModel.GetRoomErrorState -> { @@ -862,11 +873,9 @@ class ConversationInfoActivity : val v: String = resources.getStringArray(R.array.message_expiring_values)[position] databaseStorageModule!!.saveString("conversation_settings_dropdown", v) } - - binding.conversationSettingsDropdown.visibility = VISIBLE - binding.conversationInfoExpireMessagesExplanation.visibility = VISIBLE + binding.messageExpirationSettings.visibility = VISIBLE } else { - binding.conversationSettings.visibility = GONE + binding.messageExpirationSettings.visibility = GONE } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt index 1a99e2c1f..9aae36e00 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt @@ -8,7 +8,6 @@ */ package com.nextcloud.talk.conversationinfo -import android.content.Intent import android.util.Log import android.view.LayoutInflater import android.view.View @@ -24,8 +23,6 @@ import com.nextcloud.talk.models.domain.ConversationType import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.repositories.conversations.ConversationsRepository import com.nextcloud.talk.utils.ConversationUtils -import com.nextcloud.talk.utils.Mimetype -import com.nextcloud.talk.utils.ShareUtils import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -82,10 +79,6 @@ class GuestAccessHelper( } } - binding.guestAccessView.shareConversationButton.setOnClickListener { - shareUrl() - } - binding.guestAccessView.resendInvitationsButton.setOnClickListener { conversationsRepository.resendInvitations(conversation.token!!).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(ResendInvitationsObserver()) @@ -123,28 +116,6 @@ class GuestAccessHelper( ) } - private fun shareUrl() { - val sendIntent: Intent = Intent().apply { - action = Intent.ACTION_SEND - type = Mimetype.TEXT_PLAIN - putExtra( - Intent.EXTRA_SUBJECT, - String.format( - activity.resources.getString(R.string.nc_share_subject), - activity.resources.getString(R.string.nc_app_product_name) - ) - ) - - putExtra( - Intent.EXTRA_TEXT, - ShareUtils.getStringForIntent(activity, conversationUser, conversation) - ) - } - - val shareIntent = Intent.createChooser(sendIntent, null) - activity.startActivity(shareIntent) - } - inner class ResendInvitationsObserver : Observer { private lateinit var resendInvitationsResult: ConversationsRepository.ResendInvitationsResult @@ -200,7 +171,6 @@ class GuestAccessHelper( private fun showAllOptions() { binding.guestAccessView.guestAccessSettingsPasswordProtection.visibility = View.VISIBLE - binding.guestAccessView.shareConversationButton.visibility = View.VISIBLE if (conversationUser.capabilities?.spreedCapability?.features?.contains("sip-support") == true) { binding.guestAccessView.resendInvitationsButton.visibility = View.VISIBLE } @@ -208,7 +178,6 @@ class GuestAccessHelper( private fun hideAllOptions() { binding.guestAccessView.guestAccessSettingsPasswordProtection.visibility = View.GONE - binding.guestAccessView.shareConversationButton.visibility = View.GONE binding.guestAccessView.resendInvitationsButton.visibility = View.GONE } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt index 56ca2c518..263e0aa09 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt @@ -214,6 +214,11 @@ data class Conversation( } } + @Deprecated("Use ConversationUtil") + fun isNoteToSelfConversation(): Boolean { + return type == ConversationType.NOTE_TO_SELF + } + enum class NotificationLevel { DEFAULT, ALWAYS, diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt index 758710ce0..ad0a0e97c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt @@ -30,10 +30,11 @@ import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.CapabilitiesUtil +import com.nextcloud.talk.utils.ShareUtils +import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN -import com.nextcloud.talk.utils.CapabilitiesUtil -import com.nextcloud.talk.utils.SpreedFeatures import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -123,6 +124,9 @@ class ConversationsListBottomDialog( binding.conversationOperationRename.visibility = setVisibleIf( conversation.isNameEditable(currentUser) ) + binding.conversationLinkShare.visibility = setVisibleIf( + !conversation.isNoteToSelfConversation() + ) binding.conversationOperationDelete.visibility = setVisibleIf( canModerate @@ -161,6 +165,11 @@ class ConversationsListBottomDialog( markConversationAsUnread() } + binding.conversationLinkShare.setOnClickListener { + ShareUtils.shareConversationLink(activity, currentUser.baseUrl, conversation.token, conversation.name) + dismiss() + } + binding.conversationOperationRename.setOnClickListener { renameConversation() } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt index 689095f05..619fde434 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ShareUtils.kt @@ -6,17 +6,40 @@ */ package com.nextcloud.talk.utils -import android.content.Context +import android.app.Activity +import android.content.Intent +import android.net.Uri import com.nextcloud.talk.R -import com.nextcloud.talk.data.user.model.User -import com.nextcloud.talk.models.domain.ConversationModel object ShareUtils { - fun getStringForIntent(context: Context, user: User, conversation: ConversationModel?): String { - return String.format( - context.resources.getString(R.string.nc_share_text), - user.baseUrl, - conversation?.token + + fun shareConversationLink(context: Activity, baseUrl: String?, roomToken: String?, conversationName: String?) { + if (baseUrl.isNullOrBlank() || roomToken.isNullOrBlank() || conversationName.isNullOrBlank()) { + return + } + + val uriToShareConversation = Uri.parse(baseUrl) + .buildUpon() + .appendPath("index.php") + .appendPath("call") + .appendPath(roomToken) + .build() + + val shareConversationLink = String.format( + context.getString( + R.string.share_link_to_conversation, + conversationName, + uriToShareConversation.toString() + ) ) + + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, shareConversationLink) + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, context.getString(R.string.nc_share_link)) + context.startActivity(shareIntent) } } diff --git a/app/src/main/res/layout/activity_conversation_info.xml b/app/src/main/res/layout/activity_conversation_info.xml index bd7da519e..8efae01e0 100644 --- a/app/src/main/res/layout/activity_conversation_info.xml +++ b/app/src/main/res/layout/activity_conversation_info.xml @@ -229,38 +229,75 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/standard_padding" - android:text="@string/message_expiration_title" + android:text="@string/nc_conversation_settings" android:textSize="@dimen/headline_text_size" android:textStyle="bold" /> - + android:orientation="vertical"> - + android:layout_marginHorizontal="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_half_margin" + android:hint="@string/nc_expire_messages"> - + + + + + + + + + + + + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:text="@string/nc_guest_access_share_link" + android:textSize="@dimen/headline_text_size" /> + + + + + + + + + + - - - - - - - - Conversation name Create conversation Add emojis - Join the conversation at %1$s/index.php/call/%2$s - %1$s invitation - \nPassword: %1$s + + Push-to-talk With microphone disabled, click&hold to use Push-to-talk @@ -435,6 +434,7 @@ How to translate with transifex: Resend invitations Invitations were sent out again. Invitations were not send due to an error. + Share link Send message @@ -712,7 +712,6 @@ How to translate with transifex: Conversation description - Message expiration Expire chat messages Off 4 weeks @@ -785,4 +784,6 @@ How to translate with transifex: Edit Icon Failed to fetch pending invitations Edited by %1$s + Join conversation %1$s at %2$s + Conversation settings diff --git a/app/src/test/java/com/nextcloud/talk/utils/ShareUtilsTest.kt b/app/src/test/java/com/nextcloud/talk/utils/ShareUtilsTest.kt deleted file mode 100644 index cc3ed9b7d..000000000 --- a/app/src/test/java/com/nextcloud/talk/utils/ShareUtilsTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Nextcloud Talk - Android Client - * - * SPDX-FileCopyrightText: 2017-2019 Mario Danic - * SPDX-License-Identifier: GPL-3.0-or-later - */ -package com.nextcloud.talk.utils - -import android.content.Context -import android.content.res.Resources -import com.nextcloud.talk.R -import com.nextcloud.talk.data.user.model.User -import com.nextcloud.talk.models.domain.ConversationModel -import com.nextcloud.talk.users.UserManager -import io.reactivex.Maybe -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito -import org.mockito.MockitoAnnotations - -class ShareUtilsTest { - @Mock - private val context: Context? = null - - @Mock - private val resources: Resources? = null - - @Mock - private val userManager: UserManager? = null - - @Mock - private val user: User? = null - - private val baseUrl = "https://my.nextcloud.com" - private val token = "2aotbrjr" - - private lateinit var conversation: ConversationModel - - @Before - fun setUp() { - MockitoAnnotations.openMocks(this) - Mockito.`when`(userManager!!.currentUser).thenReturn(Maybe.just(user)) - Mockito.`when`(user!!.baseUrl).thenReturn(baseUrl) - Mockito.`when`(context!!.resources).thenReturn(resources) - Mockito.`when`(resources!!.getString(R.string.nc_share_text)) - .thenReturn("Join the conversation at %1\$s/index.php/call/%2\$s") - Mockito.`when`(resources.getString(R.string.nc_share_text_pass)).thenReturn("\nPassword: %1\$s") - - conversation = ConversationModel(token = token) - } - - @Test - fun stringForIntent_noPasswordGiven_correctStringWithoutPasswordReturned() { - val expectedResult = String.format( - "Join the conversation at %s/index.php/call/%s", - baseUrl, - token - ) - Assert.assertEquals( - "Intent string was not as expected", - expectedResult, - ShareUtils.getStringForIntent(context!!, userManager!!.currentUser.blockingGet(), conversation) - ) - } -}