2017-07-22 00:59:27 +02:00
|
|
|
package org.thoughtcrime.securesms.util;
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.net.ConnectivityManager;
|
|
|
|
import android.net.NetworkInfo;
|
2020-08-25 07:24:08 +02:00
|
|
|
import android.text.TextUtils;
|
|
|
|
|
2020-08-19 02:06:26 +02:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import androidx.annotation.WorkerThread;
|
2017-07-22 00:59:27 +02:00
|
|
|
|
2021-01-14 00:28:07 +01:00
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId;
|
2021-01-15 05:36:30 +01:00
|
|
|
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment;
|
2021-01-29 06:35:47 +01:00
|
|
|
import org.session.libsession.utilities.ServiceUtil;
|
|
|
|
import org.session.libsession.utilities.TextSecurePreferences;
|
|
|
|
|
2018-03-15 19:17:40 +01:00
|
|
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
2019-04-17 16:21:30 +02:00
|
|
|
import org.thoughtcrime.securesms.logging.Log;
|
2017-07-22 00:59:27 +02:00
|
|
|
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
public class AttachmentUtil {
|
|
|
|
|
|
|
|
private static final String TAG = AttachmentUtil.class.getSimpleName();
|
|
|
|
|
2018-06-11 20:08:25 +02:00
|
|
|
@WorkerThread
|
2018-06-11 19:38:11 +02:00
|
|
|
public static boolean isAutoDownloadPermitted(@NonNull Context context, @Nullable DatabaseAttachment attachment) {
|
2017-07-22 00:59:27 +02:00
|
|
|
if (attachment == null) {
|
|
|
|
Log.w(TAG, "attachment was null, returning vacuous true");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-06-11 19:38:11 +02:00
|
|
|
if (isFromUnknownContact(context, attachment)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-07-22 00:59:27 +02:00
|
|
|
Set<String> allowedTypes = getAllowedAutoDownloadTypes(context);
|
|
|
|
String contentType = attachment.getContentType();
|
|
|
|
|
2019-04-17 16:21:30 +02:00
|
|
|
if (attachment.isVoiceNote() ||
|
|
|
|
(MediaUtil.isAudio(attachment) && TextUtils.isEmpty(attachment.getFileName())) ||
|
|
|
|
MediaUtil.isLongTextType(attachment.getContentType()) ||
|
|
|
|
attachment.isSticker())
|
|
|
|
{
|
2017-07-22 00:59:27 +02:00
|
|
|
return true;
|
|
|
|
} else if (isNonDocumentType(contentType)) {
|
|
|
|
return allowedTypes.contains(MediaUtil.getDiscreteMimeType(contentType));
|
|
|
|
} else {
|
|
|
|
return allowedTypes.contains("documents");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-15 19:17:40 +01:00
|
|
|
/**
|
|
|
|
* Deletes the specified attachment. If its the only attachment for its linked message, the entire
|
|
|
|
* message is deleted.
|
|
|
|
*/
|
|
|
|
@WorkerThread
|
|
|
|
public static void deleteAttachment(@NonNull Context context,
|
|
|
|
@NonNull DatabaseAttachment attachment)
|
|
|
|
{
|
|
|
|
AttachmentId attachmentId = attachment.getAttachmentId();
|
|
|
|
long mmsId = attachment.getMmsId();
|
|
|
|
int attachmentCount = DatabaseFactory.getAttachmentDatabase(context)
|
|
|
|
.getAttachmentsForMessage(mmsId)
|
|
|
|
.size();
|
|
|
|
|
|
|
|
if (attachmentCount <= 1) {
|
|
|
|
DatabaseFactory.getMmsDatabase(context).delete(mmsId);
|
|
|
|
} else {
|
|
|
|
DatabaseFactory.getAttachmentDatabase(context).deleteAttachment(attachmentId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-22 00:59:27 +02:00
|
|
|
private static boolean isNonDocumentType(String contentType) {
|
|
|
|
return
|
|
|
|
MediaUtil.isImageType(contentType) ||
|
|
|
|
MediaUtil.isVideoType(contentType) ||
|
|
|
|
MediaUtil.isAudioType(contentType);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static @NonNull Set<String> getAllowedAutoDownloadTypes(@NonNull Context context) {
|
|
|
|
if (isConnectedWifi(context)) return TextSecurePreferences.getWifiMediaDownloadAllowed(context);
|
|
|
|
else if (isConnectedRoaming(context)) return TextSecurePreferences.getRoamingMediaDownloadAllowed(context);
|
|
|
|
else if (isConnectedMobile(context)) return TextSecurePreferences.getMobileMediaDownloadAllowed(context);
|
|
|
|
else return Collections.emptySet();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static NetworkInfo getNetworkInfo(@NonNull Context context) {
|
|
|
|
return ServiceUtil.getConnectivityManager(context).getActiveNetworkInfo();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isConnectedWifi(@NonNull Context context) {
|
|
|
|
final NetworkInfo info = getNetworkInfo(context);
|
|
|
|
return info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isConnectedMobile(@NonNull Context context) {
|
|
|
|
final NetworkInfo info = getNetworkInfo(context);
|
|
|
|
return info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isConnectedRoaming(@NonNull Context context) {
|
|
|
|
final NetworkInfo info = getNetworkInfo(context);
|
|
|
|
return info != null && info.isConnected() && info.isRoaming() && info.getType() == ConnectivityManager.TYPE_MOBILE;
|
|
|
|
}
|
|
|
|
|
2018-06-11 20:08:25 +02:00
|
|
|
@WorkerThread
|
2018-06-11 19:38:11 +02:00
|
|
|
private static boolean isFromUnknownContact(@NonNull Context context, @NonNull DatabaseAttachment attachment) {
|
2020-05-11 08:54:31 +02:00
|
|
|
// We don't allow attachments to be sent unless we're friends with someone or the attachment is sent
|
|
|
|
// in a group context. Auto-downloading attachments is therefore fine.
|
2019-10-21 01:52:53 +02:00
|
|
|
return false;
|
2018-06-11 19:38:11 +02:00
|
|
|
}
|
2017-07-22 00:59:27 +02:00
|
|
|
}
|