Compare commits

...

9 Commits

Author SHA1 Message Date
Daniel Lublin
bb8333660b Remember to return 2021-01-29 11:02:13 +01:00
Daniel Lublin
9925c799a1 WIP add old BT-diagram to BT-setup screen 2021-01-28 15:55:26 +01:00
Daniel Lublin
3ee2d2112c WIP 2021-01-28 11:08:34 +01:00
Daniel Lublin
da5b2c194a WIP 2021-01-28 11:08:33 +01:00
Daniel Lublin
244d03a718 WIP mock 2021-01-28 11:08:32 +01:00
Torsten Grote
5c1bcdeb9d Merge branch 'update-bridges' into 'master'
Update bridges

See merge request briar/briar!1352
2021-01-26 14:11:00 +00:00
akwizgran
6c1f5450cb Add run configuration for BridgeTest. 2021-01-26 13:57:33 +00:00
akwizgran
0d070cf422 Change dummy address for meek bridge.
See https://gitweb.torproject.org/builders/tor-browser-build.git/commit/projects/tor-browser/Bundle-Data/PTConfigs/bridge_prefs.js?id=8bd845464ae14bf56e0187dfa6f6e773a6593f55
2021-01-26 13:53:51 +00:00
akwizgran
d34d66c691 Update list of obfs4 bridges. 2021-01-26 13:51:41 +00:00
17 changed files with 825 additions and 9 deletions

24
.idea/runConfigurations/BridgeTest.xml generated Normal file
View File

@@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="BridgeTest" type="AndroidJUnit" factoryName="Android JUnit" nameIsGenerated="true">
<module name="briar.bramble-java" />
<useClassPathOnly />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.briarproject.bramble.plugin.tor.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="org.briarproject.bramble.plugin.tor" />
<option name="MAIN_CLASS_NAME" value="org.briarproject.bramble.plugin.tor.BridgeTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
<envs>
<env name="OPTIONAL_TESTS" value="org.briarproject.bramble.plugin.tor.BridgeTest" />
</envs>
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -1,5 +1,14 @@
Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
Bridge obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1
Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0
Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0
Bridge obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0
Bridge obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0
Bridge obfs4 209.148.46.65:443 74FAD13168806246602538555B5521A0383A1875 cert=ssH+9rP8dG2NLDN2XuFw63hIO/9MNNinLmxQDpVa+7kTOa9/m+tGWT1SmSYpQ9uTBGa6Hw iat-mode=0
Bridge obfs4 146.57.248.225:22 10A6CD36A537FCE513A322361547444B393989F0 cert=K1gDtDAIcUfeLqbstggjIw2rtgIKqdIhUlHp82XRqNSq/mtAjp1BIC9vHKJ2FAEpGssTPw iat-mode=0
Bridge obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0
Bridge obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0
Bridge obfs4 78.46.188.239:37356 5A2D2F4158D0453E00C7C176978D3F41D69C45DB cert=3c0SwxpOisbohNxEc4tb875RVW8eOu1opRTVXJhafaKA/PNNtI7ElQIVOVZg1AdL5bxGCw iat-mode=0 Bridge obfs4 78.46.188.239:37356 5A2D2F4158D0453E00C7C176978D3F41D69C45DB cert=3c0SwxpOisbohNxEc4tb875RVW8eOu1opRTVXJhafaKA/PNNtI7ElQIVOVZg1AdL5bxGCw iat-mode=0
Bridge obfs4 52.15.78.72:9443 02069A3C5362476936B62BA6F5ACC41ABD573A9B cert=ijYG/OKc7kqu2YzKNFfeXN7/BG2BOgfEP2KyYEiGDQthnHbsOiTWHeIG0WJVW+BckzDgKw iat-mode=0 Bridge meek_lite 192.0.2.2:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
Bridge obfs4 13.58.29.242:9443 0C58939A77DA6B6B29D4B5236A75865659607AE0 cert=OylWIEHb/ezpq1zWxW0sgKRn+9ARH2eOcQOZ8/Gew+4l+oKOhQ2jUX/Y+FSl61JorXZUWA iat-mode=0
Bridge obfs4 45.33.37.112:9443 60A609BB4ABE8D46E634AE81ED29ADAB7776B399 cert=t5v19WmNv5Sc2YPNr8RQids365W7MY8zJwQVkOxBjUMFomMWARDzsbYpcWLLcw0J9Gm+BQ iat-mode=0
Bridge meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com

