Skip to content

Commit 511f5f6

Browse files
committed
all network fails.
1 parent fa940be commit 511f5f6

File tree

7 files changed

+207
-4
lines changed

7 files changed

+207
-4
lines changed

mobile/src/main/java/com/windscribe/mobile/ui/auth/LoginScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ fun LoginScreen(
8080
LaunchedEffect(Unit) {
8181
viewModel?.showAllBackupFailedDialog?.collect { show ->
8282
if (show) {
83-
Toast.makeText(context, com.windscribe.vpn.R.string.failed_network_alert, Toast.LENGTH_SHORT).show()
83+
navController.navigate(Screen.AllProtocolFailedDialog.route)
84+
viewModel.clearDialog()
8485
}
8586
}
8687
}

mobile/src/main/java/com/windscribe/mobile/ui/auth/LoginViewModel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class LoginViewModel @Inject constructor(
6464
val twoFactorEnabled: StateFlow<Boolean> = _twoFactorEnabled.asStateFlow()
6565

6666
private val _showAllBackupFailedDialog = MutableSharedFlow<Boolean>(replay = 0)
67+
6768
val showAllBackupFailedDialog: SharedFlow<Boolean> = _showAllBackupFailedDialog
6869

6970
private var username = ""
@@ -310,5 +311,11 @@ class LoginViewModel @Inject constructor(
310311
_loginState.emit(state)
311312
}
312313
}
314+
315+
fun clearDialog() {
316+
viewModelScope.launch {
317+
_showAllBackupFailedDialog.emit(false)
318+
}
319+
}
313320
}
314321

mobile/src/main/java/com/windscribe/mobile/ui/auth/SignupScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ fun SignupScreen(
8787
LaunchedEffect(Unit) {
8888
viewModel?.showAllBackupFailedDialog?.collect { show ->
8989
if (show) {
90-
Toast.makeText(context, com.windscribe.vpn.R.string.failed_network_alert, Toast.LENGTH_SHORT).show()
90+
navController.navigate(Screen.AllProtocolFailedDialog.route)
91+
viewModel.clearDialog()
9192
}
9293
}
9394
}

mobile/src/main/java/com/windscribe/mobile/ui/auth/SignupViewModel.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,5 +343,11 @@ class SignupViewModel @Inject constructor(
343343
_signupState.emit(state)
344344
}
345345
}
346+
347+
fun clearDialog() {
348+
viewModelScope.launch {
349+
_showAllBackupFailedDialog.emit(false)
350+
}
351+
}
346352
}
347353

