Skip to content

Commit

Permalink
Add additional logging for diagnosing shares with null EXTRA_STREAM.
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-signal committed Aug 18, 2022
1 parent 056ef84 commit 16a4c32
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 11 deletions.
Expand Up @@ -6,12 +6,14 @@ 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
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.core.content.pm.ShortcutManagerCompat
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import org.signal.core.util.Result
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.PassphraseRequiredActivity
import org.thoughtcrime.securesms.R
Expand Down Expand Up @@ -42,9 +44,10 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
private val lifecycleDisposable = LifecycleDisposable()

private lateinit var finishOnOkResultLauncher: ActivityResultLauncher<Intent>
private lateinit var unresolvedShareData: UnresolvedShareData

private val viewModel: ShareViewModel by viewModels {
ShareViewModel.Factory(getUnresolvedShareData(), ShareRepository(this))
ShareViewModel.Factory(unresolvedShareData, ShareRepository(this))
}

private val directShareTarget: RecipientId?
Expand All @@ -58,6 +61,22 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
setContentView(R.layout.share_activity_v2)

val isIntentValid = getUnresolvedShareData().either(
onSuccess = {
unresolvedShareData = it
true
},
onFailure = {
handleIntentError(it)
false
}
)

if (!isIntentValid) {
finish()
return
}

finishOnOkResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
finish()
Expand Down Expand Up @@ -125,7 +144,7 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C

override fun getDialogBackgroundColor(): Int = ContextCompat.getColor(this, R.color.signal_background_primary)

private fun getUnresolvedShareData(): UnresolvedShareData {
private fun getUnresolvedShareData(): Result<UnresolvedShareData, IntentError> {
return when {
intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_TEXT) -> {
intent.getCharSequenceArrayListExtra(Intent.EXTRA_TEXT)?.let { list ->
Expand All @@ -138,26 +157,26 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
}
}

UnresolvedShareData.ExternalPrimitiveShare(stringBuilder)
} ?: error("ACTION_SEND_MULTIPLE with EXTRA_TEXT but the EXTRA_TEXT was null")
Result.success(UnresolvedShareData.ExternalPrimitiveShare(stringBuilder))
} ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT)
}
intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_STREAM) -> {
intent.getParcelableArrayListExtra<Uri>(Intent.EXTRA_STREAM)?.let {
UnresolvedShareData.ExternalMultiShare(it)
} ?: error("ACTION_SEND_MULTIPLE with EXTRA_STREAM but the EXTRA_STREAM was null")
Result.success(UnresolvedShareData.ExternalMultiShare(it))
} ?: Result.failure(IntentError.SEND_MULTIPLE_STREAM)
}
intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_STREAM) -> {
intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)?.let {
UnresolvedShareData.ExternalSingleShare(it, intent.type)
} ?: error("ACTION_SEND with EXTRA_STREAM but the EXTRA_STREAM was null")
Result.success(UnresolvedShareData.ExternalSingleShare(it, intent.type))
} ?: Result.failure(IntentError.SEND_STREAM)
}
intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_TEXT) -> {
intent.getCharSequenceExtra(Intent.EXTRA_TEXT)?.let {
UnresolvedShareData.ExternalPrimitiveShare(it)
} ?: error("ACTION_SEND with EXTRA_TEXT but the EXTRA_TEXT was null")
Result.success(UnresolvedShareData.ExternalPrimitiveShare(it))
} ?: Result.failure(IntentError.SEND_TEXT)
}
else -> null
} ?: error("Intent Action: ${Intent.ACTION_SEND_MULTIPLE} could not be resolved with the given arguments.")
} ?: Result.failure(IntentError.UNKNOWN)
}

private fun ensureFragment(resolvedShareData: ResolvedShareData) {
Expand Down Expand Up @@ -252,4 +271,28 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
}
}
}

private fun handleIntentError(intentError: IntentError) {
val logEntry = when (intentError) {
IntentError.SEND_MULTIPLE_TEXT -> "Failed to parse text array from intent for multi-share."
IntentError.SEND_MULTIPLE_STREAM -> "Failed to parse stream array from intent for multi-share."
IntentError.SEND_TEXT -> "Failed to parse text from intent for single-share."
IntentError.SEND_STREAM -> "Failed to parse stream from intent for single-share."
IntentError.UNKNOWN -> "Failed to parse unknown from intent."
}

Log.w(TAG, "$logEntry action: ${intent.action}, type: ${intent.type}")
Toast.makeText(this, R.string.ShareActivity__could_not_get_share_data_from_intent, Toast.LENGTH_LONG).show()
}

/**
* Represents an error with the intent when trying to extract the unresolved share data.
*/
private enum class IntentError {
SEND_MULTIPLE_TEXT,
SEND_MULTIPLE_STREAM,
SEND_TEXT,
SEND_STREAM,
UNKNOWN
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -3620,6 +3620,8 @@
<string name="ShareActivity__send">Send</string>
<string name="ShareActivity__comma_s">, %1$s</string>
<string name="ShareActivity__sharing_to_multiple_chats_is">Sharing to multiple chats is only supported for Signal messages</string>
<!-- Toast when the incoming intent is invalid -->
<string name="ShareActivity__could_not_get_share_data_from_intent">Could not get share data from intent.</string>

<!-- MultiShareDialogs -->
<string name="MultiShareDialogs__failed_to_send_to_some_users">Failed to send to some users</string>
Expand Down

0 comments on commit 16a4c32

Please sign in to comment.