From 649bfee647bcbf05f0fceda58b30afb271bd4046 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 08:56:08 +1000 Subject: [PATCH 01/12] Fix HTTP utility --- .../session/libsignal/service/loki/HTTP.kt | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/HTTP.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/HTTP.kt index 774e17cd8d..90a20d2282 100644 --- a/libsignal/src/main/java/org/session/libsignal/service/loki/HTTP.kt +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/HTTP.kt @@ -39,6 +39,25 @@ object HTTP { .build() } + private fun getDefaultConnection(timeout: Long): OkHttpClient { + // Snode to snode communication uses self-signed certificates but clients can safely ignore this + val trustManager = object : X509TrustManager { + + override fun checkClientTrusted(chain: Array?, authorizationType: String?) { } + override fun checkServerTrusted(chain: Array?, authorizationType: String?) { } + override fun getAcceptedIssuers(): Array { return arrayOf() } + } + val sslContext = SSLContext.getInstance("SSL") + sslContext.init(null, arrayOf( trustManager ), SecureRandom()) + return OkHttpClient().newBuilder() + .sslSocketFactory(sslContext.socketFactory, trustManager) + .hostnameVerifier { _, _ -> true } + .connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS) + .build() + } + private const val timeout: Long = 10 class HTTPRequestFailedException(val statusCode: Int, val json: Map<*, *>?) @@ -89,12 +108,7 @@ object HTTP { if (useSeedNodeConnection) { throw IllegalStateException("Setting a custom timeout is only allowed for requests to snodes.") } - connection = OkHttpClient() - .newBuilder() - .connectTimeout(timeout, TimeUnit.SECONDS) - .readTimeout(timeout, TimeUnit.SECONDS) - .writeTimeout(timeout, TimeUnit.SECONDS) - .build() + connection = getDefaultConnection(timeout) } else { connection = if (useSeedNodeConnection) seedNodeConnection else defaultConnection } From 54b93e56a082258165c167d74da998f1e45fc31c Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 08:58:11 +1000 Subject: [PATCH 02/12] Update version number --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8b453260bb..06015ea874 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -158,8 +158,8 @@ dependencies { testImplementation 'org.robolectric:shadows-multidex:4.2' } -def canonicalVersionCode = 161 -def canonicalVersionName = "1.10.2" +def canonicalVersionCode = 162 +def canonicalVersionName = "1.10.3" def postFixSize = 10 def abiPostFix = ['armeabi-v7a' : 1, From 43c5fce526473bf8d1563c8833ec5a354b8adf37 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 10:09:12 +1000 Subject: [PATCH 03/12] Make chips look better --- .../securesms/loki/activities/JoinPublicChatActivity.kt | 8 +++++--- .../main/res/layout-sw400dp/fragment_enter_chat_url.xml | 6 ++++++ app/src/main/res/layout/default_group_chip.xml | 8 +++++--- app/src/main/res/layout/fragment_enter_chat_url.xml | 6 ++++++ app/src/main/res/values-notnight-v21/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt index f0490d379d..e7c018bc48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt @@ -10,6 +10,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import android.widget.GridLayout import android.widget.Toast import androidx.activity.viewModels import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory @@ -184,8 +185,9 @@ class EnterChatURLFragment : Fragment() { private fun populateDefaultGroups(groups: List) { defaultRoomsGridLayout.removeAllViews() + defaultRoomsGridLayout.useDefaultMargins = false groups.forEach { defaultGroup -> - val chip = layoutInflater.inflate(R.layout.default_group_chip,defaultRoomsGridLayout, false) as Chip + val chip = layoutInflater.inflate(R.layout.default_group_chip, defaultRoomsGridLayout, false) as Chip val drawable = defaultGroup.image?.let { bytes -> val bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.size) RoundedBitmapDrawableFactory.create(resources,bitmap).apply { @@ -197,10 +199,10 @@ class EnterChatURLFragment : Fragment() { chip.setOnClickListener { (requireActivity() as JoinPublicChatActivity).joinPublicChatIfPossible(defaultGroup.joinURL) } + defaultRoomsGridLayout.addView(chip) } - if (groups.size and 1 != 0) { - // add a filler weight 1 view + if ((groups.size and 1) != 0) { // This checks that the number of rooms is even layoutInflater.inflate(R.layout.grid_layout_filler, defaultRoomsGridLayout) } } diff --git a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml index a4b088aac1..db470a8785 100644 --- a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml @@ -33,8 +33,12 @@ >>>>>> 133bcac17 (Make chips look better) android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> @@ -42,12 +46,14 @@ android:layout_marginVertical="16dp" android:textSize="18sp" android:textStyle="bold" + android:paddingHorizontal="24dp" android:text="@string/activity_join_public_chat_join_rooms" android:layout_width="match_parent" android:layout_height="wrap_content"/> diff --git a/app/src/main/res/layout/default_group_chip.xml b/app/src/main/res/layout/default_group_chip.xml index 844898e885..e0a410ca6b 100644 --- a/app/src/main/res/layout/default_group_chip.xml +++ b/app/src/main/res/layout/default_group_chip.xml @@ -4,11 +4,13 @@ xmlns:tools="http://schemas.android.com/tools" android:theme="@style/Theme.MaterialComponents.DayNight" style="?attr/chipStyle" - app:chipStartPadding="6dp" + app:chipStartPadding="4dp" + app:chipBackgroundColor="@color/open_group_chip_color" android:layout_columnWeight="1" - android:layout_marginHorizontal="2dp" tools:text="Main Group" android:ellipsize="end" tools:layout_width="wrap_content" + app:chipMinTouchTargetSize="0dp" + android:layout_margin="4dp" android:layout_width="0dp" - android:layout_height="52dp" /> \ No newline at end of file + android:layout_height="wrap_content" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_enter_chat_url.xml b/app/src/main/res/layout/fragment_enter_chat_url.xml index 7affed157e..27dd369d71 100644 --- a/app/src/main/res/layout/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout/fragment_enter_chat_url.xml @@ -33,8 +33,12 @@ >>>>>> 133bcac17 (Make chips look better) android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> @@ -42,12 +46,14 @@ android:layout_marginVertical="16dp" android:textSize="18sp" android:textStyle="bold" + android:paddingHorizontal="24dp" android:text="@string/activity_join_public_chat_join_rooms" android:layout_width="match_parent" android:layout_height="wrap_content"/> diff --git a/app/src/main/res/values-notnight-v21/colors.xml b/app/src/main/res/values-notnight-v21/colors.xml index 4d90ff3f87..36e4a1858d 100644 --- a/app/src/main/res/values-notnight-v21/colors.xml +++ b/app/src/main/res/values-notnight-v21/colors.xml @@ -22,6 +22,7 @@ #F5F5F5 #FCFCFC #F5F5F5 + #0D000000 #ffffff diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ecbcd77ec7..8771cdae4e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -31,6 +31,7 @@ #1B1B1B #212121 #FFCE3A + #0DFFFFFF #5ff8b0 From 446ff908bacbbedb8258a983d4aa5218fb1da136 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 10:56:47 +1000 Subject: [PATCH 04/12] Clean up RetrieveProfileAvatarJob --- .../jobs/RetrieveProfileAvatarJob.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java index a9c2025258..26e3280f98 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.jobs; - import android.app.Application; import android.text.TextUtils; @@ -39,7 +38,7 @@ public class RetrieveProfileAvatarJob extends BaseJob implements InjectableType private static final String TAG = RetrieveProfileAvatarJob.class.getSimpleName(); - private static final int MAX_PROFILE_SIZE_BYTES = 20 * 1024 * 1024; + private static final int MAX_PROFILE_SIZE_BYTES = 10 * 1024 * 1024; private static final String KEY_PROFILE_AVATAR = "profile_avatar"; private static final String KEY_ADDRESS = "address"; @@ -51,18 +50,17 @@ public class RetrieveProfileAvatarJob extends BaseJob implements InjectableType public RetrieveProfileAvatarJob(Recipient recipient, String profileAvatar) { this(new Job.Parameters.Builder() - .setQueue("RetrieveProfileAvatarJob" + recipient.getAddress().serialize()) - .addConstraint(NetworkConstraint.KEY) - .setLifespan(TimeUnit.HOURS.toMillis(1)) - .setMaxAttempts(3) - .build(), + .setQueue("RetrieveProfileAvatarJob" + recipient.getAddress().serialize()) + .addConstraint(NetworkConstraint.KEY) + .setLifespan(TimeUnit.HOURS.toMillis(1)) + .setMaxAttempts(10) + .build(), recipient, profileAvatar); } private RetrieveProfileAvatarJob(@NonNull Job.Parameters parameters, @NonNull Recipient recipient, String profileAvatar) { super(parameters); - this.recipient = recipient; this.profileAvatar = profileAvatar; } @@ -70,9 +68,10 @@ public class RetrieveProfileAvatarJob extends BaseJob implements InjectableType @Override public @NonNull Data serialize() { - return new Data.Builder().putString(KEY_PROFILE_AVATAR, profileAvatar) - .putString(KEY_ADDRESS, recipient.getAddress().serialize()) - .build(); + return new Data.Builder() + .putString(KEY_PROFILE_AVATAR, profileAvatar) + .putString(KEY_ADDRESS, recipient.getAddress().serialize()) + .build(); } @Override From 72540aa7873ae407b2d9ea394e8eec8f41c80c53 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 13:09:40 +1000 Subject: [PATCH 05/12] Cancel jobs when thread is deleted --- .../securesms/loki/activities/HomeActivity.kt | 2 ++ .../loki/database/SessionJobDatabase.kt | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index 3bc33c9746..ee5e22e857 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -332,6 +332,8 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), lifecycleScope.launch(Dispatchers.Main) { val context = this@HomeActivity as Context + DatabaseFactory.getSessionJobDatabase(this@HomeActivity).cancelPendingMessageSendJobs(threadID) + // Send a leave group message if this is an active closed group if (recipient.address.isClosedGroup && DatabaseFactory.getGroupDatabase(context).isActive(recipient.address.toGroupString())) { var isClosedGroup: Boolean diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt index 22c8d48f44..c5e5e102ce 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt @@ -71,6 +71,30 @@ class SessionJobDatabase(context: Context, helper: SQLCipherOpenHelper) : Databa } } + fun cancelPendingMessageSendJobs(threadID: Long) { + val database = databaseHelper.writableDatabase + val attachmentUploadJobKeys = mutableListOf() + database.getAll(sessionJobTable, "$jobType = ?", arrayOf( AttachmentUploadJob.KEY )) { cursor -> + val job = jobFromCursor(cursor) as AttachmentUploadJob? + if (job != null && job.threadID == threadID.toString()) { attachmentUploadJobKeys.add(job.id!!) } + } + val messageSendJobKeys = mutableListOf() + database.getAll(sessionJobTable, "$jobType = ?", arrayOf( MessageSendJob.KEY )) { cursor -> + val job = jobFromCursor(cursor) as MessageSendJob? + if (job != null && job.message.threadID == threadID) { messageSendJobKeys.add(job.id!!) } + } + if (attachmentUploadJobKeys.isNotEmpty()) { + val attachmentUploadJobKeysAsString = attachmentUploadJobKeys.joinToString(", ") + database.delete(sessionJobTable, "${Companion.jobType} = ? AND ${Companion.jobID} IN (?)", + arrayOf( AttachmentUploadJob.KEY, attachmentUploadJobKeysAsString )) + } + if (messageSendJobKeys.isNotEmpty()) { + val messageSendJobKeysAsString = messageSendJobKeys.joinToString(", ") + database.delete(sessionJobTable, "${Companion.jobType} = ? AND ${Companion.jobID} IN (?)", + arrayOf( MessageSendJob.KEY, messageSendJobKeysAsString )) + } + } + fun isJobCanceled(job: Job): Boolean { val database = databaseHelper.readableDatabase var cursor: android.database.Cursor? = null From 816e44a7ecb036c26190c0466df8c45a5dc6c166 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 13:30:52 +1000 Subject: [PATCH 06/12] Update copy --- app/src/main/res/layout-sw400dp/activity_pn_mode.xml | 4 ++-- app/src/main/res/layout/activity_pn_mode.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout-sw400dp/activity_pn_mode.xml b/app/src/main/res/layout-sw400dp/activity_pn_mode.xml index e31e269a2e..fb1fc1c6ca 100644 --- a/app/src/main/res/layout-sw400dp/activity_pn_mode.xml +++ b/app/src/main/res/layout-sw400dp/activity_pn_mode.xml @@ -56,7 +56,7 @@ android:layout_marginTop="4dp" android:textSize="@dimen/very_small_font_size" android:textColor="@color/text" - android:text="You’ll be notified of new messages reliably and immediately using Google’s notification servers. The contents of your messages, and who you’re messaging, are never exposed to Google." /> + android:text="You’ll be notified of new messages reliably and immediately using Google’s notification servers." /> + android:text="Session will occasionally check for new messages in the background." /> diff --git a/app/src/main/res/layout/activity_pn_mode.xml b/app/src/main/res/layout/activity_pn_mode.xml index 2e8f12b7f2..b86c0a3221 100644 --- a/app/src/main/res/layout/activity_pn_mode.xml +++ b/app/src/main/res/layout/activity_pn_mode.xml @@ -56,7 +56,7 @@ android:layout_marginTop="4dp" android:textSize="@dimen/very_small_font_size" android:textColor="@color/text" - android:text="You’ll be notified of new messages reliably and immediately using Google’s notification servers. The contents of your messages, and who you’re messaging, are never exposed to Google." /> + android:text="You’ll be notified of new messages reliably and immediately using Google’s notification servers." /> + android:text="Session will occasionally check for new messages in the background." /> From 9699126ac98e5b7e67f0a7bdb7820c8fbce6edd1 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 13:31:26 +1000 Subject: [PATCH 07/12] Update copy --- app/src/main/res/xml/preferences_notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/xml/preferences_notifications.xml b/app/src/main/res/xml/preferences_notifications.xml index a1b33553ac..76fff3f6d6 100644 --- a/app/src/main/res/xml/preferences_notifications.xml +++ b/app/src/main/res/xml/preferences_notifications.xml @@ -27,7 +27,7 @@ android:dependency="pref_key_enable_notifications" android:key="pref_key_use_fcm" android:title="Use Fast Mode" - android:summary="You’ll be notified of new messages reliably and immediately using Google’s notification servers. The contents of your messages, and who you’re messaging, are never exposed to Google." + android:summary="You’ll be notified of new messages reliably and immediately using Google’s notification servers." android:defaultValue="false" /> From 6e5f75d472525f27dd4c8604f068a138482932a2 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 13:53:41 +1000 Subject: [PATCH 08/12] Fix build --- .../securesms/loki/activities/JoinPublicChatActivity.kt | 2 +- app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml | 5 ----- app/src/main/res/layout/fragment_enter_chat_url.xml | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt index e7c018bc48..39838e2c77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt @@ -212,7 +212,7 @@ class EnterChatURLFragment : Fragment() { chatURLEditText.imeOptions = chatURLEditText.imeOptions or 16777216 // Always use incognito keyboard joinPublicChatButton.setOnClickListener { joinPublicChatIfPossible() } viewModel.defaultRooms.observe(viewLifecycleOwner) { state -> - defaultRoomsParent.isVisible = state is State.Success + defaultRoomsContainer.isVisible = state is State.Success defaultRoomsLoader.isVisible = state is State.Loading when (state) { State.Loading -> { diff --git a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml index db470a8785..a1f71e8e2f 100644 --- a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml @@ -33,12 +33,7 @@ >>>>>> 133bcac17 (Make chips look better) android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> diff --git a/app/src/main/res/layout/fragment_enter_chat_url.xml b/app/src/main/res/layout/fragment_enter_chat_url.xml index 27dd369d71..f1047f5a8e 100644 --- a/app/src/main/res/layout/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout/fragment_enter_chat_url.xml @@ -33,12 +33,7 @@ >>>>>> 133bcac17 (Make chips look better) android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> From faa8c9443fae091136182ef7d955a79cfeff53f4 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 May 2021 15:17:16 +1000 Subject: [PATCH 09/12] Hardcode community guidelines --- app/src/main/AndroidManifest.xml | 4 ++ .../conversation/ConversationActivity.java | 5 ++ .../activities/OpenGroupGuidelinesActivity.kt | 37 ++++++++++ .../loki/views/OpenGroupGuidelinesView.kt | 38 ++++++++++ .../layout/activity_open_group_guidelines.xml | 36 ++++++++++ .../main/res/layout/conversation_activity.xml | 6 ++ .../res/layout/view_open_group_guidelines.xml | 72 +++++++++++++++++++ 7 files changed, 198 insertions(+) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/loki/activities/OpenGroupGuidelinesActivity.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/loki/views/OpenGroupGuidelinesView.kt create mode 100644 app/src/main/res/layout/activity_open_group_guidelines.xml create mode 100644 app/src/main/res/layout/view_open_group_guidelines.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2d8473b849..972ec30be1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -254,6 +254,10 @@ android:name="android.support.PARENT_ACTIVITY" android:value="org.thoughtcrime.securesms.loki.activities.HomeActivity" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/conversation_activity.xml b/app/src/main/res/layout/conversation_activity.xml index 0b9ff3d077..ba9f7f27e1 100644 --- a/app/src/main/res/layout/conversation_activity.xml +++ b/app/src/main/res/layout/conversation_activity.xml @@ -134,6 +134,12 @@ android:background="?android:dividerHorizontal" android:elevation="1dp" /> + + + + + + + + + + + + + + + + + + +