View File

@@ -448,6 +448,12 @@
android:label="@string/pending_contact_requests" android:label="@string/pending_contact_requests"
android:theme="@style/BriarTheme" /> android:theme="@style/BriarTheme" />
<activity
android:name=".android.bluetoothsetup.BluetoothSetupActivity"
android:label="Bluetooth Setup"
android:theme="@style/BriarTheme"
android:windowSoftInputMode="adjustResize|stateHidden" />
</application> </application>
<queries> <queries>

View File

@@ -30,14 +30,15 @@ import org.briarproject.bramble.util.StringUtils;
import org.briarproject.briar.android.account.DozeHelperModule; import org.briarproject.briar.android.account.DozeHelperModule;
import org.briarproject.briar.android.account.LockManagerImpl; import org.briarproject.briar.android.account.LockManagerImpl;
import org.briarproject.briar.android.account.SetupModule; import org.briarproject.briar.android.account.SetupModule;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupModule;
import org.briarproject.briar.android.contact.ContactListModule; import org.briarproject.briar.android.contact.ContactListModule;
import org.briarproject.briar.android.forum.ForumModule; import org.briarproject.briar.android.forum.ForumModule;
import org.briarproject.briar.android.keyagreement.ContactExchangeModule; import org.briarproject.briar.android.keyagreement.ContactExchangeModule;
import org.briarproject.briar.android.login.LoginModule; import org.briarproject.briar.android.login.LoginModule;
import org.briarproject.briar.android.navdrawer.NavDrawerModule; import org.briarproject.briar.android.navdrawer.NavDrawerModule;
import org.briarproject.briar.android.settings.SettingsModule;
import org.briarproject.briar.android.privategroup.list.GroupListModule; import org.briarproject.briar.android.privategroup.list.GroupListModule;
import org.briarproject.briar.android.reporting.DevReportModule; import org.briarproject.briar.android.reporting.DevReportModule;
import org.briarproject.briar.android.settings.SettingsModule;
import org.briarproject.briar.android.test.TestAvatarCreatorImpl; import org.briarproject.briar.android.test.TestAvatarCreatorImpl;
import org.briarproject.briar.android.viewmodel.ViewModelModule; import org.briarproject.briar.android.viewmodel.ViewModelModule;
import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.AndroidNotificationManager;
@@ -78,6 +79,7 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
SettingsModule.class, SettingsModule.class,
DevReportModule.class, DevReportModule.class,
ContactListModule.class, ContactListModule.class,
BluetoothSetupModule.class,
// below need to be within same scope as ViewModelProvider.Factory // below need to be within same scope as ViewModelProvider.Factory
ForumModule.BindsModule.class, ForumModule.BindsModule.class,
GroupListModule.class, GroupListModule.class,

View File

@@ -20,6 +20,10 @@ import org.briarproject.briar.android.blog.ReblogFragment;
import org.briarproject.briar.android.blog.RssFeedImportActivity; import org.briarproject.briar.android.blog.RssFeedImportActivity;
import org.briarproject.briar.android.blog.RssFeedManageActivity; import org.briarproject.briar.android.blog.RssFeedManageActivity;
import org.briarproject.briar.android.blog.WriteBlogPostActivity; import org.briarproject.briar.android.blog.WriteBlogPostActivity;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupActivity;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupChooseFragment;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupPendingFragment;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupStartFragment;
import org.briarproject.briar.android.contact.ContactListFragment; import org.briarproject.briar.android.contact.ContactListFragment;
import org.briarproject.briar.android.contact.add.remote.AddContactActivity; import org.briarproject.briar.android.contact.add.remote.AddContactActivity;
import org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment; import org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment;
@@ -186,6 +190,8 @@ public interface ActivityComponent {
void inject(CrashReportActivity crashReportActivity); void inject(CrashReportActivity crashReportActivity);
void inject(BluetoothSetupActivity activity);
// Fragments // Fragments
void inject(AuthorNameFragment fragment); void inject(AuthorNameFragment fragment);
@@ -242,4 +248,10 @@ public interface ActivityComponent {
void inject(ConfirmAvatarDialogFragment fragment); void inject(ConfirmAvatarDialogFragment fragment);
void inject(BluetoothSetupStartFragment fragment);
void inject(BluetoothSetupChooseFragment fragment);
void inject(BluetoothSetupPendingFragment fragment);
} }

