Skip to content

Commit 5f5cac0

Browse files
authored
Merge pull request #23 from packetdima/feature/license-ui
Добавить пользовательское соглашение (EULA)
2 parents 7af6708 + 277eeda commit 5f5cac0

File tree

5 files changed

+214
-1
lines changed

5 files changed

+214
-1
lines changed

shared/src/commonMain/composeResources/values-ru/license.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,18 @@
1212

1313
Ни при каких обстоятельствах авторы (правообладатели) не несут ответственность за любые претензии, ущерб или другие обязательства, возникающие в случае нарушения использования ПО третьими лицами или других действий с ним.
1414
</string>
15+
<string name="eula-title">Лицензионное соглашение с конечным пользователем</string>
16+
<string name="eula-text">Данная лицензия разрешает любому лицу, получившему данное ПО (либо его копию):
17+
1. Использовать ПО для личных (служебных) целей.
18+
2. Вносить изменения в ПО полностью или изменять любую его часть. Файлы, изменённые Лицензиатом, должны содержать информацию об изменениях и дату внесения изменений.
19+
3. Распространять изменённую и неизмененную версию программы только с согласия автора. При распространении на каждом экземпляре ПО (изменённого или нет) обязана находится информация об авторском праве.
20+
21+
Запрещается использование ПО в коммерческих целях, в том числе его копирование для распространения, без разрешения автора (продажа ПО,его копий, либо изменённого ПО)
22+
23+
За нарушение авторских прав предусмотрена ответственность в соответствии с законодательством РФ.
24+
25+
Ни при каких обстоятельствах авторы (правообладатели) не несут ответственность за любые претензии, ущерб или другие обязательства, возникающие в случае нарушения использования ПО третьими лицами или других действий с ним.
26+
</string>
27+
<string name="eula-accept">Принять</string>
28+
<string name="eula-decline">Отказаться</string>
1529
</resources>

shared/src/commonMain/composeResources/values/license.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,19 @@ It is prohibited to use the software for commercial purposes, including copying
1111
Violation of copyright is subject to liability in accordance with the legislation of the Russian Federation.
1212

1313
Under no circumstances shall the authors (copyright holders) be liable for any claims, damages or other liabilities arising from the violation of the use of the software by third parties or other actions with it.</string>
14+
<string name="eula-title">End User License Agreement</string>
15+
<string name="eula-text">This license allows any person who has received this software (or a copy thereof):
16+
1. Use the software for personal (official) purposes.
17+
2. Make changes to the software in full or change any part of it. Files modified by the Licensee must contain information about the changes and the date of the changes.
18+
3. Distribute the modified and unmodified version of the program only with the consent of the author. When distributing, each copy of the software (modified or not) must contain information about the copyright.
19+
20+
It is prohibited to use the software for commercial purposes, including copying it for distribution, without the permission of the author (sale of the software, its copies, or modified software)
21+
22+
Violation of copyright is subject to liability in accordance with the legislation of the Russian Federation.
23+
24+
Under no circumstances shall the authors (copyright holders) be liable for any claims, damages or other liabilities arising from the violation of the use of the software by third parties or other actions with it.
25+
</string>
26+
<string name="eula-accept">Accept</string>
27+
<string name="eula-decline">Decline</string>
28+
<string name="eula-version">1</string>
1429
</resources>

