kopia lustrzana https://github.com/ryukoposting/Signal-Android
Use media forward sheet when forwarding in Media preview.
rodzic
d865b5d7b5
commit
477698f917
|
@ -55,6 +55,10 @@ import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.animation.DepthPageTransformer;
|
import org.thoughtcrime.securesms.animation.DepthPageTransformer;
|
||||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||||
import org.thoughtcrime.securesms.components.viewpager.ExtendedOnPageChangedListener;
|
import org.thoughtcrime.securesms.components.viewpager.ExtendedOnPageChangedListener;
|
||||||
|
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart;
|
||||||
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardBottomSheet;
|
||||||
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment;
|
||||||
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs;
|
||||||
import org.thoughtcrime.securesms.database.MediaDatabase;
|
import org.thoughtcrime.securesms.database.MediaDatabase;
|
||||||
import org.thoughtcrime.securesms.database.MediaDatabase.MediaRecord;
|
import org.thoughtcrime.securesms.database.MediaDatabase.MediaRecord;
|
||||||
import org.thoughtcrime.securesms.database.loaders.PagingMediaLoader;
|
import org.thoughtcrime.securesms.database.loaders.PagingMediaLoader;
|
||||||
|
@ -388,10 +392,12 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity
|
||||||
MediaItem mediaItem = getCurrentMediaItem();
|
MediaItem mediaItem = getCurrentMediaItem();
|
||||||
|
|
||||||
if (mediaItem != null) {
|
if (mediaItem != null) {
|
||||||
Intent composeIntent = new Intent(this, ShareActivity.class);
|
MultiselectForwardFragmentArgs.create(
|
||||||
composeIntent.putExtra(Intent.EXTRA_STREAM, mediaItem.uri);
|
this,
|
||||||
composeIntent.setType(mediaItem.type);
|
mediaItem.uri,
|
||||||
startActivity(composeIntent);
|
mediaItem.type,
|
||||||
|
args -> MultiselectForwardFragment.showBottomSheet(getSupportFragmentManager(), args)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation.mutiselect
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.net.Uri
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import org.thoughtcrime.securesms.TransportOption
|
import org.thoughtcrime.securesms.TransportOption
|
||||||
import org.thoughtcrime.securesms.TransportOptions
|
import org.thoughtcrime.securesms.TransportOptions
|
||||||
|
@ -74,6 +75,22 @@ object Multiselect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to determine whether a given attachment can be sent via MMS.
|
||||||
|
*/
|
||||||
|
fun isMmsSupported(context: Context, mediaUri: Uri, mediaType: String, mediaSize: Long): Boolean {
|
||||||
|
val canReadPhoneState = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
|
||||||
|
if (!Util.isDefaultSmsProvider(context) || !canReadPhoneState || !Util.isMmsCapable(context)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val options = TransportOptions(context, true)
|
||||||
|
options.setDefaultTransport(TransportOption.Type.SMS)
|
||||||
|
|
||||||
|
val mmsConstraints = MediaConstraints.getMmsMediaConstraints(options.selectedTransport.simSubscriptionId.orElse(-1))
|
||||||
|
return mmsConstraints.isSatisfied(context, mediaUri, mediaType, mediaSize) || mmsConstraints.canResize(mediaType)
|
||||||
|
}
|
||||||
|
|
||||||
private fun canSendAllAttachmentsToNonPush(context: Context, messageRecord: MessageRecord): Boolean {
|
private fun canSendAllAttachmentsToNonPush(context: Context, messageRecord: MessageRecord): Boolean {
|
||||||
return if (messageRecord is MmsMessageRecord) {
|
return if (messageRecord is MmsMessageRecord) {
|
||||||
messageRecord.slideDeck.asAttachments().all { isMmsSupported(context, it) }
|
messageRecord.slideDeck.asAttachments().all { isMmsSupported(context, it) }
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.thoughtcrime.securesms.conversation.mutiselect.forward
|
package org.thoughtcrime.securesms.conversation.mutiselect.forward
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
import org.signal.core.util.StreamUtil
|
import org.signal.core.util.StreamUtil
|
||||||
|
@ -15,6 +16,7 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
||||||
import org.thoughtcrime.securesms.mediasend.Media
|
import org.thoughtcrime.securesms.mediasend.Media
|
||||||
import org.thoughtcrime.securesms.mms.PartAuthority
|
import org.thoughtcrime.securesms.mms.PartAuthority
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
||||||
|
import org.thoughtcrime.securesms.util.MediaUtil
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
|
||||||
|
@ -32,6 +34,27 @@ class MultiselectForwardFragmentArgs(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun create(context: Context, mediaUri: Uri, mediaType: String, consumer: Consumer<MultiselectForwardFragmentArgs>) {
|
||||||
|
SignalExecutors.BOUNDED.execute {
|
||||||
|
val mediaSize = MediaUtil.getMediaSize(context, mediaUri)
|
||||||
|
val isMmsSupported = Multiselect.isMmsSupported(context, mediaUri, mediaType, mediaSize)
|
||||||
|
val multiShareArgs = MultiShareArgs.Builder(setOf())
|
||||||
|
.withDataUri(mediaUri)
|
||||||
|
.withDataType(mediaType)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
ThreadUtil.runOnMain {
|
||||||
|
consumer.accept(
|
||||||
|
MultiselectForwardFragmentArgs(
|
||||||
|
isMmsSupported,
|
||||||
|
listOf(multiShareArgs)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun create(context: Context, selectedParts: Set<MultiselectPart>, consumer: Consumer<MultiselectForwardFragmentArgs>) {
|
fun create(context: Context, selectedParts: Set<MultiselectPart>, consumer: Consumer<MultiselectForwardFragmentArgs>) {
|
||||||
SignalExecutors.BOUNDED.execute {
|
SignalExecutors.BOUNDED.execute {
|
||||||
|
|
|
@ -77,6 +77,19 @@ public abstract class MediaConstraints {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSatisfied(@NonNull Context context, @NonNull Uri uri, @NonNull String contentType, long size) {
|
||||||
|
try {
|
||||||
|
return (MediaUtil.isGif(contentType) && size <= getGifMaxSize(context) && isWithinBounds(context, uri)) ||
|
||||||
|
(MediaUtil.isImageType(contentType) && size <= getImageMaxSize(context) && isWithinBounds(context, uri)) ||
|
||||||
|
(MediaUtil.isAudioType(contentType) && size <= getAudioMaxSize(context)) ||
|
||||||
|
(MediaUtil.isVideoType(contentType) && size <= getVideoMaxSize(context)) ||
|
||||||
|
size <= getDocumentMaxSize(context);
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
Log.w(TAG, "Failed to determine if media's constraints are satisfied.", ioe);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isWithinBounds(Context context, Uri uri) throws IOException {
|
private boolean isWithinBounds(Context context, Uri uri) throws IOException {
|
||||||
try {
|
try {
|
||||||
InputStream is = PartAuthority.getAttachmentStream(context, uri);
|
InputStream is = PartAuthority.getAttachmentStream(context, uri);
|
||||||
|
@ -93,6 +106,11 @@ public abstract class MediaConstraints {
|
||||||
MediaUtil.isVideo(attachment) && isVideoTranscodeAvailable();
|
MediaUtil.isVideo(attachment) && isVideoTranscodeAvailable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canResize(@NonNull String mediaType) {
|
||||||
|
return MediaUtil.isImageType(mediaType) && !MediaUtil.isGif(mediaType) ||
|
||||||
|
MediaUtil.isVideoType(mediaType) && isVideoTranscodeAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isVideoTranscodeAvailable() {
|
public static boolean isVideoTranscodeAvailable() {
|
||||||
return Build.VERSION.SDK_INT >= 26 && (FeatureFlags.useStreamingVideoMuxer() || MemoryFileDescriptor.supported());
|
return Build.VERSION.SDK_INT >= 26 && (FeatureFlags.useStreamingVideoMuxer() || MemoryFileDescriptor.supported());
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue