Skip to content

Commit 2f23a0e

Browse files
Merge branch 'dev'
2 parents f2c9ea2 + cc7e470 commit 2f23a0e

File tree

231 files changed

+16370
-30188
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

231 files changed

+16370
-30188
lines changed

app/build.gradle

+8-7
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,12 @@ dependencies {
4646
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
4747
implementation 'androidx.multidex:multidex:2.0.1'
4848
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
49-
implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
50-
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
51-
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
52-
implementation 'androidx.activity:activity-ktx:1.1.0'
53-
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
49+
implementation 'androidx.lifecycle:lifecycle-common-java8:2.3.1'
50+
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
51+
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
52+
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
53+
implementation 'androidx.activity:activity-ktx:1.2.2'
54+
implementation 'androidx.fragment:fragment-ktx:1.3.2'
5455
implementation "androidx.core:core-ktx:1.3.2"
5556
implementation "androidx.work:work-runtime-ktx:2.4.0"
5657

@@ -157,8 +158,8 @@ dependencies {
157158
testImplementation 'org.robolectric:shadows-multidex:4.2'
158159
}
159160

160-
def canonicalVersionCode = 151
161-
def canonicalVersionName = "1.9.1"
161+
def canonicalVersionCode = 157
162+
def canonicalVersionName = "1.10.0"
162163

163164
def postFixSize = 10
164165
def abiPostFix = ['armeabi-v7a' : 1,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.thoughtcrime.securesms
2+
3+
import android.util.Log
4+
import nl.komponents.kovenant.Kovenant
5+
import nl.komponents.kovenant.jvm.asDispatcher
6+
import org.session.libsignal.utilities.ThreadUtils
7+
import java.util.concurrent.Executors
8+
9+
object AppContext {
10+
11+
fun configureKovenant() {
12+
Kovenant.context {
13+
callbackContext.dispatcher = Executors.newSingleThreadExecutor().asDispatcher()
14+
workerContext.dispatcher = ThreadUtils.executorPool.asDispatcher()
15+
multipleCompletion = { v1, v2 ->
16+
Log.d("Loki", "Promise resolved more than once (first with $v1, then with $v2); ignoring $v2.")
17+
}
18+
}
19+
}
20+
}

app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java

+11-19
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@
3030
import androidx.multidex.MultiDexApplication;
3131

3232
import org.conscrypt.Conscrypt;
33-
import org.session.libsession.messaging.MessagingConfiguration;
33+
import org.session.libsession.messaging.MessagingModuleConfiguration;
3434
import org.session.libsession.messaging.avatars.AvatarHelper;
35+
import org.session.libsession.messaging.file_server.FileServerAPI;
3536
import org.session.libsession.messaging.jobs.JobQueue;
36-
import org.session.libsession.messaging.opengroups.OpenGroupAPI;
37+
import org.session.libsession.messaging.mentions.MentionsManager;
38+
import org.session.libsession.messaging.open_groups.OpenGroupAPI;
3739
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier;
3840
import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPoller;
3941
import org.session.libsession.messaging.sending_receiving.pollers.Poller;
4042
import org.session.libsession.messaging.threads.Address;
41-
import org.session.libsession.snode.SnodeConfiguration;
43+
import org.session.libsession.snode.SnodeModule;
4244
import org.session.libsession.utilities.IdentityKeyUtil;
4345
import org.session.libsession.utilities.SSKEnvironment;
4446
import org.session.libsession.utilities.TextSecurePreferences;
@@ -47,12 +49,7 @@
4749
import org.session.libsession.utilities.dynamiclanguage.LocaleParser;
4850
import org.session.libsession.utilities.preferences.ProfileKeyUtil;
4951
import org.session.libsignal.service.api.util.StreamDetails;
50-
import org.session.libsignal.service.loki.api.PushNotificationAPI;
51-
import org.session.libsignal.service.loki.api.SnodeAPI;
52-
import org.session.libsignal.service.loki.api.SwarmAPI;
53-
import org.session.libsignal.service.loki.api.fileserver.FileServerAPI;
54-
import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol;
55-
import org.session.libsignal.service.loki.utilities.mentions.MentionsManager;
52+
import org.session.libsignal.service.loki.LokiAPIDatabaseProtocol;
5653
import org.session.libsignal.utilities.logging.Log;
5754
import org.signal.aesgcmprovider.AesGcmProvider;
5855
import org.thoughtcrime.securesms.components.TypingStatusSender;
@@ -106,6 +103,7 @@
106103
import kotlin.Unit;
107104
import kotlinx.coroutines.Job;
108105
import network.loki.messenger.BuildConfig;
106+
import nl.komponents.kovenant.Kovenant;
109107

110108
import static nl.komponents.kovenant.android.KovenantAndroid.startKovenant;
111109
import static nl.komponents.kovenant.android.KovenantAndroid.stopKovenant;
@@ -166,24 +164,22 @@ public void onCreate() {
166164
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
167165
// Loki
168166
// ========
167+
AppContext.INSTANCE.configureKovenant();
169168
messageNotifier = new OptimizedMessageNotifier(new DefaultMessageNotifier());
170169
broadcaster = new Broadcaster(this);
171170
threadNotificationHandler = new Handler(Looper.getMainLooper());
172171
LokiAPIDatabase apiDB = DatabaseFactory.getLokiAPIDatabase(this);
173172
LokiThreadDatabase threadDB = DatabaseFactory.getLokiThreadDatabase(this);
174173
LokiUserDatabase userDB = DatabaseFactory.getLokiUserDatabase(this);
175174
String userPublicKey = TextSecurePreferences.getLocalNumber(this);
176-
MessagingConfiguration.Companion.configure(this,
175+
MessagingModuleConfiguration.Companion.configure(this,
177176
DatabaseFactory.getStorage(this),
178177
DatabaseFactory.getAttachmentProvider(this),
179178
new SessionProtocolImpl(this));
180-
SnodeConfiguration.Companion.configure(apiDB, broadcaster);
179+
SnodeModule.Companion.configure(apiDB, broadcaster);
181180
if (userPublicKey != null) {
182-
SwarmAPI.Companion.configureIfNeeded(apiDB);
183-
SnodeAPI.Companion.configureIfNeeded(userPublicKey, apiDB, broadcaster);
184-
MentionsManager.Companion.configureIfNeeded(userPublicKey, threadDB, userDB);
181+
MentionsManager.Companion.configureIfNeeded(userPublicKey, userDB);
185182
}
186-
PushNotificationAPI.Companion.configureIfNeeded(BuildConfig.DEBUG);
187183
setUpStorageAPIIfNeeded();
188184
resubmitProfilePictureIfNeeded();
189185
publicChatManager = new PublicChatManager(this);
@@ -428,7 +424,6 @@ public boolean setUpStorageAPIIfNeeded() {
428424
byte[] userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(this).getPrivateKey().serialize();
429425
LokiAPIDatabaseProtocol apiDB = DatabaseFactory.getLokiAPIDatabase(this);
430426
FileServerAPI.Companion.configure(userPublicKey, userPrivateKey, apiDB);
431-
org.session.libsession.messaging.fileserver.FileServerAPI.Companion.configure(userPublicKey, userPrivateKey, apiDB);
432427
return true;
433428
}
434429

@@ -458,13 +453,10 @@ private void setUpPollingIfNeeded() {
458453
String userPublicKey = TextSecurePreferences.getLocalNumber(this);
459454
if (userPublicKey == null) return;
460455
if (poller != null) {
461-
SnodeAPI.shared.setUserPublicKey(userPublicKey);
462456
poller.setUserPublicKey(userPublicKey);
463457
return;
464458
}
465459
LokiAPIDatabase apiDB = DatabaseFactory.getLokiAPIDatabase(this);
466-
SwarmAPI.Companion.configureIfNeeded(apiDB);
467-
SnodeAPI.Companion.configureIfNeeded(userPublicKey, apiDB, broadcaster);
468460
poller = new Poller();
469461
closedGroupPoller = new ClosedGroupPoller();
470462
}

app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.thoughtcrime.securesms.mms.GlideRequests;
1010
import org.session.libsignal.libsignal.util.guava.Optional;
1111

12-
import org.session.libsession.messaging.sending_receiving.linkpreview.LinkPreview;
12+
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview;
1313
import org.session.libsession.messaging.threads.Address;
1414
import org.session.libsession.messaging.threads.recipients.Recipient;
1515

app/src/main/java/org/thoughtcrime/securesms/MediaOverviewActivity.java

+18
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
5353
import com.google.android.material.tabs.TabLayout;
5454

55+
import org.session.libsession.messaging.messages.control.DataExtractionNotification;
56+
import org.session.libsession.messaging.sending_receiving.MessageSender;
5557
import org.session.libsession.messaging.threads.Address;
5658
import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter;
5759
import org.thoughtcrime.securesms.database.MediaDatabase;
@@ -351,13 +353,29 @@ protected void onPostExecute(List<SaveAttachmentTask.Attachment> attachments) {
351353
saveTask.executeOnExecutor(THREAD_POOL_EXECUTOR,
352354
attachments.toArray(new SaveAttachmentTask.Attachment[attachments.size()]));
353355
actionMode.finish();
356+
// Sending a Data extraction notification (for incoming attachments only)
357+
boolean containsIncoming = mediaRecords.parallelStream().anyMatch(m -> !m.isOutgoing());
358+
if (containsIncoming) {
359+
//TODO uncomment line below when Data extraction will be activated
360+
//sendMediaSavedNotificationIfNeeded();
361+
}
354362
}
355363
}.execute();
356364
})
357365
.execute();
358366
}, mediaRecords.size());
359367
}
360368

369+
/**
370+
* Send a MediaSaved notification to the recipient
371+
*/
372+
private void sendMediaSavedNotificationIfNeeded() {
373+
// we don't send media saved notification for groups
374+
if (recipient.isGroupRecipient()) return;
375+
DataExtractionNotification message = new DataExtractionNotification(new DataExtractionNotification.Kind.MediaSaved(System.currentTimeMillis()));
376+
MessageSender.send(message, recipient.getAddress());
377+
}
378+
361379
@SuppressLint("StaticFieldLeak")
362380
private void handleDeleteMedia(@NonNull Collection<MediaDatabase.MediaRecord> mediaRecords) {
363381
int recordCount = mediaRecords.size();

app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
import android.widget.FrameLayout;
4040
import android.widget.TextView;
4141
import android.widget.Toast;
42-
42+
import org.session.libsession.messaging.messages.control.DataExtractionNotification;
43+
import org.session.libsession.messaging.sending_receiving.MessageSender;
4344
import androidx.annotation.NonNull;
4445
import androidx.annotation.Nullable;
4546
import androidx.appcompat.app.ActionBar;
@@ -52,7 +53,6 @@
5253
import androidx.recyclerview.widget.RecyclerView;
5354
import androidx.viewpager.widget.PagerAdapter;
5455
import androidx.viewpager.widget.ViewPager;
55-
5656
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment;
5757
import org.session.libsession.messaging.threads.Address;
5858
import org.session.libsession.messaging.threads.recipients.Recipient;
@@ -352,11 +352,26 @@ private void saveToDisk() {
352352
saveTask.executeOnExecutor(
353353
AsyncTask.THREAD_POOL_EXECUTOR,
354354
new Attachment(mediaItem.uri, mediaItem.type, saveDate, null));
355+
// Sending a Data extraction notification (for incoming attachments only)
356+
if(!mediaItem.outgoing) {
357+
//TODO uncomment line below when Data extraction will be activated
358+
//sendMediaSavedNotificationIfNeeded();
359+
}
355360
})
356361
.execute();
357362
});
358363
}
359364

365+
/**
366+
* Send a MediaSaved notification to the recipient
367+
*/
368+
private void sendMediaSavedNotificationIfNeeded() {
369+
// we don't send media saved notification for groups
370+
if (conversationRecipient.isGroupRecipient()) return;
371+
DataExtractionNotification message = new DataExtractionNotification(new DataExtractionNotification.Kind.MediaSaved(System.currentTimeMillis()));
372+
MessageSender.send(message, conversationRecipient.getAddress());
373+
}
374+
360375
@SuppressLint("StaticFieldLeak")
361376
private void deleteMedia() {
362377
MediaItem mediaItem = getCurrentMediaItem();

app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.session.libsession.messaging.messages.visible.LinkPreview;
4141
import org.session.libsession.messaging.messages.visible.Quote;
4242
import org.session.libsession.messaging.messages.visible.VisibleMessage;
43+
import org.session.libsession.messaging.open_groups.OpenGroup;
4344
import org.session.libsession.messaging.sending_receiving.MessageSender;
4445
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
4546
import org.thoughtcrime.securesms.MessageDetailsRecipientAdapter.RecipientDeliveryStatus;
@@ -64,7 +65,6 @@
6465
import org.session.libsession.utilities.ExpirationUtil;
6566
import org.session.libsession.utilities.Util;
6667
import org.session.libsignal.libsignal.util.guava.Optional;
67-
import org.session.libsignal.service.loki.api.opengroups.PublicChat;
6868

6969
import java.lang.ref.WeakReference;
7070
import java.sql.Date;
@@ -263,7 +263,7 @@ private void updateRecipients(MessageRecord messageRecord, Recipient recipient,
263263
}
264264
toFrom.setText(toFromRes);
265265
long threadID = messageRecord.getThreadId();
266-
PublicChat openGroup = DatabaseFactory.getLokiThreadDatabase(this).getPublicChat(threadID);
266+
OpenGroup openGroup = DatabaseFactory.getLokiThreadDatabase(this).getPublicChat(threadID);
267267
if (openGroup != null && messageRecord.isOutgoing()) {
268268
toFrom.setVisibility(View.GONE);
269269
separator.setVisibility(View.GONE);

app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public void onServiceConnected(ComponentName name, IBinder service) {
8484
}
8585
@Override
8686
public void onServiceDisconnected(ComponentName name) {
87+
keyCachingService.setMasterSecret(new Object());
8788
keyCachingService = null;
8889
}
8990
}, Context.BIND_AUTO_CREATE);
@@ -133,7 +134,9 @@ public void onActivityResult(int requestCode, int resultcode, Intent data) {
133134
private void handleAuthenticated() {
134135
authenticated = true;
135136
//TODO Replace with a proper call.
136-
keyCachingService.setMasterSecret(new Object());
137+
if (keyCachingService != null) {
138+
keyCachingService.setMasterSecret(new Object());
139+
}
137140

138141
// Finish and proceed with the next intent.
139142
Intent nextIntent = getIntent().getParcelableExtra("next_intent");
@@ -188,6 +191,8 @@ private void resumeScreenLock() {
188191

189192
if (!keyguardManager.isKeyguardSecure()) {
190193
Log.w(TAG ,"Keyguard not secure...");
194+
TextSecurePreferences.setScreenLockEnabled(getApplicationContext(), false);
195+
TextSecurePreferences.setScreenLockTimeout(getApplicationContext(), 0);
191196
handleAuthenticated();
192197
return;
193198
}

app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt

+19-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.text.TextUtils
55
import com.google.protobuf.ByteString
66
import org.greenrobot.eventbus.EventBus
77
import org.session.libsession.database.MessageDataProvider
8+
import org.session.libsession.messaging.open_groups.OpenGroup
89
import org.session.libsession.messaging.sending_receiving.attachments.*
910
import org.session.libsession.messaging.threads.Address
1011
import org.session.libsession.messaging.utilities.DotNetAPI
@@ -26,7 +27,6 @@ import org.thoughtcrime.securesms.util.MediaUtil
2627
import java.io.IOException
2728
import java.io.InputStream
2829

29-
3030
class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), MessageDataProvider {
3131

3232
override fun getAttachmentStream(attachmentId: Long): SessionServiceAttachmentStream? {
@@ -104,6 +104,10 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper)
104104
return smsDatabase.isOutgoingMessage(timestamp) || mmsDatabase.isOutgoingMessage(timestamp)
105105
}
106106

107+
override fun getOpenGroup(threadID: Long): OpenGroup? {
108+
return null // TODO: Implement
109+
}
110+
107111
override fun updateAttachmentAfterUploadSucceeded(attachmentId: Long, attachmentStream: SignalServiceAttachmentStream, attachmentKey: ByteArray, uploadResult: DotNetAPI.UploadResult) {
108112
val database = DatabaseFactory.getAttachmentDatabase(context)
109113
val databaseAttachment = getDatabaseAttachment(attachmentId) ?: return
@@ -133,9 +137,20 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper)
133137
return openGroupMessagingDatabase.getMessageID(serverID)
134138
}
135139

136-
override fun deleteMessage(messageID: Long) {
137-
val messagingDatabase = DatabaseFactory.getSmsDatabase(context)
138-
messagingDatabase.deleteMessage(messageID)
140+
override fun getMessageID(serverId: Long, threadId: Long): Pair<Long, Boolean>? {
141+
val messageDB = DatabaseFactory.getLokiMessageDatabase(context)
142+
return messageDB.getMessageID(serverId, threadId)
143+
}
144+
145+
override fun deleteMessage(messageID: Long, isSms: Boolean) {
146+
if (isSms) {
147+
val db = DatabaseFactory.getSmsDatabase(context)
148+
db.deleteMessage(messageID)
149+
} else {
150+
val db = DatabaseFactory.getMmsDatabase(context)
151+
db.delete(messageID)
152+
}
153+
DatabaseFactory.getLokiMessageDatabase(context).deleteMessage(messageID, isSms)
139154
}
140155

141156
override fun getDatabaseAttachment(attachmentId: Long): DatabaseAttachment? {

app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.thoughtcrime.securesms.mms.GlideRequests;
3131
import org.thoughtcrime.securesms.mms.SlideDeck;
3232

33-
import org.session.libsession.messaging.sending_receiving.linkpreview.LinkPreview;
33+
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview;
3434
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel;
3535
import org.session.libsession.messaging.threads.recipients.Recipient;
3636
import org.session.libsession.utilities.TextSecurePreferences;

app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.thoughtcrime.securesms.mms.ImageSlide;
1818
import org.thoughtcrime.securesms.mms.SlidesClickedListener;
1919

20-
import org.session.libsession.messaging.sending_receiving.linkpreview.LinkPreview;
20+
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview;
2121

2222
import network.loki.messenger.R;
2323
import okhttp3.HttpUrl;

app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.annimon.stream.Stream;
2222
import com.bumptech.glide.load.engine.DiskCacheStrategy;
2323

24+
import org.session.libsession.messaging.open_groups.OpenGroup;
2425
import org.session.libsession.messaging.sending_receiving.attachments.Attachment;
2526

2627
import org.thoughtcrime.securesms.database.DatabaseFactory;
@@ -35,7 +36,6 @@
3536
import org.session.libsession.utilities.TextSecurePreferences;
3637
import org.session.libsession.utilities.ThemeUtil;
3738
import org.session.libsession.utilities.Util;
38-
import org.session.libsignal.service.loki.api.opengroups.PublicChat;
3939

4040
import java.util.List;
4141

@@ -201,7 +201,7 @@ private void setQuoteAuthor(@NonNull Recipient author) {
201201

202202
long threadID = DatabaseFactory.getThreadDatabase(getContext()).getOrCreateThreadIdFor(conversationRecipient);
203203
String senderHexEncodedPublicKey = author.getAddress().serialize();
204-
PublicChat publicChat = DatabaseFactory.getLokiThreadDatabase(getContext()).getPublicChat(threadID);
204+
OpenGroup publicChat = DatabaseFactory.getLokiThreadDatabase(getContext()).getPublicChat(threadID);
205205
if (senderHexEncodedPublicKey.equalsIgnoreCase(TextSecurePreferences.getLocalNumber(getContext()))) {
206206
quoteeDisplayName = TextSecurePreferences.getProfileName(getContext());
207207
} else if (publicChat != null) {

0 commit comments

Comments
 (0)