WIP clean

This commit is contained in:
Ryan ZHAO 2021-01-15 16:51:53 +11:00
parent 6cd00aec77
commit 1f96ab1cf5
59 changed files with 1671 additions and 2094 deletions

View File

@ -33,8 +33,13 @@ import com.google.firebase.iid.FirebaseInstanceId;
import org.conscrypt.Conscrypt;
import org.jetbrains.annotations.NotNull;
import org.session.libsession.messaging.contacts.avatars.AvatarHelper;
import org.session.libsession.utilities.SSKEnvironment;
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier;
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageContextWrapper;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.Util;
import org.session.libsignal.libsignal.state.SessionRecord;
import org.signal.aesgcmprovider.AesGcmProvider;
import org.thoughtcrime.securesms.sskenvironment.ProfileManager;
@ -78,7 +83,6 @@ import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities;
import org.thoughtcrime.securesms.notifications.DefaultMessageNotifier;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.notifications.OptimizedMessageNotifier;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.session.libsession.messaging.threads.recipients.Recipient;
@ -87,9 +91,6 @@ import org.thoughtcrime.securesms.service.IncomingMessageObserver;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.service.LocalBackupListener;
import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
import org.webrtc.PeerConnectionFactory;
import org.webrtc.PeerConnectionFactory.InitializationOptions;
import org.webrtc.voiceengine.WebRtcAudioManager;

View File

@ -10,9 +10,9 @@ import android.view.WindowManager;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageActivityHelper;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageActivityHelper;
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageContextWrapper;
import network.loki.messenger.R;

View File

@ -11,9 +11,9 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import android.view.KeyEvent;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageActivityHelper;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageActivityHelper;
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageContextWrapper;
import network.loki.messenger.R;

View File

@ -26,7 +26,7 @@ import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MmsDatabase;

View File

@ -7,7 +7,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import org.thoughtcrime.securesms.util.ExpirationUtil;
import org.session.libsession.utilities.ExpirationUtil;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
import network.loki.messenger.R;

View File