shared/src/commonMain/kotlin/ru/packetdima/datascanner/common/AppSettings.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ class AppSettings : KoinComponent {
7575
@Serializable(with = MutableStateSerializer::class)
7676
var firstMigration = mutableStateOf(true)
7777

78+
@Serializable(with = MutableStateSerializer::class)
79+
var eulaAgreedVersion = mutableStateOf(0)
80+
7881

7982
constructor() {
8083
try {
@@ -96,7 +99,8 @@ class AppSettings : KoinComponent {
9699
this.reportSaveExtension = prop.reportSaveExtension
97100
this.debugMode = prop.debugMode
98101
this.firstMigration = prop.firstMigration
99-
} catch (e: Exception) {
102+
this.eulaAgreedVersion = prop.eulaAgreedVersion
103+
} catch (_: Exception) {
100104
logger.error {
101105
"Failed to load app settings. Loading defaults."
102106
}

shared/src/desktopMain/kotlin/ru/packetdima/datascanner/ui/MainWindow.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.unit.dp
1717
import androidx.compose.ui.window.Window
1818
import androidx.compose.ui.window.WindowPlacement
19+
import androidx.compose.ui.window.rememberDialogState
1920
import androidx.compose.ui.window.rememberWindowState
2021
import androidx.navigation.compose.NavHost
2122
import androidx.navigation.compose.composable
@@ -30,9 +31,11 @@ import ru.packetdima.datascanner.logging.LogLevel
3031
import ru.packetdima.datascanner.navigation.AppScreens
3132
import ru.packetdima.datascanner.resources.Res
3233
import ru.packetdima.datascanner.resources.appName
34+
import ru.packetdima.datascanner.resources.eula_version
3335
import ru.packetdima.datascanner.resources.icon
3436
import ru.packetdima.datascanner.scan.common.ScanPathHelper
3537
import ru.packetdima.datascanner.scan.common.mainWindow
38+
import ru.packetdima.datascanner.ui.dialogs.EulaDialog
3639
import ru.packetdima.datascanner.ui.theme.AppTheme
3740
import ru.packetdima.datascanner.ui.windows.components.DesktopWindowShapes
3841
import ru.packetdima.datascanner.ui.windows.components.MainWindowTitleBar
@@ -97,7 +100,29 @@ fun MainWindow(
97100
) {
98101
mainWindow = this.window
99102

103+
var eulaAgreedVersion by remember { appSettings.eulaAgreedVersion }
104+
val eulaVersion = stringResource(Res.string.eula_version).toInt()
105+
var showEulaDialog by remember { mutableStateOf(eulaAgreedVersion < eulaVersion) }
106+
val dialogEulaState = rememberDialogState(
107+
width = 600.dp,
108+
height = 400.dp
109+
)
110+
100111
AppTheme {
112+
if(showEulaDialog) {
113+
EulaDialog(
114+
onAccept = {
115+
eulaAgreedVersion = eulaVersion
116+
appSettings.save()
117+
showEulaDialog = false
118+
},
119+
onDecline = {
120+
showEulaDialog = false
121+
onCloseRequest()
122+
},
123+
dialogState = dialogEulaState
124+
)
125+
}
101126
Surface(
102127
color = MaterialTheme.colorScheme.background,
103128
modifier = Modifier
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package ru.packetdima.datascanner.ui.dialogs
2+
3+
import androidx.compose.foundation.*
4+
import androidx.compose.foundation.layout.*
5+
import androidx.compose.material.Icon
6+
import androidx.compose.material.Surface
7+
import androidx.compose.material.icons.Icons
8+
import androidx.compose.material.icons.outlined.LocalPolice
9+
import androidx.compose.material3.MaterialTheme
10+
import androidx.compose.material3.OutlinedButton
11+
import androidx.compose.material3.Text
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.ui.Alignment
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.unit.dp
16+
import androidx.compose.ui.unit.sp
17+
import androidx.compose.ui.window.DialogState
18+
import androidx.compose.ui.window.DialogWindow
19+
import androidx.compose.ui.window.WindowPlacement
20+
import org.jetbrains.compose.resources.stringResource
21+
import ru.packetdima.datascanner.resources.*
22+
import ru.packetdima.datascanner.ui.windows.components.DesktopWindowShapes
23+
import ru.packetdima.datascanner.ui.windows.components.TitleBar
24+
25+
@Composable
26+
fun EulaDialog(
27+
onAccept: () -> Unit,
28+
onDecline: () -> Unit,
29+
dialogState: DialogState = DialogState()
30+
) {
31+
32+
val scrollState = rememberScrollState()
33+
34+
DialogWindow(
35+
onCloseRequest = onDecline,
36+
state = dialogState,
37+
transparent = true,
38+
undecorated = true,
39+
resizable = false
40+
) {
41+
Surface(
42+
shape = DesktopWindowShapes(),
43+
color = MaterialTheme.colorScheme.background,
44+
border = BorderStroke(1.dp, MaterialTheme.colorScheme.primary),
45+
modifier = Modifier
46+
.fillMaxSize()
47+
) {
48+
Column(
49+
modifier = Modifier
50+
.fillMaxSize()
51+
.padding(4.dp),
52+
horizontalAlignment = Alignment.CenterHorizontally
53+
) {
54+
TitleBar(
55+
windowPlacement = WindowPlacement.Floating
56+
) {
57+
Row(
58+
modifier = Modifier
59+
.padding(horizontal = 12.dp, vertical = 8.dp),
60+
horizontalArrangement = Arrangement.spacedBy(12.dp),
61+
) {
62+
Icon(
63+
imageVector = Icons.Outlined.LocalPolice,
64+
contentDescription = null,
65+
tint = MaterialTheme.colorScheme.primary
66+
)
67+
Text(
68+
text = stringResource(Res.string.eula_title),
69+
fontSize = MaterialTheme.typography.titleMedium.fontSize,
70+
fontWeight = MaterialTheme.typography.titleMedium.fontWeight,
71+
lineHeight = MaterialTheme.typography.titleMedium.lineHeight,
72+
color = MaterialTheme.colorScheme.primary
73+
)
74+
}
75+
}
76+
Column(
77+
modifier = Modifier
78+
.fillMaxSize()
79+
.padding(top = 12.dp, bottom = 4.dp, start = 12.dp, end = 12.dp),
80+
verticalArrangement = Arrangement.SpaceBetween,
81+
horizontalAlignment = Alignment.CenterHorizontally
82+
) {
83+
Box(
84+
contentAlignment = Alignment.TopCenter,
85+
modifier = Modifier
86+
.weight(1f)
87+
) {
88+
Surface(
89+
shape = MaterialTheme.shapes.small,
90+
color = MaterialTheme.colorScheme.surface,
91+
modifier = Modifier
92+
.verticalScroll(scrollState)
93+
) {
94+
Text(
95+
text = stringResource(Res.string.eula_text),
96+
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
97+
fontWeight = MaterialTheme.typography.bodyMedium.fontWeight,
98+
lineHeight = MaterialTheme.typography.bodyMedium.lineHeight,
99+
color = MaterialTheme.colorScheme.onBackground,
100+
modifier = Modifier
101+
.padding(vertical = 8.dp)
102+
.padding(start = 8.dp, end = 20.dp)
103+
)
104+
}
105+
106+
VerticalScrollbar(
107+
adapter = rememberScrollbarAdapter(scrollState),
108+
modifier = Modifier
109+
.align(Alignment.CenterEnd)
110+
.padding(end = 6.dp)
111+
.height(400.dp)
112+
.width(10.dp),
113+
style = LocalScrollbarStyle.current.copy(
114+
hoverColor = MaterialTheme.colorScheme.primary,
115+
unhoverColor = MaterialTheme.colorScheme.secondary
116+
)
117+
)
118+
}
119+
120+
Row(
121+
modifier = Modifier
122+
.padding(horizontal = 12.dp, vertical = 8.dp),
123+
verticalAlignment = Alignment.CenterVertically,
124+
horizontalArrangement = Arrangement.spacedBy(12.dp)
125+
) {
126+
OutlinedButton(
127+
onClick = onDecline,
128+
modifier = Modifier
129+
.width(180.dp)
130+
) {
131+
Text(
132+
text = stringResource(Res.string.eula_decline),
133+
color = MaterialTheme.colorScheme.error,
134+
fontSize = 16.sp,
135+
lineHeight = 16.sp
136+
)
137+
}
138+
OutlinedButton(
139+
onClick = onAccept,
140+
modifier = Modifier
141+
.width(180.dp)
142+
) {
143+
Text(
144+
text = stringResource(Res.string.eula_accept),
145+
fontSize = 16.sp,
146+
lineHeight = 16.sp
147+
)
148+
}
149+
}
150+
}
151+
152+
}
153+
}
154+
}
155+
}

0 commit comments

Comments
 (0)