From a844526dae696ef1c42c4c240012ead65bb33963 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 9 Oct 2019 17:48:58 +0100 Subject: [PATCH 1/4] Refactor ClientVersion to bramble-api. --- .../bramble/api/versioning/ClientVersion.java | 63 +++++++++ .../ClientVersioningManagerImpl.java | 126 +++++++----------- 2 files changed, 109 insertions(+), 80 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java new file mode 100644 index 000000000..719c1e38c --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java @@ -0,0 +1,63 @@ +package org.briarproject.bramble.api.versioning; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientId; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class ClientVersion implements Comparable { + + private final ClientMajorVersion majorVersion; + private final int minorVersion; + + public ClientVersion(ClientMajorVersion majorVersion, + int minorVersion) { + this.majorVersion = majorVersion; + this.minorVersion = minorVersion; + } + + public ClientVersion(ClientId clientId, int majorVersion, + int minorVersion) { + this(new ClientMajorVersion(clientId, majorVersion), minorVersion); + } + + public ClientMajorVersion getClientMajorVersion() { + return majorVersion; + } + + public ClientId getClientId() { + return majorVersion.getClientId(); + } + + public int getMajorVersion() { + return majorVersion.getMajorVersion(); + } + + public int getMinorVersion() { + return minorVersion; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientVersion) { + ClientVersion cv = (ClientVersion) o; + return majorVersion.equals(cv.majorVersion) + && minorVersion == cv.minorVersion; + } + return false; + } + + @Override + public int hashCode() { + return majorVersion.hashCode(); + } + + @Override + public int compareTo(ClientVersion cv) { + int compare = majorVersion.compareTo(cv.majorVersion); + if (compare != 0) return compare; + return minorVersion - cv.minorVersion; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 929432c8d..ce4e323c4 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -26,6 +26,7 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.validation.IncomingMessageHook; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientMajorVersion; +import org.briarproject.bramble.api.versioning.ClientVersion; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import java.util.ArrayList; @@ -80,9 +81,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, @Override public void registerClient(ClientId clientId, int majorVersion, int minorVersion, ClientVersioningHook hook) { - ClientMajorVersion cv = new ClientMajorVersion(clientId, majorVersion); - clients.add(new ClientVersion(cv, minorVersion)); - hooks.put(cv, hook); + ClientMajorVersion cmv = new ClientMajorVersion(clientId, majorVersion); + clients.add(new ClientVersion(cmv, minorVersion)); + hooks.put(cmv, hook); } @Override @@ -96,9 +97,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); Map visibilities = getVisibilities(localUpdate.states, remoteUpdate.states); - ClientMajorVersion cv = + ClientMajorVersion key = new ClientMajorVersion(clientId, majorVersion); - Visibility v = visibilities.get(cv); + Visibility v = visibilities.get(key); return v == null ? INVISIBLE : v; } catch (FormatException e) { throw new DbException(e); @@ -112,10 +113,11 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, LatestUpdates latest = findLatestUpdates(txn, contactId); if (latest == null || latest.remote == null) return -1; Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); - ClientMajorVersion cv = + ClientMajorVersion key = new ClientMajorVersion(clientId, majorVersion); for (ClientState remote : remoteUpdate.states) { - if (remote.majorVersion.equals(cv)) return remote.minorVersion; + if (remote.clientVersion.getClientMajorVersion().equals(key)) + return remote.clientVersion.getMinorVersion(); } return -1; } catch (FormatException e) { @@ -256,8 +258,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } private BdfList encodeClientVersion(ClientVersion cv) { - return BdfList.of(cv.majorVersion.getClientId().getString(), - cv.majorVersion.getMajorVersion(), cv.minorVersion); + return BdfList.of(cv.getClientId().getString(), cv.getMajorVersion(), + cv.getMinorVersion()); } /** @@ -298,8 +300,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, ClientId clientId = new ClientId(cv.getString(0)); int majorVersion = cv.getLong(1).intValue(); int minorVersion = cv.getLong(2).intValue(); - parsed.add(new ClientVersion(clientId, majorVersion, - minorVersion)); + parsed.add(new ClientVersion(clientId, majorVersion, minorVersion)); } return parsed; } @@ -418,13 +419,15 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, private List updateStatesFromLocalVersions( List oldStates, List newVersions) { Map oldMap = new HashMap<>(); - for (ClientState cs : oldStates) oldMap.put(cs.majorVersion, cs); + for (ClientState cs : oldStates) { + oldMap.put(cs.clientVersion.getClientMajorVersion(), cs); + } List newStates = new ArrayList<>(newVersions.size()); for (ClientVersion newVersion : newVersions) { - ClientState oldState = oldMap.get(newVersion.majorVersion); + ClientMajorVersion key = newVersion.getClientMajorVersion(); + ClientState oldState = oldMap.get(key); boolean active = oldState != null && oldState.active; - newStates.add(new ClientState(newVersion.majorVersion, - newVersion.minorVersion, active)); + newStates.add(new ClientState(newVersion, active)); } return newStates; } @@ -451,21 +454,25 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } private BdfList encodeClientState(ClientState cs) { - return BdfList.of(cs.majorVersion.getClientId().getString(), - cs.majorVersion.getMajorVersion(), cs.minorVersion, cs.active); + ClientVersion cv = cs.clientVersion; + return BdfList.of(cv.getClientId().getString(), cv.getMajorVersion(), + cv.getMinorVersion(), cs.active); } private Map getVisibilities( List localStates, List remoteStates) { Map remoteMap = new HashMap<>(); - for (ClientState cs : remoteStates) remoteMap.put(cs.majorVersion, cs); + for (ClientState cs : remoteStates) { + remoteMap.put(cs.clientVersion.getClientMajorVersion(), cs); + } Map visibilities = new HashMap<>(); for (ClientState local : localStates) { - ClientState remote = remoteMap.get(local.majorVersion); - if (remote == null) visibilities.put(local.majorVersion, INVISIBLE); - else if (remote.active) - visibilities.put(local.majorVersion, SHARED); - else visibilities.put(local.majorVersion, VISIBLE); + ClientMajorVersion key = + local.clientVersion.getClientMajorVersion(); + ClientState remote = remoteMap.get(key); + if (remote == null) visibilities.put(key, INVISIBLE); + else if (remote.active) visibilities.put(key, SHARED); + else visibilities.put(key, VISIBLE); } return visibilities; } @@ -486,9 +493,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } } - private void callVisibilityHook(Transaction txn, ClientMajorVersion cv, + private void callVisibilityHook(Transaction txn, ClientMajorVersion cmv, Contact c, Visibility v) throws DbException { - ClientVersioningHook hook = hooks.get(cv); + ClientVersioningHook hook = hooks.get(cmv); if (hook != null) hook.onClientVisibilityChanging(txn, c, v); } @@ -496,8 +503,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, List versions) throws DbException { List states = new ArrayList<>(versions.size()); for (ClientVersion cv : versions) { - states.add(new ClientState(cv.majorVersion, cv.minorVersion, - false)); + states.add(new ClientState(cv, false)); } storeUpdate(txn, g, states, 1); } @@ -516,13 +522,16 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, private List updateStatesFromRemoteStates( List oldLocalStates, List remoteStates) { Set remoteSet = new HashSet<>(); - for (ClientState cs : remoteStates) remoteSet.add(cs.majorVersion); + for (ClientState cs : remoteStates) { + remoteSet.add(cs.clientVersion.getClientMajorVersion()); + } List newLocalStates = new ArrayList<>(oldLocalStates.size()); for (ClientState oldState : oldLocalStates) { - boolean active = remoteSet.contains(oldState.majorVersion); - newLocalStates.add(new ClientState(oldState.majorVersion, - oldState.minorVersion, active)); + ClientMajorVersion cmv = + oldState.clientVersion.getClientMajorVersion(); + boolean active = remoteSet.contains(cmv); + newLocalStates.add(new ClientState(oldState.clientVersion, active)); } return newLocalStates; } @@ -561,61 +570,19 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } } - private static class ClientVersion implements Comparable { - - private final ClientMajorVersion majorVersion; - private final int minorVersion; - - private ClientVersion(ClientMajorVersion majorVersion, - int minorVersion) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - } - - private ClientVersion(ClientId clientId, int majorVersion, - int minorVersion) { - this(new ClientMajorVersion(clientId, majorVersion), minorVersion); - } - - @Override - public boolean equals(Object o) { - if (o instanceof ClientVersion) { - ClientVersion cv = (ClientVersion) o; - return majorVersion.equals(cv.majorVersion) - && minorVersion == cv.minorVersion; - } - return false; - } - - @Override - public int hashCode() { - return majorVersion.hashCode(); - } - - @Override - public int compareTo(ClientVersion cv) { - int compare = majorVersion.compareTo(cv.majorVersion); - if (compare != 0) return compare; - return minorVersion - cv.minorVersion; - } - } - private static class ClientState { - private final ClientMajorVersion majorVersion; - private final int minorVersion; + private final ClientVersion clientVersion; private final boolean active; - private ClientState(ClientMajorVersion majorVersion, int minorVersion, - boolean active) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; + private ClientState(ClientVersion clientVersion, boolean active) { + this.clientVersion = clientVersion; this.active = active; } private ClientState(ClientId clientId, int majorVersion, int minorVersion, boolean active) { - this(new ClientMajorVersion(clientId, majorVersion), minorVersion, + this(new ClientVersion(clientId, majorVersion, minorVersion), active); } @@ -623,8 +590,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, public boolean equals(Object o) { if (o instanceof ClientState) { ClientState cs = (ClientState) o; - return majorVersion.equals(cs.majorVersion) - && minorVersion == cs.minorVersion + return clientVersion.equals(cs.clientVersion) && active == cs.active; } return false; @@ -632,7 +598,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, @Override public int hashCode() { - return majorVersion.hashCode(); + return clientVersion.hashCode(); } } } From ee1fd2ad8a4034358e7388f42af48d855e858f4f Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 9 Oct 2019 17:56:41 +0100 Subject: [PATCH 2/4] Broadcast events for client versioning updates. --- .../event/ClientVersionUpdatedEvent.java | 34 +++++++++++++++++++ .../ClientVersioningManagerImpl.java | 23 ++++++++++--- 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/versioning/event/ClientVersionUpdatedEvent.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/event/ClientVersionUpdatedEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/event/ClientVersionUpdatedEvent.java new file mode 100644 index 000000000..0e9985c77 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/event/ClientVersionUpdatedEvent.java @@ -0,0 +1,34 @@ +package org.briarproject.bramble.api.versioning.event; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.versioning.ClientVersion; + +import javax.annotation.concurrent.Immutable; + +/** + * An event that is broadcast when we receive a client versioning update from + * a contact. + */ +@Immutable +@NotNullByDefault +public class ClientVersionUpdatedEvent extends Event { + + private final ContactId contactId; + private final ClientVersion clientVersion; + + public ClientVersionUpdatedEvent(ContactId contactId, + ClientVersion clientVersion) { + this.contactId = contactId; + this.clientVersion = clientVersion; + } + + public ContactId getContactId() { + return contactId; + } + + public ClientVersion getClientVersion() { + return clientVersion; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index ce4e323c4..b334f3bea 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -28,6 +28,7 @@ import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientMajorVersion; import org.briarproject.bramble.api.versioning.ClientVersion; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.event.ClientVersionUpdatedEvent; import java.util.ArrayList; import java.util.Collection; @@ -228,9 +229,21 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Map after = getVisibilities(newLocalStates, newRemoteStates); // Call hooks for any visibilities that have changed + ContactId c = getContactId(txn, m.getGroupId()); if (!before.equals(after)) { - Contact c = getContact(txn, m.getGroupId()); - callVisibilityHooks(txn, c, before, after); + Contact contact = db.getContact(txn, c); + callVisibilityHooks(txn, contact, before, after); + } + // Broadcast events for any new client versions + Set oldRemoteVersions = new HashSet<>(); + for (ClientState cs : oldRemoteStates) { + oldRemoteVersions.add(cs.clientVersion); + } + for (ClientState cs : newRemoteStates) { + if (!oldRemoteVersions.contains(cs.clientVersion)) { + txn.attach(new ClientVersionUpdatedEvent(c, + cs.clientVersion)); + } } } catch (FormatException e) { throw new InvalidMessageException(e); @@ -508,12 +521,12 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, storeUpdate(txn, g, states, 1); } - private Contact getContact(Transaction txn, GroupId g) throws DbException { + private ContactId getContactId(Transaction txn, GroupId g) + throws DbException { try { BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g); - int id = meta.getLong(GROUP_KEY_CONTACT_ID).intValue(); - return db.getContact(txn, new ContactId(id)); + return new ContactId(meta.getLong(GROUP_KEY_CONTACT_ID).intValue()); } catch (FormatException e) { throw new DbException(e); } From b3bc5e69b53d6f35a5de4e333aa1724bfda49631 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 14 Oct 2019 10:59:24 +0100 Subject: [PATCH 3/4] Use client versioning event to update UI. --- .../conversation/ConversationActivity.java | 38 +++++++------ .../conversation/ConversationViewModel.java | 55 +++++++------------ .../view/TextAttachmentController.java | 12 +--- 3 files changed, 43 insertions(+), 62 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 9b89740e3..852f82bff 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -46,9 +46,11 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent; import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent; +import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.event.MessagesAckedEvent; import org.briarproject.bramble.api.sync.event.MessagesSentEvent; +import org.briarproject.bramble.api.versioning.event.ClientVersionUpdatedEvent; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -99,7 +101,6 @@ import javax.inject.Inject; import de.hdodenhof.circleimageview.CircleImageView; import im.delight.android.identicons.IdenticonDrawable; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; -import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.PromptStateChangeListener; import static android.arch.lifecycle.Lifecycle.State.STARTED; import static android.os.Build.VERSION.SDK_INT; @@ -130,8 +131,6 @@ import static org.briarproject.briar.android.util.UiUtils.getBulbTransitionName; import static org.briarproject.briar.android.util.UiUtils.observeOnce; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; -import static uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.STATE_DISMISSED; -import static uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.STATE_FINISHED; @MethodsNotNullByDefault @ParametersNotNullByDefault @@ -263,11 +262,15 @@ public class ConversationActivity extends BriarActivity ImagePreview imagePreview = findViewById(R.id.imagePreview); sendController = new TextAttachmentController(textInputView, imagePreview, this, viewModel); - observeOnce(viewModel.hasImageSupport(), this, hasSupport -> { - if (hasSupport != null && hasSupport) { - // TODO: remove cast when removing feature flag - ((TextAttachmentController) sendController) - .setImagesSupported(); + viewModel.hasImageSupport().observe(this, new Observer() { + @Override + public void onChanged(@Nullable Boolean hasSupport) { + if (hasSupport != null && hasSupport) { + // TODO: remove cast when removing feature flag + ((TextAttachmentController) sendController) + .setImagesSupported(); + viewModel.hasImageSupport().removeObserver(this); + } } }); } else { @@ -649,6 +652,15 @@ public class ConversationActivity extends BriarActivity LOG.info("Contact disconnected"); displayContactOnlineStatus(); } + } else if (e instanceof ClientVersionUpdatedEvent) { + ClientVersionUpdatedEvent c = (ClientVersionUpdatedEvent) e; + if (c.getContactId().equals(contactId)) { + ClientId clientId = c.getClientVersion().getClientId(); + if (clientId.equals(MessagingManager.CLIENT_ID)) { + LOG.info("Contact's messaging client was updated"); + viewModel.recheckFeaturesAndOnboarding(contactId); + } + } } } @@ -829,9 +841,7 @@ public class ConversationActivity extends BriarActivity private void showImageOnboarding() { // TODO: remove cast when removing feature flag - ((TextAttachmentController) sendController) - .showImageOnboarding(this, () -> - viewModel.onImageOnboardingSeen()); + ((TextAttachmentController) sendController).showImageOnboarding(this); } private void showIntroductionOnboarding(@Nullable Boolean show) { @@ -865,11 +875,6 @@ public class ConversationActivity extends BriarActivity return; } - PromptStateChangeListener listener = (prompt, state) -> { - if (state == STATE_DISMISSED || state == STATE_FINISHED) { - viewModel.onIntroductionOnboardingSeen(); - } - }; new MaterialTapTargetPrompt.Builder(ConversationActivity.this, R.style.OnboardingDialogTheme).setTarget(target) .setPrimaryText(R.string.introduction_onboarding_title) @@ -877,7 +882,6 @@ public class ConversationActivity extends BriarActivity .setIcon(R.drawable.ic_more_vert_accent) .setBackgroundColour( ContextCompat.getColor(this, R.color.briar_primary)) - .setPromptStateChangeListener(listener) .show(); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index cb1c4128a..9886c9895 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -231,47 +231,24 @@ public class ConversationViewModel extends AndroidViewModel boolean introductionSupported = contacts.size() > 1; showIntroductionAction.postValue(introductionSupported); + // we only show one onboarding dialog at a time Settings settings = settingsManager.getSettings(SETTINGS_NAMESPACE); if (imagesSupported && settings.getBoolean(SHOW_ONBOARDING_IMAGE, true)) { - // check if we should show onboarding, only if images are supported + onOnboardingShown(SHOW_ONBOARDING_IMAGE); showImageOnboarding.postEvent(true); - // allow observer to stop listening for changes - showIntroductionOnboarding.postEvent(false); - } else { - // allow observer to stop listening for changes - showImageOnboarding.postEvent(false); - // we only show one onboarding dialog at a time - if (introductionSupported && - settings.getBoolean(SHOW_ONBOARDING_INTRODUCTION, true)) { - showIntroductionOnboarding.postEvent(true); - } else { - // allow observer to stop listening for changes - showIntroductionOnboarding.postEvent(false); - } + } else if (introductionSupported && + settings.getBoolean(SHOW_ONBOARDING_INTRODUCTION, true)) { + onOnboardingShown(SHOW_ONBOARDING_INTRODUCTION); + showIntroductionOnboarding.postEvent(true); } } - @UiThread - void onImageOnboardingSeen() { - onOnboardingSeen(SHOW_ONBOARDING_IMAGE); - } - - @UiThread - void onIntroductionOnboardingSeen() { - onOnboardingSeen(SHOW_ONBOARDING_INTRODUCTION); - } - - private void onOnboardingSeen(String key) { - dbExecutor.execute(() -> { - try { - Settings settings = new Settings(); - settings.putBoolean(key, false); - settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + @DatabaseExecutor + private void onOnboardingShown(String key) throws DbException { + Settings settings = new Settings(); + settings.putBoolean(key, false); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); } private void createMessage(GroupId groupId, @Nullable String text, @@ -352,4 +329,14 @@ public class ConversationViewModel extends AndroidViewModel return addedHeader; } + @UiThread + void recheckFeaturesAndOnboarding(ContactId contactId) { + dbExecutor.execute(() -> { + try { + checkFeaturesAndOnboarding(contactId); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java index 87cb9fb24..e2b89bdc1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java @@ -28,7 +28,6 @@ import java.util.Collection; import java.util.List; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; -import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.PromptStateChangeListener; import static android.arch.lifecycle.Lifecycle.State.DESTROYED; import static android.content.Intent.ACTION_GET_CONTENT; @@ -44,8 +43,6 @@ import static android.widget.Toast.LENGTH_LONG; import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute; import static org.briarproject.briar.api.messaging.MessagingConstants.IMAGE_MIME_TYPES; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; -import static uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.STATE_DISMISSED; -import static uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt.STATE_FINISHED; @UiThread @NotNullByDefault @@ -269,13 +266,7 @@ public class TextAttachmentController extends TextSendController reset(); } - public void showImageOnboarding(Activity activity, - Runnable onOnboardingSeen) { - PromptStateChangeListener listener = (prompt, state) -> { - if (state == STATE_DISMISSED || state == STATE_FINISHED) { - onOnboardingSeen.run(); - } - }; + public void showImageOnboarding(Activity activity) { int color = resolveColorAttribute(activity, R.attr.colorControlNormal); new MaterialTapTargetPrompt.Builder(activity, R.style.OnboardingDialogTheme).setTarget(sendButton) @@ -284,7 +275,6 @@ public class TextAttachmentController extends TextSendController .setBackgroundColour(getColor(activity, R.color.briar_primary)) .setIcon(R.drawable.ic_image) .setIconDrawableColourFilter(color) - .setPromptStateChangeListener(listener) .show(); } From 27cba75a50077041378055111f0b1811ca2ed5e8 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 6 Nov 2019 14:17:16 +0000 Subject: [PATCH 4/4] Fix test expectations. --- .../versioning/ClientVersioningManagerImplTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java index 197d5a167..93cf97dcc 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java @@ -60,6 +60,8 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { private final ClientId clientId = getClientId(); private final long now = System.currentTimeMillis(); private final Transaction txn = new Transaction(null, false); + private final BdfDictionary groupMeta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); private ClientVersioningManagerImpl createInstance() { context.checking(new Expectations() {{ @@ -107,8 +109,6 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { } private void expectAddingContact() throws Exception { - BdfDictionary groupMeta = BdfDictionary.of( - new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); long now = System.currentTimeMillis(); BdfList localUpdateBody = BdfList.of(new BdfList(), 1L); Message localUpdate = getMessage(contactGroup.getId()); @@ -459,6 +459,10 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { // Delete the old remote update oneOf(db).deleteMessage(txn, oldRemoteUpdateId); oneOf(db).deleteMessageMetadata(txn, oldRemoteUpdateId); + // Get contact ID + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(groupMeta)); // No states or visibilities have changed }}); @@ -488,6 +492,10 @@ public class ClientVersioningManagerImplTest extends BrambleMockTestCase { // Load the latest local update oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); will(returnValue(oldLocalUpdateBody)); + // Get client ID + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(groupMeta)); // No states or visibilities have changed }});