diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4c57386..edab061d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,29 @@
+# Build 225 (1.3.1)
+2023-12-07
+
+- Minor fixes
+
+# ~~Build 224 (1.3.1)~~
+2023-12-06
+
+- Fix for keycloak contact addition when keycloak is unreachable
+
+# ~~Build 223 (1.3.1)~~
+2023-12-05
+
+- Various fixes for keycloak/one-to-one interactions
+
+# ~~Build 222 (1.3.1)~~
+2023-12-05
+
+- Fix for invite all group members
+
+
+# ~~Build 221 (1.3.1)~~
+2023-12-04
+
+- Make it possible to invite all group members to private discussions
+
# Build 220 (1.3)
2023-12-04
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/datatypes/Constants.java b/obv_engine/engine/src/main/java/io/olvid/engine/datatypes/Constants.java
index c9a61950..94ca9553 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/datatypes/Constants.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/datatypes/Constants.java
@@ -70,7 +70,7 @@ public abstract class Constants {
public static final long WELL_KNOWN_REFRESH_INTERVAL = 3_600_000L * 6; // 6 hours
// download message
- public static final long RELIST_DELAY = 30_000; // 30 seconds
+ public static final long RELIST_DELAY = 10_000; // 10 seconds
// backups
public static final long AUTOBACKUP_MAX_INTERVAL = 86_400_000L; // 1 day
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/coordinators/DownloadMessagesAndListAttachmentsCoordinator.java b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/coordinators/DownloadMessagesAndListAttachmentsCoordinator.java
index 9c922344..ab78d11d 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/coordinators/DownloadMessagesAndListAttachmentsCoordinator.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/coordinators/DownloadMessagesAndListAttachmentsCoordinator.java
@@ -128,7 +128,7 @@ public void initialQueueing() {
}
// check all decrypted messages, with attachments, that are not yet marked as listed on the server
- InboxMessage[] messagesToMarkAsListedOnServer = InboxMessage.getMessageThatCanBeMarkedAsListedOnServer(fetchManagerSession);
+ InboxMessage[] messagesToMarkAsListedOnServer = InboxMessage.getMessagesThatCanBeMarkedAsListedOnServer(fetchManagerSession);
for (InboxMessage inboxMessage : messagesToMarkAsListedOnServer) {
fetchManagerSession.markAsListedOnServerListener.messageCanBeMarkedAsListedOnServer(inboxMessage.getOwnedIdentity(), inboxMessage.getUid());
}
@@ -209,7 +209,7 @@ public void onFinishCallback(Operation operation) {
scheduler.clearFailedCount(identity);
if (listingTruncated) {
- // if we listed more than 20 new messages, we might have missed some messages on the server --> trigger a new list in 30 seconds, once messages are processed and deleted from server
+ // if listing was truncated --> trigger a new list in 10 seconds, once messages are processed and deleted from server
scheduler.schedule(identity, () -> queueNewDownloadMessagesAndListAttachmentsOperation(identity, deviceUid), "DownloadMessagesAndListAttachmentsOperation [relist]", Constants.RELIST_DELAY);
}
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/databases/InboxMessage.java b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/databases/InboxMessage.java
index 47c750f1..349d00e1 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/databases/InboxMessage.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/databases/InboxMessage.java
@@ -457,7 +457,7 @@ public static InboxMessage[] getMissingExtendedPayloadMessages(FetchManagerSessi
}
// get all messages that have been decrypted, have attachments and are not yet makredAsListedOnServer
- public static InboxMessage[] getMessageThatCanBeMarkedAsListedOnServer(FetchManagerSession fetchManagerSession) {
+ public static InboxMessage[] getMessagesThatCanBeMarkedAsListedOnServer(FetchManagerSession fetchManagerSession) {
try (PreparedStatement statement = fetchManagerSession.session.prepareStatement(
"SELECT m.* FROM " + TABLE_NAME + " AS m " +
" INNER JOIN " + InboxAttachment.TABLE_NAME + " AS a " +
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/operations/ServerQueryOperation.java b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/operations/ServerQueryOperation.java
index 99100880..03ca263e 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/operations/ServerQueryOperation.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/networkfetch/operations/ServerQueryOperation.java
@@ -317,6 +317,12 @@ public void doExecute() {
// do nothing for these
break;
}
+ } else if (serverQuery.getType().getId() == ServerQuery.TypeId.CHECK_KEYCLOAK_REVOCATION_QUERY_ID && returnStatus == ServerMethod.SERVER_CONNECTION_ERROR) {
+ // if not able to connect to keycloak, assume the user is not revoked. This is required in setups where one of the user's devices does not have access to keycloak
+ // TODO: once we implement visibility rules in keycloak, this must be removed and replaced by synchronisation messages between owned devices in the protocol
+ serverResponse = Encoded.of(true);
+ finished = true;
+ return;
}
cancel(RFC_NETWORK_ERROR);
}
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/ContactMutualIntroductionProtocol.java b/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/ContactMutualIntroductionProtocol.java
index c96b9ec6..61e2db9f 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/ContactMutualIntroductionProtocol.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/ContactMutualIntroductionProtocol.java
@@ -591,6 +591,7 @@ public PropagatedInitialMessage(CoreProtocolMessage coreProtocolMessage, Identit
super(coreProtocolMessage, contactIdentityA, contactIdentityB);
}
+ @SuppressWarnings("unused")
public PropagatedInitialMessage(ReceivedMessage receivedMessage) throws Exception {
super(receivedMessage);
}
diff --git a/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/OneToOneContactInvitationProtocol.java b/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/OneToOneContactInvitationProtocol.java
index 58127ee3..29d66d22 100644
--- a/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/OneToOneContactInvitationProtocol.java
+++ b/obv_engine/engine/src/main/java/io/olvid/engine/protocol/protocols/OneToOneContactInvitationProtocol.java
@@ -650,10 +650,12 @@ public ConcreteProtocolState executeStep() throws Exception {
UUID dialogUuid = UUID.randomUUID();
{
- // create a dialog to allow Alice to abort the protocol
- CoreProtocolMessage coreProtocolMessage = buildCoreProtocolMessage(SendChannelInfo.createUserInterfaceChannelInfo(getOwnedIdentity(), DialogType.createOneToOneInvitationSentDialog(receivedMessage.contactIdentity), dialogUuid));
- ChannelMessageToSend messageToSend = new DialogInvitationSentMessage(coreProtocolMessage).generateChannelDialogMessageToSend();
- protocolManagerSession.channelDelegate.post(protocolManagerSession.session, messageToSend, getPrng());
+ // create a dialog to allow Alice to abort the protocol (only if Bob is not one to one)
+ if (!protocolManagerSession.identityDelegate.isIdentityAOneToOneContactOfOwnedIdentity(protocolManagerSession.session, getOwnedIdentity(), receivedMessage.contactIdentity)) {
+ CoreProtocolMessage coreProtocolMessage = buildCoreProtocolMessage(SendChannelInfo.createUserInterfaceChannelInfo(getOwnedIdentity(), DialogType.createOneToOneInvitationSentDialog(receivedMessage.contactIdentity), dialogUuid));
+ ChannelMessageToSend messageToSend = new DialogInvitationSentMessage(coreProtocolMessage).generateChannelDialogMessageToSend();
+ protocolManagerSession.channelDelegate.post(protocolManagerSession.session, messageToSend, getPrng());
+ }
}
{
@@ -1030,10 +1032,12 @@ public ConcreteProtocolState executeStep() throws Exception {
UUID dialogUuid = UUID.randomUUID();
{
- // create a dialog to allow Alice to abort the protocol
- CoreProtocolMessage coreProtocolMessage = buildCoreProtocolMessage(SendChannelInfo.createUserInterfaceChannelInfo(getOwnedIdentity(), DialogType.createOneToOneInvitationSentDialog(receivedMessage.contactIdentity), dialogUuid));
- ChannelMessageToSend messageToSend = new DialogInvitationSentMessage(coreProtocolMessage).generateChannelDialogMessageToSend();
- protocolManagerSession.channelDelegate.post(protocolManagerSession.session, messageToSend, getPrng());
+ // create a dialog to allow Alice to abort the protocol (only if Bob is not one to one)
+ if (!protocolManagerSession.identityDelegate.isIdentityAOneToOneContactOfOwnedIdentity(protocolManagerSession.session, getOwnedIdentity(), receivedMessage.contactIdentity)) {
+ CoreProtocolMessage coreProtocolMessage = buildCoreProtocolMessage(SendChannelInfo.createUserInterfaceChannelInfo(getOwnedIdentity(), DialogType.createOneToOneInvitationSentDialog(receivedMessage.contactIdentity), dialogUuid));
+ ChannelMessageToSend messageToSend = new DialogInvitationSentMessage(coreProtocolMessage).generateChannelDialogMessageToSend();
+ protocolManagerSession.channelDelegate.post(protocolManagerSession.session, messageToSend, getPrng());
+ }
}
{
diff --git a/obv_messenger/.idea/inspectionProfiles/Project_Default.xml b/obv_messenger/.idea/inspectionProfiles/Project_Default.xml
index 98b6a066..0e48db0a 100644
--- a/obv_messenger/.idea/inspectionProfiles/Project_Default.xml
+++ b/obv_messenger/.idea/inspectionProfiles/Project_Default.xml
@@ -3,6 +3,7 @@
+
diff --git a/obv_messenger/.idea/inspectionProfiles/Unused_stuff.xml b/obv_messenger/.idea/inspectionProfiles/Unused_stuff.xml
index 6d4cc8a5..f6ca9728 100644
--- a/obv_messenger/.idea/inspectionProfiles/Unused_stuff.xml
+++ b/obv_messenger/.idea/inspectionProfiles/Unused_stuff.xml
@@ -1,408 +1,110 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -423,8 +125,6 @@
-
-
@@ -432,7 +132,6 @@
-
@@ -450,14 +149,12 @@
-
-
@@ -467,7 +164,6 @@
-
@@ -482,7 +178,6 @@
-
@@ -522,7 +217,6 @@
-
@@ -530,12 +224,8 @@
-
-
-
-
@@ -561,7 +251,6 @@
-
@@ -576,14 +265,12 @@
-
-
@@ -596,14 +283,11 @@
-
-
-
@@ -644,7 +328,6 @@
-
@@ -652,7 +335,6 @@
-
@@ -673,7 +355,6 @@
-
@@ -693,14 +374,11 @@
-
-
-
@@ -722,7 +400,6 @@
-
@@ -768,9 +445,6 @@
-
-
-
@@ -818,18 +492,11 @@
-
-
-
-
-
-
-
@@ -839,10 +506,7 @@
-
-
-
@@ -855,9 +519,7 @@
-
-
@@ -954,8 +616,6 @@
-
-
@@ -979,7 +639,6 @@
-
@@ -987,7 +646,6 @@
-
@@ -995,7 +653,6 @@
-
@@ -1020,14 +677,11 @@
-
-
-
@@ -1089,9 +743,7 @@
-
-
@@ -1108,30 +760,17 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1169,8 +808,6 @@
-
-
@@ -1180,12 +817,8 @@
-
-
-
-
@@ -1205,7 +838,6 @@
-
@@ -1230,9 +862,7 @@
-
-
@@ -1255,7 +885,6 @@
-
@@ -1320,7 +949,6 @@
-
@@ -1382,7 +1010,6 @@
-
@@ -1393,7 +1020,6 @@
-
@@ -1402,14 +1028,12 @@
-
-
@@ -1446,7 +1070,6 @@
-
@@ -1454,7 +1077,6 @@
-
@@ -1501,7 +1123,6 @@
-
@@ -1536,7 +1157,6 @@
-
@@ -1592,11 +1212,7 @@
-
-
-
-
@@ -1613,15 +1229,9 @@
-
-
-
-
-
-
@@ -1636,8 +1246,6 @@
-
-
diff --git a/obv_messenger/.idea/inspectionProfiles/profiles_settings.xml b/obv_messenger/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index fcdef7a8..00000000
--- a/obv_messenger/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/obv_messenger/app/build.gradle b/obv_messenger/app/build.gradle
index cd1d3189..97c4d736 100644
--- a/obv_messenger/app/build.gradle
+++ b/obv_messenger/app/build.gradle
@@ -16,8 +16,8 @@ android {
applicationId "io.olvid.messenger"
minSdkVersion 21
targetSdk 34
- versionCode 220
- versionName "1.3"
+ versionCode 225
+ versionName "1.3.1"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
resourceConfigurations += ['en', 'fr']
diff --git a/obv_messenger/app/src/main/java/io/olvid/messenger/activities/ContactDetailsActivity.java b/obv_messenger/app/src/main/java/io/olvid/messenger/activities/ContactDetailsActivity.java
index ee038b86..bfe44d82 100644
--- a/obv_messenger/app/src/main/java/io/olvid/messenger/activities/ContactDetailsActivity.java
+++ b/obv_messenger/app/src/main/java/io/olvid/messenger/activities/ContactDetailsActivity.java
@@ -365,6 +365,9 @@ public void onAnimationEnd(Drawable drawable) {
if (contact.establishedChannelCount > 0) {
introduceButton.setEnabled(true);
notOneToOneInviteButton.setEnabled(true);
+ } else if (contact.keycloakManaged) {
+ introduceButton.setEnabled(false);
+ notOneToOneInviteButton.setEnabled(true);
} else {
introduceButton.setEnabled(false);
notOneToOneInviteButton.setEnabled(false);
@@ -800,7 +803,18 @@ public void onClick(View view) {
} else {
// this is an invite initiation
try {
- AppSingleton.getEngine().startOneToOneInvitationProtocol(contact.bytesOwnedIdentity, contact.bytesContactIdentity);
+ // if the contact has channels, invite them to one-to-one discussion
+ if (contact.establishedChannelCount > 0) {
+ AppSingleton.getEngine().startOneToOneInvitationProtocol(contact.bytesOwnedIdentity, contact.bytesContactIdentity);
+ }
+
+ // if the contact is keycloak managed, also start a keycloak invitation protocol
+ if (contact.keycloakManaged) {
+ JsonIdentityDetails jsonIdentityDetails = contact.getIdentityDetails();
+ if (jsonIdentityDetails != null && jsonIdentityDetails.getSignedUserDetails() != null) {
+ AppSingleton.getEngine().addKeycloakContact(contact.bytesOwnedIdentity, contact.bytesContactIdentity, jsonIdentityDetails.getSignedUserDetails());
+ }
+ }
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/obv_messenger/app/src/main/java/io/olvid/messenger/group/GroupV2DetailsActivity.kt b/obv_messenger/app/src/main/java/io/olvid/messenger/group/GroupV2DetailsActivity.kt
index a6398b6e..099bcc96 100644
--- a/obv_messenger/app/src/main/java/io/olvid/messenger/group/GroupV2DetailsActivity.kt
+++ b/obv_messenger/app/src/main/java/io/olvid/messenger/group/GroupV2DetailsActivity.kt
@@ -840,6 +840,54 @@ class GroupV2DetailsActivity : LockableActivity(), EngineNotificationListener, O
.setPositiveButton(string.button_label_ok, null)
builder.create().show()
}
+ } else if (itemId == R.id.action_invite_all_members) {
+ val group = groupDetailsViewModel.group.value ?: return true
+ if (group.updateInProgress == Group2.UPDATE_NONE) {
+ groupDetailsViewModel.groupMembers.value?.mapNotNull { group2MemberOrPending ->
+ group2MemberOrPending.contact?.let { contact ->
+ if ((contact.establishedChannelCount > 0 || contact.keycloakManaged) && contact.oneToOne.not()) {
+ contact
+ } else {
+ null
+ }
+ }
+ } ?. let { contacts ->
+ if (contacts.isEmpty()) {
+ App.toast(R.string.toast_message_no_member_can_be_invited, Toast.LENGTH_SHORT)
+ } else {
+ val builder = SecureAlertDialogBuilder(this, style.CustomAlertDialog)
+ .setTitle(string.dialog_title_invite_all_group_members)
+ .setMessage(resources.getQuantityString(R.plurals.dialog_message_invite_all_group_members, contacts.size, contacts.size))
+ .setPositiveButton(R.string.button_label_proceed) { _, _ ->
+ contacts.forEach { contact ->
+ if (contact.establishedChannelCount > 0) {
+ AppSingleton.getEngine().startOneToOneInvitationProtocol(
+ contact.bytesOwnedIdentity,
+ contact.bytesContactIdentity
+ )
+ }
+ if (contact.keycloakManaged) {
+ try {
+ val jsonIdentityDetails = contact.getIdentityDetails()
+ if (jsonIdentityDetails != null && jsonIdentityDetails.signedUserDetails != null) {
+ AppSingleton.getEngine().addKeycloakContact(
+ contact.bytesOwnedIdentity,
+ contact.bytesContactIdentity,
+ jsonIdentityDetails.signedUserDetails
+ )
+ }
+ } catch (e : Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ }
+ .setNegativeButton(R.string.button_label_cancel, null)
+ builder.create().show()
+ }
+ }
+ }
+ return true
}
return false
}
diff --git a/obv_messenger/app/src/main/java/io/olvid/messenger/main/contacts/ContactListFragment.kt b/obv_messenger/app/src/main/java/io/olvid/messenger/main/contacts/ContactListFragment.kt
index 81b417d8..9daa8d65 100644
--- a/obv_messenger/app/src/main/java/io/olvid/messenger/main/contacts/ContactListFragment.kt
+++ b/obv_messenger/app/src/main/java/io/olvid/messenger/main/contacts/ContactListFragment.kt
@@ -183,7 +183,26 @@ class ContactListFragment : RefreshingFragment(), ContactMenu {
.setNegativeButton(R.string.button_label_cancel, null)
.setPositiveButton(R.string.button_label_invite) { _, _ ->
try {
- AppSingleton.getEngine().startOneToOneInvitationProtocol(contact.bytesOwnedIdentity, contact.bytesContactIdentity)
+ if (contact.establishedChannelCount > 0) {
+ AppSingleton.getEngine().startOneToOneInvitationProtocol(
+ contact.bytesOwnedIdentity,
+ contact.bytesContactIdentity
+ )
+ }
+ if (contact.keycloakManaged) {
+ try {
+ val jsonIdentityDetails = contact.getIdentityDetails()
+ if (jsonIdentityDetails != null && jsonIdentityDetails.signedUserDetails != null) {
+ AppSingleton.getEngine().addKeycloakContact(
+ contact.bytesOwnedIdentity,
+ contact.bytesContactIdentity,
+ jsonIdentityDetails.signedUserDetails
+ )
+ }
+ } catch (e : Exception) {
+ e.printStackTrace()
+ }
+ }
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
diff --git a/obv_messenger/app/src/main/java/io/olvid/messenger/openid/KeycloakManager.java b/obv_messenger/app/src/main/java/io/olvid/messenger/openid/KeycloakManager.java
index 69e69ef1..b58d03bc 100644
--- a/obv_messenger/app/src/main/java/io/olvid/messenger/openid/KeycloakManager.java
+++ b/obv_messenger/app/src/main/java/io/olvid/messenger/openid/KeycloakManager.java
@@ -362,32 +362,28 @@ private void selfTestAndPromptForAuthentication(@NonNull BytesKey identityBytesK
KeycloakManagerState kms = ownedIdentityStates.get(identityBytesKey);
if (kms != null) {
String nonce = AppSingleton.getEngine().getOwnedIdentityKeycloakSelfRevocationTestNonce(kms.bytesOwnedIdentity, kms.serverUrl);
- if (nonce == null) {
- authenticationRequiredOwnedIdentities.add(identityBytesKey);
- AndroidNotificationManager.displayKeycloakAuthenticationRequiredNotification(identityBytesKey.bytes);
- App.openAppDialogKeycloakAuthenticationRequired(kms.bytesOwnedIdentity, kms.clientId, kms.clientSecret, kms.serverUrl);
- } else {
- KeycloakTasks.selfRevocationTest(kms.serverUrl, nonce, new KeycloakCallback() {
- @Override
- public void success(Boolean result) {
- if (result != null && result) {
- // the server returned true --> the identity is no longer managed
- AppSingleton.getEngine().unbindOwnedIdentityFromKeycloak(kms.bytesOwnedIdentity);
- App.openAppDialogKeycloakIdentityRevoked(kms.bytesOwnedIdentity);
- } else {
- authenticationRequiredOwnedIdentities.add(identityBytesKey);
- AndroidNotificationManager.displayKeycloakAuthenticationRequiredNotification(identityBytesKey.bytes);
- App.openAppDialogKeycloakAuthenticationRequired(kms.bytesOwnedIdentity, kms.clientId, kms.clientSecret, kms.serverUrl);
- }
+ KeycloakTasks.selfRevocationTest(kms.serverUrl, nonce == null ? "" : nonce, new KeycloakCallback() {
+ @Override
+ public void success(Boolean result) {
+ // only unbind if nonce is non-null
+ if (nonce != null && result != null && result) {
+ // the server returned true --> the identity is no longer managed
+ AppSingleton.getEngine().unbindOwnedIdentityFromKeycloak(kms.bytesOwnedIdentity);
+ App.openAppDialogKeycloakIdentityRevoked(kms.bytesOwnedIdentity);
+ } else {
+ // require an authentication: either nonce still exists, or nonce is null
+ authenticationRequiredOwnedIdentities.add(identityBytesKey);
+ AndroidNotificationManager.displayKeycloakAuthenticationRequiredNotification(identityBytesKey.bytes);
+ App.openAppDialogKeycloakAuthenticationRequired(kms.bytesOwnedIdentity, kms.clientId, kms.clientSecret, kms.serverUrl);
}
+ }
- @Override
- public void failed(int rfc) {
- // in case of failure, we do nothing --> this is probably only a network error, and it will be tried again
- // we do not want to prompt the user to authenticate in case of permanent connection error with the keycloak
- }
- });
- }
+ @Override
+ public void failed(int rfc) {
+ // in case of failure, we do nothing --> this is probably only a network error, and it will be tried again
+ // we do not want to prompt the user to authenticate in case of permanent connection error with the keycloak
+ }
+ });
}
});
}
diff --git a/obv_messenger/app/src/main/res/menu/menu_group_details_joined_v2.xml b/obv_messenger/app/src/main/res/menu/menu_group_details_joined_v2.xml
index 1ab4adc0..7de09f59 100644
--- a/obv_messenger/app/src/main/res/menu/menu_group_details_joined_v2.xml
+++ b/obv_messenger/app/src/main/res/menu/menu_group_details_joined_v2.xml
@@ -17,6 +17,10 @@
android:id="@+id/action_clone_group"
android:orderInCategory="130"
android:title="@string/menu_action_clone_group"/>
+
+
+
- Personne ici pour le moment
Les membres de groupes qui ne sont pas encore des contacts apparîtront ici.
Annuaire vide
+ Inviter tous les membres
+ Inviter tous les membres ?
+ Aucun membre du group à inviter
+
+
- Vous êtes sur le point d\'inviter chaque membre de ce groupe avec lequel vous avez un canal (actuellement 1 membre) à une discussion privée.\nSouhaitez-vous poursuivre ?
+ - Vous êtes sur le point d\'inviter chaque membre de ce groupe avec lequel vous avez un canal (actuellement %1$d membres) à une discussion privée.\nSouhaitez-vous poursuivre ?
+
- %1$d groupe commun
- %1$d groupes communs
diff --git a/obv_messenger/app/src/main/res/values/strings.xml b/obv_messenger/app/src/main/res/values/strings.xml
index c772e9fc..afd62766 100644
--- a/obv_messenger/app/src/main/res/values/strings.xml
+++ b/obv_messenger/app/src/main/res/values/strings.xml
@@ -1821,8 +1821,15 @@
No one here for now
Group members that are not yet contacts will appear here.
Empty directory
+ Invite all group members
+ Invite all group members?
+ No group member to invite
+
+ - You are about to invite each group member with whom you have a channel (currently 1 member) to a private discussion.\nDo you want to proceed?
+ - You are about to invite each group member with whom you have a channel (currently %1$d members) to a private discussion.\nDo you want to proceed?
+
- 1 common group
- %1$d common groups