mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 20:59:54 +01:00
Show a snackbar when a peer connected to the hotspot
This commit is contained in:
@@ -3,8 +3,12 @@ package org.briarproject.briar.android.hotspot;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.util.BriarSnackbarBuilder;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
@@ -20,12 +24,9 @@ public class HotspotFragment extends AbstractTabsFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
// no need to call into the ViewModel here
|
connectedButton.setOnClickListener(v -> showNextFragment());
|
||||||
connectedButton.setOnClickListener(v -> {
|
viewModel.getPeerConnectedEvent().observeEvent(getViewLifecycleOwner(),
|
||||||
Fragment f = new WebsiteFragment();
|
this::onPeerConnected);
|
||||||
String tag = WebsiteFragment.TAG;
|
|
||||||
showFragment(getParentFragmentManager(), f, tag);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -38,4 +39,21 @@ public class HotspotFragment extends AbstractTabsFragment {
|
|||||||
return QrHotspotFragment.newInstance(true);
|
return QrHotspotFragment.newInstance(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onPeerConnected(boolean connected) {
|
||||||
|
if (!connected) return;
|
||||||
|
new BriarSnackbarBuilder()
|
||||||
|
.setAction(R.string.hotspot_peer_connected_action, v ->
|
||||||
|
showNextFragment())
|
||||||
|
.make(connectedButton, R.string.hotspot_peer_connected,
|
||||||
|
Snackbar.LENGTH_LONG)
|
||||||
|
.setAnchorView(connectedButton)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNextFragment() {
|
||||||
|
Fragment f = new WebsiteFragment();
|
||||||
|
String tag = WebsiteFragment.TAG;
|
||||||
|
showFragment(getParentFragmentManager(), f, tag);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ class HotspotManager implements ActionListener {
|
|||||||
@IoExecutor
|
@IoExecutor
|
||||||
void onHotspotStarted(NetworkConfig networkConfig);
|
void onHotspotStarted(NetworkConfig networkConfig);
|
||||||
|
|
||||||
|
@UiThread
|
||||||
|
void onDeviceConnected();
|
||||||
|
|
||||||
void onHotspotStopped();
|
void onHotspotStopped();
|
||||||
|
|
||||||
void onHotspotError(String error);
|
void onHotspotError(String error);
|
||||||
@@ -216,6 +219,7 @@ class HotspotManager implements ActionListener {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
|
if (channel == null) return;
|
||||||
wifiP2pManager.requestGroupInfo(channel, groupListener);
|
wifiP2pManager.requestGroupInfo(channel, groupListener);
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
// this should never happen, because we request permissions before
|
// this should never happen, because we request permissions before
|
||||||
@@ -223,6 +227,7 @@ class HotspotManager implements ActionListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@UiThread
|
||||||
private void onHotspotStarted(WifiP2pGroup group) {
|
private void onHotspotStarted(WifiP2pGroup group) {
|
||||||
DisplayMetrics dm = ctx.getResources().getDisplayMetrics();
|
DisplayMetrics dm = ctx.getResources().getDisplayMetrics();
|
||||||
ioExecutor.execute(() -> {
|
ioExecutor.execute(() -> {
|
||||||
@@ -233,6 +238,7 @@ class HotspotManager implements ActionListener {
|
|||||||
group.getPassphrase(), qrCode);
|
group.getPassphrase(), qrCode);
|
||||||
listener.onHotspotStarted(config);
|
listener.onHotspotStarted(config);
|
||||||
});
|
});
|
||||||
|
requestGroupInfoForConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isGroupValid(@Nullable WifiP2pGroup group) {
|
private boolean isGroupValid(@Nullable WifiP2pGroup group) {
|
||||||
@@ -268,6 +274,30 @@ class HotspotManager implements ActionListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@UiThread
|
||||||
|
private void requestGroupInfoForConnection() {
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info("requestGroupInfo for connection");
|
||||||
|
}
|
||||||
|
GroupInfoListener groupListener = group -> {
|
||||||
|
if (group == null || group.getClientList().isEmpty()) {
|
||||||
|
handler.postDelayed(this::requestGroupInfoForConnection,
|
||||||
|
RETRY_DELAY_MILLIS);
|
||||||
|
} else {
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info("client list " + group.getClientList());
|
||||||
|
}
|
||||||
|
listener.onDeviceConnected();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
if (channel == null) return;
|
||||||
|
wifiP2pManager.requestGroupInfo(channel, groupListener);
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static String createWifiLoginString(String ssid, String password) {
|
private static String createWifiLoginString(String ssid, String password) {
|
||||||
// https://en.wikipedia.org/wiki/QR_code#WiFi_network_login
|
// https://en.wikipedia.org/wiki/QR_code#WiFi_network_login
|
||||||
// do not remove the dangling ';', it can cause problems to omit it
|
// do not remove the dangling ';', it can cause problems to omit it
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ import org.briarproject.briar.android.hotspot.HotspotState.StartingHotspot;
|
|||||||
import org.briarproject.briar.android.hotspot.HotspotState.WebsiteConfig;
|
import org.briarproject.briar.android.hotspot.HotspotState.WebsiteConfig;
|
||||||
import org.briarproject.briar.android.hotspot.WebServerManager.WebServerListener;
|
import org.briarproject.briar.android.hotspot.WebServerManager.WebServerListener;
|
||||||
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
||||||
|
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||||
|
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
||||||
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
@@ -47,6 +49,8 @@ class HotspotViewModel extends DbViewModel
|
|||||||
|
|
||||||
private final MutableLiveData<HotspotState> state =
|
private final MutableLiveData<HotspotState> state =
|
||||||
new MutableLiveData<>();
|
new MutableLiveData<>();
|
||||||
|
private final MutableLiveEvent<Boolean> peerConnected =
|
||||||
|
new MutableLiveEvent<>();
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
// Field to temporarily store the network config received via onHotspotStarted()
|
// Field to temporarily store the network config received via onHotspotStarted()
|
||||||
@@ -109,6 +113,12 @@ class HotspotViewModel extends DbViewModel
|
|||||||
webServerManager.startWebServer();
|
webServerManager.startWebServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@UiThread
|
||||||
|
@Override
|
||||||
|
public void onDeviceConnected() {
|
||||||
|
peerConnected.setEvent(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onHotspotStopped() {
|
public void onHotspotStopped() {
|
||||||
LOG.info("stopping webserver");
|
LOG.info("stopping webserver");
|
||||||
@@ -141,4 +151,8 @@ class HotspotViewModel extends DbViewModel
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LiveEvent<Boolean> getPeerConnectedEvent() {
|
||||||
|
return peerConnected;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,6 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/errorTitle"
|
app:layout_constraintTop_toBottomOf="@+id/errorTitle"
|
||||||
tools:text="@string/qr_code_unsupported" />
|
tools:text="@string/startup_failed_service_error" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -721,6 +721,8 @@
|
|||||||
<string name="hotspot_manual_wifi">To download the app on another phone, please connect to this Wi-Fi network:</string>
|
<string name="hotspot_manual_wifi">To download the app on another phone, please connect to this Wi-Fi network:</string>
|
||||||
<string name="hotspot_manual_wifi_ssid">Network name (SSID)</string>
|
<string name="hotspot_manual_wifi_ssid">Network name (SSID)</string>
|
||||||
<string name="hotspot_manual_wifi_alt">Instead of adding the network manually, you can also scan a QR code.</string>
|
<string name="hotspot_manual_wifi_alt">Instead of adding the network manually, you can also scan a QR code.</string>
|
||||||
|
<string name="hotspot_peer_connected">Successfully connected</string>
|
||||||
|
<string name="hotspot_peer_connected_action">Show download info</string>
|
||||||
<string name="hotspot_manual_site">After you are connected to the Wi-Fi, carefully enter this address in your browser.</string>
|
<string name="hotspot_manual_site">After you are connected to the Wi-Fi, carefully enter this address in your browser.</string>
|
||||||
<string name="hotspot_manual_site_address">Address (URL)</string>
|
<string name="hotspot_manual_site_address">Address (URL)</string>
|
||||||
<string name="hotspot_manual_site_alt">Instead of typing the address manually, you can also scan a QR code.</string>
|
<string name="hotspot_manual_site_alt">Instead of typing the address manually, you can also scan a QR code.</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user