@@ -5,8 +5,9 @@ import androidx.compose.foundation.focusable
5
5
import androidx.compose.foundation.interaction.MutableInteractionSource
6
6
import androidx.compose.foundation.layout.Arrangement
7
7
import androidx.compose.foundation.layout.Column
8
- import androidx.compose.foundation.layout.ExperimentalLayoutApi
8
+ import androidx.compose.foundation.layout.Row
9
9
import androidx.compose.foundation.layout.fillMaxSize
10
+ import androidx.compose.foundation.layout.fillMaxWidth
10
11
import androidx.compose.foundation.layout.imePadding
11
12
import androidx.compose.foundation.layout.padding
12
13
import androidx.compose.foundation.layout.systemBarsPadding
@@ -15,6 +16,7 @@ import androidx.compose.foundation.verticalScroll
15
16
import androidx.compose.material.icons.Icons
16
17
import androidx.compose.material.icons.automirrored.outlined.ViewQuilt
17
18
import androidx.compose.material.icons.filled.AppShortcut
19
+ import androidx.compose.material.icons.filled.FolderZip
18
20
import androidx.compose.material.icons.outlined.Bolt
19
21
import androidx.compose.material.icons.outlined.Code
20
22
import androidx.compose.material.icons.outlined.FolderZip
@@ -23,7 +25,11 @@ import androidx.compose.material.icons.outlined.Pin
23
25
import androidx.compose.material.icons.outlined.Restore
24
26
import androidx.compose.material.icons.outlined.VpnKeyOff
25
27
import androidx.compose.material.icons.outlined.VpnLock
28
+ import androidx.compose.material3.ExperimentalMaterial3Api
29
+ import androidx.compose.material3.HorizontalDivider
30
+ import androidx.compose.material3.Icon
26
31
import androidx.compose.material3.MaterialTheme
32
+ import androidx.compose.material3.ModalBottomSheet
27
33
import androidx.compose.material3.Text
28
34
import androidx.compose.runtime.Composable
29
35
import androidx.compose.runtime.getValue
@@ -38,6 +44,7 @@ import androidx.compose.ui.res.stringResource
38
44
import androidx.compose.ui.unit.dp
39
45
import androidx.hilt.navigation.compose.hiltViewModel
40
46
import com.zaneschepke.wireguardautotunnel.R
47
+ import com.zaneschepke.wireguardautotunnel.domain.enums.ConfigType
41
48
import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState
42
49
import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel
43
50
import com.zaneschepke.wireguardautotunnel.ui.Route
@@ -56,7 +63,7 @@ import com.zaneschepke.wireguardautotunnel.util.extensions.showToast
56
63
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
57
64
import xyz.teamgravity.pin_lock_compose.PinManager
58
65
59
- @OptIn(ExperimentalLayoutApi ::class )
66
+ @OptIn(ExperimentalMaterial3Api ::class )
60
67
@Composable
61
68
fun SettingsScreen (viewModel : SettingsViewModel = hiltViewModel(), appViewModel : AppViewModel , uiState : AppUiState ) {
62
69
val context = LocalContext .current
@@ -68,11 +75,13 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel(), appViewModel:
68
75
val interactionSource = remember { MutableInteractionSource () }
69
76
var showAuthPrompt by remember { mutableStateOf(false ) }
70
77
78
+ var showExportSheet by remember { mutableStateOf(false ) }
79
+
71
80
if (showAuthPrompt) {
72
81
AuthorizationPrompt (
73
82
onSuccess = {
74
83
showAuthPrompt = false
75
- viewModel.exportAllConfigs(context)
84
+ showExportSheet = true
76
85
},
77
86
onError = { _ ->
78
87
showAuthPrompt = false
@@ -89,6 +98,52 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel(), appViewModel:
89
98
)
90
99
}
91
100
101
+ if (showExportSheet) {
102
+ ModalBottomSheet (onDismissRequest = { showExportSheet = false }) {
103
+ Row (
104
+ modifier =
105
+ Modifier
106
+ .fillMaxWidth()
107
+ .clickable {
108
+ showExportSheet = false
109
+ viewModel.exportAllConfigs(context, ConfigType .AMNEZIA )
110
+ }
111
+ .padding(10 .dp),
112
+ ) {
113
+ Icon (
114
+ Icons .Filled .FolderZip ,
115
+ contentDescription = stringResource(id = R .string.export_amnezia),
116
+ modifier = Modifier .padding(10 .dp),
117
+ )
118
+ Text (
119
+ stringResource(id = R .string.export_amnezia),
120
+ modifier = Modifier .padding(10 .dp),
121
+ )
122
+ }
123
+ HorizontalDivider ()
124
+ Row (
125
+ modifier =
126
+ Modifier
127
+ .fillMaxWidth()
128
+ .clickable {
129
+ showExportSheet = false
130
+ viewModel.exportAllConfigs(context, ConfigType .WG )
131
+ }
132
+ .padding(10 .dp),
133
+ ) {
134
+ Icon (
135
+ Icons .Filled .FolderZip ,
136
+ contentDescription = stringResource(id = R .string.export_wireguard),
137
+ modifier = Modifier .padding(10 .dp),
138
+ )
139
+ Text (
140
+ stringResource(id = R .string.export_wireguard),
141
+ modifier = Modifier .padding(10 .dp),
142
+ )
143
+ }
144
+ }
145
+ }
146
+
92
147
Column (
93
148
horizontalAlignment = Alignment .Start ,
94
149
verticalArrangement = Arrangement .spacedBy(24 .dp, Alignment .Top ),
0 commit comments