diff --git a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/AbstractTabsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/AbstractTabsFragment.java index a3b940734..7d39be903 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/AbstractTabsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/AbstractTabsFragment.java @@ -9,6 +9,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.TextView; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; @@ -43,6 +44,7 @@ public abstract class AbstractTabsFragment extends Fragment { protected Button stopButton; protected Button connectedButton; + protected TextView connectedView; @Override public void onAttach(Context context) { @@ -85,6 +87,9 @@ public abstract class AbstractTabsFragment extends Fragment { finishAfterTransition(requireActivity()); }); connectedButton = view.findViewById(R.id.connectedButton); + connectedView = view.findViewById(R.id.connectedView); + viewModel.getPeersConnectedEvent() + .observe(getViewLifecycleOwner(), this::onPeerConnected); } @Override @@ -126,4 +131,13 @@ public abstract class AbstractTabsFragment extends Fragment { } } + private void onPeerConnected(int peers) { + if (peers == 0) { + connectedView.setText(R.string.hotspot_no_peers_connected); + } else { + connectedView.setText(getResources().getQuantityString( + R.plurals.hotspot_peers_connected, peers, peers)); + } + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotFragment.java index 773faf510..7decec77c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotFragment.java @@ -2,11 +2,9 @@ package org.briarproject.briar.android.hotspot; import android.os.Bundle; import android.view.View; -import android.widget.Toast; 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; @@ -23,8 +21,6 @@ public class HotspotFragment extends AbstractTabsFragment { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); connectedButton.setOnClickListener(v -> showNextFragment()); - viewModel.getPeerConnectedEvent().observeEvent(getViewLifecycleOwner(), - this::onPeerConnected); } @Override @@ -37,12 +33,6 @@ public class HotspotFragment extends AbstractTabsFragment { return QrHotspotFragment.newInstance(true); } - private void onPeerConnected(boolean connected) { - if (!connected) return; - Toast.makeText(requireContext(), R.string.hotspot_peer_connected, - Toast.LENGTH_LONG).show(); - } - private void showNextFragment() { Fragment f = new WebsiteFragment(); String tag = WebsiteFragment.TAG; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotManager.java b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotManager.java index 8d4300c31..48842039f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotManager.java @@ -66,7 +66,7 @@ class HotspotManager { void onHotspotStarted(NetworkConfig networkConfig); @UiThread - void onDeviceConnected(); + void onPeersUpdated(int peers); @UiThread void onHotspotError(String error); @@ -377,12 +377,11 @@ class HotspotManager { private void requestGroupInfoForConnection() { LOG.info("requestGroupInfo for connection"); GroupInfoListener groupListener = group -> { - if (group == null || group.getClientList().isEmpty()) { - handler.postDelayed(this::requestGroupInfoForConnection, - RETRY_DELAY_MILLIS); - } else { - listener.onDeviceConnected(); + if (group != null) { + listener.onPeersUpdated(group.getClientList().size()); } + handler.postDelayed(this::requestGroupInfoForConnection, + RETRY_DELAY_MILLIS); }; try { if (channel == null) return; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotViewModel.java index ee9a984e7..a5b2d34f8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/hotspot/HotspotViewModel.java @@ -63,8 +63,8 @@ class HotspotViewModel extends DbViewModel private final MutableLiveData state = new MutableLiveData<>(); - private final MutableLiveEvent peerConnected = - new MutableLiveEvent<>(); + private final MutableLiveData peersConnected = + new MutableLiveData<>(); private final MutableLiveEvent savedApkToUri = new MutableLiveEvent<>(); @@ -137,8 +137,8 @@ class HotspotViewModel extends DbViewModel @UiThread @Override - public void onDeviceConnected() { - peerConnected.setEvent(true); + public void onPeersUpdated(int peers) { + peersConnected.setValue(peers); } @Override @@ -213,8 +213,8 @@ class HotspotViewModel extends DbViewModel return state; } - LiveEvent getPeerConnectedEvent() { - return peerConnected; + LiveData getPeersConnectedEvent() { + return peersConnected; } LiveEvent getSavedApkToUri() { diff --git a/briar-android/src/main/res/layout/fragment_hotspot_tabs.xml b/briar-android/src/main/res/layout/fragment_hotspot_tabs.xml index 941f970b4..89e37bd78 100644 --- a/briar-android/src/main/res/layout/fragment_hotspot_tabs.xml +++ b/briar-android/src/main/res/layout/fragment_hotspot_tabs.xml @@ -6,9 +6,10 @@ android:layout_height="match_parent"> @@ -51,14 +52,22 @@ android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - app:layout_constraintBottom_toTopOf="@+id/connectedButton" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/tabLayout" /> + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + +