mirror of
https://github.com/oxen-io/session-android.git
synced 2025-03-29 20:52:15 +00:00
WIP clean
This commit is contained in:
parent
6cd00aec77
commit
1f96ab1cf5
app/src/main/java/org/thoughtcrime/securesms
ApplicationContext.javaBaseActionBarActivity.javaBaseActivity.javaDatabaseUpgradeActivity.javaExpirationDialog.javaMediaOverviewActivity.javaMediaPreviewActivity.javaMessageDetailsActivity.javaMessageDetailsRecipientAdapter.javaPassphrasePromptActivity.javaPassphraseRequiredActionBarActivity.javaShareActivity.javaShortcutLauncherActivity.javaTypingIndicatorIntroFragment.java
audio
components
loki/activities
mms
net
notifications
DefaultMessageNotifier.javaFailedNotificationBuilder.javaMarkReadReceiver.javaPendingMessageNotificationBuilder.javaSingleRecipientNotificationBuilder.java
permissions
profiles
providers
service
sms
stickers
StickerKeyboardPageFragment.javaStickerKeyboardProvider.javaStickerKeyboardRepository.javaStickerManagementRepository.javaStickerPackPreviewActivity.javaStickerPackPreviewRepository.javaStickerSearchRepository.java
util
GroupUtil.javaTextSecurePreferences.javaVersionTracker.kt
concurrent
AssertedSuccessListener.javaListenableFuture.javaSettableFuture.javaSignalExecutors.javaSimpleTask.java
dynamiclanguage
video
libsession/src/main/java/org/session/libsession/utilities
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
6
app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java
6
app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java
@ -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;
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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 {
|
||||
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
40
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java
40
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
34
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java
34
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
26
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParseHelper.kt
Normal file
26
app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParseHelper.kt
Normal 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
|
||||
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
package org.session.libsession.utilities;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ExecutorService;
|
Loading…
x
Reference in New Issue
Block a user