View File

@@ -0,0 +1,60 @@
package org.briarproject.briar.android.bluetoothsetup;
import android.os.Bundle;
import android.view.MenuItem;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.appcompat.app.ActionBar;
import androidx.lifecycle.ViewModelProvider;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class BluetoothSetupActivity extends BriarActivity implements
BaseFragmentListener {
@Inject
ViewModelProvider.Factory viewModelFactory;
private BluetoothSetupViewModel viewModel;
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public void onCreate(@Nullable Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_fragment_container);
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(true);
}
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(BluetoothSetupViewModel.class);
if (state == null) {
showInitialFragment(new BluetoothSetupStartFragment());
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -0,0 +1,72 @@
package org.briarproject.briar.android.bluetoothsetup;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.lifecycle.ViewModelProvider;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class BluetoothSetupChooseFragment extends BaseFragment {
private static final String TAG =
BluetoothSetupChooseFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private BluetoothSetupViewModel viewModel;
@Override
public String getUniqueTag() {
return TAG;
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
if (getActivity() == null || getContext() == null) return null;
viewModel = new ViewModelProvider(requireActivity())
.get(BluetoothSetupViewModel.class);
View v =
inflater.inflate(R.layout.fragment_bluetooth_setup_choose,
container, false);
// TODO to enable when user picks a device from list
Button continueButton = v.findViewById(R.id.continueButton);
continueButton.setOnClickListener(view -> {
showNextFragment(new BluetoothSetupPendingFragment());
});
continueButton.setEnabled(true);
// RecyclerView devices = v.findViewById(R.id.devices);
// devices.setHasFixedSize(true);
// final LinearLayoutManager layoutManager =
// new LinearLayoutManager(getActivity(),
// LinearLayoutManager.VERTICAL, false);
// devices.setLayoutManager(layoutManager);
return v;
}
}

View File

@@ -0,0 +1,18 @@
package org.briarproject.briar.android.bluetoothsetup;
import org.briarproject.briar.android.viewmodel.ViewModelKey;
import androidx.lifecycle.ViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module
public abstract class BluetoothSetupModule {
@Binds
@IntoMap
@ViewModelKey(BluetoothSetupViewModel.class)
abstract ViewModel bindBluetoothSetupViewModel(
BluetoothSetupViewModel bluetoothSetupViewModel);
}

View File

@@ -0,0 +1,59 @@
package org.briarproject.briar.android.bluetoothsetup;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.lifecycle.ViewModelProvider;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class BluetoothSetupPendingFragment extends BaseFragment {
private static final String TAG =
BluetoothSetupPendingFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private BluetoothSetupViewModel viewModel;
@Override
public String getUniqueTag() {
return TAG;
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
if (getActivity() == null || getContext() == null) return null;
viewModel = new ViewModelProvider(requireActivity())
.get(BluetoothSetupViewModel.class);
View v = inflater.inflate(R.layout.fragment_bluetooth_setup_pending,
container, false);
return v;
}
private void onContinueButtonClicked() {
}
}

View File

@@ -0,0 +1,65 @@
package org.briarproject.briar.android.bluetoothsetup;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.lifecycle.ViewModelProvider;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class BluetoothSetupStartFragment extends BaseFragment {
private static final String TAG =
BluetoothSetupStartFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private BluetoothSetupViewModel viewModel;
@Override
public String getUniqueTag() {
return TAG;
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
if (getActivity() == null || getContext() == null) return null;
viewModel = new ViewModelProvider(requireActivity())
.get(BluetoothSetupViewModel.class);
View v = inflater.inflate(R.layout.fragment_bluetooth_setup_start,
container, false);
// TODO device-BT and BT-plugin needs to be enabled at this point
Button startButton = v.findViewById(R.id.startButton);
startButton.setOnClickListener(view -> {
showNextFragment(new BluetoothSetupChooseFragment());
});
startButton.setEnabled(true);
return v;
}
}

View File

@@ -0,0 +1,33 @@
package org.briarproject.briar.android.bluetoothsetup;
import android.app.Application;
import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.TransactionManager;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.viewmodel.DbViewModel;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.inject.Inject;
import static java.util.logging.Logger.getLogger;
@NotNullByDefault
public class BluetoothSetupViewModel extends DbViewModel {
private final static Logger LOG =
getLogger(BluetoothSetupViewModel.class.getName());
@Inject
BluetoothSetupViewModel(Application application,
@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager,
TransactionManager db,
AndroidExecutor androidExecutor) {
super(application, dbExecutor, lifecycleManager, db, androidExecutor);
}
}

View File

@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.bluetoothsetup.BluetoothSetupActivity;
import org.briarproject.briar.android.contact.BaseContactListAdapter.OnContactClickListener; import org.briarproject.briar.android.contact.BaseContactListAdapter.OnContactClickListener;
import org.briarproject.briar.android.contact.add.remote.AddContactActivity; import org.briarproject.briar.android.contact.add.remote.AddContactActivity;
import org.briarproject.briar.android.contact.add.remote.PendingContactListActivity; import org.briarproject.briar.android.contact.add.remote.PendingContactListActivity;
@@ -134,6 +135,11 @@ public class ContactListFragment extends BaseFragment
case R.id.action_add_contact_remotely: case R.id.action_add_contact_remotely:
startActivity( startActivity(
new Intent(getContext(), AddContactActivity.class)); new Intent(getContext(), AddContactActivity.class));
return;
case R.id.action_bluetooth_setup:
startActivity(
new Intent(getContext(),
BluetoothSetupActivity.class));
} }
} }

