From ed728e816ea27ab348fd5c8e53ad50480867b6ee Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 11 Nov 2016 15:35:24 -0200 Subject: [PATCH] Add onboarding dialog for revealing contacts screen --- briar-android/res/drawable/ic_info_white.xml | 9 +++ .../res/menu/group_reveal_actions.xml | 12 ++++ briar-android/res/values/strings.xml | 2 + .../reveal/RevealContactsActivity.java | 63 +++++++++++++++++++ .../reveal/RevealContactsController.java | 6 ++ .../reveal/RevealContactsControllerImpl.java | 48 +++++++++++++- 6 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 briar-android/res/drawable/ic_info_white.xml create mode 100644 briar-android/res/menu/group_reveal_actions.xml diff --git a/briar-android/res/drawable/ic_info_white.xml b/briar-android/res/drawable/ic_info_white.xml new file mode 100644 index 000000000..7c4d881ba --- /dev/null +++ b/briar-android/res/drawable/ic_info_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/briar-android/res/menu/group_reveal_actions.xml b/briar-android/res/menu/group_reveal_actions.xml new file mode 100644 index 000000000..8612c9436 --- /dev/null +++ b/briar-android/res/menu/group_reveal_actions.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 0c5274d17..cc6f0f7d6 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -80,6 +80,7 @@ No data The entered text is too long + Show Help Dialog It seems that you are new here and have no contacts yet.\n\nTap the + icon at the top and follow the instructions to add some friends to your list.\n\nPlease remember: You can only add new contacts face-to-face to prevent anyone from impersonating you or reading your messages in the future. @@ -196,6 +197,7 @@ Reveal Contacts + You can choose whether to reveal contacts to all current and future members of this group.\n\nRevealing contacts makes your connection to the group faster and more reliable, because you can communicate with revealed contacts even when the creator of the group is offline. Your relationship is visible to the group Your relationship is visible to the group (revealed by you) Your relationship is visible to the group (revealed by contact) diff --git a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsActivity.java b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsActivity.java index f76d514fd..cae47760b 100644 --- a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsActivity.java +++ b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsActivity.java @@ -1,9 +1,13 @@ package org.briarproject.android.privategroup.reveal; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; +import android.support.v7.app.AlertDialog; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; @@ -13,6 +17,7 @@ import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.android.contactselection.ContactSelectorActivity; import org.briarproject.android.controller.handler.UiExceptionHandler; +import org.briarproject.android.controller.handler.UiResultExceptionHandler; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.nullsafety.MethodsNotNullByDefault; @@ -67,17 +72,75 @@ public class RevealContactsActivity extends ContactSelectorActivity return R.layout.activity_reveal_contacts; } + @Override + public void onStart() { + super.onStart(); + controller.isOnboardingNeeded( + new UiResultExceptionHandler(this) { + @Override + public void onResultUi(Boolean show) { + if (show) showOnboardingDialog(); + } + + @Override + public void onExceptionUi(DbException exception) { + // TODO proper error handling + finish(); + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.group_reveal_actions, menu); + return super.onCreateOptionsMenu(menu); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; + case R.id.action_group_reveal_onboarding: + showOnboardingDialog(); + return true; default: return super.onOptionsItemSelected(item); } } + private void showOnboardingDialog() { + new AlertDialog.Builder(this, R.style.BriarDialogTheme) + .setMessage(getString(R.string.groups_reveal_dialog_message)) + .setPositiveButton(R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, + int which) { + dialog.cancel(); + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + onboardingShown(); + } + }) + .show(); + } + + private void onboardingShown() { + controller.onboardingShown( + new UiExceptionHandler(this) { + @Override + public void onExceptionUi(DbException exception) { + // TODO proper error handling + } + }); + } + @Override public void contactsSelected(Collection contacts) { super.contactsSelected(contacts); diff --git a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsController.java b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsController.java index 9c14e20a0..dcc67f6aa 100644 --- a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsController.java +++ b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsController.java @@ -2,6 +2,7 @@ package org.briarproject.android.privategroup.reveal; import org.briarproject.android.contactselection.ContactSelectorController; import org.briarproject.android.controller.handler.ExceptionHandler; +import org.briarproject.android.controller.handler.ResultExceptionHandler; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.nullsafety.NotNullByDefault; @@ -13,6 +14,11 @@ import java.util.Collection; public interface RevealContactsController extends ContactSelectorController { + void isOnboardingNeeded( + ResultExceptionHandler handler); + + void onboardingShown(ExceptionHandler handler); + void reveal(GroupId g, Collection contacts, ExceptionHandler handler); diff --git a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsControllerImpl.java index 40ddff92d..d0b89a0e2 100644 --- a/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsControllerImpl.java +++ b/briar-android/src/org/briarproject/android/privategroup/reveal/RevealContactsControllerImpl.java @@ -14,6 +14,8 @@ import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.privategroup.GroupMember; import org.briarproject.api.privategroup.PrivateGroupManager; import org.briarproject.api.privategroup.invitation.GroupInvitationManager; +import org.briarproject.api.settings.Settings; +import org.briarproject.api.settings.SettingsManager; import org.briarproject.api.sync.GroupId; import java.util.ArrayList; @@ -26,6 +28,7 @@ import javax.inject.Inject; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; +import static org.briarproject.android.fragment.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.api.privategroup.Visibility.INVISIBLE; @Immutable @@ -35,20 +38,24 @@ public class RevealContactsControllerImpl extends DbControllerImpl private static final Logger LOG = Logger.getLogger(RevealContactsControllerImpl.class.getName()); + private static final String SHOW_ONBOARDING_REVEAL_CONTACTS = + "showOnboardingRevealContacts"; private final PrivateGroupManager groupManager; private final GroupInvitationManager groupInvitationManager; private final ContactManager contactManager; + private final SettingsManager settingsManager; @Inject public RevealContactsControllerImpl(@DatabaseExecutor Executor dbExecutor, LifecycleManager lifecycleManager, PrivateGroupManager groupManager, GroupInvitationManager groupInvitationManager, - ContactManager contactManager) { + ContactManager contactManager, SettingsManager settingsManager) { super(dbExecutor, lifecycleManager); this.groupManager = groupManager; this.groupInvitationManager = groupInvitationManager; this.contactManager = contactManager; + this.settingsManager = settingsManager; } @Override @@ -95,6 +102,45 @@ public class RevealContactsControllerImpl extends DbControllerImpl return items; } + @Override + public void isOnboardingNeeded( + final ResultExceptionHandler handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + Settings settings = + settingsManager.getSettings(SETTINGS_NAMESPACE); + handler.onResult( + settings.getBoolean(SHOW_ONBOARDING_REVEAL_CONTACTS, + true)); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + handler.onException(e); + } + + } + }); + } + + @Override + public void onboardingShown(ExceptionHandler handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + Settings settings = new Settings(); + settings.putBoolean(SHOW_ONBOARDING_REVEAL_CONTACTS, false); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } + } + }); + } + @Override public void reveal(final GroupId g, final Collection contacts, final ExceptionHandler handler) {