mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-20 22:59:54 +01:00
Merge branch 'incorporate-mockup-fragments' into 'social-backup-poc'
Incorporate mockup fragments See merge request briar/briar!1395
This commit is contained in:
@@ -134,6 +134,25 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="org.briarproject.briar.android.socialbackup.DistributedBackupActivity"
|
||||||
|
android:label="@string/activity_name_distributed_backup"
|
||||||
|
android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
android:value="org.briarproject.briar.android.settings.SettingsActivity" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="org.briarproject.briar.android.socialbackup.OldDistributedBackupActivity"
|
||||||
|
android:label="@string/activity_name_old_distributed_backup"
|
||||||
|
android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
android:value="org.briarproject.briar.android.settings.SettingsActivity" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.briarproject.briar.android.conversation.ConversationActivity"
|
android:name="org.briarproject.briar.android.conversation.ConversationActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import org.briarproject.bramble.api.contact.ContactExchangeManager;
|
|||||||
import org.briarproject.bramble.api.contact.ContactManager;
|
import org.briarproject.bramble.api.contact.ContactManager;
|
||||||
import org.briarproject.bramble.api.crypto.CryptoExecutor;
|
import org.briarproject.bramble.api.crypto.CryptoExecutor;
|
||||||
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
|
import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||||
import org.briarproject.bramble.api.db.TransactionManager;
|
import org.briarproject.bramble.api.db.TransactionManager;
|
||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
@@ -59,7 +60,9 @@ import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
|
|||||||
import org.briarproject.briar.api.privategroup.PrivateGroupManager;
|
import org.briarproject.briar.api.privategroup.PrivateGroupManager;
|
||||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;
|
||||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
||||||
|
import org.briarproject.briar.api.socialbackup.SocialBackupManager;
|
||||||
import org.briarproject.briar.api.test.TestDataCreator;
|
import org.briarproject.briar.api.test.TestDataCreator;
|
||||||
|
import org.briarproject.briar.socialbackup.SocialBackupManagerImpl_Factory;
|
||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
@@ -184,6 +187,9 @@ public interface AndroidComponent
|
|||||||
|
|
||||||
Thread.UncaughtExceptionHandler exceptionHandler();
|
Thread.UncaughtExceptionHandler exceptionHandler();
|
||||||
|
|
||||||
|
SocialBackupManager socialBackupManager();
|
||||||
|
DatabaseComponent databaseComponent();
|
||||||
|
|
||||||
void inject(SignInReminderReceiver briarService);
|
void inject(SignInReminderReceiver briarService);
|
||||||
|
|
||||||
void inject(BriarService briarService);
|
void inject(BriarService briarService);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.android.activity;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||||
import org.briarproject.briar.android.AndroidComponent;
|
import org.briarproject.briar.android.AndroidComponent;
|
||||||
import org.briarproject.briar.android.StartupFailureActivity;
|
import org.briarproject.briar.android.StartupFailureActivity;
|
||||||
import org.briarproject.briar.android.account.AuthorNameFragment;
|
import org.briarproject.briar.android.account.AuthorNameFragment;
|
||||||
@@ -77,20 +78,29 @@ import org.briarproject.briar.android.sharing.ShareBlogFragment;
|
|||||||
import org.briarproject.briar.android.sharing.ShareForumActivity;
|
import org.briarproject.briar.android.sharing.ShareForumActivity;
|
||||||
import org.briarproject.briar.android.sharing.ShareForumFragment;
|
import org.briarproject.briar.android.sharing.ShareForumFragment;
|
||||||
import org.briarproject.briar.android.sharing.SharingModule;
|
import org.briarproject.briar.android.sharing.SharingModule;
|
||||||
|
//import org.briarproject.briar.android.socialbackup.CustodianDisplayFragment;
|
||||||
|
import org.briarproject.briar.android.socialbackup.CustodianSelectorFragment;
|
||||||
|
import org.briarproject.briar.android.socialbackup.DistributedBackupActivity;
|
||||||
|
import org.briarproject.briar.android.socialbackup.OldDistributedBackupActivity;
|
||||||
|
import org.briarproject.briar.android.socialbackup.ShardsSentFragment;
|
||||||
|
import org.briarproject.briar.android.socialbackup.ThresholdSelectorFragment;
|
||||||
|
import org.briarproject.briar.android.socialbackup.creation.CreateBackupController;
|
||||||
|
import org.briarproject.briar.android.socialbackup.creation.CreateBackupModule;
|
||||||
import org.briarproject.briar.android.splash.SplashScreenActivity;
|
import org.briarproject.briar.android.splash.SplashScreenActivity;
|
||||||
import org.briarproject.briar.android.test.TestDataActivity;
|
import org.briarproject.briar.android.test.TestDataActivity;
|
||||||
|
|
||||||
import dagger.Component;
|
import dagger.Component;
|
||||||
|
|
||||||
@ActivityScope
|
@ActivityScope
|
||||||
@Component(modules = {
|
@Component(modules ={
|
||||||
ActivityModule.class,
|
ActivityModule.class,
|
||||||
BlogModule.class,
|
BlogModule.class,
|
||||||
CreateGroupModule.class,
|
CreateGroupModule.class,
|
||||||
GroupInvitationModule.class,
|
GroupInvitationModule.class,
|
||||||
GroupMemberModule.class,
|
GroupMemberModule.class,
|
||||||
GroupRevealModule.class,
|
GroupRevealModule.class,
|
||||||
SharingModule.SharingLegacyModule.class
|
SharingModule.SharingLegacyModule.class,
|
||||||
|
CreateBackupModule.class
|
||||||
}, dependencies = AndroidComponent.class)
|
}, dependencies = AndroidComponent.class)
|
||||||
public interface ActivityComponent {
|
public interface ActivityComponent {
|
||||||
|
|
||||||
@@ -238,4 +248,17 @@ public interface ActivityComponent {
|
|||||||
|
|
||||||
void inject(ConfirmAvatarDialogFragment fragment);
|
void inject(ConfirmAvatarDialogFragment fragment);
|
||||||
|
|
||||||
|
void inject(ThresholdSelectorFragment thresholdSelectorFragment);
|
||||||
|
|
||||||
|
void inject(DistributedBackupActivity distributedBackupActivity);
|
||||||
|
// void inject(CreateBackupController createBackupController);
|
||||||
|
// void inject(CustodianDisplayFragment custodianDisplayFragment);
|
||||||
|
|
||||||
|
void inject(DatabaseComponent databaseComponent);
|
||||||
|
|
||||||
|
void inject(CustodianSelectorFragment custodianSelectorFragment);
|
||||||
|
|
||||||
|
void inject(ShardsSentFragment shardsSentFragment);
|
||||||
|
|
||||||
|
void inject(OldDistributedBackupActivity oldDistributedBackupActivity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,8 +56,11 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
|
|||||||
|
|
||||||
Bundle args = requireArguments();
|
Bundle args = requireArguments();
|
||||||
byte[] b = args.getByteArray(GROUP_ID);
|
byte[] b = args.getByteArray(GROUP_ID);
|
||||||
if (b == null) throw new IllegalStateException("No GroupId");
|
// if (b == null) throw new IllegalStateException("No GroupId");
|
||||||
groupId = new GroupId(b);
|
// TODO find what the groupId should be when selecting custodians
|
||||||
|
if (b != null) {
|
||||||
|
groupId = new GroupId(b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public abstract class ContactSelectorFragment extends
|
|||||||
|
|
||||||
public static final String TAG = ContactSelectorFragment.class.getName();
|
public static final String TAG = ContactSelectorFragment.class.getName();
|
||||||
|
|
||||||
private Menu menu;
|
protected Menu menu;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ContactSelectorAdapter getAdapter(Context context,
|
protected ContactSelectorAdapter getAdapter(Context context,
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.socialbackup.creation.CreateBackupController;
|
||||||
|
import org.briarproject.briar.android.contactselection.BaseContactSelectorAdapter;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorController;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorFragment;
|
||||||
|
import org.briarproject.briar.android.contactselection.SelectableContactItem;
|
||||||
|
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
|
@MethodsNotNullByDefault
|
||||||
|
@ParametersNotNullByDefault
|
||||||
|
public class CustodianSelectorFragment extends ContactSelectorFragment {
|
||||||
|
|
||||||
|
public static final String TAG = CustodianSelectorFragment.class.getName();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CreateBackupController controller;
|
||||||
|
|
||||||
|
public static CustodianSelectorFragment newInstance() {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
|
||||||
|
CustodianSelectorFragment fragment = new CustodianSelectorFragment();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectFragment(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
requireActivity().setTitle(R.string.title_select_custodians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ContactSelectorController<SelectableContactItem> getController() {
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSelectionChanged() {
|
||||||
|
super.onSelectionChanged();
|
||||||
|
if (menu == null) return;
|
||||||
|
MenuItem item = menu.findItem(R.id.action_contacts_selected);
|
||||||
|
if (item == null) return;
|
||||||
|
|
||||||
|
BaseContactSelectorAdapter a = adapter;
|
||||||
|
selectedContacts = a.getSelectedContactIds();
|
||||||
|
|
||||||
|
int n = selectedContacts.size();
|
||||||
|
int min = 2;
|
||||||
|
boolean enough = n >= min;
|
||||||
|
|
||||||
|
item.setVisible(enough);
|
||||||
|
if (n == 0) {
|
||||||
|
Toast.makeText(getContext(), String.format(getString(R.string.select_at_least_n_contacts), min),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
} else if (n < min) {
|
||||||
|
Toast.makeText(getContext(), String.format(getString(R.string.select_at_least_n_more_contacts), min - n),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.activity.BriarActivity;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorListener;
|
||||||
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
import org.briarproject.briar.api.socialbackup.SocialBackupManager;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
public class DistributedBackupActivity extends BriarActivity implements
|
||||||
|
BaseFragment.BaseFragmentListener, ContactSelectorListener,
|
||||||
|
ThresholdDefinedListener, ShardsSentDismissedListener {
|
||||||
|
|
||||||
|
private Collection<ContactId> custodians;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public SocialBackupManager socialBackupManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DatabaseComponent db;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectActivity(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_distributed_backup);
|
||||||
|
// TODO here we should check if we already have a backup
|
||||||
|
// BackupMetadata backupMetadata = socialBackupManager.getBackupMetadata();
|
||||||
|
// if (backupMetadata == null) {
|
||||||
|
CustodianSelectorFragment fragment =
|
||||||
|
CustodianSelectorFragment.newInstance();
|
||||||
|
// } else {
|
||||||
|
// display the backup metadata
|
||||||
|
showInitialFragment(fragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contactsSelected(Collection<ContactId> contacts) {
|
||||||
|
Toast.makeText(this,
|
||||||
|
String.format("selected %d contacts", contacts.size()),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
custodians = contacts;
|
||||||
|
ThresholdSelectorFragment fragment = ThresholdSelectorFragment.newInstance(contacts.size());
|
||||||
|
showNextFragment(fragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void thresholdDefined(int threshold) throws DbException {
|
||||||
|
db.transaction(false, txn -> {
|
||||||
|
socialBackupManager.createBackup(txn, (List<ContactId>) custodians, threshold);
|
||||||
|
ShardsSentFragment fragment = new ShardsSentFragment();
|
||||||
|
showNextFragment(fragment);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shardsSentDismissed() {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.activity.BriarActivity;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorListener;
|
||||||
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
public class OldDistributedBackupActivity extends BriarActivity
|
||||||
|
implements BaseFragment.BaseFragmentListener, ContactSelectorListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectActivity(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_distributed_backup);
|
||||||
|
|
||||||
|
// CustodianDisplayFragment fragment =
|
||||||
|
// CustodianDisplayFragment.newInstance();
|
||||||
|
//
|
||||||
|
// showInitialFragment(fragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contactsSelected(Collection<ContactId> contacts) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import androidx.annotation.UiThread;
|
||||||
|
|
||||||
|
public interface ShardsSentDismissedListener {
|
||||||
|
|
||||||
|
@UiThread
|
||||||
|
void shardsSentDismissed();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
|
public class ShardsSentFragment extends BaseFragment {
|
||||||
|
|
||||||
|
public static final String TAG = ShardsSentFragment.class.getName();
|
||||||
|
|
||||||
|
protected ShardsSentDismissedListener listener;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
requireActivity().setTitle(R.string.title_distributed_backup);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_shards_sent,
|
||||||
|
container, false);
|
||||||
|
|
||||||
|
Button button = view.findViewById(R.id.button);
|
||||||
|
button.setOnClickListener(e -> {
|
||||||
|
listener.shardsSentDismissed();
|
||||||
|
});
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
listener = (ShardsSentDismissedListener) context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectFragment(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
|
||||||
|
import androidx.annotation.UiThread;
|
||||||
|
|
||||||
|
public interface ThresholdDefinedListener {
|
||||||
|
|
||||||
|
@UiThread
|
||||||
|
void thresholdDefined(int threshold) throws DbException;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorListener;
|
||||||
|
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||||
|
import org.magmacollective.darkcrystal.secretsharingwrapper.SecretSharingWrapper;
|
||||||
|
|
||||||
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
|
public class ThresholdSelectorFragment extends BaseFragment {
|
||||||
|
|
||||||
|
public static final String TAG = ThresholdSelectorFragment.class.getName();
|
||||||
|
private static final String NUMBER_CUSTODIANS = "numberCustodians";
|
||||||
|
|
||||||
|
protected ThresholdDefinedListener listener;
|
||||||
|
|
||||||
|
// TODO this should be the actual number of custodians
|
||||||
|
private int numberOfCustodians;
|
||||||
|
private int threshold;
|
||||||
|
private int recommendedThreshold;
|
||||||
|
private SeekBar seekBar;
|
||||||
|
private TextView thresholdRepresentation;
|
||||||
|
private TextView message;
|
||||||
|
private TextView mOfn;
|
||||||
|
|
||||||
|
public static ThresholdSelectorFragment newInstance(int numberCustodians) {
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putInt(NUMBER_CUSTODIANS, numberCustodians);
|
||||||
|
ThresholdSelectorFragment fragment = new ThresholdSelectorFragment();
|
||||||
|
fragment.setArguments(bundle);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
requireActivity().setTitle(R.string.title_define_threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_select_threshold,
|
||||||
|
container, false);
|
||||||
|
Bundle args = requireArguments();
|
||||||
|
numberOfCustodians = args.getInt(NUMBER_CUSTODIANS);
|
||||||
|
|
||||||
|
seekBar = view.findViewById(R.id.seekBar);
|
||||||
|
thresholdRepresentation = view.findViewById(R.id.textViewThresholdRepresentation);
|
||||||
|
message = view.findViewById(R.id.textViewMessage);
|
||||||
|
mOfn = view.findViewById(R.id.textViewmOfn);
|
||||||
|
int max = numberOfCustodians - 3;
|
||||||
|
seekBar.setMax(max);
|
||||||
|
seekBar.setOnSeekBarChangeListener(new SeekBarListener());
|
||||||
|
recommendedThreshold = SecretSharingWrapper.defaultThreshold(numberOfCustodians);
|
||||||
|
threshold = recommendedThreshold;
|
||||||
|
seekBar.setProgress(threshold - 2);
|
||||||
|
|
||||||
|
thresholdRepresentation.setText(buildThresholdRepresentationString());
|
||||||
|
setmOfnText();
|
||||||
|
return view;
|
||||||
|
// return super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setmOfnText() {
|
||||||
|
mOfn.setText(String.format("%d of %d contacts needed to recover your account", threshold, numberOfCustodians));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
listener = (ThresholdDefinedListener) context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectFragment(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
inflater.inflate(R.menu.define_threshold_actions, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.action_threshold_defined:
|
||||||
|
try {
|
||||||
|
listener.thresholdDefined(threshold);
|
||||||
|
} catch (DbException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildThresholdRepresentationString () {
|
||||||
|
String thresholdRepresentationText = "";
|
||||||
|
for (int i = 0; i < threshold; i++) {
|
||||||
|
thresholdRepresentationText += getString(R.string.filled_bullet);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < (numberOfCustodians - threshold); i++) {
|
||||||
|
thresholdRepresentationText += getString(R.string.linear_bullet);
|
||||||
|
}
|
||||||
|
return thresholdRepresentationText;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SeekBarListener implements SeekBar.OnSeekBarChangeListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress,
|
||||||
|
boolean fromUser) {
|
||||||
|
threshold = progress + 2;
|
||||||
|
|
||||||
|
thresholdRepresentation.setText(
|
||||||
|
buildThresholdRepresentationString()
|
||||||
|
);
|
||||||
|
setmOfnText();
|
||||||
|
|
||||||
|
int sanityLevel = SecretSharingWrapper.thresholdSanity(threshold, numberOfCustodians);
|
||||||
|
int text = R.string.threshold_secure;
|
||||||
|
if (threshold == recommendedThreshold) text = R.string.threshold_recommended;
|
||||||
|
if (sanityLevel < -1) text = R.string.threshold_low_insecure;
|
||||||
|
if (sanityLevel > 0) text = R.string.threshold_high_insecure;
|
||||||
|
message.setText(text);
|
||||||
|
// TODO change colour of thresholdRepresentation to green/red based on sanityLevel
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup.creation;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorController;
|
||||||
|
import org.briarproject.briar.android.contactselection.SelectableContactItem;
|
||||||
|
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
@NotNullByDefault
|
||||||
|
public interface CreateBackupController
|
||||||
|
extends ContactSelectorController<SelectableContactItem> {
|
||||||
|
|
||||||
|
void createGroup(String name,
|
||||||
|
ResultExceptionHandler<GroupId, DbException> result);
|
||||||
|
|
||||||
|
void sendInvitation(GroupId g, Collection<ContactId> contacts,
|
||||||
|
@Nullable String text,
|
||||||
|
ResultExceptionHandler<Void, DbException> result);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup.creation;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.Contact;
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId;
|
||||||
|
import org.briarproject.bramble.api.contact.ContactManager;
|
||||||
|
import org.briarproject.bramble.api.crypto.CryptoExecutor;
|
||||||
|
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||||
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
|
import org.briarproject.bramble.api.db.NoSuchContactException;
|
||||||
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
|
import org.briarproject.bramble.api.identity.LocalAuthor;
|
||||||
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
|
import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl;
|
||||||
|
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
|
||||||
|
import org.briarproject.briar.api.identity.AuthorManager;
|
||||||
|
import org.briarproject.briar.api.privategroup.GroupMessage;
|
||||||
|
import org.briarproject.briar.api.privategroup.GroupMessageFactory;
|
||||||
|
import org.briarproject.briar.api.privategroup.PrivateGroup;
|
||||||
|
import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
|
||||||
|
import org.briarproject.briar.api.privategroup.PrivateGroupManager;
|
||||||
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;
|
||||||
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
@NotNullByDefault
|
||||||
|
/**
|
||||||
|
* Derived from {@link org.briarproject.briar.android.privategroup.invitation.GroupInvitationControllerImpl}
|
||||||
|
*/
|
||||||
|
class CreateBackupControllerImpl extends ContactSelectorControllerImpl
|
||||||
|
implements CreateBackupController {
|
||||||
|
|
||||||
|
private static final Logger LOG =
|
||||||
|
Logger.getLogger(
|
||||||
|
CreateBackupControllerImpl.class.getName());
|
||||||
|
|
||||||
|
private final Executor cryptoExecutor;
|
||||||
|
private final ContactManager contactManager;
|
||||||
|
private final IdentityManager identityManager;
|
||||||
|
private final PrivateGroupFactory groupFactory;
|
||||||
|
private final GroupMessageFactory groupMessageFactory;
|
||||||
|
private final PrivateGroupManager groupManager;
|
||||||
|
private final GroupInvitationFactory groupInvitationFactory;
|
||||||
|
private final GroupInvitationManager groupInvitationManager;
|
||||||
|
private final Clock clock;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CreateBackupControllerImpl(@DatabaseExecutor Executor dbExecutor,
|
||||||
|
@CryptoExecutor Executor cryptoExecutor,
|
||||||
|
LifecycleManager lifecycleManager, ContactManager contactManager,
|
||||||
|
IdentityManager identityManager, PrivateGroupFactory groupFactory,
|
||||||
|
GroupMessageFactory groupMessageFactory,
|
||||||
|
PrivateGroupManager groupManager,
|
||||||
|
GroupInvitationFactory groupInvitationFactory,
|
||||||
|
GroupInvitationManager groupInvitationManager, Clock clock, AuthorManager authorManager) {
|
||||||
|
super(dbExecutor, lifecycleManager, contactManager, authorManager);
|
||||||
|
this.cryptoExecutor = cryptoExecutor;
|
||||||
|
this.contactManager = contactManager;
|
||||||
|
this.identityManager = identityManager;
|
||||||
|
this.groupFactory = groupFactory;
|
||||||
|
this.groupMessageFactory = groupMessageFactory;
|
||||||
|
this.groupManager = groupManager;
|
||||||
|
this.groupInvitationFactory = groupInvitationFactory;
|
||||||
|
this.groupInvitationManager = groupInvitationManager;
|
||||||
|
this.clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createGroup(String name,
|
||||||
|
ResultExceptionHandler<GroupId, DbException> handler) {
|
||||||
|
runOnDbThread(() -> {
|
||||||
|
try {
|
||||||
|
LocalAuthor author = identityManager.getLocalAuthor();
|
||||||
|
createGroupAndMessages(author, name, handler);
|
||||||
|
} catch (DbException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
handler.onException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createGroupAndMessages(LocalAuthor author, String name,
|
||||||
|
ResultExceptionHandler<GroupId, DbException> handler) {
|
||||||
|
cryptoExecutor.execute(() -> {
|
||||||
|
LOG.info("Creating group...");
|
||||||
|
PrivateGroup group =
|
||||||
|
groupFactory.createPrivateGroup(name, author);
|
||||||
|
LOG.info("Creating new join announcement...");
|
||||||
|
GroupMessage joinMsg =
|
||||||
|
groupMessageFactory.createJoinMessage(group.getId(),
|
||||||
|
clock.currentTimeMillis(), author);
|
||||||
|
storeGroup(group, joinMsg, handler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void storeGroup(PrivateGroup group, GroupMessage joinMsg,
|
||||||
|
ResultExceptionHandler<GroupId, DbException> handler) {
|
||||||
|
runOnDbThread(() -> {
|
||||||
|
LOG.info("Adding group to database...");
|
||||||
|
try {
|
||||||
|
groupManager.addPrivateGroup(group, joinMsg, true);
|
||||||
|
handler.onResult(group.getId());
|
||||||
|
} catch (DbException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
handler.onException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isDisabled(GroupId g, Contact c) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendInvitation(GroupId g, Collection<ContactId> contactIds,
|
||||||
|
@Nullable String text,
|
||||||
|
ResultExceptionHandler<Void, DbException> handler) {
|
||||||
|
runOnDbThread(() -> {
|
||||||
|
try {
|
||||||
|
LocalAuthor localAuthor = identityManager.getLocalAuthor();
|
||||||
|
List<Contact> contacts = new ArrayList<>();
|
||||||
|
for (ContactId c : contactIds) {
|
||||||
|
try {
|
||||||
|
contacts.add(contactManager.getContact(c));
|
||||||
|
} catch (NoSuchContactException e) {
|
||||||
|
// Continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signInvitations(g, localAuthor, contacts, text, handler);
|
||||||
|
} catch (DbException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
handler.onException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void signInvitations(GroupId g, LocalAuthor localAuthor,
|
||||||
|
Collection<Contact> contacts, @Nullable String text,
|
||||||
|
ResultExceptionHandler<Void, DbException> handler) {
|
||||||
|
cryptoExecutor.execute(() -> {
|
||||||
|
long timestamp = clock.currentTimeMillis();
|
||||||
|
List<InvitationContext> contexts = new ArrayList<>();
|
||||||
|
for (Contact c : contacts) {
|
||||||
|
byte[] signature = groupInvitationFactory.signInvitation(c, g,
|
||||||
|
timestamp, localAuthor.getPrivateKey());
|
||||||
|
contexts.add(new InvitationContext(c.getId(), timestamp,
|
||||||
|
signature));
|
||||||
|
}
|
||||||
|
sendInvitations(g, contexts, text, handler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendInvitations(GroupId g,
|
||||||
|
Collection<InvitationContext> contexts, @Nullable String text,
|
||||||
|
ResultExceptionHandler<Void, DbException> handler) {
|
||||||
|
runOnDbThread(() -> {
|
||||||
|
try {
|
||||||
|
for (InvitationContext context : contexts) {
|
||||||
|
try {
|
||||||
|
groupInvitationManager.sendInvitation(g,
|
||||||
|
context.contactId, text, context.timestamp,
|
||||||
|
context.signature);
|
||||||
|
} catch (NoSuchContactException e) {
|
||||||
|
// Continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//noinspection ConstantConditions
|
||||||
|
handler.onResult(null);
|
||||||
|
} catch (DbException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
handler.onException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class InvitationContext {
|
||||||
|
|
||||||
|
private final ContactId contactId;
|
||||||
|
private final long timestamp;
|
||||||
|
private final byte[] signature;
|
||||||
|
|
||||||
|
private InvitationContext(ContactId contactId, long timestamp,
|
||||||
|
byte[] signature) {
|
||||||
|
this.contactId = contactId;
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
this.signature = signature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package org.briarproject.briar.android.socialbackup.creation;
|
||||||
|
|
||||||
|
import org.briarproject.briar.android.activity.ActivityScope;
|
||||||
|
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
|
||||||
|
@Module
|
||||||
|
public class CreateBackupModule {
|
||||||
|
|
||||||
|
@ActivityScope
|
||||||
|
@Provides
|
||||||
|
CreateBackupController provideCreateGroupController(
|
||||||
|
CreateBackupControllerImpl createBackupController) {
|
||||||
|
return createBackupController;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#29C400"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M19.77,5.03l1.4,1.4L8.43,19.17l-5.6,-5.6 1.4,-1.4 4.2,4.2L19.77,5.03m0,-2.83L8.43,13.54l-4.2,-4.2L0,13.57 8.43,22 24,6.43 19.77,2.2z"/>
|
||||||
|
</vector>
|
||||||
39
briar-android/src/main/res/drawable/ic_pie_2_of_3.xml
Normal file
39
briar-android/src/main/res/drawable/ic_pie_2_of_3.xml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="223.98288dp"
|
||||||
|
android:height="224.54811dp"
|
||||||
|
android:viewportWidth="223.98288"
|
||||||
|
android:viewportHeight="224.54811">
|
||||||
|
<path
|
||||||
|
android:pathData="m217.071,117.837a100,100 0,0 1,-50 86.603,100 100,0 0,1 -100,0l50,-86.603z"
|
||||||
|
android:strokeAlpha="0.967625"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillAlpha="0.967625"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M61.997,200.214A100,100 0,0 1,11.997 113.611,100 100,0 0,1 61.997,27.009l50,86.602z"
|
||||||
|
android:strokeAlpha="0.967625"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillAlpha="0.967625"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m67.272,24.388a100,100 0,0 1,100 -0,100 100,0 0,1 50,86.602l-100,0z"
|
||||||
|
android:strokeAlpha="0.967625"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillAlpha="0.967625"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m206.574,108.346a100,100 0,0 1,-50 86.603,100 100,0 0,1 -100,0l50,-86.603z"
|
||||||
|
android:strokeWidth="3"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M51.5,190.723A100,100 0,0 1,1.5 104.12,100 100,0 0,1 51.5,17.518l50,86.602z"
|
||||||
|
android:strokeWidth="3"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m56.775,14.897a100,100 0,0 1,100 -0,100 100,0 0,1 50,86.602l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
</vector>
|
||||||
56
briar-android/src/main/res/drawable/ic_pie_2_of_5.xml
Normal file
56
briar-android/src/main/res/drawable/ic_pie_2_of_5.xml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="227.09961dp"
|
||||||
|
android:height="229.26584dp"
|
||||||
|
android:viewportWidth="227.09961"
|
||||||
|
android:viewportHeight="229.26584">
|
||||||
|
<path
|
||||||
|
android:pathData="m221.061,121.69a100,100 0,0 1,-69.098 95.106L121.061,121.69Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M145.01,218.923A100,100 0,0 1,33.207 182.596l80.902,-58.779z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M27.939,175.395A100,100 0,0 1,27.939 57.838L108.841,116.616Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M32.639,50.913A100,100 0,0 1,144.442 14.586L113.54,109.691Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m152.553,17.698a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m213.717,113.504a100,100 0,0 1,-69.098 95.106l-30.902,-95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M137.667,210.738A100,100 0,0 1,25.863 174.411L106.765,115.632Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M20.596,167.209A100,100 0,0 1,20.596 49.652L101.497,108.431Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M25.295,42.727A100,100 0,0 1,137.098 6.4l-30.902,95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m145.21,9.512a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
</vector>
|
||||||
56
briar-android/src/main/res/drawable/ic_pie_3_of_5.xml
Normal file
56
briar-android/src/main/res/drawable/ic_pie_3_of_5.xml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="227.09961dp"
|
||||||
|
android:height="229.26584dp"
|
||||||
|
android:viewportWidth="227.09961"
|
||||||
|
android:viewportHeight="229.26584">
|
||||||
|
<path
|
||||||
|
android:pathData="m221.061,121.69a100,100 0,0 1,-69.098 95.106L121.061,121.69Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M145.01,218.923A100,100 0,0 1,33.207 182.596l80.902,-58.779z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M27.939,175.395A100,100 0,0 1,27.939 57.838L108.841,116.616Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M32.639,50.913A100,100 0,0 1,144.442 14.586L113.54,109.691Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m152.553,17.698a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m213.717,113.504a100,100 0,0 1,-69.098 95.106l-30.902,-95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M137.667,210.738A100,100 0,0 1,25.863 174.411L106.765,115.632Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M20.596,167.209A100,100 0,0 1,20.596 49.652L101.497,108.431Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M25.295,42.727A100,100 0,0 1,137.098 6.4l-30.902,95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m145.21,9.512a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
</vector>
|
||||||
56
briar-android/src/main/res/drawable/ic_pie_4_of_5.xml
Normal file
56
briar-android/src/main/res/drawable/ic_pie_4_of_5.xml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="227.09961dp"
|
||||||
|
android:height="229.26584dp"
|
||||||
|
android:viewportWidth="227.09961"
|
||||||
|
android:viewportHeight="229.26584">
|
||||||
|
<path
|
||||||
|
android:pathData="m221.061,121.69a100,100 0,0 1,-69.098 95.106L121.061,121.69Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M145.01,218.923A100,100 0,0 1,33.207 182.596l80.902,-58.779z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M27.939,175.395A100,100 0,0 1,27.939 57.838L108.841,116.616Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M32.639,50.913A100,100 0,0 1,144.442 14.586L113.54,109.691Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m152.553,17.698a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#b3b3b3"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m213.717,113.504a100,100 0,0 1,-69.098 95.106l-30.902,-95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M137.667,210.738A100,100 0,0 1,25.863 174.411L106.765,115.632Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#800080"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M20.596,167.209A100,100 0,0 1,20.596 49.652L101.497,108.431Z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M25.295,42.727A100,100 0,0 1,137.098 6.4l-30.902,95.106z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m145.21,9.512a100,100 0,0 1,69.098 95.106l-100,0z"
|
||||||
|
android:strokeWidth="3.00011"
|
||||||
|
android:fillColor="#ff00ff"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/fragmentContainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_help_recover"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_custodian_explainer" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_help_recover"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_custodian_error_explainer" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_recovery_mode"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_owner_explainer" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_recovery_mode"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_owner_error_explainer" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_recovery_mode"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_owner_main" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/title_recovery_mode"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_recovery_owner_recovering" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/setup_title"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
<include layout="@layout/fragment_start" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
19
briar-android/src/main/res/layout/activity_welcome.xml
Normal file
19
briar-android/src/main/res/layout/activity_welcome.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:title="@string/setup_title"
|
||||||
|
app:titleTextColor="@android:color/white" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="32dp"
|
||||||
|
android:text="@string/backup_done_dismiss"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_account_recovered"
|
||||||
|
android:textSize="30sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginStart="32dp"
|
||||||
|
android:layout_marginLeft="32dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="32dp"
|
||||||
|
android:layout_marginRight="32dp"
|
||||||
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_done_outline_24" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
130
briar-android/src/main/res/layout/fragment_mockups.xml
Normal file
130
briar-android/src/main/res/layout/fragment_mockups.xml
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Backup creation" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonSelectThreshold"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Select Threshold" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonShardsSent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Shards sent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Setup" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonWelcome"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Welcome" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Recovery from secrect owner's point of view" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryExplainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Explainer" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryReceivedShard"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Shard received" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryMain1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Main (0 shards)" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryMain2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Main (1 shard)" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryMain3"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Recovering account…" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryAccountRecovered"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Account recovered" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonOwnerRecoveryErrorExplainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Error" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Recovery from custodian's point of view" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonCustodianRecoveryExplainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Explainer" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonCustodianRecoveryErrorExplainer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Error" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonCustodianRecoveryDone"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_security"
|
||||||
|
android:text="Done" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/custodian_shard_sent"
|
||||||
|
android:textSize="30sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginStart="32dp"
|
||||||
|
android:layout_marginLeft="32dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="32dp"
|
||||||
|
android:layout_marginRight="32dp"
|
||||||
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_done_outline_24" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_custodian2">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/custodian_recovery_failed_to_send"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView1"
|
||||||
|
app:srcCompat="@drawable/qr_code_error" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_helpful_suggestions"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/recovery_retry"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_custodian1">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/custodian_recovery_explainer"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView"
|
||||||
|
app:srcCompat="@drawable/qr_code_intro" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:text="@string/custodian_scan_code"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_owner2">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_failed_to_receive"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView1"
|
||||||
|
app:srcCompat="@drawable/qr_code_error" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_helpful_suggestions"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/recovery_retry"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_owner1">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_explainer"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView"
|
||||||
|
app:srcCompat="@drawable/qr_code_intro" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:text="@string/recovery_begin"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_owner3">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_recovered_shards"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewShardCount"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="0"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/recovery_scan_qr_code"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:ignore="VectorDrawableCompat"
|
||||||
|
tools:showIn="@layout/activity_preview_recovery_owner4">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_recovered_shards"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewShardCount"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="3"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView"
|
||||||
|
tools:layout_editor_absoluteX="16dp" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBar"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="144dp"
|
||||||
|
android:indeterminate="true"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textViewShardCount" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView3"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_recovering_account"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/progressBar" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/title_threshold"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/threshold"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/seekBar"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:max="5"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:progress="3"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/title_threshold" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewThresholdRepresentation"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:text="placeholder"
|
||||||
|
android:textSize="64dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/seekBar" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewmOfn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:text="m of n contacts needed to recover your account"
|
||||||
|
android:textSize="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textViewThresholdRepresentation" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewMessage"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:text="@string/threshold_secure"
|
||||||
|
android:textSize="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textViewmOfn" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="32dp"
|
||||||
|
android:text="@string/backup_done_dismiss"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/recovery_shard_received"
|
||||||
|
android:textSize="30sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginStart="32dp"
|
||||||
|
android:layout_marginLeft="32dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="32dp"
|
||||||
|
android:layout_marginRight="32dp"
|
||||||
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_done_outline_24" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
50
briar-android/src/main/res/layout/fragment_shards_sent.xml
Normal file
50
briar-android/src/main/res/layout/fragment_shards_sent.xml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="32dp"
|
||||||
|
android:text="@string/backup_done_dismiss"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/backup_done_info"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textSize="30sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginStart="32dp"
|
||||||
|
android:layout_marginLeft="32dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="32dp"
|
||||||
|
android:layout_marginRight="32dp"
|
||||||
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_baseline_done_outline_24" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
34
briar-android/src/main/res/layout/fragment_start.xml
Normal file
34
briar-android/src/main/res/layout/fragment_start.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/linearLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/margin_large"
|
||||||
|
android:paddingTop="@dimen/margin_medium"
|
||||||
|
android:paddingRight="@dimen/margin_large"
|
||||||
|
android:paddingBottom="@dimen/margin_medium"
|
||||||
|
tools:showIn="@layout/activity_preview_welcome">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonSelectThreshold"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_contacts"
|
||||||
|
android:text="@string/setup_new_account"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonShardsSent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_repeat"
|
||||||
|
android:text="@string/setup_restore_account"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/buttonSelectThreshold" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
14
briar-android/src/main/res/layout/item_custodian.xml
Normal file
14
briar-android/src/main/res/layout/item_custodian.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/checkBox"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Bob"
|
||||||
|
tools:text="@sample/names.json/names/short_names/name" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -27,4 +27,9 @@
|
|||||||
android:title="@string/delete_contact"
|
android:title="@string/delete_contact"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_help_recover_account"
|
||||||
|
android:icon="@drawable/introduction_white"
|
||||||
|
android:title="@string/help_recover_account"
|
||||||
|
app:showAsAction="never"/>
|
||||||
</menu>
|
</menu>
|
||||||
12
briar-android/src/main/res/menu/define_threshold_actions.xml
Normal file
12
briar-android/src/main/res/menu/define_threshold_actions.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_threshold_defined"
|
||||||
|
android:icon="@drawable/ic_check_white"
|
||||||
|
android:title="@string/threshold_defined"
|
||||||
|
app:showAsAction="always"/>
|
||||||
|
|
||||||
|
</menu>
|
||||||
@@ -638,4 +638,78 @@
|
|||||||
<!-- This is a message to be used in screenshots. -->
|
<!-- This is a message to be used in screenshots. -->
|
||||||
<string name="screenshot_message_3">No problem, hope you like it 😀</string>
|
<string name="screenshot_message_3">No problem, hope you like it 😀</string>
|
||||||
|
|
||||||
|
<!-- social backup -->
|
||||||
|
|
||||||
|
<!-- settings -->
|
||||||
|
|
||||||
|
<string name="pref_distributed_backup_title">Social backup</string>
|
||||||
|
<string name="pref_distributed_backup_summary">Backup your account using trusted contacts</string>
|
||||||
|
|
||||||
|
<string name="pref_distributed_old_backup_title">Existing Social backup</string>
|
||||||
|
<string name="pref_distributed_old_backup_summary">Information about your most recent social backup</string>
|
||||||
|
|
||||||
|
<!-- social backup procedure -->
|
||||||
|
|
||||||
|
<string name="select_custodians">Select Trusted Contacts:</string>
|
||||||
|
|
||||||
|
<string name="select_at_least_n_contacts">Please select at least %d contacts</string>
|
||||||
|
<string name="select_at_least_n_more_contacts">Please select at least %d more contacts</string>
|
||||||
|
|
||||||
|
<string name="threshold">The minimum number of trusted contacts needed to restore your account:</string>
|
||||||
|
<string name="threshold_secure">Secure</string>
|
||||||
|
<string name="threshold_recommended">Secure - recommended threshold</string>
|
||||||
|
<string name="threshold_low_insecure">Insecure – higher threshold recommended</string>
|
||||||
|
<string name="threshold_high_insecure">Danger of loss – lower threshold recommended</string>
|
||||||
|
<string name="threshold_defined">Choose Threshold</string>
|
||||||
|
|
||||||
|
<string name="backup_done_info">Backup pieces sent to trusted contacts</string>
|
||||||
|
<string name="backup_done_dismiss">Got it</string>
|
||||||
|
|
||||||
|
<string name="backup_created">Backup created 1/6/2020</string>
|
||||||
|
|
||||||
|
<!-- recovery from the secret owner's POV -->
|
||||||
|
|
||||||
|
<string name="recovery_explainer">You need to meet your trusted contacts in-person to receive pieces by scanning QR codes</string>
|
||||||
|
<string name="recovery_begin">Begin</string>
|
||||||
|
<string name="recovery_failed_to_receive">Failed to receive backup piece</string>
|
||||||
|
<string name="recovery_helpful_suggestions">Please check that bluetooth is swtiched on and that no-one but your trusted contact is able to scan the QR code</string>
|
||||||
|
<string name="recovery_retry">Retry</string>
|
||||||
|
<string name="recovery_recovered_shards">Recovered backup pieces:</string>
|
||||||
|
<string name="recovery_scan_qr_code">Scan QR code</string>
|
||||||
|
<string name="recovery_recovering_account">Recovering account…</string>
|
||||||
|
<string name="recovery_shard_received">Account backup piece received</string>
|
||||||
|
<string name="recovery_account_recovered">Account recovered</string>
|
||||||
|
|
||||||
|
<!-- recovery from the custodian's POV -->
|
||||||
|
|
||||||
|
<string name="custodian_recovery_explainer">You need to meet in-person to transfer backup piece</string>
|
||||||
|
<string name="custodian_recovery_failed_to_send">Failed to send backup piece</string>
|
||||||
|
<string name="custodian_scan_code">Scan code</string>
|
||||||
|
<string name="custodian_shard_sent">Account backup piece transmitted</string>
|
||||||
|
|
||||||
|
<!-- titles for the app bar -->
|
||||||
|
|
||||||
|
<string name="title_distributed_backup">Social Backup</string>
|
||||||
|
<string name="title_select_custodians">Select Trusted Contacts</string>
|
||||||
|
<string name="title_define_threshold">Choose Threshold</string>
|
||||||
|
<string name="title_recovery_mode">Recovery Mode</string>
|
||||||
|
<string name="title_help_recover">Help recover account</string>
|
||||||
|
|
||||||
|
<!-- conversation action for custodian -->
|
||||||
|
|
||||||
|
<string name="help_recover_account">Help recover account</string>
|
||||||
|
|
||||||
|
<!-- setup screen -->
|
||||||
|
|
||||||
|
<string name="setup_new_account">Create new account</string>
|
||||||
|
<string name="setup_restore_account">Restore account from backup</string>
|
||||||
|
|
||||||
|
<!-- Symbols for visualising threshold values for social backup -->
|
||||||
|
<string name="filled_bullet">\u25CF</string>
|
||||||
|
<string name="linear_bullet">\u25CB</string>
|
||||||
|
|
||||||
|
<!-- activity names -->
|
||||||
|
<string name="activity_name_distributed_backup">Social Backup</string>
|
||||||
|
<string name="activity_name_old_distributed_backup">Old Social Backup</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -90,6 +90,17 @@
|
|||||||
android:layout="@layout/preferences_category"
|
android:layout="@layout/preferences_category"
|
||||||
android:title="@string/security_settings_title">
|
android:title="@string/security_settings_title">
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:summary="@string/pref_distributed_backup_summary"
|
||||||
|
android:title="@string/pref_distributed_backup_title"
|
||||||
|
app:iconSpaceReserved="false">
|
||||||
|
|
||||||
|
<intent
|
||||||
|
android:targetClass="org.briarproject.briar.android.socialbackup.DistributedBackupActivity"
|
||||||
|
android:targetPackage="@string/app_package" />
|
||||||
|
|
||||||
|
</Preference>
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:key="pref_key_lock"
|
android:key="pref_key_lock"
|
||||||
|
|||||||
Reference in New Issue
Block a user