Skip to content

Commit 34c979e

Browse files
committed
add stream agreement setting
1 parent 9bf706e commit 34c979e

File tree

11 files changed

+207
-5
lines changed

11 files changed

+207
-5
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package io.agora.flat.data.model
2+
3+
data class StreamAgreement(val isAgree: Boolean)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package io.agora.flat.data.model
2+
3+
class StreamAgreementReq(val isAgree: Boolean)

app/src/main/java/io/agora/flat/data/repository/MiscRepository.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import io.agora.flat.data.AppKVCenter
44
import io.agora.flat.data.Result
55
import io.agora.flat.data.model.PureRoomReq
66
import io.agora.flat.data.model.PureToken
7+
import io.agora.flat.data.model.RespNoData
78
import io.agora.flat.data.model.RtmCensorReq
9+
import io.agora.flat.data.model.StreamAgreementReq
810
import io.agora.flat.data.toResult
911
import io.agora.flat.http.api.MiscService
1012
import kotlinx.coroutines.Dispatchers
@@ -45,4 +47,17 @@ class MiscRepository @Inject constructor(
4547
}
4648
}
4749
}
50+
51+
suspend fun getStreamAgreement(): Boolean? {
52+
return withContext(Dispatchers.IO) {
53+
val result = miscService.getStreamAgreement().toResult()
54+
return@withContext result.get()?.isAgree
55+
}
56+
}
57+
58+
suspend fun setStreamAgreement(isAgree: Boolean): Result<RespNoData> {
59+
return withContext(Dispatchers.IO) {
60+
return@withContext miscService.setStreamAgreement(StreamAgreementReq(isAgree)).toResult()
61+
}
62+
}
4863
}

app/src/main/java/io/agora/flat/http/api/MiscService.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,14 @@ interface MiscService {
3535

3636
@GET("v2/region/configs")
3737
fun getRegionConfigs(): Call<BaseResp<RegionConfigs>>
38+
39+
@POST("v1/user/agreement/get")
40+
fun getStreamAgreement(
41+
@Body empty: BaseReq = BaseReq.EMPTY,
42+
): Call<BaseResp<StreamAgreement>>
43+
44+
@POST("v1/user/agreement/set")
45+
fun setStreamAgreement(
46+
@Body req: StreamAgreementReq,
47+
): Call<BaseResp<RespNoData>>
3848
}

app/src/main/java/io/agora/flat/ui/activity/dev/DevSettingsActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class DevSettingsActivity : BaseComposeActivity() {
2121
onBack = { finish() },
2222
onLogout = {},
2323
onDownload = { Uri.EMPTY },
24+
onAgreeStream = {},
2425
)
2526
}
2627
}

