diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java index c16fcd4e1..257ab646c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java @@ -158,7 +158,8 @@ public class NavDrawerActivity extends BriarActivity implements @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); - navDrawerViewModel.checkTransportsOnboarding(); +// navDrawerViewModel.checkTransportsOnboarding(); + navDrawerViewModel.checkSocialBackupOnboarding(); } }; drawerLayout.addDrawerListener(drawerToggle); @@ -167,9 +168,12 @@ public class NavDrawerActivity extends BriarActivity implements initializeTransports(); transportsView.setAdapter(transportsAdapter); - observeOnce(navDrawerViewModel.showTransportsOnboarding(), this, show -> - observeOnce(torIcon, this, imageView -> - showTransportsOnboarding(show, imageView))); +// observeOnce(navDrawerViewModel.showTransportsOnboarding(), this, show -> +// observeOnce(torIcon, this, imageView -> +// showTransportsOnboarding(show, imageView))); + + observeOnce(navDrawerViewModel.showSocialBackupOnboarding(), this, + this::showSocialBackupOnboarding); lockManager.isLockable().observe(this, this::setLockVisible); @@ -468,6 +472,22 @@ public class NavDrawerActivity extends BriarActivity implements } } + private void showSocialBackupOnboarding(boolean show) { + if (show) { + new MaterialTapTargetPrompt.Builder(NavDrawerActivity.this, + R.style.OnboardingDialogTheme) + .setTarget(R.id.nav_btn_settings) + .setPrimaryText(R.string.social_backup_onboarding_title) + .setSecondaryText(R.string.social_backup_onboarding_long) + .setFocalRadius((float) 350) + .setFocalPadding((float) 100) + .setBackgroundColour( + ContextCompat.getColor(this, R.color.briar_primary)) + .show(); + navDrawerViewModel.socialBackupOnboardingShown(); + } + } + private static class Transport { private final TransportId id; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java index 132cc0b9f..d38dac6ba 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java @@ -39,6 +39,8 @@ public class NavDrawerViewModel extends DbViewModel { private static final String EXPIRY_DATE_WARNING = "expiryDateWarning"; private static final String SHOW_TRANSPORTS_ONBOARDING = "showTransportsOnboarding"; + private static final String SHOW_SOCIAL_BACKUP_ONBOARDING = + "showSocialBackupOnboarding"; private final SettingsManager settingsManager; @@ -48,6 +50,8 @@ public class NavDrawerViewModel extends DbViewModel { new MutableLiveData<>(); private final MutableLiveData showTransportsOnboarding = new MutableLiveData<>(); + private final MutableLiveData showSocialBackupOnboarding = + new MutableLiveData<>(); @Inject NavDrawerViewModel(Application app, @@ -142,6 +146,11 @@ public class NavDrawerViewModel extends DbViewModel { return showTransportsOnboarding; } + @UiThread + LiveData showSocialBackupOnboarding() { + return showSocialBackupOnboarding; + } + @UiThread void checkTransportsOnboarding() { if (showTransportsOnboarding.getValue() != null) return; @@ -171,4 +180,35 @@ public class NavDrawerViewModel extends DbViewModel { } }); } + + @UiThread + void checkSocialBackupOnboarding() { + if (showSocialBackupOnboarding.getValue() != null) return; + runOnDbThread(() -> { + try { + Settings settings = + settingsManager.getSettings(SETTINGS_NAMESPACE); + boolean show = + settings.getBoolean(SHOW_SOCIAL_BACKUP_ONBOARDING, + true); + showSocialBackupOnboarding.postValue(show); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } + + @UiThread + void socialBackupOnboardingShown() { + showSocialBackupOnboarding.setValue(false); + runOnDbThread(() -> { + try { + Settings settings = new Settings(); + settings.putBoolean(SHOW_SOCIAL_BACKUP_ONBOARDING, false); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsActivity.java index 747bc9895..8225f479b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsActivity.java @@ -1,10 +1,12 @@ package org.briarproject.briar.android.settings; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.view.MenuItem; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -12,6 +14,7 @@ import org.briarproject.bramble.api.FeatureFlags; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; +import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.view.AuthorView; @@ -19,11 +22,15 @@ import javax.inject.Inject; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; import androidx.lifecycle.ViewModelProvider; +import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; import de.hdodenhof.circleimageview.CircleImageView; +import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; import static android.widget.Toast.LENGTH_LONG; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_AVATAR_IMAGE; +import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute; public class SettingsActivity extends BriarActivity { diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index e58ca403f..628aad146 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -673,9 +673,11 @@ Backup your Briar identity and contacts list using trusted contacts You can choose a set of trusted contacts to send backup pieces to.\n\nYou set how many of these contacts must help you recover your account.\n\nFor example, you can choose three trusted contacts and that any two of them are needed to recover. - Choose trusted contacts + Backup your Briar account + Social backup feature allows you to recover your account with the help of trusted contacts + You need to meet your trusted contacts in-person to receive pieces