mobile/src/main/java/com/windscribe/mobile/ui/nav/NavigationStack.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModel
1212
import androidx.lifecycle.viewmodel.compose.viewModel
1313
import androidx.navigation.NavController
1414
import androidx.navigation.NavGraphBuilder
15+
import androidx.navigation.activity
1516
import androidx.navigation.compose.NavHost
1617
import androidx.navigation.compose.composable
1718
import androidx.navigation.compose.rememberNavController
@@ -34,6 +35,7 @@ import com.windscribe.mobile.ui.home.HomeScreen
3435
import com.windscribe.mobile.ui.home.HomeViewmodel
3536
import com.windscribe.mobile.ui.model.AccountStatusDialogData
3637
import com.windscribe.mobile.ui.popup.AccountStatusScreen
38+
import com.windscribe.mobile.ui.popup.AllProtocolFailedDialogScreen
3739
import com.windscribe.mobile.ui.popup.EditCustomConfigScreen
3840
import com.windscribe.mobile.ui.popup.EditCustomConfigViewmodel
3941
import com.windscribe.mobile.ui.popup.ExtraDataUseWarningScreen
@@ -124,7 +126,7 @@ private fun NavGraphBuilder.addNavigationScreens() {
124126
}, exitTransition = {
125127
slideOutHorizontally(targetOffsetX = { it })
126128
}) {
127-
val homeViewModel = getViewModel(HomeViewmodel::class.java)
129+
val homeViewModel = getViewModel(HomeViewmodel::class.java)
128130
ViewModelRoute(NewsfeedViewmodel::class.java) {
129131
NewsfeedScreen(it, homeViewModel)
130132
}
@@ -134,7 +136,7 @@ private fun NavGraphBuilder.addNavigationScreens() {
134136
}, exitTransition = {
135137
slideOutHorizontally(targetOffsetX = { it })
136138
}) {
137-
val homeViewModel = getViewModel(HomeViewmodel::class.java)
139+
val homeViewModel = getViewModel(HomeViewmodel::class.java)
138140
ViewModelRoute(MainMenuViewModel::class.java) {
139141
MainMenuScreen(it, homeViewModel)
140142
}
@@ -308,6 +310,9 @@ private fun NavGraphBuilder.addNavigationScreens() {
308310
val activity = LocalContext.current as AppStartActivity
309311
OverlayDialogScreen(appStartActivityViewModel = activity.viewmodel)
310312
}
313+
composable(route = Screen.AllProtocolFailedDialog.route) {
314+
AllProtocolFailedDialogScreen()
315+
}
311316
composable(route = Screen.ExtraDataUseWarning.route) {
312317
val activity = LocalContext.current as AppStartActivity
313318
ExtraDataUseWarningScreen(activity.viewmodel)

mobile/src/main/java/com/windscribe/mobile/ui/nav/Screen.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ sealed class Screen(val route: String) {
3737
object GpsSpoofing: Screen("gps_spoofing")
3838
object AddEmail: Screen("add_email")
3939
object ConfirmEmail: Screen("confirm_email")
40+
41+
object AllProtocolFailedDialog: Screen("all_protocol_failed_dialog")
4042
}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package com.windscribe.mobile.ui.popup
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import android.net.Uri
6+
import androidx.compose.foundation.Image
7+
import androidx.compose.foundation.background
8+
import androidx.compose.foundation.clickable
9+
import androidx.compose.foundation.layout.Arrangement
10+
import androidx.compose.foundation.layout.Box
11+
import androidx.compose.foundation.layout.Column
12+
import androidx.compose.foundation.layout.Row
13+
import androidx.compose.foundation.layout.Spacer
14+
import androidx.compose.foundation.layout.fillMaxSize
15+
import androidx.compose.foundation.layout.fillMaxWidth
16+
import androidx.compose.foundation.layout.height
17+
import androidx.compose.foundation.layout.navigationBarsPadding
18+
import androidx.compose.foundation.layout.padding
19+
import androidx.compose.foundation.layout.size
20+
import androidx.compose.foundation.layout.statusBarsPadding
21+
import androidx.compose.foundation.layout.width
22+
import androidx.compose.foundation.layout.widthIn
23+
import androidx.compose.material3.Text
24+
import androidx.compose.material3.TextButton
25+
import androidx.compose.runtime.Composable
26+
import androidx.compose.ui.Alignment
27+
import androidx.compose.ui.Modifier
28+
import androidx.compose.ui.graphics.Color
29+
import androidx.compose.ui.graphics.ColorFilter
30+
import androidx.compose.ui.res.painterResource
31+
import androidx.compose.ui.res.stringResource
32+
import androidx.compose.ui.text.style.TextAlign
33+
import androidx.compose.ui.unit.dp
34+
import androidx.core.content.FileProvider
35+
import androidx.navigation.NavController
36+
import com.windscribe.mobile.R
37+
import com.windscribe.mobile.ui.common.NextButton
38+
import com.windscribe.mobile.ui.common.theme
39+
import com.windscribe.mobile.ui.helper.MultiDevicePreview
40+
import com.windscribe.mobile.ui.helper.PreviewWithNav
41+
import com.windscribe.mobile.ui.nav.LocalNavController
42+
import com.windscribe.mobile.ui.theme.AppColors
43+
import com.windscribe.mobile.ui.theme.font16
44+
import com.windscribe.mobile.ui.theme.font24
45+
import com.windscribe.vpn.Windscribe.Companion.appContext
46+
import com.windscribe.vpn.constants.PreferencesKeyConstants
47+
import java.io.File
48+
49+
@Composable
50+
fun AllProtocolFailedDialogScreen() {
51+
val navController = LocalNavController.current
52+
Box(
53+
modifier = Modifier
54+
.fillMaxSize()
55+
.background(AppColors.deepBlue),
56+
contentAlignment = Alignment.Center
57+
) {
58+
Column(
59+
horizontalAlignment = Alignment.CenterHorizontally,
60+
verticalArrangement = Arrangement.Center,
61+
modifier = Modifier
62+
.padding(32.dp)
63+
.statusBarsPadding()
64+
.navigationBarsPadding()
65+
) {
66+
Row(modifier = Modifier.fillMaxWidth()) {
67+
Spacer(modifier = Modifier.weight(1f))
68+
Image(
69+
painter = painterResource(R.drawable.ic_close),
70+
contentDescription = null,
71+
colorFilter = ColorFilter.tint(theme(R.attr.wdPrimaryColor)),
72+
modifier = Modifier
73+
.size(24.dp)
74+
.clickable { navController.popBackStack() }
75+
)
76+
}
77+
Spacer(modifier = Modifier.weight(1f))
78+
Image(
79+
painter = painterResource(R.drawable.ic_attention_icon),
80+
contentDescription = "Attention",
81+
colorFilter = ColorFilter.tint(theme(R.attr.wdPrimaryColor)),
82+
modifier = Modifier.padding(vertical = 16.dp)
83+
)
84+
85+
Text(
86+
text = stringResource(com.windscribe.vpn.R.string.this_network_hates_us),
87+
style = font24,
88+
color = Color.White,
89+
textAlign = TextAlign.Center,
90+
modifier = Modifier.padding(bottom = 8.dp)
91+
)
92+
93+
Text(
94+
text = stringResource(com.windscribe.vpn.R.string.well_we_gave_it_our_best_shot_we_just_couldn_t_connect_you_on_this_network_send_us_your_debug_log_so_we_can_figure_out_what_happened),
95+
style = font16,
96+
color = Color.White,
97+
textAlign = TextAlign.Center,
98+
modifier = Modifier
99+
.widthIn(max = 400.dp)
100+
.padding(bottom = 16.dp)
101+
)
102+
Spacer(modifier = Modifier.weight(1f))
103+
NextButton(
104+
modifier = Modifier.width(400.dp),
105+
text = stringResource(com.windscribe.vpn.R.string.export_log),
106+
enabled = true,
107+
onClick = { exportLog(navController.context) }
108+
)
109+
Spacer(modifier = Modifier.height(16.dp))
110+
NextButton(
111+
modifier = Modifier.width(400.dp),
112+
text = stringResource(com.windscribe.vpn.R.string.contact_support),
113+
enabled = true,
114+
onClick = { contactSupport(navController.context) }
115+
)
116+
117+
Spacer(modifier = Modifier.height(8.dp))
118+
119+
TextButton(onClick = { navController.popBackStack() }) {
120+
Text(
121+
text = stringResource(com.windscribe.vpn.R.string.cancel),
122+
style = font16,
123+
color = Color.White
124+
)
125+
}
126+
}
127+
}
128+
}
129+
130+
fun contactSupport(context: Context, navController: NavController? = null) {
131+
val emailIntent = Intent(Intent.ACTION_SEND).apply {
132+
type = "message/rfc822"
133+
putExtra(Intent.EXTRA_EMAIL, arrayOf("[email protected]"))
134+
putExtra(Intent.EXTRA_SUBJECT, "Restrictive Network Detected")
135+
putExtra(Intent.EXTRA_TEXT, "Please find the attached debug log.")
136+
val logFile = File(appContext.cacheDir.path + PreferencesKeyConstants.DEBUG_LOG_FILE_NAME)
137+
if (logFile.exists()) {
138+
val fileUri: Uri = FileProvider.getUriForFile(
139+
context,
140+
"com.windscribe.vpn.provider",
141+
logFile
142+
)
143+
putExtra(Intent.EXTRA_STREAM, fileUri)
144+
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
145+
}
146+
}
147+
val chooser = Intent.createChooser(emailIntent, "Select Email Provider")
148+
if (emailIntent.resolveActivity(context.packageManager) != null) {
149+
context.startActivity(chooser)
150+
}
151+
navController?.popBackStack()
152+
}
153+
154+
fun exportLog(context: Context, navController: NavController? = null) {
155+
val logFile = File(appContext.cacheDir.path + PreferencesKeyConstants.DEBUG_LOG_FILE_NAME)
156+
if (logFile.exists()) {
157+
val fileUri: Uri = FileProvider.getUriForFile(
158+
context,
159+
"com.windscribe.vpn.provider",
160+
logFile
161+
)
162+
val shareIntent = Intent(Intent.ACTION_SEND).apply {
163+
type = "text/plain"
164+
putExtra(Intent.EXTRA_STREAM, fileUri)
165+
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
166+
}
167+
val chooser = Intent.createChooser(shareIntent, "Export Log File")
168+
if (shareIntent.resolveActivity(context.packageManager) != null) {
169+
context.startActivity(chooser)
170+
}
171+
}
172+
navController?.popBackStack()
173+
}
174+
175+
@Composable
176+
@MultiDevicePreview
177+
fun AllProtocolFailedDialogScreenPreview() {
178+
PreviewWithNav {
179+
AllProtocolFailedDialogScreen()
180+
}
181+
}

0 commit comments

Comments
 (0)