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