View File

@@ -0,0 +1,151 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="499.24373dp"
android:height="175.49413dp"
android:viewportWidth="499.24373"
android:viewportHeight="175.49413">
<path
android:fillColor="#000000"
android:pathData="M459.809,171.16 L455.482,166.826 L448.412,164.399
C444.524,163.064,439.689,161.403,437.668,160.708 L433.994,159.445
L437.518,159.272 C445.76,158.868,450.506,155.265,451.854,148.388
C452.65,144.327,452.983,131.09,452.684,115.347
C452.531,107.263,452.518,99.9306,452.656,99.0522
C452.794,98.1738,453.191,96.6321,453.539,95.6262
C454.761,92.0938,453.879,83.7179,451.681,77.9947
C451.333,77.0872,449.747,73.7797,448.157,70.6447
C443.999,62.4444,443.652,61.7028,443.264,60.1606
C442.805,58.3392,443.052,54.7253,443.726,53.3947
C444.392,52.0797,445.883,50.4785,446.972,49.9081
C448.271,49.2279,449.588,50.0301,451.658,52.7632
C455.08,57.2792,465.659,72.2041,467.39,74.9562
C471.136,80.9126,473.346,86.1212,475.362,93.7447
C476.017,96.2197,477.247,100.742,478.097,103.795
C478.946,106.847,480.811,113.953,482.241,119.585 L484.841,129.825
L489.491,135.018 C492.048,137.874,495.288,141.482,496.691,143.035
C498.093,144.588,499.241,146.01,499.241,146.196
C499.241,146.531,464.741,175.495,464.342,175.495
C464.227,175.495,462.186,173.545,459.807,171.161 Z M365.944,154.772
C364.687,154.144,363.739,153.393,363.03,152.465
C360.941,149.729,361.08,154.834,361.166,83.9825 L361.244,19.9437
L361.905,18.7088 C362.92,16.8111,363.897,15.7979,365.645,14.8299
L367.245,13.9437 L405.029,13.8641
C447.485,13.7747,444.431,13.6158,447.145,16.056
C448.02,16.8431,448.902,18.0155,449.329,18.9598
C450.042,20.5368,450.045,20.5982,450.135,33.1639 L450.225,45.7841
L448.427,45.654 C447.001,45.5509,446.346,45.661,445.261,46.1861
C443.248,47.1606,441.321,49.0848,440.146,51.2936 L439.109,53.2436
L439.102,40.4186 L439.095,27.5936 L405.495,27.5936 L371.895,27.5936
L371.895,78.8936 L371.895,130.194 L405.494,130.194 L439.093,130.194
L439.169,95.769 C439.242,62.8088,439.267,61.4078,439.76,62.844
C440.043,63.669,441.566,66.8415,443.143,69.894
C448.636,80.5202,448.548,79.7541,448.539,117.097
C448.532,144.718,448.415,147.048,446.877,150.206
C445.806,152.405,444.166,153.916,441.819,154.866 L440.145,155.543
L403.977,155.623 L367.809,155.703 L365.945,154.772 Z M408.344,149.734
C411.215,148.425,412.802,146.056,412.774,143.117
C412.735,139.001,409.665,135.894,405.638,135.894
C403.518,135.894,402.071,136.503,400.474,138.066
C398.229,140.264,397.72,143.505,399.173,146.353
C399.886,147.751,401.694,149.362,403.135,149.883
C404.632,150.425,406.975,150.358,408.344,149.734 Z" />
<path
android:fillColor="#000000"
android:pathData="M39.4343,171.16 L43.7609,166.826 L50.8305,164.399
C54.7188,163.064,59.5534,161.403,61.574,160.708 L65.248,159.445 L61.724,159.272
C53.4822,158.868,48.7362,155.265,47.3877,148.388
C46.5914,144.327,46.2588,131.09,46.5575,115.347
C46.7109,107.263,46.7237,99.9306,46.5859,99.0522
C46.4482,98.1738,46.0506,96.6321,45.7025,95.6262
C44.48,92.0938,45.3625,83.7179,47.5602,77.9947
C47.9087,77.0872,49.4945,73.7797,51.0844,70.6447
C55.2429,62.4444,55.589,61.7028,55.9773,60.1606
C56.4359,58.3392,56.1889,54.7253,55.5148,53.3947
C54.8486,52.0797,53.3578,50.4785,52.2686,49.9081
C50.9697,49.2279,49.6529,50.0301,47.5822,52.7632
C44.1607,57.2792,33.5808,72.2041,31.8503,74.9562
C28.1048,80.9126,25.8947,86.1212,23.8781,93.7447
C23.2234,96.2197,21.9929,100.742,21.1435,103.795
C20.2942,106.847,18.4295,113.953,16.9996,119.585 L14.4,129.824 L9.75,135.017
C7.1925,137.873,3.9525,141.481,2.55,143.034 C1.1475,144.587,0,146.009,0,146.195
C0,146.53,34.4996,175.494,34.8991,175.494
C35.0138,175.494,37.0547,173.544,39.4343,171.16 Z M133.299,154.772
C134.557,154.144,135.505,153.393,136.213,152.465
C138.302,149.729,138.163,154.834,138.077,83.9825 L137.999,19.9437
L137.338,18.7088 C136.323,16.8111,135.346,15.7979,133.598,14.8299
L131.998,13.9437 L94.2141,13.8641
C51.7582,13.7747,54.8117,13.6158,52.0976,16.056
C51.2222,16.8431,50.3404,18.0155,49.9137,18.9598
C49.2011,20.5368,49.1976,20.5982,49.1081,33.1639 L49.0182,45.7841
L50.8164,45.654 C52.2422,45.5509,52.8978,45.661,53.9824,46.1861
C55.9953,47.1606,57.9223,49.0848,59.0972,51.2936 L60.1344,53.2436
L60.1414,40.4186 L60.1484,27.5936 L93.7484,27.5936 L127.348,27.5936
L127.348,78.8936 L127.348,130.194 L93.7493,130.194 L60.1506,130.194
L60.0743,95.769 C60.0013,62.8088,59.9761,61.4078,59.4833,62.844
C59.2002,63.669,57.6777,66.8415,56.0999,69.894
C50.6074,80.5202,50.695,79.7541,50.7039,117.097
C50.7109,144.718,50.8275,147.048,52.3659,150.206
C53.4373,152.405,55.0773,153.916,57.4241,154.866 L59.0979,155.543
L95.2656,155.623 L131.433,155.703 L133.297,154.772 Z M90.8996,149.734
C88.0284,148.425,86.4419,146.056,86.4696,143.117
C86.5084,139.001,89.5784,135.894,93.606,135.894
C95.7256,135.894,97.1733,136.503,98.7696,138.066
C101.015,140.264,101.524,143.505,100.071,146.353
C99.3579,147.751,97.5496,149.362,96.1089,149.883
C94.6118,150.425,92.2689,150.358,90.9,149.734 Z" />
<path
android:fillColor="#0a3d91"
android:pathData="M247.254,75.9792 L251.99,75.9792
C265.155,75.9792,275.753,86.5777,275.753,99.7427 L275.753,131.917
C275.753,145.082,265.154,155.68,251.99,155.68 L247.254,155.68
C234.089,155.68,223.491,145.081,223.491,131.917 L223.491,99.7424
C223.491,86.5774,234.09,75.9789,247.254,75.9789 Z" />
<path
android:strokeColor="#ffffff"
android:strokeWidth="4.32805729"
android:pathData="M236.311,102.927 L261.218,127.997 L249.214,142.533 L249.214,90.5963
L261.218,104.479 L236.311,128.896" />
<path
android:fillColor="#0a3d91"
android:strokeWidth="7.55000019"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M143.679,27.5571 C142.089,30.1809,143.861,33.1318,146.464,34.1998
C149.159,35.7722,152.635,39.187,155.612,36.432
C157.845,34.3925,156.213,30.7041,153.571,29.7617
C150.507,28.085,147.019,24.2469,143.68,27.5572 Z M351.705,27.1294
C348.937,29.09,344.636,29.8244,343.327,33.1721
C342.685,35.9031,345.263,38.1647,347.911,37.5986
C351.113,35.9607,354.968,34.7562,357.089,31.6509
C357.658,29.0465,355.596,26.3002,352.821,26.9052
C352.405,26.7975,352.061,26.9402,351.704,27.1294 Z M324.943,40.3012
C322.009,42.0092,317.623,42.224,316.012,45.4542
C315.104,48.1085,317.444,50.6134,320.136,50.3152
C323.492,49.0109,327.456,48.2025,329.873,45.3129
C330.687,42.7752,328.896,39.8433,326.077,40.184
C325.673,40.0383,325.317,40.1458,324.944,40.3011 Z M169.707,42.7641
C168.488,45.476,170.464,48.2246,173.151,48.9095
C176.009,49.9903,179.82,53.0273,182.463,50.1434
C184.778,48.1069,182.802,44.308,180.053,43.7252
C176.725,42.5494,172.668,39.0116,169.707,42.7641 Z M296.98,50.3813
C293.857,51.6905,289.488,51.352,287.488,54.3514
C286.256,56.8701,288.261,59.6497,290.968,59.6911
C294.455,58.7838,298.535,58.5783,301.271,55.952
C302.385,53.5298,300.959,50.4059,298.119,50.401
C297.736,50.2053,297.369,50.274,296.98,50.3813 Z M199.49,51.9262
C197.261,53.388,196.81,56.7921,199.214,58.3031
C201.801,59.7737,205.129,60.258,208.054,60.7984
C210.839,61.1306,212.8,58.3192,211.945,55.7497
C209.902,52.47,205.473,53.0161,202.228,51.6605
C201.315,51.749,200.402,51.8376,199.49,51.9261 Z M268.004,56.434
C264.728,57.2229,260.543,56.2461,258.068,58.816
C256.418,61.0841,257.911,64.1697,260.572,64.6779
C264.184,64.3855,268.29,64.7686,271.412,62.5839
C272.874,60.3563,271.935,57.0522,269.127,56.6245
C268.778,56.3753,268.405,56.3852,268.004,56.434 Z M228.555,57.852
C226.622,59.6879,226.79,63.1186,229.426,64.1735
C232.235,65.1623,235.597,65.0202,238.57,65.0349
C241.369,64.8621,242.796,61.7451,241.494,59.3702
C238.89,56.5186,234.647,57.8284,231.201,57.1003
C230.319,57.3509,229.437,57.6015,228.555,57.8521 Z" />
</vector>