app/src/main/java/io/agora/flat/ui/activity/setting/Settings.kt

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import io.agora.flat.ui.compose.FlatDivider
4343
import io.agora.flat.ui.compose.FlatHighlightTextButton
4444
import io.agora.flat.ui.compose.FlatTextBodyOne
4545
import io.agora.flat.ui.compose.FlatTextCaption
46+
import io.agora.flat.ui.compose.StreamCollectDialog
4647
import io.agora.flat.ui.compose.UpdateDialog
4748
import io.agora.flat.ui.theme.FlatTheme
4849
import io.agora.flat.ui.viewmodel.SettingsUiState
@@ -59,6 +60,7 @@ fun SettingsScreen(navController: NavController, viewModel: SettingsViewModel =
5960
SettingsScreen(
6061
state = state,
6162
onDownload = viewModel::downloadApp,
63+
onAgreeStream = viewModel::setAgreeStream,
6264
onBack = { navController.popBackStack() },
6365
onLogout = {
6466
viewModel.logout()
@@ -71,6 +73,7 @@ fun SettingsScreen(navController: NavController, viewModel: SettingsViewModel =
7173
fun SettingsScreen(
7274
state: SettingsUiState,
7375
onDownload: suspend () -> Uri,
76+
onAgreeStream: (Boolean) -> Unit,
7477
onBack: () -> Unit,
7578
onLogout: () -> Unit
7679
) {
@@ -80,16 +83,17 @@ fun SettingsScreen(
8083
onBackPressed = onBack
8184
)
8285
Box(Modifier.weight(1f)) {
83-
SettingsList(state, onDownload)
86+
SettingsList(state, onDownload, onAgreeStream)
8487
}
8588
BottomOperateArea(onLogout = onLogout)
8689
}
8790
}
8891

8992
@Composable
90-
private fun SettingsList(state: SettingsUiState, onDownload: suspend () -> Uri) {
93+
private fun SettingsList(state: SettingsUiState, onDownload: suspend () -> Uri, onAgreeStream: (Boolean) -> Unit) {
9194
val context = LocalContext.current
9295
var showUpdate by remember { mutableStateOf(false) }
96+
var showCollect by remember { mutableStateOf(false) }
9397

9498
LazyColumn {
9599
item {
@@ -117,7 +121,6 @@ private fun SettingsList(state: SettingsUiState, onDownload: suspend () -> Uri)
117121
id = R.drawable.ic_settings_dark_light,
118122
tip = stringResource(R.string.title_dark_mode),
119123
onClick = { Navigator.launchDarkModeActivity(context) })
120-
121124
Spacer(Modifier.height(12.dp))
122125
SettingLabel(stringResource(R.string.privacy))
123126
SettingItem(
@@ -139,6 +142,15 @@ private fun SettingsList(state: SettingsUiState, onDownload: suspend () -> Uri)
139142
id = R.drawable.ic_settings_info_third_party,
140143
tip = stringResource(R.string.info_third_party),
141144
onClick = { Navigator.launchWebViewActivity(context, Constants.URL.Libraries) })
145+
if (state.isAgreeStream != null) {
146+
SettingItem(
147+
id = R.drawable.ic_settings_stream_analysis,
148+
tip = stringResource(R.string.stream_data_analysis),
149+
desc = if (state.isAgreeStream) stringResource(R.string.setting_on) else stringResource(R.string.setting_off),
150+
onClick = { showCollect = true }
151+
)
152+
SettingItemDivider()
153+
}
142154

143155
Spacer(Modifier.height(12.dp))
144156
SettingLabel(stringResource(R.string.more))
@@ -187,6 +199,22 @@ private fun SettingsList(state: SettingsUiState, onDownload: suspend () -> Uri)
187199
}
188200
)
189201
}
202+
203+
if (showCollect) {
204+
StreamCollectDialog(
205+
onOpen = {
206+
onAgreeStream(true)
207+
showCollect = false
208+
},
209+
onClose = {
210+
onAgreeStream(false)
211+
showCollect = false
212+
},
213+
onCancel = {
214+
showCollect = false
215+
}
216+
)
217+
}
190218
}
191219

192220
@Composable
@@ -292,6 +320,6 @@ internal fun SettingItemDivider() {
292320
fun UserSettingActivityPreview() {
293321
val state = SettingsUiState()
294322
FlatColumnPage {
295-
SettingsScreen(state, { Uri.EMPTY }, {}, {})
323+
SettingsScreen(state, { Uri.EMPTY }, {}, {}, {})
296324
}
297325
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package io.agora.flat.ui.compose
2+
3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.heightIn
11+
import androidx.compose.material.Surface
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.ui.Alignment
16+
import androidx.compose.ui.ExperimentalComposeUiApi
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.tooling.preview.Preview
20+
import androidx.compose.ui.unit.dp
21+
import androidx.compose.ui.window.Dialog
22+
import androidx.compose.ui.window.DialogProperties
23+
import io.agora.flat.R
24+
import io.agora.flat.ui.theme.FlatTheme
25+
26+
@OptIn(ExperimentalComposeUiApi::class)
27+
@Composable
28+
fun StreamCollectDialog(onOpen: () -> Unit, onClose: () -> Unit, onCancel: () -> Unit) {
29+
val openDialog = remember { mutableStateOf(true) }
30+
31+
if (openDialog.value) {
32+
FlatTheme {
33+
Dialog(
34+
onDismissRequest = {
35+
onCancel()
36+
openDialog.value = false
37+
},
38+
properties = DialogProperties(usePlatformDefaultWidth = false),
39+
) {
40+
Box(
41+
modifier = Modifier
42+
.fillMaxSize()
43+
.clickable {
44+
onCancel()
45+
openDialog.value = false
46+
},
47+
contentAlignment = Alignment.BottomCenter,
48+
) {
49+
Surface(
50+
modifier = Modifier.fillMaxWidth(),
51+
) {
52+
Column(
53+
horizontalAlignment = Alignment.CenterHorizontally,
54+
verticalArrangement = Arrangement.spacedBy(6.dp)
55+
) {
56+
OperationItem(stringResource(R.string.setting_on)) {
57+
onOpen()
58+
openDialog.value = false
59+
}
60+
OperationItem(stringResource(R.string.setting_off)) {
61+
onClose()
62+
openDialog.value = false
63+
}
64+
OperationItem(stringResource(R.string.cancel)) {
65+
onCancel()
66+
openDialog.value = false
67+
}
68+
}
69+
}
70+
}
71+
}
72+
}
73+
}
74+
}
75+
76+
@Composable
77+
fun OperationItem(text: String, onClick: () -> Unit) {
78+
Row(
79+
modifier = Modifier
80+
.fillMaxWidth()
81+
.heightIn(min = 48.dp)
82+
.clickable(onClick = onClick),
83+
verticalAlignment = Alignment.CenterVertically,
84+
horizontalArrangement = Arrangement.Center
85+
) {
86+
FlatTextBodyOne(text)
87+
}
88+
}
89+
90+
@Composable
91+
@Preview(locale = "zh")
92+
fun StreamCollectDialogPreview() {
93+
StreamCollectDialog({}, {}, {})
94+
}

app/src/main/java/io/agora/flat/ui/viewmodel/SettingsViewModel.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.agora.flat.common.version.VersionCheckResult
99
import io.agora.flat.common.version.VersionChecker
1010
import io.agora.flat.data.AppEnv
1111
import io.agora.flat.data.AppKVCenter
12+
import io.agora.flat.data.repository.MiscRepository
1213
import io.agora.flat.data.repository.UserRepository
1314
import kotlinx.coroutines.flow.MutableStateFlow
1415
import kotlinx.coroutines.flow.StateFlow
@@ -21,6 +22,7 @@ class SettingsViewModel @Inject constructor(
2122
private val appKVCenter: AppKVCenter,
2223
private val versionChecker: VersionChecker,
2324
private val downloader: AndroidDownloader,
25+
private val miscRepository: MiscRepository,
2426
env: AppEnv
2527
) : ViewModel() {
2628
private val _state = MutableStateFlow(
@@ -34,6 +36,11 @@ class SettingsViewModel @Inject constructor(
3436
viewModelScope.launch {
3537
_state.value = _state.value.copy(versionCheckResult = versionChecker.forceCheck())
3638
}
39+
40+
viewModelScope.launch {
41+
val value = miscRepository.getStreamAgreement()
42+
_state.value = _state.value.copy(isAgreeStream = value)
43+
}
3744
}
3845

3946
suspend fun downloadApp(): Uri {
@@ -46,12 +53,20 @@ class SettingsViewModel @Inject constructor(
4653
_state.value = _state.value.copy(versionCheckResult = VersionCheckResult.Empty)
4754
}
4855

56+
fun setAgreeStream(isAgree: Boolean) {
57+
viewModelScope.launch {
58+
miscRepository.setStreamAgreement(isAgree)
59+
_state.value = _state.value.copy(isAgreeStream = isAgree)
60+
}
61+
}
62+
4963
fun logout() {
5064
userRepository.logout()
5165
}
5266
}
5367

5468
data class SettingsUiState(
5569
val infoUrl: String = "",
56-
val versionCheckResult: VersionCheckResult = VersionCheckResult.Empty
70+
val versionCheckResult: VersionCheckResult = VersionCheckResult.Empty,
71+
val isAgreeStream: Boolean? = null
5772
)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="#00000000"
8+
android:pathData="M21,7.6V20.4C21,20.731 20.731,21 20.4,21H7.6C7.269,21 7,20.731 7,20.4V7.6C7,7.269 7.269,7 7.6,7H20.4C20.731,7 21,7.269 21,7.6Z"
9+
android:strokeWidth="1.25"
10+
android:strokeColor="#5D6066"
11+
android:strokeLineCap="round"
12+
android:strokeLineJoin="round" />
13+
<path
14+
android:fillColor="#00000000"
15+
android:pathData="M18,4H4.6C4.269,4 4,4.269 4,4.6V18"
16+
android:strokeWidth="1.25"
17+
android:strokeColor="#5D6066"
18+
android:strokeLineCap="round"
19+
android:strokeLineJoin="round" />
20+
<path
21+
android:fillColor="#00000000"
22+
android:pathData="M12.909,11.545C12.509,11.305 12,11.593 12,12.06V15.94C12,16.407 12.509,16.695 12.909,16.455L16.142,14.514C16.531,14.281 16.531,13.719 16.142,13.486L12.909,11.545Z"
23+
android:strokeWidth="1.25"
24+
android:strokeColor="#5D6066"
25+
android:strokeLineCap="round"
26+
android:strokeLineJoin="round" />
27+
</vector>

app/src/main/res/values-zh/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
<string name="preferences">首选项</string>
2828
<string name="privacy">隐私</string>
2929
<string name="more">更多</string>
30+
<string name="setting_on">开启</string>
31+
<string name="setting_off">关闭</string>
3032

3133
<!-- time -->
3234
<string name="relative_time_mm">%d分</string>
@@ -60,6 +62,7 @@
6062
<string name="network_acceleration">网络加速</string>
6163
<string name="account_security">账户安全</string>
6264
<string name="delete_account">注销账户</string>
65+
<string name="stream_data_analysis">音视频数据采集</string>
6366

6467
<string name="room_type_big_class">大班课</string>
6568
<string name="room_type_small_class">小班课</string>

0 commit comments

Comments
 (0)