@ -64,8 +64,8 @@ import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.util.AttachmentUtil;
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.ViewUtil;
import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
import java.util.Collection;
@ -198,7 +198,7 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity {
if (address == null) throw new AssertionError();
if (locale == null) throw new AssertionError();
this.recipient = Recipient.from(getContext(), Address.fromSerialized(address), true);
this.recipient = Recipient.from(getContext(), Address.Companion.fromSerialized(address), true);
this.locale = locale;
getLoaderManager().initLoader(0, null, this);

View File

@ -53,7 +53,7 @@ import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.MediaView;
import org.session.libsession.messaging.threads.Address;
import org.thoughtcrime.securesms.database.MediaDatabase.MediaRecord;

View File

@ -37,7 +37,7 @@ import androidx.loader.app.LoaderManager.LoaderCallbacks;
import androidx.loader.content.Loader;
import org.thoughtcrime.securesms.MessageDetailsRecipientAdapter.RecipientDeliveryStatus;
import org.thoughtcrime.securesms.color.MaterialColor;
import org.session.libsession.utilities.color.MaterialColor;
import org.thoughtcrime.securesms.conversation.ConversationItem;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
@ -55,8 +55,8 @@ import org.session.libsession.messaging.threads.recipients.Recipient;
import org.session.libsession.messaging.threads.recipients.RecipientModifiedListener;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.ExpirationUtil;
import org.thoughtcrime.securesms.util.Util;
import org.session.libsession.utilities.ExpirationUtil;
import org.session.libsession.utilities.Util;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsignal.service.loki.api.opengroups.PublicChat;

View File

@ -12,7 +12,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.loki.views.UserView;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.util.Conversions;
import org.session.libsession.utilities.Conversions;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

View File

@ -43,7 +43,7 @@ import org.thoughtcrime.securesms.animation.AnimationCompleteListener;
import org.thoughtcrime.securesms.components.AnimatingToggle;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.session.libsession.utilities.TextSecurePreferences;
import network.loki.messenger.R;

View File

@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.activities.HomeActivity;
import org.thoughtcrime.securesms.loki.activities.LandingActivity;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.session.libsession.utilities.TextSecurePreferences;
import java.util.Locale;

View File

@ -47,9 +47,9 @@ import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import org.session.libsession.messaging.sending_receiving.attachments.StickerLocator;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
import java.io.FileInputStream;
import java.io.IOException;

View File

@ -43,7 +43,7 @@ public class ShortcutLauncherActivity extends AppCompatActivity {
return;
}
Address address = Address.fromSerialized(serializedAddress);
Address address = Address.Companion.fromSerialized(serializedAddress);
Recipient recipient = Recipient.from(this, address, true);
TaskStackBuilder backStack = TaskStackBuilder.create(this)
.addNextIntent(new Intent(this, HomeActivity.class));

View File

@ -10,7 +10,7 @@ import android.view.View;
import android.view.ViewGroup;
import org.thoughtcrime.securesms.components.TypingIndicatorView;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.session.libsession.utilities.TextSecurePreferences;
import network.loki.messenger.R;

View File

@ -11,7 +11,7 @@ import android.util.Pair;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ThreadUtil;
import org.session.libsession.utilities.ThreadUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import org.thoughtcrime.securesms.util.concurrent.SettableFuture;

View File

@ -28,12 +28,12 @@ import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideClickListener;
import org.thoughtcrime.securesms.mms.SlidesClickedListener;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import org.thoughtcrime.securesms.util.concurrent.SettableFuture;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.ViewUtil;
import org.session.libsession.utilities.concurrent.ListenableFuture;
import org.session.libsession.utilities.concurrent.SettableFuture;
import java.util.Collections;
import java.util.Locale;

View File

@ -11,8 +11,8 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import org.thoughtcrime.securesms.util.concurrent.SettableFuture;
import org.session.libsession.utilities.concurrent.ListenableFuture;
import org.session.libsession.utilities.concurrent.SettableFuture;
import org.session.libsession.utilities.ViewUtil;

View File

@ -40,11 +40,11 @@ import org.thoughtcrime.securesms.loki.utilities.push
import org.thoughtcrime.securesms.mms.GlideApp
import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.profiles.AvatarHelper
import org.session.libsession.messaging.contacts.avatars.AvatarHelper
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints
import org.thoughtcrime.securesms.util.BitmapDecodingException
import org.thoughtcrime.securesms.util.BitmapUtil
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsignal.service.api.crypto.ProfileCipher
import org.session.libsignal.service.api.util.StreamDetails
import org.session.libsignal.service.loki.api.fileserver.FileServerAPI

View File

@ -39,7 +39,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.MediaPreviewActivity;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.thoughtcrime.securesms.loki.views.MessageAudioView;
import org.thoughtcrime.securesms.components.DocumentView;
import org.thoughtcrime.securesms.components.RemovableEditableMediaView;
@ -53,21 +52,23 @@ import org.thoughtcrime.securesms.mediasend.MediaSendActivity;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.providers.DeprecatedPersistentBlobProvider;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.ExternalStorageUtil;
import org.thoughtcrime.securesms.util.FileProviderUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener;
import org.thoughtcrime.securesms.util.concurrent.SettableFuture;
import org.thoughtcrime.securesms.util.views.Stub;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.session.libsession.utilities.ThemeUtil;
import org.session.libsession.utilities.ViewUtil;
import org.session.libsession.utilities.views.Stub;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.concurrent.AssertedSuccessListener;
import org.session.libsession.utilities.concurrent.ListenableFuture;
import org.session.libsession.utilities.concurrent.ListenableFuture.Listener;
import org.session.libsession.utilities.concurrent.SettableFuture;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

View File

@ -25,7 +25,7 @@ import androidx.annotation.Nullable;
import network.loki.messenger.R;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.UriAttachment;
import org.session.libsession.messaging.sending_receiving.attachments.UriAttachment;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ResUtil;

View File

@ -20,7 +20,7 @@ import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.load.resource.gif.StreamGifDecoder;
import com.bumptech.glide.module.AppGlideModule;
import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto;
import org.session.libsession.messaging.contacts.avatars.ContactPhoto;
import org.thoughtcrime.securesms.crypto.AttachmentSecret;
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.giph.model.ChunkedImageUrl;

View File

@ -22,14 +22,16 @@ import android.net.Uri;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.UriAttachment;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Util;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.session.libsession.messaging.sending_receiving.attachments.UriAttachment;
import org.session.libsession.messaging.sending_receiving.attachments.StickerLocator;
import org.session.libsession.utilities.Util;
import java.security.SecureRandom;
import network.loki.messenger.R;

View File

@ -8,7 +8,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import org.session.libsession.messaging.sending_receiving.attachments.StickerLocator;
import org.thoughtcrime.securesms.util.MediaUtil;
import network.loki.messenger.R;

View File

@ -7,8 +7,8 @@ import com.annimon.stream.Stream;
import com.bumptech.glide.util.ContentLengthInputStream;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import org.session.libsignal.libsignal.util.Pair;
import org.session.libsignal.libsignal.util.guava.Optional;

View File

@ -43,7 +43,7 @@ import org.session.libsession.messaging.sending_receiving.notifications.MessageN
import org.session.libsignal.service.api.messages.SignalServiceGroup;
import org.session.libsignal.service.internal.push.SignalServiceProtos;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.contactshare.Contact;
import org.session.libsession.messaging.sending_receiving.contacts.Contact;
import org.thoughtcrime.securesms.contactshare.ContactUtil;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
import org.thoughtcrime.securesms.database.DatabaseFactory;

View File

@ -6,7 +6,7 @@ import android.content.Intent;
import android.graphics.BitmapFactory;
import network.loki.messenger.R;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
public class FailedNotificationBuilder extends AbstractNotificationBuilder {
@ -22,7 +22,7 @@ public class FailedNotificationBuilder extends AbstractNotificationBuilder {
setTicker(context.getString(R.string.MessageNotifier_error_delivering_message));
setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
setAutoCancel(true);
setAlarms(null, RecipientDatabase.VibrateState.DEFAULT);
setAlarms(null, Recipient.VibrateState.DEFAULT);
setChannelId(NotificationChannels.FAILURES);
}

View File

@ -87,7 +87,7 @@ public class MarkReadReceiver extends BroadcastReceiver {
// Loki - Take into account multi device
Set<String> linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(address.serialize());
for (String device : linkedDevices) {
Address deviceAsAddress = Address.fromExternal(context, device);
Address deviceAsAddress = Address.Companion.fromExternal(context, device);
ApplicationContext.getInstance(context)
.getJobManager()
.add(new SendReadReceiptJob(deviceAsAddress, timestamps));

View File

@ -6,7 +6,7 @@ import android.content.Context;
import android.content.Intent;
import androidx.core.app.NotificationCompat;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.loki.activities.HomeActivity;
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@ -30,7 +30,7 @@ public class PendingMessageNotificationBuilder extends AbstractNotificationBuild
setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
setAutoCancel(true);
setAlarms(null, RecipientDatabase.VibrateState.DEFAULT);
setAlarms(null, Recipient.VibrateState.DEFAULT);
if (!NotificationChannels.supported()) {
setPriority(TextSecurePreferences.getNotificationPriority(context));

View File

@ -25,9 +25,9 @@ import androidx.core.app.RemoteInput;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import org.thoughtcrime.securesms.contacts.avatars.ContactColors;
import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto;
import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto;
import org.session.libsession.messaging.contacts.avatars.ContactColors;
import org.session.libsession.messaging.contacts.avatars.ContactPhoto;
import org.session.libsession.messaging.contacts.avatars.GeneratedContactPhoto;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.utilities.AvatarPlaceholderGenerator;
import org.thoughtcrime.securesms.loki.utilities.NotificationUtilities;

View File

@ -15,7 +15,7 @@ import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import network.loki.messenger.R;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
public class RationaleDialog {

View File

@ -1,61 +0,0 @@
package org.thoughtcrime.securesms.profiles;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.session.libsession.messaging.threads.Address;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
public class AvatarHelper {
private static final String AVATAR_DIRECTORY = "avatars";
public static InputStream getInputStreamFor(@NonNull Context context, @NonNull Address address)
throws IOException
{
return new FileInputStream(getAvatarFile(context, address));
}
public static List<File> getAvatarFiles(@NonNull Context context) {
File avatarDirectory = new File(context.getFilesDir(), AVATAR_DIRECTORY);
File[] results = avatarDirectory.listFiles();
if (results == null) return new LinkedList<>();
else return Stream.of(results).toList();
}
public static void delete(@NonNull Context context, @NonNull Address address) {
getAvatarFile(context, address).delete();
}
public static @NonNull File getAvatarFile(@NonNull Context context, @NonNull Address address) {
File avatarDirectory = new File(context.getFilesDir(), AVATAR_DIRECTORY);
avatarDirectory.mkdirs();
return new File(avatarDirectory, new File(address.serialize()).getName());
}
public static void setAvatar(@NonNull Context context, @NonNull Address address, @Nullable byte[] data)
throws IOException
{
if (data == null) {
delete(context, address);
} else {
try (FileOutputStream out = new FileOutputStream(getAvatarFile(context, address))) {
out.write(data);
}
}
}
}

View File

@ -16,7 +16,7 @@ import android.widget.FrameLayout;
import network.loki.messenger.R;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
public class GroupShareProfileView extends FrameLayout {

View File

@ -11,7 +11,7 @@ import network.loki.messenger.R;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.session.libsession.messaging.threads.recipients.Recipient;
import org.session.libsession.messaging.threads.recipients.RecipientExporter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
public class UnknownSenderView extends FrameLayout {

View File

@ -14,8 +14,8 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream;
import org.thoughtcrime.securesms.crypto.ModernEncryptingPartOutputStream;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import java.io.ByteArrayInputStream;
import java.io.File;

View File

@ -47,7 +47,7 @@ public class QuickResponseService extends IntentService {
number = URLDecoder.decode(number);
}
Address address = Address.fromExternal(this, number);
Address address = Address.Companion.fromExternal(this, number);
Recipient recipient = Recipient.from(this, address, false);
int subscriptionId = recipient.getDefaultSubscriptionId().or(-1);
long expiresIn = recipient.getExpireMessages() * 1000L;

View File

@ -227,7 +227,7 @@ public class MessageSender {
MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context);
OutgoingMediaMessage message = mmsDatabase.getOutgoingMessage(messageId);
SyncMessageId syncId = new SyncMessageId(Address.fromSerialized(TextSecurePreferences.getLocalNumber(context)), message.getSentTimeMillis());
SyncMessageId syncId = new SyncMessageId(Address.Companion.fromSerialized(TextSecurePreferences.getLocalNumber(context)), message.getSentTimeMillis());
for (Attachment attachment : message.getAttachments()) {
attachmentDatabase.markAttachmentUploaded(messageId, attachment);
@ -254,7 +254,7 @@ public class MessageSender {
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context);
SmsMessageRecord message = smsDatabase.getMessage(messageId);
SyncMessageId syncId = new SyncMessageId(Address.fromSerialized(TextSecurePreferences.getLocalNumber(context)), message.getDateSent());
SyncMessageId syncId = new SyncMessageId(Address.Companion.fromSerialized(TextSecurePreferences.getLocalNumber(context)), message.getDateSent());
smsDatabase.markAsSent(messageId, true);
smsDatabase.markUnidentified(messageId, true);

View File

@ -23,7 +23,7 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.stickers.StickerKeyboardPageAdapter.StickerKeyboardPageViewHolder;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
import network.loki.messenger.R;

View File

@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.stickers.StickerKeyboardPageFragment.EventListener;
import org.thoughtcrime.securesms.stickers.StickerKeyboardRepository.PackListResult;
import org.thoughtcrime.securesms.util.ResUtil;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.session.libsession.utilities.ThemeUtil;
import org.thoughtcrime.securesms.util.Throttler;
import java.util.ArrayList;

View File

@ -8,7 +8,7 @@ import org.thoughtcrime.securesms.database.StickerDatabase.StickerPackRecordRead
import org.thoughtcrime.securesms.database.StickerDatabase.StickerRecordReader;
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.database.model.StickerRecord;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import java.util.ArrayList;
import java.util.List;

View File

@ -12,8 +12,8 @@ import org.thoughtcrime.securesms.database.StickerDatabase.StickerPackRecordRead
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import java.util.ArrayList;
import java.util.List;

View File

@ -27,7 +27,7 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.stickers.StickerManifest.Sticker;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.session.libsession.utilities.concurrent.SimpleTask;
import network.loki.messenger.R;

View File

@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.database.model.StickerRecord;
import org.thoughtcrime.securesms.dependencies.InjectableType;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.util.Hex;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import org.session.libsignal.libsignal.InvalidMessageException;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsignal.service.api.SignalServiceMessageReceiver;

View File

@ -10,7 +10,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.StickerDatabase;
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.database.model.StickerRecord;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.session.libsession.utilities.concurrent.SignalExecutors;
public final class StickerSearchRepository {

View File

@ -27,204 +27,204 @@ import network.loki.messenger.R;
import static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext;
public class GroupUtil {
private static final String ENCODED_CLOSED_GROUP_PREFIX = "__textsecure_group__!";
private static final String ENCODED_MMS_GROUP_PREFIX = "__signal_mms_group__!";
private static final String ENCODED_OPEN_GROUP_PREFIX = "__loki_public_chat_group__!";
private static final String ENCODED_RSS_FEED_GROUP_PREFIX = "__loki_rss_feed_group__!";
private static final String TAG = GroupUtil.class.getSimpleName();
public static String getEncodedId(SignalServiceGroup group) {
byte[] groupId = group.getGroupId();
if (group.getGroupType() == SignalServiceGroup.GroupType.PUBLIC_CHAT) {
return getEncodedOpenGroupId(groupId);
} else if (group.getGroupType() == SignalServiceGroup.GroupType.RSS_FEED) {
return getEncodedRSSFeedId(groupId);
}
return getEncodedId(groupId, false);
}
public static String getEncodedId(byte[] groupId, boolean mms) {
return (mms ? ENCODED_MMS_GROUP_PREFIX : ENCODED_CLOSED_GROUP_PREFIX) + Hex.toStringCondensed(groupId);
}
public static String getEncodedOpenGroupId(byte[] groupId) {
return ENCODED_OPEN_GROUP_PREFIX + Hex.toStringCondensed(groupId);
}
public static String getEncodedRSSFeedId(byte[] groupId) {
return ENCODED_RSS_FEED_GROUP_PREFIX + Hex.toStringCondensed(groupId);
}
public static byte[] getDecodedId(String groupId) throws IOException {
if (!isEncodedGroup(groupId)) {
throw new IOException("Invalid encoding");
}
return Hex.fromStringCondensed(groupId.split("!", 2)[1]);
}
public static String getDecodedStringId(String groupId) throws IOException {
byte[] id = getDecodedId(groupId);
return new String(id);
}
public static boolean isEncodedGroup(@NonNull String groupId) {
return groupId.startsWith(ENCODED_CLOSED_GROUP_PREFIX) || groupId.startsWith(ENCODED_MMS_GROUP_PREFIX) || groupId.startsWith(ENCODED_OPEN_GROUP_PREFIX) || groupId.startsWith(ENCODED_RSS_FEED_GROUP_PREFIX);
}
public static boolean isMmsGroup(@NonNull String groupId) {
return groupId.startsWith(ENCODED_MMS_GROUP_PREFIX);
}
public static boolean isOpenGroup(@NonNull String groupId) {
return groupId.startsWith(ENCODED_OPEN_GROUP_PREFIX);
}
public static boolean isRSSFeed(@NonNull String groupId) {
return groupId.startsWith(ENCODED_RSS_FEED_GROUP_PREFIX);
}
public static boolean isClosedGroup(@NonNull String groupId) {
return groupId.startsWith(ENCODED_CLOSED_GROUP_PREFIX);
}
@WorkerThread
public static Optional<OutgoingGroupMediaMessage> createGroupLeaveMessage(@NonNull Context context, @NonNull Recipient groupRecipient) {
String encodedGroupId = groupRecipient.getAddress().toGroupString();
GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
if (!groupDatabase.isActive(encodedGroupId)) {
Log.w(TAG, "Group has already been left.");
return Optional.absent();
}
ByteString decodedGroupId;
try {
decodedGroupId = ByteString.copyFrom(getDecodedId(encodedGroupId));
} catch (IOException e) {
Log.w(TAG, "Failed to decode group ID.", e);
return Optional.absent();
}
GroupContext groupContext = GroupContext.newBuilder()
.setId(decodedGroupId)
.setType(GroupContext.Type.QUIT)
.build();
return Optional.of(new OutgoingGroupMediaMessage(groupRecipient, groupContext, null, System.currentTimeMillis(), 0, null, Collections.emptyList(), Collections.emptyList()));
}
public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup) {
if (encodedGroup == null) {
return new GroupDescription(context, null);
}
try {
GroupContext groupContext = GroupContext.parseFrom(Base64.decode(encodedGroup));
return new GroupDescription(context, groupContext);
} catch (IOException e) {
Log.w(TAG, e);
return new GroupDescription(context, null);
}
}
public static class GroupDescription {
@NonNull private final Context context;
@Nullable private final GroupContext groupContext;
private final List<Recipient> newMembers;
private final List<Recipient> removedMembers;
private boolean wasCurrentUserRemoved;
public GroupDescription(@NonNull Context context, @Nullable GroupContext groupContext) {
this.context = context.getApplicationContext();
this.groupContext = groupContext;
this.newMembers = new LinkedList<>();
this.removedMembers = new LinkedList<>();
this.wasCurrentUserRemoved = false;
if (groupContext != null) {
List<String> newMembers = groupContext.getNewMembersList();
for (String member : newMembers) {
this.newMembers.add(this.toRecipient(member));
}
List<String> removedMembers = groupContext.getRemovedMembersList();
for (String member : removedMembers) {
this.removedMembers.add(this.toRecipient(member));
}
// If we were the one that quit then we need to leave the group (only relevant for slave
// devices in a multi device context)
if (!removedMembers.isEmpty()) {
String masterPublicKeyOrNull = TextSecurePreferences.getMasterHexEncodedPublicKey(context);
String masterPublicKey = masterPublicKeyOrNull != null ? masterPublicKeyOrNull : TextSecurePreferences.getLocalNumber(context);
wasCurrentUserRemoved = removedMembers.contains(masterPublicKey);
}
}
}
private Recipient toRecipient(String hexEncodedPublicKey) {
Address address = Address.Companion.fromSerialized(hexEncodedPublicKey);
return Recipient.from(context, address, false);
}
public String toString(Recipient sender) {
if (wasCurrentUserRemoved) {
return context.getString(R.string.GroupUtil_you_were_removed_from_group);
}
StringBuilder description = new StringBuilder();
description.append(context.getString(R.string.MessageRecord_s_updated_group, sender.toShortString()));
if (groupContext == null) {
return description.toString();
}
String title = groupContext.getName();
if (!newMembers.isEmpty()) {
description.append("\n");
description.append(context.getResources().getQuantityString(R.plurals.GroupUtil_joined_the_group,
newMembers.size(), toString(newMembers)));
}
if (!removedMembers.isEmpty()) {
description.append("\n");
description.append(context.getResources().getQuantityString(R.plurals.GroupUtil_removed_from_the_group,
removedMembers.size(), toString(removedMembers)));
}
if (title != null && !title.trim().isEmpty()) {
String separator = (!newMembers.isEmpty() || !removedMembers.isEmpty()) ? " " : "\n";
description.append(separator);
description.append(context.getString(R.string.GroupUtil_group_name_is_now, title));
}
return description.toString();
}
public void addListener(RecipientModifiedListener listener) {
if (!this.newMembers.isEmpty()) {
for (Recipient member : this.newMembers) {
member.addListener(listener);
}
}
}
private String toString(List<Recipient> recipients) {
String result = "";
for (int i=0;i<recipients.size();i++) {
result += recipients.get(i).toShortString();
if (i != recipients.size() -1 )
result += ", ";
}
return result;
}
}
// TODO: Remove this file
// private static final String ENCODED_CLOSED_GROUP_PREFIX = "__textsecure_group__!";
// private static final String ENCODED_MMS_GROUP_PREFIX = "__signal_mms_group__!";
// private static final String ENCODED_OPEN_GROUP_PREFIX = "__loki_public_chat_group__!";
// private static final String ENCODED_RSS_FEED_GROUP_PREFIX = "__loki_rss_feed_group__!";
// private static final String TAG = GroupUtil.class.getSimpleName();
//
// public static String getEncodedId(SignalServiceGroup group) {
// byte[] groupId = group.getGroupId();
// if (group.getGroupType() == SignalServiceGroup.GroupType.PUBLIC_CHAT) {
// return getEncodedOpenGroupId(groupId);
// } else if (group.getGroupType() == SignalServiceGroup.GroupType.RSS_FEED) {
// return getEncodedRSSFeedId(groupId);
// }
// return getEncodedId(groupId, false);
// }
//
// public static String getEncodedId(byte[] groupId, boolean mms) {
// return (mms ? ENCODED_MMS_GROUP_PREFIX : ENCODED_CLOSED_GROUP_PREFIX) + Hex.toStringCondensed(groupId);
// }
//
// public static String getEncodedOpenGroupId(byte[] groupId) {
// return ENCODED_OPEN_GROUP_PREFIX + Hex.toStringCondensed(groupId);
// }
//
// public static String getEncodedRSSFeedId(byte[] groupId) {
// return ENCODED_RSS_FEED_GROUP_PREFIX + Hex.toStringCondensed(groupId);
// }
//
// public static byte[] getDecodedId(String groupId) throws IOException {
// if (!isEncodedGroup(groupId)) {
// throw new IOException("Invalid encoding");
// }
//
// return Hex.fromStringCondensed(groupId.split("!", 2)[1]);
// }
//
// public static String getDecodedStringId(String groupId) throws IOException {
// byte[] id = getDecodedId(groupId);
// return new String(id);
// }
//
// public static boolean isEncodedGroup(@NonNull String groupId) {
// return groupId.startsWith(ENCODED_CLOSED_GROUP_PREFIX) || groupId.startsWith(ENCODED_MMS_GROUP_PREFIX) || groupId.startsWith(ENCODED_OPEN_GROUP_PREFIX) || groupId.startsWith(ENCODED_RSS_FEED_GROUP_PREFIX);
// }
//
// public static boolean isMmsGroup(@NonNull String groupId) {
// return groupId.startsWith(ENCODED_MMS_GROUP_PREFIX);
// }
//
// public static boolean isOpenGroup(@NonNull String groupId) {
// return groupId.startsWith(ENCODED_OPEN_GROUP_PREFIX);
// }
//
// public static boolean isRSSFeed(@NonNull String groupId) {
// return groupId.startsWith(ENCODED_RSS_FEED_GROUP_PREFIX);
// }
//
// public static boolean isClosedGroup(@NonNull String groupId) {
// return groupId.startsWith(ENCODED_CLOSED_GROUP_PREFIX);
// }
//
// @WorkerThread
// public static Optional<OutgoingGroupMediaMessage> createGroupLeaveMessage(@NonNull Context context, @NonNull Recipient groupRecipient) {
// String encodedGroupId = groupRecipient.getAddress().toGroupString();
// GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
//
// if (!groupDatabase.isActive(encodedGroupId)) {
// Log.w(TAG, "Group has already been left.");
// return Optional.absent();
// }
//
// ByteString decodedGroupId;
// try {
// decodedGroupId = ByteString.copyFrom(getDecodedId(encodedGroupId));
// } catch (IOException e) {
// Log.w(TAG, "Failed to decode group ID.", e);
// return Optional.absent();
// }
//
// GroupContext groupContext = GroupContext.newBuilder()
// .setId(decodedGroupId)
// .setType(GroupContext.Type.QUIT)
// .build();
//
// return Optional.of(new OutgoingGroupMediaMessage(groupRecipient, groupContext, null, System.currentTimeMillis(), 0, null, Collections.emptyList(), Collections.emptyList()));
// }
//
// public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup) {
// if (encodedGroup == null) {
// return new GroupDescription(context, null);
// }
//
// try {
// GroupContext groupContext = GroupContext.parseFrom(Base64.decode(encodedGroup));
// return new GroupDescription(context, groupContext);
// } catch (IOException e) {
// Log.w(TAG, e);
// return new GroupDescription(context, null);
// }
// }
//
// public static class GroupDescription {
//
// @NonNull private final Context context;
// @Nullable private final GroupContext groupContext;
// private final List<Recipient> newMembers;
// private final List<Recipient> removedMembers;
// private boolean wasCurrentUserRemoved;
//
// public GroupDescription(@NonNull Context context, @Nullable GroupContext groupContext) {
// this.context = context.getApplicationContext();
// this.groupContext = groupContext;
//
// this.newMembers = new LinkedList<>();
// this.removedMembers = new LinkedList<>();
// this.wasCurrentUserRemoved = false;
//
// if (groupContext != null) {
// List<String> newMembers = groupContext.getNewMembersList();
// for (String member : newMembers) {
// this.newMembers.add(this.toRecipient(member));
// }
//
// List<String> removedMembers = groupContext.getRemovedMembersList();
// for (String member : removedMembers) {
// this.removedMembers.add(this.toRecipient(member));
// }
//
// // If we were the one that quit then we need to leave the group (only relevant for slave
// // devices in a multi device context)
// if (!removedMembers.isEmpty()) {
// String masterPublicKeyOrNull = TextSecurePreferences.getMasterHexEncodedPublicKey(context);
// String masterPublicKey = masterPublicKeyOrNull != null ? masterPublicKeyOrNull : TextSecurePreferences.getLocalNumber(context);
// wasCurrentUserRemoved = removedMembers.contains(masterPublicKey);
// }
// }
// }
//
// private Recipient toRecipient(String hexEncodedPublicKey) {
// Address address = Address.Companion.fromSerialized(hexEncodedPublicKey);
// return Recipient.from(context, address, false);
// }
//
// public String toString(Recipient sender) {
// if (wasCurrentUserRemoved) {
// return context.getString(R.string.GroupUtil_you_were_removed_from_group);
// }
//
// StringBuilder description = new StringBuilder();
// description.append(context.getString(R.string.MessageRecord_s_updated_group, sender.toShortString()));
//
// if (groupContext == null) {
// return description.toString();
// }
//
// String title = groupContext.getName();
//
// if (!newMembers.isEmpty()) {
// description.append("\n");
// description.append(context.getResources().getQuantityString(R.plurals.GroupUtil_joined_the_group,
// newMembers.size(), toString(newMembers)));
// }
//
// if (!removedMembers.isEmpty()) {
// description.append("\n");
// description.append(context.getResources().getQuantityString(R.plurals.GroupUtil_removed_from_the_group,
// removedMembers.size(), toString(removedMembers)));
// }
//
// if (title != null && !title.trim().isEmpty()) {
// String separator = (!newMembers.isEmpty() || !removedMembers.isEmpty()) ? " " : "\n";
// description.append(separator);
// description.append(context.getString(R.string.GroupUtil_group_name_is_now, title));
// }
//
// return description.toString();
// }
//
// public void addListener(RecipientModifiedListener listener) {
// if (!this.newMembers.isEmpty()) {
// for (Recipient member : this.newMembers) {
// member.addListener(listener);
// }
// }
// }
//
// private String toString(List<Recipient> recipients) {
// String result = "";
//
// for (int i=0;i<recipients.size();i++) {
// result += recipients.get(i).toShortString();
//
// if (i != recipients.size() -1 )
// result += ", ";
// }
//
// return result;
// }
// }
}

View File

@ -4,6 +4,8 @@ import android.content.Context
import java.io.IOException
import java.lang.RuntimeException
import org.session.libsession.utilities.TextSecurePreferences
object VersionTracker {
@JvmStatic

View File

@ -1,12 +0,0 @@
package org.thoughtcrime.securesms.util.concurrent;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener;
import java.util.concurrent.ExecutionException;
public abstract class AssertedSuccessListener<T> implements Listener<T> {
@Override
public void onFailure(ExecutionException e) {
throw new AssertionError(e);
}
}

View File

@ -1,13 +0,0 @@
package org.thoughtcrime.securesms.util.concurrent;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public interface ListenableFuture<T> extends Future<T> {
void addListener(Listener<T> listener);
public interface Listener<T> {
public void onSuccess(T result);
public void onFailure(ExecutionException e);
}
}

View File

@ -1,137 +0,0 @@
package org.thoughtcrime.securesms.util.concurrent;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class SettableFuture<T> implements ListenableFuture<T> {
private final List<Listener<T>> listeners = new LinkedList<>();
private boolean completed;
private boolean canceled;
private volatile T result;
private volatile Throwable exception;
public SettableFuture() { }
public SettableFuture(T value) {
this.result = value;
this.completed = true;
}
@Override
public synchronized boolean cancel(boolean mayInterruptIfRunning) {
if (!completed && !canceled) {
canceled = true;
return true;
}
return false;
}
@Override
public synchronized boolean isCancelled() {
return canceled;
}
@Override
public synchronized boolean isDone() {
return completed;
}
public boolean set(T result) {
synchronized (this) {
if (completed || canceled) return false;
this.result = result;
this.completed = true;
notifyAll();
}
notifyAllListeners();
return true;
}
public boolean setException(Throwable throwable) {
synchronized (this) {
if (completed || canceled) return false;
this.exception = throwable;
this.completed = true;
notifyAll();
}
notifyAllListeners();
return true;
}
public void deferTo(ListenableFuture<T> other) {
other.addListener(new Listener<T>() {
@Override
public void onSuccess(T result) {
SettableFuture.this.set(result);
}
@Override
public void onFailure(ExecutionException e) {
SettableFuture.this.setException(e.getCause());
}
});
}
@Override
public synchronized T get() throws InterruptedException, ExecutionException {
while (!completed) wait();
if (exception != null) throw new ExecutionException(exception);
else return result;
}
@Override
public synchronized T get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException
{
long startTime = System.currentTimeMillis();
while (!completed && System.currentTimeMillis() - startTime > unit.toMillis(timeout)) {
wait(unit.toMillis(timeout));
}
if (!completed) throw new TimeoutException();
else return get();
}
@Override
public void addListener(Listener<T> listener) {
synchronized (this) {
listeners.add(listener);
if (!completed) return;
}
notifyListener(listener);
}
private void notifyAllListeners() {
List<Listener<T>> localListeners;
synchronized (this) {
localListeners = new LinkedList<>(listeners);
}
for (Listener<T> listener : localListeners) {
notifyListener(listener);
}
}
private void notifyListener(Listener<T> listener) {
if (exception != null) listener.onFailure(new ExecutionException(exception));
else listener.onSuccess(result);
}
}

View File

@ -1,40 +0,0 @@
package org.thoughtcrime.securesms.util.concurrent;
import androidx.annotation.NonNull;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class SignalExecutors {
public static final ExecutorService UNBOUNDED = Executors.newCachedThreadPool(new NumberedThreadFactory("signal-unbounded"));
public static final ExecutorService BOUNDED = Executors.newFixedThreadPool(Math.max(2, Math.min(Runtime.getRuntime().availableProcessors() - 1, 4)), new NumberedThreadFactory("signal-bounded"));
public static final ExecutorService SERIAL = Executors.newSingleThreadExecutor(new NumberedThreadFactory("signal-serial"));
public static ExecutorService newCachedSingleThreadExecutor(final String name) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 15, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), r -> new Thread(r, name));
executor.allowCoreThreadTimeOut(true);
return executor;
}
private static class NumberedThreadFactory implements ThreadFactory {
private final String baseName;
private final AtomicInteger counter;
NumberedThreadFactory(@NonNull String baseName) {
this.baseName = baseName;
this.counter = new AtomicInteger();
}
@Override
public Thread newThread(@NonNull Runnable r) {
return new Thread(r, baseName + "-" + counter.getAndIncrement());
}
}
}

View File

@ -1,58 +0,0 @@
package org.thoughtcrime.securesms.util.concurrent;
import androidx.lifecycle.Lifecycle;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.util.Util;
public class SimpleTask {
/**
* Runs a task in the background and passes the result of the computation to a task that is run
* on the main thread. Will only invoke the {@code foregroundTask} if the provided {@link Lifecycle}
* is in a valid (i.e. visible) state at that time. In this way, it is very similar to
* {@link AsyncTask}, but is safe in that you can guarantee your task won't be called when your
* view is in an invalid state.
*/
public static <E> void run(@NonNull Lifecycle lifecycle, @NonNull BackgroundTask<E> backgroundTask, @NonNull ForegroundTask<E> foregroundTask) {
if (!isValid(lifecycle)) {
return;
}
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
final E result = backgroundTask.run();
if (isValid(lifecycle)) {
Util.runOnMain(() -> {
if (isValid(lifecycle)) {
foregroundTask.run(result);
}
});
}
});
}
/**
* Runs a task in the background and passes the result of the computation to a task that is run on
* the main thread. Essentially {@link AsyncTask}, but lambda-compatible.
*/
public static <E> void run(@NonNull BackgroundTask<E> backgroundTask, @NonNull ForegroundTask<E> foregroundTask) {
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
final E result = backgroundTask.run();
Util.runOnMain(() -> foregroundTask.run(result));
});
}
private static boolean isValid(@NonNull Lifecycle lifecycle) {
return lifecycle.getCurrentState().isAtLeast(Lifecycle.State.CREATED);
}
public interface BackgroundTask<E> {
E run();
}
public interface ForegroundTask<E> {
void run(E result);
}
}

View File

@ -1,40 +0,0 @@
package org.thoughtcrime.securesms.util.dynamiclanguage;
import android.app.Activity;
import androidx.annotation.MainThread;
import androidx.core.os.ConfigurationCompat;
import org.thoughtcrime.securesms.logging.Log;
import java.util.Locale;
public final class DynamicLanguageActivityHelper {
private static final String TAG = Log.tag(DynamicLanguageActivityHelper.class);
private static String reentryProtection;
/**
* If the activity isn't in the specified language, it will restart the activity.
*/
@MainThread
public static void recreateIfNotInCorrectLanguage(Activity activity, String language) {
Locale currentActivityLocale = ConfigurationCompat.getLocales(activity.getResources().getConfiguration()).get(0);
Locale selectedLocale = LocaleParser.findBestMatchingLocaleForLanguage(language);
if (currentActivityLocale.equals(selectedLocale)) {
reentryProtection = "";
return;
}
String reentryKey = activity.getClass().getName() + ":" + selectedLocale;
if (!reentryKey.equals(reentryProtection)) {
reentryProtection = reentryKey;
Log.d(TAG, String.format("Activity Locale %s, Selected locale %s, restarting", currentActivityLocale, selectedLocale));
activity.recreate();
} else {
Log.d(TAG, String.format("Skipping recreate as looks like looping, Activity Locale %s, Selected locale %s", currentActivityLocale, selectedLocale));
}
}
}

View File

@ -1,34 +0,0 @@
package org.thoughtcrime.securesms.util.dynamiclanguage;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import java.util.Locale;
/**
* Updates a context with an alternative language.
*/
public final class DynamicLanguageContextWrapper {
public static Context updateContext(Context context, String language) {
final Locale newLocale = LocaleParser.findBestMatchingLocaleForLanguage(language);
Locale.setDefault(newLocale);
final Resources resources = context.getResources();
final Configuration config = resources.getConfiguration();
final Configuration newConfig = copyWithNewLocale(config, newLocale);
resources.updateConfiguration(newConfig, resources.getDisplayMetrics());
return context;
}
private static Configuration copyWithNewLocale(Configuration config, Locale locale) {
final Configuration copy = new Configuration(config);
copy.setLocale(locale);
return copy;
}
}

View File

@ -1,48 +0,0 @@
package org.thoughtcrime.securesms.util.dynamiclanguage;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Locale;
public final class LanguageString {
private LanguageString() {
}
/**
* @param languageString String in format language_REGION, e.g. en_US
* @return Locale, or null if cannot parse
*/
@Nullable
public static Locale parseLocale(@Nullable String languageString) {
if (languageString == null || languageString.isEmpty()) {
return null;
}
final Locale locale = createLocale(languageString);
if (!isValid(locale)) {
return null;
} else {
return locale;
}
}
private static Locale createLocale(@NonNull String languageString) {
final String language[] = languageString.split("_");
if (language.length == 2) {
return new Locale(language[0], language[1]);
} else {
return new Locale(language[0]);
}
}
private static boolean isValid(@NonNull Locale locale) {
try {
return locale.getISO3Language() != null && locale.getISO3Country() != null;
} catch (Exception ex) {
return false;
}
}
}

View File

@ -0,0 +1,26 @@
package org.thoughtcrime.securesms.util.dynamiclanguage
import android.content.res.Resources
import androidx.core.os.ConfigurationCompat
import network.loki.messenger.BuildConfig
import org.session.libsession.utilities.dynamiclanguage.LocaleParserHelperProtocol
import java.util.*
class LocaleParseHelper: LocaleParserHelperProtocol {
override fun appSupportsTheExactLocale(locale: Locale?): Boolean {
return if (locale == null) {
false
} else Arrays.asList(*BuildConfig.LANGUAGES).contains(locale.toString())
}
override fun findBestSystemLocale(): Locale {
val config = Resources.getSystem().configuration
val firstMatch = ConfigurationCompat.getLocales(config)
.getFirstMatch(BuildConfig.LANGUAGES)
return firstMatch ?: Locale.ENGLISH
}
}

View File

@ -1,53 +0,0 @@
package org.thoughtcrime.securesms.util.dynamiclanguage;
import android.content.res.Configuration;
import android.content.res.Resources;
import androidx.annotation.Nullable;
import androidx.core.os.ConfigurationCompat;
import network.loki.messenger.BuildConfig;
import java.util.Arrays;
import java.util.Locale;
final class LocaleParser {
private LocaleParser() {
}
/**
* Given a language, gets the best choice from the apps list of supported languages and the
* Systems set of languages.
*/
static Locale findBestMatchingLocaleForLanguage(@Nullable String language) {
final Locale locale = LanguageString.parseLocale(language);
if (appSupportsTheExactLocale(locale)) {
return locale;
} else {
return findBestSystemLocale();
}
}
private static boolean appSupportsTheExactLocale(@Nullable Locale locale) {
if (locale == null) {
return false;
}
return Arrays.asList(BuildConfig.LANGUAGES).contains(locale.toString());
}
/**
* Get the first preferred language the app supports.
*/
private static Locale findBestSystemLocale() {
final Configuration config = Resources.getSystem().getConfiguration();
final Locale firstMatch = ConfigurationCompat.getLocales(config)
.getFirstMatch(BuildConfig.LANGUAGES);
if (firstMatch != null) {
return firstMatch;
}
return Locale.ENGLISH;
}
}

View File

@ -52,7 +52,7 @@ import org.thoughtcrime.securesms.attachments.AttachmentServer;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.VideoSlide;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.session.libsession.utilities.ViewUtil;
import org.thoughtcrime.securesms.video.exo.AttachmentDataSourceFactory;
import java.io.IOException;

View File

@ -1,11 +1,9 @@
package org.session.libsession.utilities
import android.content.Context
import android.content.SharedPreferences
import android.hardware.Camera
import android.net.Uri
import android.os.Build
import android.preference.PreferenceManager.*
import android.preference.PreferenceManager.getDefaultSharedPreferences
import android.provider.Settings
import androidx.annotation.ArrayRes
import androidx.core.app.NotificationCompat
@ -167,18 +165,23 @@ object TextSecurePreferences {
private const val LAST_FCM_TOKEN_UPLOAD_TIME = "pref_last_fcm_token_upload_time_2"
private const val HAS_SEEN_PN_MODE_SHEET = "pref_has_seen_pn_mode_sheet"
@JvmStatic
fun isUsingFCM(context: Context): Boolean {
return getBooleanPreference(context, IS_USING_FCM, false)
}
@JvmStatic
fun setIsUsingFCM(context: Context, value: Boolean) {
setBooleanPreference(context, IS_USING_FCM, value)
}
@JvmStatic
fun getFCMToken(context: Context): String? {
return getStringPreference(context, FCM_TOKEN, "")
}
@JvmStatic
fun setFCMToken(context: Context, value: String) {
setStringPreference(context, FCM_TOKEN, value)
}
@ -192,6 +195,7 @@ object TextSecurePreferences {
}
// endregion
@JvmStatic
fun isScreenLockEnabled(context: Context): Boolean {
return getBooleanPreference(context, SCREEN_LOCK, false)
}
@ -349,6 +353,7 @@ object TextSecurePreferences {
return getBooleanPreference(context, TYPING_INDICATORS, false)
}
@JvmStatic
fun setTypingIndicatorsEnabled(context: Context, enabled: Boolean) {
setBooleanPreference(context, TYPING_INDICATORS, enabled)
}
@ -380,6 +385,7 @@ object TextSecurePreferences {
setStringPreference(context, PROFILE_KEY_PREF, key)
}
@JvmStatic
fun setProfileName(context: Context, name: String?) {
setStringPreference(context, PROFILE_NAME_PREF, name)
}
@ -389,6 +395,7 @@ object TextSecurePreferences {
return getStringPreference(context, PROFILE_NAME_PREF, null)
}
@JvmStatic
fun setProfileAvatarId(context: Context, id: Int) {
setIntegerPrefrence(context, PROFILE_AVATAR_ID_PREF, id)
}
@ -402,6 +409,7 @@ object TextSecurePreferences {
setStringPreference(context, PROFILE_AVATAR_URL_PREF, url)
}
@JvmStatic
fun getProfilePictureURL(context: Context): String? {
return getStringPreference(context, PROFILE_AVATAR_URL_PREF, null)
}
@ -765,6 +773,7 @@ object TextSecurePreferences {
setBooleanPreference(context, SCREEN_SECURITY_PREF, value)
}
@JvmStatic
fun isScreenSecurityEnabled(context: Context): Boolean {
return getBooleanPreference(context, SCREEN_SECURITY_PREF, true)
}
@ -851,6 +860,7 @@ object TextSecurePreferences {
return getBooleanPreference(context, SMS_DELIVERY_REPORT_PREF, false)
}
@JvmStatic
fun hasSeenWelcomeScreen(context: Context): Boolean {
return getBooleanPreference(context, SEEN_WELCOME_SCREEN_PREF, true)
}
@ -1026,10 +1036,12 @@ object TextSecurePreferences {
setIntegerPrefrence(context, NOTIFICATION_MESSAGES_CHANNEL_VERSION, version)
}
@JvmStatic
fun getNeedsMessagePull(context: Context): Boolean {
return getBooleanPreference(context, NEEDS_MESSAGE_PULL, false)
}
@JvmStatic
fun setNeedsMessagePull(context: Context, needsMessagePull: Boolean) {
setBooleanPreference(context, NEEDS_MESSAGE_PULL, needsMessagePull)
}
@ -1183,10 +1195,12 @@ object TextSecurePreferences {
setBooleanPreference(context, "has_seen_open_group_suggestion_sheet", true)
}
@JvmStatic
fun getLastProfilePictureUpload(context: Context): Long {
return getLongPreference(context, "last_profile_picture_upload", 0)
}
@JvmStatic
fun setLastProfilePictureUpload(context: Context, newValue: Long) {
setLongPreference(context, "last_profile_picture_upload", newValue)
}
@ -1199,6 +1213,7 @@ object TextSecurePreferences {
setBooleanPreference(context, "has_seen_gif_metadata_warning", true)
}
@JvmStatic
fun clearAll(context: Context) {
getDefaultSharedPreferences(context).edit().clear().commit()
}
@ -1219,6 +1234,31 @@ object TextSecurePreferences {
setBooleanPreference(context, "has_seen_light_theme_intro_sheet", true)
}
fun getLastSnodePoolRefreshDate(context: Context?): Long {
return getLongPreference(context!!, "last_snode_pool_refresh_date", 0)
}
fun setLastSnodePoolRefreshDate(context: Context?, date: Date) {
setLongPreference(context!!, "last_snode_pool_refresh_date", date.time)
}
fun getLastKeyPairMigrationNudge(context: Context?): Long {
return getLongPreference(context!!, "last_key_pair_migration_nudge", 0)
}
fun setLastKeyPairMigrationNudge(context: Context?, newValue: Long) {
setLongPreference(context!!, "last_key_pair_migration_nudge", newValue)
}
fun getIsMigratingKeyPair(context: Context?): Boolean {
return getBooleanPreference(context!!, "is_migrating_key_pair", false)
}
@JvmStatic
fun setIsMigratingKeyPair(context: Context?, newValue: Boolean) {
setBooleanPreference(context!!, "is_migrating_key_pair", newValue)
}
// endregion
/* TODO
// region Backup related

View File

@ -1,4 +1,4 @@
package org.thoughtcrime.securesms.util;
package org.session.libsession.utilities;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;