View File

@@ -0,0 +1,125 @@
<?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"
android:fillViewport="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_large">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<TextView
android:id="@+id/stepOne"
style="@style/StepBubble"
android:text="@string/step_1"
app:layout_constraintBottom_toTopOf="@+id/stepOneText"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<TextView
android:id="@+id/stepOneText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Pick contact"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/stepOne" />
<View
android:id="@+id/stepConnector"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_margin="16dp"
android:alpha="0.5"
android:background="@color/briar_accent"
app:layout_constraintBottom_toBottomOf="@+id/stepOne"
app:layout_constraintEnd_toStartOf="@+id/stepTwo"
app:layout_constraintStart_toEndOf="@+id/stepOne"
app:layout_constraintTop_toTopOf="@+id/stepOne" />
<TextView
android:id="@+id/stepTwo"
style="@style/StepBubble.Upcoming"
android:text="@string/step_2"
app:layout_constraintBottom_toTopOf="@+id/stepTwoText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="@+id/stepOne"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/stepTwoText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:alpha="0.5"
android:text="Wait for setup"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/guideline"
app:layout_constraintTop_toBottomOf="@+id/stepTwo" />
<TextView
android:id="@+id/discoveryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="32dp"
android:text="Pick the nearby contact to perform the setup with."
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/contacts"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/stepOneText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/contacts"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginVertical="32dp"
app:layout_constraintBottom_toTopOf="@id/continueButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/discoveryText" />
<Button
android:id="@+id/continueButton"
style="@style/BriarButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:enabled="false"
android:text="@string/continue_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:enabled="true" />
<TextView
android:id="@+id/commentTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="148dp"
android:layout_marginLeft="148dp"
android:layout_marginTop="124dp"
android:text="list of all [contact-name-and-avatar]"
android:textColor="@color/briar_red_500"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@@ -0,0 +1,112 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_large">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/stepOne"
style="@style/StepBubble.Completed"
app:layout_constraintBottom_toTopOf="@+id/stepOneText"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/stepOneText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Pick contact"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/stepOne" />
<View
android:id="@+id/stepConnector"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_margin="16dp"
android:background="@color/briar_accent"
app:layout_constraintBottom_toBottomOf="@+id/stepOne"
app:layout_constraintEnd_toStartOf="@+id/stepTwo"
app:layout_constraintStart_toEndOf="@+id/stepOne"
app:layout_constraintTop_toTopOf="@+id/stepOne" />
<TextView
android:id="@+id/stepTwo"
style="@style/StepBubble"
android:text="@string/step_2"
app:layout_constraintBottom_toTopOf="@+id/stepTwoText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="@+id/stepOne"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/stepTwoText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Wait for setup"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/guideline"
app:layout_constraintTop_toBottomOf="@+id/stepTwo" />
<TextView
android:id="@+id/pendingText"
android:layout_marginTop="32dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:textSize="16sp"
android:text="Waiting for a connection to be established with:\n\n[chosen contact-name-and-avatar]"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/stepOneText" />
<Button
android:id="@+id/doneButton"
style="@style/BriarButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Done"
android:enabled="false"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@@ -0,0 +1,56 @@
<?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"
android:fillViewport="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_large">
<ImageView
android:id="@+id/diagram"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:paddingBottom="@dimen/margin_large"
android:scaleType="fitCenter"
android:src="@drawable/bluetooth"
app:layout_constraintBottom_toTopOf="@id/explanationText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/explanationText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|start"
android:text="To be able to communicate over Bluetooth with contacts that were previously added at a distance, Briar needs to learn the Bluetooth address of your device. This only needs to be done once.\n\nTo accomplish this, you need to have one of your contacts nearby to perform the Bluetooth Setup.\n\nBefore you start the setup, your contact also needs bring up the Bluetooth Setup screen by navigating [here-and-here].\n\nNote: Bluetooth Pairing is not a required part of the setup."
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/startButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/diagram" />
<Button
android:id="@+id/startButton"
style="@style/BriarButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:enabled="false"
android:text="Start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintVertical_bias="1.0"
tools:enabled="true" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
@@ -8,13 +7,20 @@
android:icon="@drawable/ic_nearby" android:icon="@drawable/ic_nearby"
android:orderInCategory="3" android:orderInCategory="3"
android:title="@string/add_contact_nearby_title" android:title="@string/add_contact_nearby_title"
app:showAsAction="never"/> app:showAsAction="never" />
<item <item
android:id="@+id/action_add_contact_remotely" android:id="@+id/action_add_contact_remotely"
android:icon="@drawable/ic_link_menu" android:icon="@drawable/ic_link_menu"
android:orderInCategory="2" android:orderInCategory="2"
android:title="@string/add_contact_remotely_title" android:title="@string/add_contact_remotely_title"
app:showAsAction="never"/> app:showAsAction="never" />
<item
android:id="@+id/action_bluetooth_setup"
android:icon="@drawable/ic_link_menu"
android:orderInCategory="4"
android:title="Bluetooth setup"
app:showAsAction="never" />
</menu> </menu>