diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 50baf0c91d..095d8d861a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -198,6 +198,7 @@ + + val media: List, + val text: CharSequence? ) : ResolvedShareData() { override fun toMultiShareArgs(): MultiShareArgs { - return MultiShareArgs.Builder(setOf()).withMedia(media).build() + return MultiShareArgs.Builder(setOf()) + .withMedia(media) + .withDraftText(text?.toString()) + .build() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt index 777bcf1a47..b6d264be96 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt @@ -5,7 +5,6 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle -import android.text.SpannableStringBuilder import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.ActivityResultLauncher @@ -13,6 +12,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.text.buildSpannedString import com.google.android.material.appbar.MaterialToolbar import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy @@ -193,29 +193,22 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C override fun getDialogBackgroundColor(): Int = ContextCompat.getColor(this, R.color.signal_background_primary) private fun getUnresolvedShareData(): Result { - return when { - intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_TEXT) -> { - intent.getCharSequenceArrayListExtra(Intent.EXTRA_TEXT)?.let { list -> - val stringBuilder = SpannableStringBuilder() - list.forEachIndexed { index, text -> - stringBuilder.append(text) - - if (index != list.lastIndex) { - stringBuilder.append("\n") - } - } - - Result.success(UnresolvedShareData.ExternalPrimitiveShare(stringBuilder)) - } ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT) - } - - intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_STREAM) -> { - intent.getParcelableArrayListExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let { - Result.success(UnresolvedShareData.ExternalMultiShare(it)) + return when (intent.action) { + Intent.ACTION_SEND_MULTIPLE if intent.hasExtra(Intent.EXTRA_STREAM) -> { + intent.getParcelableArrayListExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let { uris -> + val text: CharSequence? = intent.getCharSequenceArrayListExtra(Intent.EXTRA_TEXT) + ?.let { textExtras -> combineTextExtras(textExtras) } + Result.success(UnresolvedShareData.ExternalMultiShare(uris, text)) } ?: Result.failure(IntentError.SEND_MULTIPLE_STREAM) } - intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_STREAM) -> { + Intent.ACTION_SEND_MULTIPLE if intent.hasExtra(Intent.EXTRA_TEXT) -> { + intent.getCharSequenceArrayListExtra(Intent.EXTRA_TEXT) + ?.let { textExtras -> Result.success(UnresolvedShareData.ExternalPrimitiveShare(text = combineTextExtras(textExtras))) } + ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT) + } + + Intent.ACTION_SEND if intent.hasExtra(Intent.EXTRA_STREAM) -> { val uri: Uri? = intent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java) if (uri == null) { extractSingleExtraTextFromIntent(IntentError.SEND_STREAM) @@ -225,7 +218,7 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C } } - intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_TEXT) -> { + Intent.ACTION_SEND if intent.hasExtra(Intent.EXTRA_TEXT) -> { extractSingleExtraTextFromIntent() } @@ -243,6 +236,17 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C } } + private fun combineTextExtras(textExtras: List): CharSequence { + return buildSpannedString { + textExtras.forEachIndexed { index, textItem -> + append(textItem) + if (index != textExtras.lastIndex) { + append("\n") + } + } + } + } + private fun ensureFragment(resolvedShareData: ResolvedShareData) { if (!supportFragmentManager.isStateSaved && supportFragmentManager.fragments.none { it is MultiselectForwardFullScreenDialogFragment }) { supportFragmentManager.beginTransaction() diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt index abfb1ad098..e10784980f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt @@ -121,7 +121,7 @@ class ShareRepository(context: Context) { }.filterNotNull() return if (media.isNotEmpty()) { - ResolvedShareData.Media(media) + ResolvedShareData.Media(media, externalMultiShare.text) } else { ResolvedShareData.Failure } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/UnresolvedShareData.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/UnresolvedShareData.kt index de55145080..fbbc14fb3c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/UnresolvedShareData.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/UnresolvedShareData.kt @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.sharing.v2 import android.net.Uri sealed class UnresolvedShareData { - data class ExternalMultiShare(val uris: List) : UnresolvedShareData() + data class ExternalMultiShare(val uris: List, val text: CharSequence?) : UnresolvedShareData() data class ExternalSingleShare(val uri: Uri, val mimeType: String?, val text: CharSequence?) : UnresolvedShareData() data class ExternalPrimitiveShare(val text: CharSequence) : UnresolvedShareData() }