From 1be8ac6e14260d6c05f9322097cf77197c81b0ee Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 17 Aug 2021 15:07:26 +0200 Subject: [PATCH] Add simple UI for Connect via Bluetooth feature --- briar-android/artwork/bluetooth.svg | 60 +++-- briar-android/src/main/AndroidManifest.xml | 11 + .../briar/android/AndroidComponent.java | 3 + .../briarproject/briar/android/AppModule.java | 2 + .../android/activity/ActivityComponent.java | 7 +- .../connect/BluetoothConditionManager.java | 87 ++++++++ .../connect/BluetoothIntroFragment.java | 109 +++++++++ .../connect/BluetoothProgressFragment.java | 29 +++ .../connect/ConnectViaBluetoothActivity.java | 104 +++++++++ .../connect/ConnectViaBluetoothModule.java | 19 ++ .../connect/ConnectViaBluetoothState.java | 23 ++ .../ConnectViaBluetoothViewModel.java} | 209 ++++++++---------- .../BluetoothConnecterDialogFragment.java | 151 ------------- .../conversation/ConversationActivity.java | 8 +- .../conversation/ConversationViewModel.java | 9 +- .../briar/android/fragment/FinalFragment.java | 8 +- .../src/main/res/drawable/ic_bluetooth.xml | 21 ++ .../res/layout/fragment_bluetooth_intro.xml | 51 +++++ .../layout/fragment_bluetooth_progress.xml | 43 ++++ .../src/main/res/values-ar/strings.xml | 4 +- .../src/main/res/values-bg/strings.xml | 18 +- .../src/main/res/values-ca/strings.xml | 18 +- .../src/main/res/values-de/strings.xml | 18 +- .../src/main/res/values-es/strings.xml | 18 +- .../src/main/res/values-eu/strings.xml | 4 +- .../src/main/res/values-fa/strings.xml | 18 +- .../src/main/res/values-fr/strings.xml | 18 +- .../src/main/res/values-gl/strings.xml | 16 +- .../src/main/res/values-he/strings.xml | 4 +- .../src/main/res/values-hi/strings.xml | 4 +- .../src/main/res/values-hu/strings.xml | 18 +- .../src/main/res/values-is/strings.xml | 18 +- .../src/main/res/values-it/strings.xml | 18 +- .../src/main/res/values-ja/strings.xml | 18 +- .../src/main/res/values-ko/strings.xml | 4 +- .../src/main/res/values-lt/strings.xml | 18 +- .../src/main/res/values-mk/strings.xml | 4 +- .../src/main/res/values-my/strings.xml | 18 +- .../src/main/res/values-nl/strings.xml | 4 +- .../src/main/res/values-oc/strings.xml | 4 +- .../src/main/res/values-pl/strings.xml | 4 +- .../src/main/res/values-pt-rBR/strings.xml | 4 +- .../src/main/res/values-ro/strings.xml | 4 +- .../src/main/res/values-ru/strings.xml | 18 +- .../src/main/res/values-sq/strings.xml | 18 +- .../src/main/res/values-sv/strings.xml | 4 +- .../src/main/res/values-sw/strings.xml | 4 +- .../src/main/res/values-tr/strings.xml | 18 +- .../src/main/res/values-uk/strings.xml | 4 +- .../src/main/res/values-zh-rCN/strings.xml | 18 +- briar-android/src/main/res/values/strings.xml | 22 +- 51 files changed, 842 insertions(+), 494 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothConditionManager.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothIntroFragment.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothProgressFragment.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothActivity.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothModule.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothState.java rename briar-android/src/main/java/org/briarproject/briar/android/{conversation/BluetoothConnecter.java => contact/connect/ConnectViaBluetoothViewModel.java} (56%) delete mode 100644 briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecterDialogFragment.java create mode 100644 briar-android/src/main/res/drawable/ic_bluetooth.xml create mode 100644 briar-android/src/main/res/layout/fragment_bluetooth_intro.xml create mode 100644 briar-android/src/main/res/layout/fragment_bluetooth_progress.xml diff --git a/briar-android/artwork/bluetooth.svg b/briar-android/artwork/bluetooth.svg index ed248d1da..0905e018e 100644 --- a/briar-android/artwork/bluetooth.svg +++ b/briar-android/artwork/bluetooth.svg @@ -1,15 +1,28 @@ - + + + d="m 459.80937,167.15983 -4.32657,-4.3343 -7.06956,-2.42737 c -3.88825,-1.33505 -8.72285,-2.99587 -10.74354,-3.6907 l -3.674,-1.26333 3.524,-0.1726 c 8.24183,-0.40367 12.98778,-4.00671 14.33634,-10.88389 0.79628,-4.06078 1.12887,-17.29805 0.83016,-33.04122 -0.15338,-8.08375 -0.16617,-15.41641 -0.0284,-16.29481 0.13775,-0.8784 0.53527,-2.42011 0.88339,-3.42602 1.22247,-3.53243 0.33996,-11.90828 -1.8577,-17.63146 -0.34848,-0.9075 -1.93434,-4.215 -3.52415,-7.35 -4.15849,-8.2003 -4.50458,-8.94188 -4.89292,-10.4841 -0.45865,-1.82145 -0.21161,-5.43531 0.4625,-6.7659 0.66625,-1.31505 2.15695,-2.91616 3.24622,-3.48662 1.29885,-0.68024 2.61568,0.12202 4.6864,2.85512 3.42153,4.51599 14.00135,19.44095 15.73191,22.19301 3.74551,5.95636 5.95558,11.16496 7.9722,18.78849 0.6547,2.475 1.88525,6.9975 2.73456,10.05 0.84931,3.0525 2.71404,10.15792 4.14385,15.78983 l 2.59964,10.23983 4.65,5.19319 c 2.5575,2.85626 5.7975,6.46371 7.2,8.01657 1.4025,1.55286 2.55,2.97543 2.55,3.16127 0,0.33546 -34.49955,29.29931 -34.89913,29.29931 -0.11475,0 -2.15559,-1.95044 -4.5352,-4.3343 z M 365.9443,150.77206 c -1.25762,-0.62844 -2.20557,-1.3788 -2.91402,-2.30663 -2.08931,-2.73629 -1.95034,2.36868 -1.86433,-68.48249 l 0.0777,-64.03881 0.66066,-1.23494 c 1.0152,-1.89767 1.99201,-2.91087 3.73952,-3.87887 l 1.59982,-0.88619 37.78387,-0.0796 c 42.45592,-0.0894 39.40239,-0.2483 42.11646,2.19188 0.87544,0.78709 1.75715,1.95946 2.18393,2.90385 0.71264,1.57698 0.71613,1.63839 0.80561,14.20405 l 0.0899,12.62022 -1.79817,-0.13007 c -1.42577,-0.10313 -2.08143,0.007 -3.16601,0.5321 -2.01294,0.97445 -3.93993,2.89871 -5.11476,5.10753 l -1.03717,1.95 -0.007,-12.825 -0.007,-12.825 h -33.6 -33.6 v 51.3 51.3 h 33.59873 33.59874 l 0.0763,-34.425 c 0.073,-32.96021 0.0982,-34.36117 0.59098,-32.925 0.28309,0.825 1.80562,3.9975 3.3834,7.05 5.49252,10.62624 5.40494,9.86009 5.39597,47.20335 -0.007,27.62122 -0.12358,29.95084 -1.66204,33.10906 -1.07144,2.19949 -2.71143,3.71042 -5.05823,4.66019 l -1.67381,0.6774 -36.1677,0.0797 -36.16769,0.0797 -1.864,-0.93145 z m 42.39939,-5.03813 c 2.87119,-1.30885 4.45771,-3.6784 4.43003,-6.61652 -0.0388,-4.11587 -3.1088,-7.22328 -7.1364,-7.22328 -2.11956,0 -3.56727,0.60889 -5.16364,2.17177 -2.24518,2.19807 -2.75398,5.43897 -1.30101,8.28704 0.71312,1.39782 2.52137,3.00905 3.96214,3.53045 1.49707,0.54176 3.84003,0.47454 5.20888,-0.14946 z" + style="fill:#000000;stroke:none" /> + d="m 39.434334,167.15983 4.32657,-4.3343 7.06956,-2.42737 c 3.88825,-1.33505 8.72285,-2.99587 10.74354,-3.6907 l 3.674,-1.26333 -3.524,-0.1726 c -8.24183,-0.40367 -12.98778,-4.00671 -14.33634,-10.88389 -0.79628,-4.06078 -1.12887,-17.29805 -0.83016,-33.04122 0.15338,-8.08375 0.16617,-15.41641 0.0284,-16.29481 -0.13775,-0.8784 -0.53527,-2.42011 -0.88339,-3.42602 -1.22247,-3.53243 -0.33996,-11.90828 1.8577,-17.63146 0.34848,-0.9075 1.93434,-4.215 3.52415,-7.35 4.15849,-8.2003 4.50458,-8.94188 4.89292,-10.4841 0.45865,-1.82145 0.21161,-5.43531 -0.4625,-6.7659 -0.66625,-1.31505 -2.15695,-2.91616 -3.24622,-3.48662 -1.29885,-0.68024 -2.61568,0.12202 -4.6864,2.85512 -3.42153,4.51599 -14.00135,19.44095 -15.73191,22.19301 -3.74551,5.95636 -5.955584,11.16496 -7.972204,18.78849 -0.6547,2.475 -1.88525,6.9975 -2.73456,10.05 -0.84931,3.0525 -2.71404,10.15792 -4.14385,15.78983 L 14.4,125.82379 9.75,131.01698 c -2.5575,2.85626 -5.7975,6.46371 -7.2,8.01657 -1.4025,1.55286 -2.55,2.97543 -2.55,3.16127 0,0.33546 34.499554,29.29931 34.899134,29.29931 0.11475,0 2.15559,-1.95044 4.53519,-4.3343 z m 93.865056,-16.38777 c 1.25762,-0.62844 2.20557,-1.3788 2.91402,-2.30663 2.08931,-2.73629 1.95034,2.36868 1.86433,-68.48249 l -0.0777,-64.03881 -0.66066,-1.23494 c -1.0152,-1.89767 -1.99201,-2.91087 -3.73952,-3.87887 L 132.00004,9.94413 94.216184,9.86453 c -42.45592,-0.0894 -39.40239,-0.2483 -42.11646,2.19188 -0.87544,0.78709 -1.75715,1.95946 -2.18393,2.90385 -0.71264,1.57698 -0.71613,1.63839 -0.80561,14.20405 l -0.0899,12.62022 1.79817,-0.13007 c 1.42577,-0.10313 2.08143,0.007 3.16601,0.5321 2.01294,0.97445 3.93993,2.89871 5.11476,5.10753 l 1.03717,1.95 0.007,-12.825 0.007,-12.825 h 33.6 33.599986 v 51.3 51.3 H 93.751664 60.152924 l -0.0763,-34.425 c -0.073,-32.96021 -0.0982,-34.36117 -0.59098,-32.925 -0.28309,0.825 -1.80562,3.9975 -3.3834,7.05 -5.49252,10.62624 -5.40494,9.86009 -5.39597,47.20335 0.007,27.62122 0.12358,29.95084 1.66204,33.10906 1.07144,2.19949 2.71143,3.71042 5.05823,4.66019 l 1.67381,0.6774 36.1677,0.0797 36.167676,0.0797 1.864,-0.93145 z m -42.399376,-5.03813 c -2.87119,-1.30885 -4.45771,-3.6784 -4.43003,-6.61652 0.0388,-4.11587 3.1088,-7.22328 7.1364,-7.22328 2.11956,0 3.56727,0.60889 5.16364,2.17177 2.245176,2.19807 2.753976,5.43897 1.301006,8.28704 -0.713116,1.39782 -2.521366,3.00905 -3.962136,3.53045 -1.49707,0.54176 -3.84003,0.47454 -5.20888,-0.14946 z" + style="fill:#000000;stroke:none" /> - + d="m 247.25369,71.97921 h 4.73637 c 13.16497,0 23.76348,10.598514 23.76348,23.763485 v 32.174615 c 0,13.16497 -10.59851,23.76348 -23.76348,23.76348 h -4.73637 c -13.16497,0 -23.76349,-10.59851 -23.76349,-23.76348 V 95.742695 c 0,-13.164971 10.59852,-23.763485 23.76349,-23.763485 z" + style="fill:#0a3d91;stroke:none" /> + d="m 143.67921,23.5571 c -1.59043,2.623831 0.18153,5.574737 2.78461,6.642714 2.69504,1.572445 6.1706,4.987176 9.14793,2.232151 2.23313,-2.039515 0.60129,-5.727894 -2.04109,-6.67035 -3.06433,-1.676733 -6.55172,-5.514807 -9.89145,-2.204515 z M 351.7046,23.12937 c -2.76779,1.960623 -7.06819,2.694997 -8.37782,6.042717 -0.64195,2.73095 1.93572,4.99255 4.58419,4.426453 3.2021,-1.637914 7.05658,-2.8424 9.17849,-5.94769 0.56931,-2.60435 -1.49324,-5.35066 -4.26769,-4.745697 -0.41558,-0.107679 -0.76003,0.03505 -1.11717,0.224217 z m -26.76172,13.17187 c -2.93431,1.708015 -7.32039,1.922759 -8.93076,5.153004 -0.90775,2.654328 1.43202,5.159236 4.12365,4.861044 3.35587,-1.304271 7.31954,-2.112696 9.73662,-5.002268 0.81368,-2.537666 -0.97658,-5.469583 -3.79644,-5.128908 -0.4035,-0.14574 -0.75969,-0.03824 -1.13307,0.117128 z m -155.23633,2.46289 c -1.21948,2.711869 0.75683,5.460507 3.4437,6.14538 2.85847,1.080772 6.66937,4.11785 9.31224,1.23392 2.3151,-2.03652 0.33929,-5.835383 -2.40983,-6.41823 -3.32833,-1.175814 -7.38479,-4.713633 -10.34611,-0.96107 z m 127.27344,7.61719 c -3.12289,1.309174 -7.49226,0.970678 -9.49244,3.970097 -1.23184,2.518748 0.7727,5.298264 3.48037,5.339749 3.48706,-0.907308 7.56742,-1.1128 10.30314,-3.739116 1.11397,-2.422222 -0.31199,-5.546068 -3.1516,-5.551016 -0.3827,-0.195662 -0.75023,-0.126964 -1.13947,-0.01971 z m -97.49023,1.54492 c -2.22858,1.461838 -2.68005,4.865948 -0.27553,6.376909 2.5869,1.470583 5.91459,1.954941 8.83971,2.495346 2.78485,0.332188 4.74603,-2.479173 3.89118,-5.048668 -2.04264,-3.279676 -6.47206,-2.73364 -9.71704,-4.089227 -0.91277,0.08855 -1.82555,0.177093 -2.73832,0.26564 z m 68.51367,4.50782 c -3.27623,0.788856 -7.46081,-0.187875 -9.93635,2.381992 -1.64972,2.268076 -0.15709,5.353662 2.50432,5.86185 3.61172,-0.292365 7.71764,0.09072 10.84009,-2.093962 1.46245,-2.227649 0.52336,-5.531725 -2.28478,-5.959415 -0.34949,-0.249225 -0.72211,-0.239347 -1.12328,-0.190465 z m -39.44922,1.41796 c -1.93309,1.83595 -1.76537,5.266611 0.87081,6.321491 2.80857,0.988807 6.17065,0.846733 9.1444,0.861366 2.79909,-0.172766 4.22635,-3.289835 2.92376,-5.664738 -2.60365,-2.851635 -6.84699,-1.541752 -10.29251,-2.269899 -0.88215,0.250593 -1.76431,0.501187 -2.64646,0.75178 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0a3d91;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.55;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:7.55, 22.65;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index 738ddbdf0..27956ce43 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -462,6 +462,17 @@ android:label="@string/hotspot_title" android:theme="@style/BriarTheme" /> + + + + diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java index d2ecf5196..42d6570e2 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java @@ -35,6 +35,7 @@ import org.briarproject.briar.BriarCoreEagerSingletons; import org.briarproject.briar.BriarCoreModule; import org.briarproject.briar.android.attachment.AttachmentModule; import org.briarproject.briar.android.attachment.media.MediaModule; +import org.briarproject.briar.android.contact.connect.BluetoothIntroFragment; import org.briarproject.briar.android.conversation.glide.BriarModelLoader; import org.briarproject.briar.android.hotspot.AbstractTabsFragment; import org.briarproject.briar.android.hotspot.FallbackFragment; @@ -236,4 +237,6 @@ public interface AndroidComponent void inject(SendFragment sendFragment); void inject(ReceiveFragment receiveFragment); + + void inject(BluetoothIntroFragment bluetoothIntroFragment); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 78b27dbce..a42f19bf5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -35,6 +35,7 @@ import org.briarproject.briar.android.account.SetupModule; import org.briarproject.briar.android.blog.BlogModule; import org.briarproject.briar.android.contact.ContactListModule; import org.briarproject.briar.android.contact.add.nearby.AddNearbyContactModule; +import org.briarproject.briar.android.contact.connect.ConnectViaBluetoothModule; import org.briarproject.briar.android.forum.ForumModule; import org.briarproject.briar.android.hotspot.HotspotModule; import org.briarproject.briar.android.introduction.IntroductionModule; @@ -89,6 +90,7 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; DevReportModule.class, ContactListModule.class, IntroductionModule.class, + ConnectViaBluetoothModule.class, // below need to be within same scope as ViewModelProvider.Factory BlogModule.class, ForumModule.class, diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java index 683b484e8..8c0a30735 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java @@ -28,8 +28,8 @@ 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.NicknameFragment; import org.briarproject.briar.android.contact.add.remote.PendingContactListActivity; +import org.briarproject.briar.android.contact.connect.ConnectViaBluetoothActivity; import org.briarproject.briar.android.conversation.AliasDialogFragment; -import org.briarproject.briar.android.conversation.BluetoothConnecterDialogFragment; import org.briarproject.briar.android.conversation.ConversationActivity; import org.briarproject.briar.android.conversation.ConversationSettingsDialog; import org.briarproject.briar.android.conversation.ImageActivity; @@ -238,9 +238,6 @@ public interface ActivityComponent { void inject(ConversationSettingsDialog dialog); - void inject( - BluetoothConnecterDialogFragment bluetoothConnecterDialogFragment); - void inject(RssFeedImportFragment fragment); void inject(RssFeedManageFragment fragment); @@ -248,4 +245,6 @@ public interface ActivityComponent { void inject(RssFeedImportFailedDialogFragment fragment); void inject(RssFeedDeleteFeedDialogFragment fragment); + + void inject(ConnectViaBluetoothActivity connectViaBluetoothActivity); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothConditionManager.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothConditionManager.java new file mode 100644 index 000000000..a2b2a4cf7 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothConditionManager.java @@ -0,0 +1,87 @@ +package org.briarproject.briar.android.contact.connect; + +import android.app.Activity; +import android.content.Context; + +import org.briarproject.briar.R; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.Nullable; +import androidx.annotation.UiThread; +import androidx.appcompat.app.AlertDialog; + +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.os.Build.VERSION.SDK_INT; +import static androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale; +import static org.briarproject.briar.android.util.UiUtils.getGoToSettingsListener; +import static org.briarproject.briar.android.util.UiUtils.isLocationEnabled; +import static org.briarproject.briar.android.util.UiUtils.showLocationDialog; + +class BluetoothConditionManager { + + private enum Permission { + UNKNOWN, GRANTED, SHOW_RATIONALE, PERMANENTLY_DENIED + } + + private Permission locationPermission = Permission.UNKNOWN; + + /** + * Call this when the using activity or fragment starts, + * because permissions might have changed while it was stopped. + */ + void reset() { + locationPermission = Permission.UNKNOWN; + } + + @UiThread + void onLocationPermissionResult(Activity activity, + @Nullable Boolean result) { + if (result != null && result) { + locationPermission = Permission.GRANTED; + } else if (shouldShowRequestPermissionRationale(activity, + ACCESS_FINE_LOCATION)) { + locationPermission = Permission.SHOW_RATIONALE; + } else { + locationPermission = Permission.PERMANENTLY_DENIED; + } + } + + boolean areRequirementsFulfilled(Context ctx, + ActivityResultLauncher permissionRequest, + Runnable onLocationDenied) { + boolean permissionGranted = + SDK_INT < 23 || locationPermission == Permission.GRANTED; + boolean locationEnabled = isLocationEnabled(ctx); + if (permissionGranted && locationEnabled) return true; + + if (locationPermission == Permission.PERMANENTLY_DENIED) { + showDenialDialog(ctx, onLocationDenied); + } else if (locationPermission == Permission.SHOW_RATIONALE) { + showRationale(ctx, permissionRequest); + } else if (!locationEnabled) { + showLocationDialog(ctx); + } + return false; + } + + private void showDenialDialog(Context ctx, Runnable onLocationDenied) { + new AlertDialog.Builder(ctx, R.style.BriarDialogTheme) + .setTitle(R.string.permission_location_title) + .setMessage(R.string.permission_location_denied_body) + .setPositiveButton(R.string.ok, getGoToSettingsListener(ctx)) + .setNegativeButton(R.string.cancel, (v, d) -> + onLocationDenied.run()) + .show(); + } + + private void showRationale(Context ctx, + ActivityResultLauncher permissionRequest) { + new AlertDialog.Builder(ctx, R.style.BriarDialogTheme) + .setTitle(R.string.permission_location_title) + .setMessage(R.string.permission_location_request_body) + .setPositiveButton(R.string.ok, (dialog, which) -> + permissionRequest.launch(ACCESS_FINE_LOCATION)) + .show(); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothIntroFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothIntroFragment.java new file mode 100644 index 000000000..52d02c0f4 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothIntroFragment.java @@ -0,0 +1,109 @@ +package org.briarproject.briar.android.contact.connect; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.Toast; + +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.briar.R; +import org.briarproject.briar.android.util.ActivityLaunchers.RequestBluetoothDiscoverable; + +import javax.inject.Inject; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.RequestPermission; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.widget.Toast.LENGTH_LONG; +import static org.briarproject.briar.android.AppModule.getAndroidComponent; + +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class BluetoothIntroFragment extends Fragment { + + final static String TAG = BluetoothIntroFragment.class.getName(); + + @Inject + ViewModelProvider.Factory viewModelFactory; + + private final BluetoothConditionManager conditionManager = + new BluetoothConditionManager(); + private ConnectViaBluetoothViewModel viewModel; + + private final ActivityResultLauncher bluetoothDiscoverableRequest = + registerForActivityResult(new RequestBluetoothDiscoverable(), + this::onBluetoothDiscoverable); + private final ActivityResultLauncher permissionRequest = + registerForActivityResult(new RequestPermission(), + this::onPermissionRequestResult); + + @Override + public void onAttach(Context context) { + super.onAttach(context); + getAndroidComponent(requireContext()).inject(this); + viewModel = new ViewModelProvider(requireActivity(), viewModelFactory) + .get(ConnectViaBluetoothViewModel.class); + } + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater + .inflate(R.layout.fragment_bluetooth_intro, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + Button startButton = view.findViewById(R.id.startButton); + startButton.setOnClickListener(this::onStartClicked); + } + + @Override + public void onStart() { + super.onStart(); + conditionManager.reset(); + } + + private void onStartClicked(View v) { + if (viewModel.shouldStartFlow()) { + // The dialog starts a permission request which comes back as true + // if the permission is already granted. + // So we can use the request as a generic entry point + // to the whole flow. + permissionRequest.launch(ACCESS_FINE_LOCATION); + } + } + + private void onPermissionRequestResult(@Nullable Boolean result) { + Activity a = requireActivity(); + // update permission result in BluetoothConnecter + conditionManager.onLocationPermissionResult(a, result); + // what to do when the user denies granting the location permission + Runnable onLocationPermissionDenied = () -> Toast.makeText( + requireContext(), + R.string.connect_via_bluetooth_no_location_permission, + LENGTH_LONG).show(); + // if requirements are fulfilled, request Bluetooth discoverability + if (conditionManager.areRequirementsFulfilled(a, permissionRequest, + onLocationPermissionDenied)) { + bluetoothDiscoverableRequest.launch(120); // for 2min + } + } + + private void onBluetoothDiscoverable(@Nullable Boolean result) { + if (result != null && result) { + viewModel.onBluetoothDiscoverable(); + } + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothProgressFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothProgressFragment.java new file mode 100644 index 000000000..fee273f58 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/BluetoothProgressFragment.java @@ -0,0 +1,29 @@ +package org.briarproject.briar.android.contact.connect; + +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 androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class BluetoothProgressFragment extends Fragment { + + final static String TAG = BluetoothProgressFragment.class.getName(); + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater + .inflate(R.layout.fragment_bluetooth_progress, container, false); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothActivity.java new file mode 100644 index 000000000..806f5e783 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothActivity.java @@ -0,0 +1,104 @@ +package org.briarproject.briar.android.contact.connect; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import org.briarproject.bramble.api.contact.ContactId; +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.FinalFragment; + +import javax.inject.Inject; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import static java.util.Objects.requireNonNull; +import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; +import static org.briarproject.briar.android.util.UiUtils.showFragment; + +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class ConnectViaBluetoothActivity extends BriarActivity { + + @Inject + ViewModelProvider.Factory viewModelFactory; + + private ConnectViaBluetoothViewModel viewModel; + + @Override + public void injectActivity(ActivityComponent component) { + component.inject(this); + + viewModel = new ViewModelProvider(this, viewModelFactory) + .get(ConnectViaBluetoothViewModel.class); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = requireNonNull(getIntent()); + int contactId = intent.getIntExtra(CONTACT_ID, -1); + if (contactId == -1) throw new IllegalArgumentException("ContactId"); + viewModel.setContactId(new ContactId(contactId)); + + setContentView(R.layout.activity_fragment_container); + + viewModel.getState().observeEvent(this, this::onStateChanged); + + if (savedInstanceState == null) { + Fragment f = new BluetoothIntroFragment(); + String tag = BluetoothIntroFragment.TAG; + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, f, tag) + .commitNow(); + } + } + + @Override + public void onStart() { + super.onStart(); + viewModel.reset(); + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void onStateChanged(ConnectViaBluetoothState state) { + Fragment f; + String tag = FinalFragment.TAG; + if (state instanceof ConnectViaBluetoothState.Connecting) { + f = new BluetoothProgressFragment(); + tag = BluetoothProgressFragment.TAG; + } else if (state instanceof ConnectViaBluetoothState.Success) { + f = FinalFragment.newInstance( + R.string.connect_via_bluetooth_success, + R.drawable.ic_check_circle_outline, + R.color.briar_brand_green, + 0 + ); + } else if (state instanceof ConnectViaBluetoothState.Error) { + f = FinalFragment.newInstance( + R.string.error, + R.drawable.alerts_and_states_error, + R.color.briar_red_500, + ((ConnectViaBluetoothState.Error) state).errorRes + ); + } else throw new AssertionError(); + showFragment(getSupportFragmentManager(), f, tag, false); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothModule.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothModule.java new file mode 100644 index 000000000..50b3b70c3 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothModule.java @@ -0,0 +1,19 @@ +package org.briarproject.briar.android.contact.connect; + +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 ConnectViaBluetoothModule { + + @Binds + @IntoMap + @ViewModelKey(ConnectViaBluetoothViewModel.class) + abstract ViewModel bindContactListViewModel( + ConnectViaBluetoothViewModel connectViaBluetoothViewModel); + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothState.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothState.java new file mode 100644 index 000000000..d32e6ba84 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothState.java @@ -0,0 +1,23 @@ +package org.briarproject.briar.android.contact.connect; + +import androidx.annotation.StringRes; + +abstract class ConnectViaBluetoothState { + + static class Connecting extends ConnectViaBluetoothState { + } + + static class Success extends ConnectViaBluetoothState { + } + + static class Error extends ConnectViaBluetoothState { + @StringRes + final int errorRes; + + Error(@StringRes int errorRes) { + this.errorRes = errorRes; + } + } + +} + diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothViewModel.java similarity index 56% rename from briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecter.java rename to briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothViewModel.java index dc46af738..d73d2db34 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/connect/ConnectViaBluetoothViewModel.java @@ -1,19 +1,20 @@ -package org.briarproject.briar.android.conversation; +package org.briarproject.briar.android.contact.connect; -import android.app.Activity; import android.app.Application; import android.bluetooth.BluetoothAdapter; -import android.content.Context; -import android.widget.Toast; import org.briarproject.bramble.api.connection.ConnectionManager; import org.briarproject.bramble.api.connection.ConnectionRegistry; import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.PluginManager; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.plugin.event.ConnectionOpenedEvent; @@ -21,23 +22,22 @@ import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.plugin.bluetooth.BluetoothPlugin; import org.briarproject.briar.R; -import org.briarproject.briar.android.contact.ContactItem; +import org.briarproject.briar.android.contact.connect.ConnectViaBluetoothState.Connecting; +import org.briarproject.briar.android.contact.connect.ConnectViaBluetoothState.Success; +import org.briarproject.briar.android.viewmodel.DbViewModel; +import org.briarproject.briar.android.viewmodel.LiveEvent; +import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import java.util.concurrent.Executor; import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.inject.Inject; -import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; import androidx.annotation.UiThread; -import androidx.appcompat.app.AlertDialog; -import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.os.Build.VERSION.SDK_INT; -import static androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale; +import static java.util.Objects.requireNonNull; import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; @@ -46,48 +46,50 @@ import static org.briarproject.bramble.api.plugin.BluetoothConstants.PROP_UUID; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; -import static org.briarproject.briar.android.util.UiUtils.getGoToSettingsListener; -import static org.briarproject.briar.android.util.UiUtils.isLocationEnabled; -import static org.briarproject.briar.android.util.UiUtils.showLocationDialog; -class BluetoothConnecter implements EventListener { +@UiThread +@NotNullByDefault +class ConnectViaBluetoothViewModel extends DbViewModel implements + EventListener { - private final Logger LOG = getLogger(BluetoothConnecter.class.getName()); + private final Logger LOG = + getLogger(ConnectViaBluetoothViewModel.class.getName()); private final long BT_ACTIVE_TIMEOUT = SECONDS.toMillis(5); - private enum Permission { - UNKNOWN, GRANTED, SHOW_RATIONALE, PERMANENTLY_DENIED - } - - private final Application app; private final PluginManager pluginManager; private final Executor ioExecutor; - private final AndroidExecutor androidExecutor; private final ConnectionRegistry connectionRegistry; + @Nullable private final BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); private final EventBus eventBus; private final TransportPropertyManager transportPropertyManager; private final ConnectionManager connectionManager; + @Nullable private volatile BluetoothPlugin bluetoothPlugin; - - private Permission locationPermission = Permission.UNKNOWN; + @Nullable private ContactId contactId = null; + private final MutableLiveEvent state = + new MutableLiveEvent<>(); + @Inject - BluetoothConnecter(Application app, + ConnectViaBluetoothViewModel( + Application app, + @DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, + TransactionManager db, + AndroidExecutor androidExecutor, PluginManager pluginManager, @IoExecutor Executor ioExecutor, - AndroidExecutor androidExecutor, ConnectionRegistry connectionRegistry, EventBus eventBus, TransportPropertyManager transportPropertyManager, ConnectionManager connectionManager) { - this.app = app; + super(app, dbExecutor, lifecycleManager, db, androidExecutor); this.pluginManager = pluginManager; this.ioExecutor = ioExecutor; - this.androidExecutor = androidExecutor; this.bluetoothPlugin = (BluetoothPlugin) pluginManager.getPlugin(ID); this.connectionRegistry = connectionRegistry; this.eventBus = eventBus; @@ -95,20 +97,22 @@ class BluetoothConnecter implements EventListener { this.connectionManager = connectionManager; } - boolean isConnectedViaBluetooth(ContactId contactId) { - return connectionRegistry.isConnected(contactId, ID); - } - - boolean isDiscovering() { - return bluetoothPlugin.isDiscovering(); + @Override + protected void onCleared() { + stopConnecting(); } /** - * Call this when the using activity or fragment starts, - * because permissions might have changed while it was stopped. + * Set this as soon as it becomes available. + */ + void setContactId(ContactId contactId) { + this.contactId = contactId; + } + + /** + * Call this when the using activity or fragment starts. */ void reset() { - locationPermission = Permission.UNKNOWN; // When this class is instantiated before we are logged in // (like when returning to a killed activity), bluetoothPlugin would be // null and we consider bluetooth not supported. So reset here. @@ -116,94 +120,52 @@ class BluetoothConnecter implements EventListener { } @UiThread - void onLocationPermissionResult(Activity activity, - @Nullable Boolean result) { - if (result != null && result) { - locationPermission = Permission.GRANTED; - } else if (shouldShowRequestPermissionRationale(activity, - ACCESS_FINE_LOCATION)) { - locationPermission = Permission.SHOW_RATIONALE; - } else { - locationPermission = Permission.PERMANENTLY_DENIED; + boolean shouldStartFlow() { + if (isBluetoothNotSupported()) { + state.setEvent(new ConnectViaBluetoothState.Error( + R.string.bt_plugin_status_inactive)); + return false; + } else if (isConnectedViaBluetooth()) { + state.setEvent(new Success()); + return false; + } else if (isDiscovering()) { + state.setEvent(new ConnectViaBluetoothState.Error( + R.string.connect_via_bluetooth_already_discovering)); + return false; } + return true; } - boolean isBluetoothNotSupported() { + private boolean isBluetoothNotSupported() { return bt == null || bluetoothPlugin == null; } - boolean areRequirementsFulfilled(Context ctx, - ActivityResultLauncher permissionRequest, - Runnable onLocationDenied) { - boolean permissionGranted = - SDK_INT < 23 || locationPermission == Permission.GRANTED; - boolean locationEnabled = isLocationEnabled(ctx); - if (permissionGranted && locationEnabled) return true; - - if (locationPermission == Permission.PERMANENTLY_DENIED) { - showDenialDialog(ctx, onLocationDenied); - } else if (locationPermission == Permission.SHOW_RATIONALE) { - showRationale(ctx, permissionRequest); - } else if (!locationEnabled) { - showLocationDialog(ctx); - } - return false; + private boolean isDiscovering() { + // we should not be calling this if isBluetoothNotSupported() is true + return requireNonNull(bluetoothPlugin).isDiscovering(); } - private void showDenialDialog(Context ctx, Runnable onLocationDenied) { - new AlertDialog.Builder(ctx, R.style.BriarDialogTheme) - .setTitle(R.string.permission_location_title) - .setMessage(R.string.permission_location_denied_body) - .setPositiveButton(R.string.ok, getGoToSettingsListener(ctx)) - .setNegativeButton(R.string.cancel, (v, d) -> - onLocationDenied.run()) - .show(); - } - - private void showRationale(Context ctx, - ActivityResultLauncher permissionRequest) { - new AlertDialog.Builder(ctx, R.style.BriarDialogTheme) - .setTitle(R.string.permission_location_title) - .setMessage(R.string.permission_location_request_body) - .setPositiveButton(R.string.ok, (dialog, which) -> - permissionRequest.launch(ACCESS_FINE_LOCATION)) - .show(); + private boolean isConnectedViaBluetooth() { + return connectionRegistry.isConnected(requireNonNull(contactId), ID); } @UiThread - void onBluetoothDiscoverable(ContactItem contact) { - contactId = contact.getContact().getId(); - connect(); - } + void onBluetoothDiscoverable() { + ContactId contactId = requireNonNull(this.contactId); + BluetoothPlugin bluetoothPlugin = requireNonNull(this.bluetoothPlugin); - @UiThread - @Override - public void eventOccurred(@NonNull Event e) { - if (e instanceof ConnectionOpenedEvent) { - ConnectionOpenedEvent c = (ConnectionOpenedEvent) e; - if (c.getContactId().equals(contactId) && c.isIncoming() && - c.getTransportId() == ID) { - if (bluetoothPlugin != null) { - bluetoothPlugin.stopDiscoverAndConnect(); - } - LOG.info("Contact connected to us"); - showToast(R.string.toast_connect_via_bluetooth_success); - } - } - } + state.setEvent(new Connecting()); - private void connect() { bluetoothPlugin.disablePolling(); pluginManager.setPluginEnabled(ID, true); - ioExecutor.execute(() -> { try { if (!waitForBluetoothActive()) { - showToast(R.string.bt_plugin_status_inactive); + state.postEvent(new ConnectViaBluetoothState.Error( + R.string.bt_plugin_status_inactive)); LOG.warning("Bluetooth plugin didn't become active"); return; } - showToast(R.string.toast_connect_via_bluetooth_start); eventBus.addListener(this); try { String uuid = null; @@ -226,7 +188,7 @@ class BluetoothConnecter implements EventListener { LOG.info("Could connect, handling connection"); connectionManager .manageOutgoingConnection(contactId, ID, conn); - showToast(R.string.toast_connect_via_bluetooth_success); + state.postEvent(new Success()); } } finally { eventBus.removeListener(this); @@ -237,8 +199,23 @@ class BluetoothConnecter implements EventListener { }); } + @UiThread + @Override + public void eventOccurred(@NonNull Event e) { + if (e instanceof ConnectionOpenedEvent) { + ConnectionOpenedEvent c = (ConnectionOpenedEvent) e; + if (c.getContactId().equals(contactId) && c.isIncoming() && + c.getTransportId() == ID) { + stopConnecting(); + LOG.info("Contact connected to us"); + state.postEvent(new Success()); + } + } + } + @IoExecutor private boolean waitForBluetoothActive() { + BluetoothPlugin bluetoothPlugin = requireNonNull(this.bluetoothPlugin); long left = BT_ACTIVE_TIMEOUT; final long sleep = 250; try { @@ -264,9 +241,9 @@ class BluetoothConnecter implements EventListener { final long sleep = 250; try { while (left > 0) { - if (isConnectedViaBluetooth(contactId)) { + if (isConnectedViaBluetooth()) { LOG.info("Failed to connect, but contact connected"); - // no Toast needed here, as it gets shown when + // no success state needed here, as it gets shown when // ConnectionOpenedEvent is received return; } @@ -277,13 +254,19 @@ class BluetoothConnecter implements EventListener { Thread.currentThread().interrupt(); } LOG.warning("Failed to connect"); - showToast(R.string.toast_connect_via_bluetooth_error); + state.postEvent(new ConnectViaBluetoothState.Error( + R.string.connect_via_bluetooth_error)); } - private void showToast(@StringRes int res) { - androidExecutor.runOnUiThread(() -> - Toast.makeText(app, res, Toast.LENGTH_LONG).show() - ); + private void stopConnecting() { + BluetoothPlugin bluetoothPlugin = this.bluetoothPlugin; + if (bluetoothPlugin != null) { + bluetoothPlugin.stopDiscoverAndConnect(); + } + } + + LiveEvent getState() { + return state; } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecterDialogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecterDialogFragment.java deleted file mode 100644 index f208d3bcf..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecterDialogFragment.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.briarproject.briar.android.conversation; - -import android.app.Activity; -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.Toast; - -import org.briarproject.bramble.api.contact.ContactId; -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.BaseActivity; -import org.briarproject.briar.android.contact.ContactItem; -import org.briarproject.briar.android.util.ActivityLaunchers.RequestBluetoothDiscoverable; - -import javax.inject.Inject; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts.RequestPermission; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; -import androidx.lifecycle.ViewModelProvider; - -import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.content.DialogInterface.BUTTON_POSITIVE; -import static android.widget.Toast.LENGTH_LONG; -import static java.util.Objects.requireNonNull; - -@MethodsNotNullByDefault -@ParametersNotNullByDefault -public class BluetoothConnecterDialogFragment extends DialogFragment { - - final static String TAG = BluetoothConnecterDialogFragment.class.getName(); - - @Inject - ViewModelProvider.Factory viewModelFactory; - - private ConversationViewModel viewModel; - private BluetoothConnecter bluetoothConnecter; - - private final ActivityResultLauncher bluetoothDiscoverableRequest = - registerForActivityResult(new RequestBluetoothDiscoverable(), - this::onBluetoothDiscoverable); - private final ActivityResultLauncher permissionRequest = - registerForActivityResult(new RequestPermission(), - this::onPermissionRequestResult); - - @Override - public void onAttach(Context ctx) { - super.onAttach(ctx); - ((BaseActivity) requireActivity()).getActivityComponent().inject(this); - viewModel = new ViewModelProvider(requireActivity(), viewModelFactory) - .get(ConversationViewModel.class); - bluetoothConnecter = viewModel.getBluetoothConnecter(); - } - - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - Context ctx = requireContext(); - return new AlertDialog.Builder(ctx, R.style.BriarDialogTheme) - .setTitle(R.string.dialog_title_connect_via_bluetooth) - .setMessage(R.string.dialog_message_connect_via_bluetooth) - // actual listener gets set in onResume() - .setPositiveButton(R.string.start, null) - .setNegativeButton(R.string.cancel, null) - .setCancelable(false) // keep it open until dismissed - .create(); - } - - @Override - public void onStart() { - super.onStart(); - bluetoothConnecter.reset(); - if (bluetoothConnecter.isBluetoothNotSupported()) { - showToast(R.string.toast_connect_via_bluetooth_error); - dismiss(); - return; - } - // MenuItem only gets enabled after contactItem has loaded - ContactItem contact = - requireNonNull(viewModel.getContactItem().getValue()); - ContactId contactId = contact.getContact().getId(); - if (bluetoothConnecter.isConnectedViaBluetooth(contactId)) { - showToast(R.string.toast_connect_via_bluetooth_success); - dismiss(); - return; - } - if (bluetoothConnecter.isDiscovering()) { - showToast(R.string.toast_connect_via_bluetooth_already_discovering); - dismiss(); - } - } - - @Override - public void onResume() { - super.onResume(); - // Set the click listener for the START button here - // to prevent it from automatically dismissing the dialog. - // The dialog is shown in onStart(), so we set the listener here later. - AlertDialog dialog = (AlertDialog) getDialog(); - Button positiveButton = dialog.getButton(BUTTON_POSITIVE); - positiveButton.setOnClickListener(this::onStartClicked); - } - - private void onStartClicked(View v) { - // The dialog starts a permission request which comes back as true - // if the permission is already granted. - // So we can use the request as a generic entry point to the whole flow. - permissionRequest.launch(ACCESS_FINE_LOCATION); - } - - private void onPermissionRequestResult(@Nullable Boolean result) { - Activity a = requireActivity(); - // update permission result in BluetoothConnecter - bluetoothConnecter.onLocationPermissionResult(a, result); - // what to do when the user denies granting the location permission - Runnable onLocationPermissionDenied = () -> { - Toast.makeText(requireContext(), - R.string.toast_connect_via_bluetooth_no_location_permission, - LENGTH_LONG).show(); - dismiss(); - }; - // if requirements are fulfilled, request Bluetooth discoverability - if (bluetoothConnecter.areRequirementsFulfilled(a, permissionRequest, - onLocationPermissionDenied)) { - bluetoothDiscoverableRequest.launch(120); // for 2min - } - } - - private void onBluetoothDiscoverable(@Nullable Boolean result) { - if (result != null && result) { - // MenuItem only gets enabled after contactItem has loaded - ContactItem contact = - requireNonNull(viewModel.getContactItem().getValue()); - bluetoothConnecter.onBluetoothDiscoverable(contact); - dismiss(); - } else { - showToast(R.string.toast_connect_via_bluetooth_not_discoverable); - } - } - - private void showToast(@StringRes int stringRes) { - Toast.makeText(requireContext(), stringRes, LENGTH_LONG).show(); - } - -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index db2f8fb2a..1bac397f9 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -48,6 +48,7 @@ import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.attachment.AttachmentItem; import org.briarproject.briar.android.attachment.AttachmentRetriever; import org.briarproject.briar.android.blog.BlogActivity; +import org.briarproject.briar.android.contact.connect.ConnectViaBluetoothActivity; import org.briarproject.briar.android.conversation.ConversationVisitor.AttachmentCache; import org.briarproject.briar.android.conversation.ConversationVisitor.TextCache; import org.briarproject.briar.android.forum.ForumActivity; @@ -104,7 +105,6 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; import androidx.core.content.ContextCompat; -import androidx.fragment.app.FragmentManager; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -422,9 +422,9 @@ public class ConversationActivity extends BriarActivity onAutoDeleteTimerNoticeClicked(); return true; } else if (itemId == R.id.action_connect_via_bluetooth) { - FragmentManager fm = getSupportFragmentManager(); - new BluetoothConnecterDialogFragment().show(fm, - BluetoothConnecterDialogFragment.TAG); + Intent intent = new Intent(this, ConnectViaBluetoothActivity.class); + intent.putExtra(CONTACT_ID, contactId.getInt()); + startActivity(intent); return true; } else if (itemId == R.id.action_transfer_data) { Intent intent = new Intent(this, RemovableDriveActivity.class); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 557602f31..dcc42e49c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -101,7 +101,6 @@ public class ConversationViewModel extends DbViewModel private final AttachmentCreator attachmentCreator; private final AutoDeleteManager autoDeleteManager; private final ConversationManager conversationManager; - private final BluetoothConnecter bluetoothConnecter; @Nullable private ContactId contactId = null; @@ -140,8 +139,7 @@ public class ConversationViewModel extends DbViewModel AttachmentRetriever attachmentRetriever, AttachmentCreator attachmentCreator, AutoDeleteManager autoDeleteManager, - ConversationManager conversationManager, - BluetoothConnecter bluetoothConnecter) { + ConversationManager conversationManager) { super(application, dbExecutor, lifecycleManager, db, androidExecutor); this.db = db; this.eventBus = eventBus; @@ -154,7 +152,6 @@ public class ConversationViewModel extends DbViewModel this.attachmentCreator = attachmentCreator; this.autoDeleteManager = autoDeleteManager; this.conversationManager = conversationManager; - this.bluetoothConnecter = bluetoothConnecter; messagingGroupId = map(contactItem, c -> messagingManager.getContactGroup(c.getContact()).getId()); eventBus.addListener(this); @@ -414,10 +411,6 @@ public class ConversationViewModel extends DbViewModel return attachmentRetriever; } - BluetoothConnecter getBluetoothConnecter() { - return bluetoothConnecter; - } - LiveData getContactItem() { return contactItem; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/FinalFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/FinalFragment.java index 0cb4b4a8a..4daa6cca6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/FinalFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/FinalFragment.java @@ -25,6 +25,7 @@ import androidx.core.widget.ImageViewCompat; import androidx.fragment.app.Fragment; import static android.view.View.FOCUS_DOWN; +import static android.view.View.GONE; /** * A fragment to be used at the end of a user flow @@ -81,7 +82,12 @@ public class FinalFragment extends Fragment { int color = getResources().getColor(args.getInt(ARG_ICON_TINT)); ColorStateList tint = ColorStateList.valueOf(color); ImageViewCompat.setImageTintList(iconView, tint); - textView.setText(args.getInt(ARG_TEXT)); + int textRes = args.getInt(ARG_TEXT); + if (textRes == 0) { + textView.setVisibility(GONE); + } else { + textView.setText(textRes); + } buttonView.setOnClickListener(view -> onBackButtonPressed()); diff --git a/briar-android/src/main/res/drawable/ic_bluetooth.xml b/briar-android/src/main/res/drawable/ic_bluetooth.xml new file mode 100644 index 000000000..cd6f7cb41 --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_bluetooth.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/briar-android/src/main/res/layout/fragment_bluetooth_intro.xml b/briar-android/src/main/res/layout/fragment_bluetooth_intro.xml new file mode 100644 index 000000000..f7c5a272c --- /dev/null +++ b/briar-android/src/main/res/layout/fragment_bluetooth_intro.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + diff --git a/briar-android/src/main/res/layout/fragment_bluetooth_progress.xml b/briar-android/src/main/res/layout/fragment_bluetooth_progress.xml new file mode 100644 index 000000000..290d4996c --- /dev/null +++ b/briar-android/src/main/res/layout/fragment_bluetooth_progress.xml @@ -0,0 +1,43 @@ + + + + + + + + + + diff --git a/briar-android/src/main/res/values-ar/strings.xml b/briar-android/src/main/res/values-ar/strings.xml index a01b82702..c6befbb45 100644 --- a/briar-android/src/main/res/values-ar/strings.xml +++ b/briar-android/src/main/res/values-ar/strings.xml @@ -1,5 +1,5 @@ - + مرحبًا بك في Briar (براير) سيتم إظهار اسمك المستعار بجانب كل ما تنشره من محتوى. لا يمكنك تغيير الاسم بعد إنشاء حسابك. @@ -175,7 +175,7 @@ تعديل إسم جهة الاتصال اسم جهة الاتصال الإتصال عبر بلوتوث - الإتصال عبر بلوتوث + الإتصال عبر بلوتوث diff --git a/briar-android/src/main/res/values-bg/strings.xml b/briar-android/src/main/res/values-bg/strings.xml index 618a0fd6a..3768d09f3 100644 --- a/briar-android/src/main/res/values-bg/strings.xml +++ b/briar-android/src/main/res/values-bg/strings.xml @@ -1,5 +1,5 @@ - + Добре дошли в Briar Прякорът ви ще бъде видим до всяка ваша публикация. Няма да можете да го промените след като създадете профил. @@ -165,14 +165,14 @@ Име на контакта Изчезващи съобщения Свързване чрез Bluetooth - Свързване чрез Bluetooth - За да сработи този метод, контактът трябва да бъде близо до вас.\n\nДвамата трябва да натиснете „Start“ едновременно. - Има започнат опит за връзка чрез Bluetooth - Не може да продължи без Bluetooth - Не може да продължи без разрешение за местоположение - Свързване чрез Bluetooth… - Успешно свързване чрез Bluetooth - Не може да се установи връзка чрез Bluetooth + Свързване чрез Bluetooth + За да сработи този метод, контактът трябва да бъде близо до вас.\n\nДвамата трябва да натиснете „Start“ едновременно. + Има започнат опит за връзка чрез Bluetooth + Не може да продължи без Bluetooth + Не може да продължи без разрешение за местоположение + Свързване чрез Bluetooth… + Успешно свързване чрез Bluetooth + Не може да се установи връзка чрез Bluetooth Съобщението ще изчезне след %1$s. %2$s diff --git a/briar-android/src/main/res/values-ca/strings.xml b/briar-android/src/main/res/values-ca/strings.xml index 2ea8349f9..571bcf6e1 100644 --- a/briar-android/src/main/res/values-ca/strings.xml +++ b/briar-android/src/main/res/values-ca/strings.xml @@ -1,5 +1,5 @@ - + Benvingut a Briar El vostre sobrenom etiquetarà tot el que publiqueu. Després de crear el compte ja no podreu canviar el sobrenom. @@ -165,14 +165,14 @@ Nom del contacte Missatges fonedissos Connecta via bluetooth - Connecta via bluetooth - El vostre contacte ha de ser a prop per a que vagi bé.\n\nVós i el vostre contacte heu de prémer «Engega» simultàniament. - Ja està mirant de connectar-se amb Bluetooth. - No es pot continuar sense Bluetooth. - No es pot continuar sense permís per obtenir la posició. - Connectant-se via Bluetooth... - S\'ha connectat via Bluetooth. - No ha pogut connectar-se amb Bluetooth. + Connecta via bluetooth + El vostre contacte ha de ser a prop per a que vagi bé.\n\nVós i el vostre contacte heu de prémer «Engega» simultàniament. + Ja està mirant de connectar-se amb Bluetooth. + No es pot continuar sense Bluetooth. + No es pot continuar sense permís per obtenir la posició. + Connectant-se via Bluetooth... + S\'ha connectat via Bluetooth. + No ha pogut connectar-se amb Bluetooth. Els vostres missatges es faran fonedissos en %1$s. %2$s diff --git a/briar-android/src/main/res/values-de/strings.xml b/briar-android/src/main/res/values-de/strings.xml index 2868a195f..e20af3f60 100644 --- a/briar-android/src/main/res/values-de/strings.xml +++ b/briar-android/src/main/res/values-de/strings.xml @@ -1,5 +1,5 @@ - + Willkommen bei Briar Dein Benutzername wird neben deinem geposteten Inhalt angezeigt. Du kannst diesen nicht mehr ändern, nachdem du dein Konto erstellt hast. @@ -165,14 +165,14 @@ Name des Kontakts Selbstlöschende Nachrichten Über Bluetooth verbinden - Über Bluetooth verbinden - Dein Kontakt muss in der Nähe sein, damit dies funktioniert.\n\nDu und dein Kontakt sollten beide gleichzeitig \"Start\" drücken. - Versucht bereits, eine Verbindung über Bluetooth herzustellen - Kann ohne Bluetooth nicht fortgesetzt werden - Kann ohne Standortberechtigung nicht fortgesetzt werden - Verbinde über Bluetooth… - Erfolgsreich über Bluetooth verbunden - Konnte keine Verbindung über Bluetooth herstellen + Über Bluetooth verbinden + Dein Kontakt muss in der Nähe sein, damit dies funktioniert.\n\nDu und dein Kontakt sollten beide gleichzeitig \"Start\" drücken. + Versucht bereits, eine Verbindung über Bluetooth herzustellen + Kann ohne Bluetooth nicht fortgesetzt werden + Kann ohne Standortberechtigung nicht fortgesetzt werden + Verbinde über Bluetooth… + Erfolgsreich über Bluetooth verbunden + Konnte keine Verbindung über Bluetooth herstellen Deine Nachrichten werden nach %1$sgelöscht. %2$s diff --git a/briar-android/src/main/res/values-es/strings.xml b/briar-android/src/main/res/values-es/strings.xml index ca8382319..211050d9e 100644 --- a/briar-android/src/main/res/values-es/strings.xml +++ b/briar-android/src/main/res/values-es/strings.xml @@ -1,5 +1,5 @@ - + Bienvenido a Briar Tu nombre de usuario aparecerá junto a cualquier contenido que publiques. No puedes cambiarlo después de crear tu cuenta. @@ -165,14 +165,14 @@ Nombre del contacto Mensajes con caducidad Conectar mediante Bluetooth - Conectar mediante Bluetooth - Tu contacto necesita estar cerca para que esto funcione.\n\nTú y tu contacto deberían presionar \"Iniciar\" ambos al mismo tiempo. - Ya se está intentando conectar mediante Bluetooth - No se puede continuar sin Bluetooth - No se puede continuar sin permiso de ubicación - Conectar mediante Bluetooth... - Conectado exitosamente mediante Bluetooth - No se pudo conectar mediante Bluetooth + Conectar mediante Bluetooth + Tu contacto necesita estar cerca para que esto funcione.\n\nTú y tu contacto deberían presionar \"Iniciar\" ambos al mismo tiempo. + Ya se está intentando conectar mediante Bluetooth + No se puede continuar sin Bluetooth + No se puede continuar sin permiso de ubicación + Conectar mediante Bluetooth... + Conectado exitosamente mediante Bluetooth + No se pudo conectar mediante Bluetooth Tus mensajes desaparecerán después de %1$s. %2$s diff --git a/briar-android/src/main/res/values-eu/strings.xml b/briar-android/src/main/res/values-eu/strings.xml index 80e22b6c9..7b9e95051 100644 --- a/briar-android/src/main/res/values-eu/strings.xml +++ b/briar-android/src/main/res/values-eu/strings.xml @@ -1,5 +1,5 @@ - + Ongi etorri Briar-era Zure ezizena argitaratzen dituzun eduki guztien ondoan agertuko da. Ezingo duzu aldatu, kontua sortu eta gero. @@ -130,7 +130,7 @@ Aldatu kontaktuaren izena Kontaktuaren izena Konektatu Bluetooth bidez - Konektatu Bluetooth bidez + Konektatu Bluetooth bidez diff --git a/briar-android/src/main/res/values-fa/strings.xml b/briar-android/src/main/res/values-fa/strings.xml index 98fcb3eaf..357519585 100644 --- a/briar-android/src/main/res/values-fa/strings.xml +++ b/briar-android/src/main/res/values-fa/strings.xml @@ -1,5 +1,5 @@ - + به Briar (برایر) خوش آمدید نام مستعار شما کنار هر مطلبی که پست کنید قرار خواهد گرفت. بعد از ایجاد حساب کاربری امکان تغییر آن وجود ندارد. @@ -171,14 +171,14 @@ نام مخاطب پیام‌های ناپدید شونده اتصال از طریق بلوتوث - اتصال از طریق بلوتوث - برای امکان این عملکرد، مخاطب شما باید نزدیک باشد. \n\n شما و مخاطبتان باید همزمان گزینه‌ی \"شروع\" را بفشارید. - در حال تلاش برای اتصال از طریق بلوتوث - امکان ادامه بدون بلوتوث وجود ندارد - امکان ادامه بدون اجازه مکان‌یابی وجود ندارد - در حال اتصال از طریق بلوتوث - ارتباط از طریق بلوتوث با موفقیت انجام شد - اتصال از طریق بلوتوث برقرار نشد + اتصال از طریق بلوتوث + برای امکان این عملکرد، مخاطب شما باید نزدیک باشد. \n\n شما و مخاطبتان باید همزمان گزینه‌ی \"شروع\" را بفشارید. + در حال تلاش برای اتصال از طریق بلوتوث + امکان ادامه بدون بلوتوث وجود ندارد + امکان ادامه بدون اجازه مکان‌یابی وجود ندارد + در حال اتصال از طریق بلوتوث + ارتباط از طریق بلوتوث با موفقیت انجام شد + اتصال از طریق بلوتوث برقرار نشد پیام شما پس از %1$s ناپدید خواهد شد. %2$s diff --git a/briar-android/src/main/res/values-fr/strings.xml b/briar-android/src/main/res/values-fr/strings.xml index 2832e1aae..0cd385155 100644 --- a/briar-android/src/main/res/values-fr/strings.xml +++ b/briar-android/src/main/res/values-fr/strings.xml @@ -1,5 +1,5 @@ - + Bienvenue à Briar Votre pseudonyme sera affiché à côté de tout contenu que vous publierez. Vous pourrez le modifier après avoir créé votre compte. @@ -165,14 +165,14 @@ Nom du contact Messages éphémères Se connecter par Bluetooth - Se connecter par Bluetooth - Afin que cela fonctionne, votre contact doit être à proximité.\n\nVotre contact et vous devriez appuyer ensemble sur « Commencer ». - Tentative de connexion par Bluetooth déjà en cours - Impossible de poursuivre sans le Bluetooth - Impossible de poursuivre sans la permission de position - Connexion par Bluetooth… - Connectée par Bluetooth avec succès - Impossible de se connecter par Bluetooth + Se connecter par Bluetooth + Afin que cela fonctionne, votre contact doit être à proximité.\n\nVotre contact et vous devriez appuyer ensemble sur « Commencer ». + Tentative de connexion par Bluetooth déjà en cours + Impossible de poursuivre sans le Bluetooth + Impossible de poursuivre sans la permission de position + Connexion par Bluetooth… + Connectée par Bluetooth avec succès + Impossible de se connecter par Bluetooth Vos messages disparaîtront après %1$s. %2$s diff --git a/briar-android/src/main/res/values-gl/strings.xml b/briar-android/src/main/res/values-gl/strings.xml index 4c413e11c..38ce39511 100644 --- a/briar-android/src/main/res/values-gl/strings.xml +++ b/briar-android/src/main/res/values-gl/strings.xml @@ -1,5 +1,5 @@ - + Benvida a Briar O teu alcume mostrarase xunto a todas as mensaxes que publiques. Podes cambialo tras crear a túa conta. @@ -158,13 +158,13 @@ Nome do contacto Mensaxes efémeras Conectar vía Bluetooth - Conectar vía Bluetooth - O teu contacto ten que estar preto para que isto funcione.\n\nTi e o teu contacto tedes que premer en \"Iniciar\" ao mesmo tempo. - Non se pode continuar sen o Bluetooth - Non se pode continuar sen o permiso de localización - Conectando vía Bluetooth... - Conectouse correctamente vía Bluetooth - Non se puido conectar vía Bluetooth + Conectar vía Bluetooth + O teu contacto ten que estar preto para que isto funcione.\n\nTi e o teu contacto tedes que premer en \"Iniciar\" ao mesmo tempo. + Non se pode continuar sen o Bluetooth + Non se pode continuar sen o permiso de localización + Conectando vía Bluetooth... + Conectouse correctamente vía Bluetooth + Non se puido conectar vía Bluetooth As túas mensaxes desaparecerán após %1$s . %2$s diff --git a/briar-android/src/main/res/values-he/strings.xml b/briar-android/src/main/res/values-he/strings.xml index 4b853d08a..e42408824 100644 --- a/briar-android/src/main/res/values-he/strings.xml +++ b/briar-android/src/main/res/values-he/strings.xml @@ -1,5 +1,5 @@ - + ברוך בואך אל Briar כינויך יוראה ליד תוכן כלשהו שתכתוב. אינך יכול לשנות אותו לאחר יצירת חשבונך. @@ -165,7 +165,7 @@ שַׁנֵּה שם איש קשר שם איש הקשר התחבר באמצעות שן כחולה - התחבר באמצעות שן כחולה + התחבר באמצעות שן כחולה diff --git a/briar-android/src/main/res/values-hi/strings.xml b/briar-android/src/main/res/values-hi/strings.xml index 5b1b8ad14..5f34e8f16 100644 --- a/briar-android/src/main/res/values-hi/strings.xml +++ b/briar-android/src/main/res/values-hi/strings.xml @@ -1,5 +1,5 @@ - + Briar में आपका स्वागत है आपके उपनाम आप पोस्ट किसी भी सामग्री के बगल में दिखाया जाएगा। आप अपना खाता बनाने के बाद इसे बदल नहीं सकते @@ -124,7 +124,7 @@ संपर्क नाम बदलें संपर्क नाम ब्लूटूथ के माध्यम से कनेक्ट करें - ब्लूटूथ के माध्यम से कनेक्ट करें + ब्लूटूथ के माध्यम से कनेक्ट करें diff --git a/briar-android/src/main/res/values-hu/strings.xml b/briar-android/src/main/res/values-hu/strings.xml index 2b2f74c8a..8d9d58da7 100644 --- a/briar-android/src/main/res/values-hu/strings.xml +++ b/briar-android/src/main/res/values-hu/strings.xml @@ -1,5 +1,5 @@ - + Köszöntjük a Briar-ban A beceneve fog megjelenni minden tartalom mellett amit Ön osztott meg. Nem tudja megváltoztatni a fiók létrehozása után. @@ -165,14 +165,14 @@ Kapcsolat neve Eltűnő üzenetek Csatlakozás bluetooth-on keresztül - Csatlakozás bluetooth-on keresztül - A kapcsolatai közel kell legyenek, hogy ez működjön.\n\n Ön és a kapcsolata egyaránt meg kell nyomja a \"Start\" gombot egyidőben. - Már próbálkozik csatlakozni Bluetooth-on - Nem folytatható Bluetooth nélkül - Nem folytatható hely engedélyek nélkül - Csatlakozás Bluetooth-on... - Sikeres csatlakozás Bluetooth-on. - Nem sikerült csatlakozni Bluetooth-on + Csatlakozás bluetooth-on keresztül + A kapcsolatai közel kell legyenek, hogy ez működjön.\n\n Ön és a kapcsolata egyaránt meg kell nyomja a \"Start\" gombot egyidőben. + Már próbálkozik csatlakozni Bluetooth-on + Nem folytatható Bluetooth nélkül + Nem folytatható hely engedélyek nélkül + Csatlakozás Bluetooth-on... + Sikeres csatlakozás Bluetooth-on. + Nem sikerült csatlakozni Bluetooth-on Az üzenetei eltűnnek %1$s. %2$s múlva diff --git a/briar-android/src/main/res/values-is/strings.xml b/briar-android/src/main/res/values-is/strings.xml index a10f68816..d5ad28b40 100644 --- a/briar-android/src/main/res/values-is/strings.xml +++ b/briar-android/src/main/res/values-is/strings.xml @@ -1,5 +1,5 @@ - + Velkomin í Briar Stuttnefnið þitt birtist við hlið alls þess efnis sem þú sendir inn. Þú getur ekki breytt því eftir að þú hefur skráð notandaaðganginn þinn. @@ -161,14 +161,14 @@ Nafn tengiliðar Sjálfeyðandi skilaboð Tengjast í gegnum Bluetooth - Tengjast í gegnum Bluetooth - Tengiliðurinn þinn þarf að vera nálægt til að þetta virki.\n\nÞú og tengiliðurinn ættuð bæði að ýta á \"Byrja\" á sama tíma. - Þegar að reyna að tengjast í gegnum Bluetooth - Get ekki haldið áfram án Bluetooth - Get ekki haldið áfram án heimildar til að nota staðsetningu - Tengist í gegnum Bluetooth… - Tókst að tengjast í gegnum Bluetooth - Gat ekki tengst í gegnum Bluetooth + Tengjast í gegnum Bluetooth + Tengiliðurinn þinn þarf að vera nálægt til að þetta virki.\n\nÞú og tengiliðurinn ættuð bæði að ýta á \"Byrja\" á sama tíma. + Þegar að reyna að tengjast í gegnum Bluetooth + Get ekki haldið áfram án Bluetooth + Get ekki haldið áfram án heimildar til að nota staðsetningu + Tengist í gegnum Bluetooth… + Tókst að tengjast í gegnum Bluetooth + Gat ekki tengst í gegnum Bluetooth Skilaboðin þín munu hverfa eftir %1$s. %2$s diff --git a/briar-android/src/main/res/values-it/strings.xml b/briar-android/src/main/res/values-it/strings.xml index c348d719a..6bf2cb1ce 100644 --- a/briar-android/src/main/res/values-it/strings.xml +++ b/briar-android/src/main/res/values-it/strings.xml @@ -1,5 +1,5 @@ - + Benvenuto su Briar Il tuo nickname sarà accanto ad ogni contenuto pubblicato. Non potrai cambiarlo dopo aver creato l\'account. @@ -165,14 +165,14 @@ Nome contatto Messaggi dissolventi Connessione attraverso Bluetooth - Connessione attraverso Bluetooth - Per funzionare, il tuo contatto deve essere nelle vicinanze.\n\nDovreste entrambi premere \"Inizia\" nello stesso momento. - Si sta già tentanto di connettersi via Bluetooth - Impossibile continuare senza Bluetooth - Impossibile continuare senza l\'autorizzazione per la geolocalizzazione - Connessione via Bluetooth… - Connessione via Bluetooth riuscita - Connessione via Bluetooth fallita + Connessione attraverso Bluetooth + Per funzionare, il tuo contatto deve essere nelle vicinanze.\n\nDovreste entrambi premere \"Inizia\" nello stesso momento. + Si sta già tentanto di connettersi via Bluetooth + Impossibile continuare senza Bluetooth + Impossibile continuare senza l\'autorizzazione per la geolocalizzazione + Connessione via Bluetooth… + Connessione via Bluetooth riuscita + Connessione via Bluetooth fallita I tuoi messaggi spariranno dopo %1$s. %2$s diff --git a/briar-android/src/main/res/values-ja/strings.xml b/briar-android/src/main/res/values-ja/strings.xml index 75bae3641..e96f05cc2 100644 --- a/briar-android/src/main/res/values-ja/strings.xml +++ b/briar-android/src/main/res/values-ja/strings.xml @@ -1,5 +1,5 @@ - + Briarへようこそ あなたのニックネームは、常に、あなたが投稿するコンテンツとともに表示されます。プロフィール作成後、編集はできません。 @@ -154,14 +154,14 @@ 連絡先名 消えたメッセージ Bluetooth経由で接続する - Bluetooth経由で接続する - この機能を利用するには、あなたの連絡先が近くにある必要があります。\n\nあなたとあなたの連絡先が同時に\"開始\"を押してください。 - Bluetooth経由の接続を既に試行中です - Bluetoothなくして続行不可能 - 位置情報の権限なくして続行不可能 - Bluetooth経由で接続中… - Bluetooth経由で接続に成功 - Bluetooth経由で接続不可能 + Bluetooth経由で接続する + この機能を利用するには、あなたの連絡先が近くにある必要があります。\n\nあなたとあなたの連絡先が同時に\"開始\"を押してください。 + Bluetooth経由の接続を既に試行中です + Bluetoothなくして続行不可能 + 位置情報の権限なくして続行不可能 + Bluetooth経由で接続中… + Bluetooth経由で接続に成功 + Bluetooth経由で接続不可能 diff --git a/briar-android/src/main/res/values-ko/strings.xml b/briar-android/src/main/res/values-ko/strings.xml index 810c7314c..775512b21 100644 --- a/briar-android/src/main/res/values-ko/strings.xml +++ b/briar-android/src/main/res/values-ko/strings.xml @@ -1,5 +1,5 @@ - + Briar에 오신 것을 환영합니다 별명은 게시한 모든 컨텐츠 옆에 보여지게 됩니다. 별명은 계정을 만든 후에는 바꿀 수 없습니다. @@ -150,7 +150,7 @@ 연락처 이름 바꾸기 연락처 이름 블루투스로 연결하기 - 블루투스로 연결하기 + 블루투스로 연결하기 diff --git a/briar-android/src/main/res/values-lt/strings.xml b/briar-android/src/main/res/values-lt/strings.xml index 7ef520fb6..dca675750 100644 --- a/briar-android/src/main/res/values-lt/strings.xml +++ b/briar-android/src/main/res/values-lt/strings.xml @@ -1,5 +1,5 @@ - + Sveiki atvykę į Briar Jūsų slapyvardis bus rodomas šalia bet kokio jūsų skelbiamo turinio. Sukūrę paskyrą, slapyvardžio pakeisti nebegalėsite. @@ -175,14 +175,14 @@ Adresato vardas Išnykstančios žinutės Prisijungti per Bluetooth - Prisijungti per Bluetooth - Norint, kad tai suveiktų, jūsų adresatas privalo būti šalia jūsų.\n\nJūs ir jūsų adresatas abu vienu metu turėtumėte paspausti „Pradėti“. - Jau bandoma prisijungti per Bluetooth - Nepavyksta tęsti be Bluetooth - Nepavyksta tęsti be įrenginio vietovės leidimo - Jungiamasi per Bluetooth… - Sėkmingai prisijungta per Bluetooth - Nepavyko prisijungti per Bluetooth + Prisijungti per Bluetooth + Norint, kad tai suveiktų, jūsų adresatas privalo būti šalia jūsų.\n\nJūs ir jūsų adresatas abu vienu metu turėtumėte paspausti „Pradėti“. + Jau bandoma prisijungti per Bluetooth + Nepavyksta tęsti be Bluetooth + Nepavyksta tęsti be įrenginio vietovės leidimo + Jungiamasi per Bluetooth… + Sėkmingai prisijungta per Bluetooth + Nepavyko prisijungti per Bluetooth Jūsų žinutės išnyks po %1$s. %2$s diff --git a/briar-android/src/main/res/values-mk/strings.xml b/briar-android/src/main/res/values-mk/strings.xml index 66edd8db0..9510bcccf 100644 --- a/briar-android/src/main/res/values-mk/strings.xml +++ b/briar-android/src/main/res/values-mk/strings.xml @@ -1,5 +1,5 @@ - + Добредојде во Briar Вашето корисничко име ќе се појави до секоја содржина која ќе ја објавите. Истото не можете да го промените откога ќе ја креирате вашата сметка. @@ -154,7 +154,7 @@ Промена на име на контакт Име на контакт Поврзи се преку Bluetooth - Поврзи се преку Bluetooth + Поврзи се преку Bluetooth diff --git a/briar-android/src/main/res/values-my/strings.xml b/briar-android/src/main/res/values-my/strings.xml index c8737ded7..b29f1a6bb 100644 --- a/briar-android/src/main/res/values-my/strings.xml +++ b/briar-android/src/main/res/values-my/strings.xml @@ -1,5 +1,5 @@ - + Briar မှ ကြိုဆိုပါသည် သင့်နာမည်ပြောင်သည် သင်တင်ထားသမျှအရာ၏ဘေးတွင် ပေါ်နေပါလိမ့်မည်။ သို့ပါ၍ သင့်နာမည်ပြောင်အား အကောင့်ဖွင့်ပြီးနောက် ပြောင်း၍မရတော့ပါ။ @@ -160,14 +160,14 @@ အဆက်အသွယ်အမည် ပျောက်ကွယ် မက်ဆေ့ချ်များ ဘလူးတုသ် နှင့် ချိတ်မယ် - ဘလူးတုသ် နှင့် ချိတ်မယ် - လုပ်ဆောင်ချက် အောင်မြင်နိုင်ရန် သင်၏ အဆက်အသွယ်သည် အနီးအနားတွင်ရှိရပါမည်။ \n\n သင် နှင့် သင်၏ အဆက်အသွယ် နှစ်ဦးစလုံးသည် \"စတင်ရန်\" ကို တစ်ပြိုင်တည်း နှိပ်ရပါမည်။ - ဘလူးတုသ် နှင့် ချိတ်ဆက်ရန် ကြိုးစားနေပါသည် - ဘလူးတုသ် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ - တည်နေရာသုံးခွင့် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ - ဘလူးတုသ် နှင့် ချိတ်ဆက်နေသည်... - ဘလူးတုသ် နှင့် အောင်မြင်စွာ ချိတ်ဆက်ပြီး - ဘလူးတုသ် နှင့် ချိတ်ဆက်၍မရပါ + ဘလူးတုသ် နှင့် ချိတ်မယ် + လုပ်ဆောင်ချက် အောင်မြင်နိုင်ရန် သင်၏ အဆက်အသွယ်သည် အနီးအနားတွင်ရှိရပါမည်။ \n\n သင် နှင့် သင်၏ အဆက်အသွယ် နှစ်ဦးစလုံးသည် \"စတင်ရန်\" ကို တစ်ပြိုင်တည်း နှိပ်ရပါမည်။ + ဘလူးတုသ် နှင့် ချိတ်ဆက်ရန် ကြိုးစားနေပါသည် + ဘလူးတုသ် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ + တည်နေရာသုံးခွင့် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ + ဘလူးတုသ် နှင့် ချိတ်ဆက်နေသည်... + ဘလူးတုသ် နှင့် အောင်မြင်စွာ ချိတ်ဆက်ပြီး + ဘလူးတုသ် နှင့် ချိတ်ဆက်၍မရပါ သင်၏မက်ဆေ့ချ်များသည် %1$s အကြာတွင် ပျောက်ကွယ်သွားပါမည်။ %2$s diff --git a/briar-android/src/main/res/values-nl/strings.xml b/briar-android/src/main/res/values-nl/strings.xml index fa6ea51b6..784037fe1 100644 --- a/briar-android/src/main/res/values-nl/strings.xml +++ b/briar-android/src/main/res/values-nl/strings.xml @@ -1,5 +1,5 @@ - + Welkom bij Briar Je bijnaam wordt getoond bij alle content die je post. Nadat je account is aangemaakt is het niet mogelijk je bijnaam te wijzigen. @@ -155,7 +155,7 @@ Verander naam van contact Contactnaam Verbind via Bluetooth - Verbind via Bluetooth + Verbind via Bluetooth diff --git a/briar-android/src/main/res/values-oc/strings.xml b/briar-android/src/main/res/values-oc/strings.xml index 7bf2c4741..c7853ce76 100644 --- a/briar-android/src/main/res/values-oc/strings.xml +++ b/briar-android/src/main/res/values-oc/strings.xml @@ -1,5 +1,5 @@ - + La benvenguda a Briar Vòstre escais-nom serà mostrat al costat de cada de vòstra publicacion. Poiretz pas lo cambiar aprèp la creacion del compte. @@ -130,7 +130,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n Cambiar lo nom del contacte Nom del contacte Se connectar per Bluetooth - Se connectar per Bluetooth + Se connectar per Bluetooth diff --git a/briar-android/src/main/res/values-pl/strings.xml b/briar-android/src/main/res/values-pl/strings.xml index 6e1535b20..8800e4fb3 100644 --- a/briar-android/src/main/res/values-pl/strings.xml +++ b/briar-android/src/main/res/values-pl/strings.xml @@ -1,5 +1,5 @@ - + Witaj w Briar Twoja nazwa użytkownika będzie wyświetlana przy każdej zamieszczonej przez Ciebie treści. Nie można jej zmienić po tworzeniu konta. @@ -145,7 +145,7 @@ Nazwa kontaktu Znikające wiadomości Połącz przez Bluetooth - Połącz przez Bluetooth + Połącz przez Bluetooth diff --git a/briar-android/src/main/res/values-pt-rBR/strings.xml b/briar-android/src/main/res/values-pt-rBR/strings.xml index 29b1072df..531d12ce7 100644 --- a/briar-android/src/main/res/values-pt-rBR/strings.xml +++ b/briar-android/src/main/res/values-pt-rBR/strings.xml @@ -1,5 +1,5 @@ - + Boas-vindas ao Briar Seu nome de usuária será mostrado próximo a qualquer conteúdo que você publicar. Você não pode mudá-lo depois que criar sua conta, @@ -155,7 +155,7 @@ Alterar nome do contato Nome de contato Conectar via Bluetooth - Conectar via Bluetooth + Conectar via Bluetooth diff --git a/briar-android/src/main/res/values-ro/strings.xml b/briar-android/src/main/res/values-ro/strings.xml index 2ea800d7a..8cb8d5e16 100644 --- a/briar-android/src/main/res/values-ro/strings.xml +++ b/briar-android/src/main/res/values-ro/strings.xml @@ -1,5 +1,5 @@ - + Bine ați venit la Briar Numele dumneavoastră va fi afișat lângă orice conținut trimis. Nu îl veți putea schimba după crearea contului. @@ -162,7 +162,7 @@ Nume contact Mesaje ce dispar Conectare prin Bluetooth - Conectare prin Bluetooth + Conectare prin Bluetooth diff --git a/briar-android/src/main/res/values-ru/strings.xml b/briar-android/src/main/res/values-ru/strings.xml index e5f4969db..6a0c4c13c 100644 --- a/briar-android/src/main/res/values-ru/strings.xml +++ b/briar-android/src/main/res/values-ru/strings.xml @@ -1,5 +1,5 @@ - + Добро пожаловать в Briar Ваш псевдоним будет отображаться рядом с любым размещаемым вами контентом. Его нельзя изменить после создания аккаунта. @@ -177,14 +177,14 @@ Имя контакта Исчезающие сообщения Подключение через Bluetooth - Подключение через Bluetooth - Чтобы это сработало, ваш контакт должен находиться поблизости.\n\nВы и ваш собеседник должны одновременно нажать кнопку \"Начать\". - Пробуем подключиться через Bluetooth - Невозможно продолжить без Bluetooth - Невозможно продолжить без доступа к местоположению - Подключение через Bluetooth... - Успешное подключение через Bluetooth - Не удалось подключиться через Bluetooth + Подключение через Bluetooth + Чтобы это сработало, ваш контакт должен находиться поблизости.\n\nВы и ваш собеседник должны одновременно нажать кнопку \"Начать\". + Пробуем подключиться через Bluetooth + Невозможно продолжить без Bluetooth + Невозможно продолжить без доступа к местоположению + Подключение через Bluetooth... + Успешное подключение через Bluetooth + Не удалось подключиться через Bluetooth Ваши сообщения исчезнут спустя %1$s. %2$s diff --git a/briar-android/src/main/res/values-sq/strings.xml b/briar-android/src/main/res/values-sq/strings.xml index 5b2ee15bc..2930a3919 100644 --- a/briar-android/src/main/res/values-sq/strings.xml +++ b/briar-android/src/main/res/values-sq/strings.xml @@ -1,5 +1,5 @@ - + Mirë se vini në Briar Nofka juaj do të shfaqet në krah të çfarëdo gjëje që postoni. S\’mund ta ndryshoni më, pas krijimit të llogarisë tuaj. @@ -166,14 +166,14 @@ këmbyes aplikacionesh)\n\n2. Shtypni dhe mbajeni të shtypur figurën e Briar-i Emër kontakti Mesazhe që treten Lidhu përmes Bluetooth-i - Lidhu përmes Bluetooth-i - Është e nevojshme që kontakti juaj të jetë atypari, që kjo të funksionojë.\n\nJu dhe kontakti juaj duhet që të shtypin “Fillo” në të njëjtën kohë. - Po provohet tashmë të lidhet përmes Bluetooth-i - S’mund të vazhdohet pa Bluetooth - S’mund të vazhdohet pa leje vendore - Po lidhet me Bluetooth… - U lidh me sukses përmes Bluetooth-i - S’u lidh dot përmes Bluetooth-i + Lidhu përmes Bluetooth-i + Është e nevojshme që kontakti juaj të jetë atypari, që kjo të funksionojë.\n\nJu dhe kontakti juaj duhet që të shtypin “Fillo” në të njëjtën kohë. + Po provohet tashmë të lidhet përmes Bluetooth-i + S’mund të vazhdohet pa Bluetooth + S’mund të vazhdohet pa leje vendore + Po lidhet me Bluetooth… + U lidh me sukses përmes Bluetooth-i + S’u lidh dot përmes Bluetooth-i Mesazhet tuaja do të treten pas %1$s. %2$s diff --git a/briar-android/src/main/res/values-sv/strings.xml b/briar-android/src/main/res/values-sv/strings.xml index 5659671bc..068940a67 100644 --- a/briar-android/src/main/res/values-sv/strings.xml +++ b/briar-android/src/main/res/values-sv/strings.xml @@ -1,5 +1,5 @@ - + Välkommen till Briar Ditt användarnamn kommer att visas bredvid allt innehåll som du lägger upp. Du kan inte ändra ditt användarnamn efter att ditt konto skapats. @@ -155,7 +155,7 @@ Ändra namn på kontakt Kontaktnamn Anslut via Bluetooth - Anslut via Bluetooth + Anslut via Bluetooth diff --git a/briar-android/src/main/res/values-sw/strings.xml b/briar-android/src/main/res/values-sw/strings.xml index dd8d87933..889050c9d 100644 --- a/briar-android/src/main/res/values-sw/strings.xml +++ b/briar-android/src/main/res/values-sw/strings.xml @@ -1,5 +1,5 @@ - + Karibu kwenye Briar lakabu lako litaonekana kwenye kila chapisho lako . Na hutaweza badilisha baada ya kuteneneza akaunti yako . @@ -146,7 +146,7 @@ Umepoteza nenosiri. Badilisha jina lako la mawasiliano Jina la mawasiliano Unganisha kwa Bluetooth - Unganisha kwa Bluetooth + Unganisha kwa Bluetooth diff --git a/briar-android/src/main/res/values-tr/strings.xml b/briar-android/src/main/res/values-tr/strings.xml index 3517160a5..73ed89c2e 100644 --- a/briar-android/src/main/res/values-tr/strings.xml +++ b/briar-android/src/main/res/values-tr/strings.xml @@ -1,5 +1,5 @@ - + Briar\'a Hoşgeldiniz Takma adınız, gönderdiğiniz herhangi bir içeriğin yanında gösterilecek. Hesabınızı oluşturduktan sonra onu değiştiremezsiniz. @@ -165,14 +165,14 @@ Ad Kaybolan iletiler Bluetooth ile Bağlan - Bluetooth ile Bağlan - Bunun çalışması için kişinin yakınlarda olması gerekiyor.\n\nSizin ve kişinin \"Başlat\" düğmesine aynı anda basması gerekiyor. - Zaten Bluetooth\'a bağlanmaya çalışıyor - Bluetooth olmadan devam edilemez - Konum izni olmadan devam edilemez - Bluetooth ile bağlanılıyor… - Bluetooth ile başarılı bir şekilde bağlandı - Bluetooth ile bağlanamıyor + Bluetooth ile Bağlan + Bunun çalışması için kişinin yakınlarda olması gerekiyor.\n\nSizin ve kişinin \"Başlat\" düğmesine aynı anda basması gerekiyor. + Zaten Bluetooth\'a bağlanmaya çalışıyor + Bluetooth olmadan devam edilemez + Konum izni olmadan devam edilemez + Bluetooth ile bağlanılıyor… + Bluetooth ile başarılı bir şekilde bağlandı + Bluetooth ile bağlanamıyor İletileriniz %1$s sonra kaybolacak. %2$s diff --git a/briar-android/src/main/res/values-uk/strings.xml b/briar-android/src/main/res/values-uk/strings.xml index a6e905804..ef4ba9724 100644 --- a/briar-android/src/main/res/values-uk/strings.xml +++ b/briar-android/src/main/res/values-uk/strings.xml @@ -1,5 +1,5 @@ - + Вітаємо у Briar Ваше ім\'я користувача буде відображено біля будь-якого матеріалу, який ви опублікуєте. Ви не зможете змінити його після створення облікового запису. @@ -135,7 +135,7 @@ Змінити ім\'я контакту Назва контакту З\'єднатися через Bluetooth - З\'єднатися через Bluetooth + З\'єднатися через Bluetooth diff --git a/briar-android/src/main/res/values-zh-rCN/strings.xml b/briar-android/src/main/res/values-zh-rCN/strings.xml index e6653fc18..e5532b7ec 100644 --- a/briar-android/src/main/res/values-zh-rCN/strings.xml +++ b/briar-android/src/main/res/values-zh-rCN/strings.xml @@ -1,5 +1,5 @@ - + 欢迎来到 Briar 您的昵称将被显示在您发布的任何内容旁边。昵称在创建帐户后无法更改。 @@ -160,14 +160,14 @@ 联系人姓名 让消息自动消失 通过蓝牙连接 - 通过蓝牙连接 - 你的联络人必须在附近才能起作用。\n\n你和你的联系人应该同时按“开始”。 - 已在尝试通过蓝牙进行连接 - 没有蓝牙无法继续 - 没有位置权限不能继续 - 正通过蓝牙连接 … - 通过蓝牙连接成功 - 无法通过蓝牙连接 + 通过蓝牙连接 + 你的联络人必须在附近才能起作用。\n\n你和你的联系人应该同时按“开始”。 + 已在尝试通过蓝牙进行连接 + 没有蓝牙无法继续 + 没有位置权限不能继续 + 正通过蓝牙连接 … + 通过蓝牙连接成功 + 无法通过蓝牙连接 你的消息将在 %1$s 后消失。%2$s diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 109a2447a..9953b62d0 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -178,15 +178,6 @@ Change contact name Contact name Disappearing messages - Connect via Bluetooth - Connect via Bluetooth - Your contact needs to be nearby for this to work.\n\nYou and your contact should both press \"Start\" at the same time. - Already trying to connect via Bluetooth - Cannot continue without Bluetooth - Cannot continue without location permission - Connecting via Bluetooth… - Successfully connected via Bluetooth - Could not connect via Bluetooth Your messages will disappear after %1$s. %2$s @@ -342,6 +333,18 @@ %1$s declined the introduction to %2$s. %1$s says that %2$s declined the introduction. + + + Connect via Bluetooth + Connect via Bluetooth + In case Bluetooth connections do not work automatically, you can use this screen to connect manually.\n\nYour contact needs to be nearby for this to work.\n\nYou and your contact should both press \"Start\" at the same time. + Already trying to connect via Bluetooth. Please try again shortly. + Cannot continue without location permission + Connecting via Bluetooth… + Successfully connected via Bluetooth + Could not connect via Bluetooth. + Bluetooth is not supported by device. + No groups to show Tap the + icon to create a group, or ask your contacts to share groups with you @@ -707,7 +710,6 @@ You have denied access to your location, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access. Wi-Fi setting To create a Wi-Fi hotspot, Briar needs to use Wi-Fi. Please enable it. - You have denied permission to enable Wi-Fi, but Briar needs to use Wi-Fi.\n\nPlease consider enabling it. Manual