Skip to content

Commit f75ba3c

Browse files
feat: create component - top app bar (#954)
* Add OudsTopAppBar # Conflicts: # NOTICE.txt # core/src/main/java/com/orange/ouds/core/component/OudsTag.kt # theme-contract/src/main/java/com/orange/ouds/theme/OudsDrawableResources.kt # theme-orange/src/main/java/com/orange/ouds/theme/orange/OrangeDrawableResources.kt # theme-sosh/src/main/java/com/orange/ouds/theme/sosh/SoshDrawableResources.kt # theme-wireframe/src/main/java/com/orange/ouds/theme/wireframe/WireframeDrawableResources.kt # Conflicts: # core/src/main/java/com/orange/ouds/core/component/OudsTag.kt * Add design version to navigation and top app bars * Add top app bar demo * Add translucent parameter to top app bar * Integrate OudsTopAppBar into the demo app * Add snapshot tests * Add instrumented tests * Rename NavigationBar to Bar in OudsVersion * Monogram is now limited to a single letter and does not take user font scale into account * Fix a crash in typography tokens screen * Review: Fix KDoc * Review: Rename size parameter of Title method to topAppBarSize to avoid confusion * Review: It is now possible to customize the top app bar demo with all kind of navigation icons * Review: Replace hardcoded 48dp with minInteractiveArea token value * Review: Remove empty line * Review: Factorize top padding and window insets of top bars * feat(top-app-bar): add the option to add a badge on an icon in the top app bar (#969) * Add OudsComponentIconBadge and an icon badge parameter in OudsButton * Add snapshot tests for OudsButton with icon badge * Add OudsBadgedIcon and use it in OudsNavigationBarItem * Add snapshot tests for OudsBadgedIcon * Add OudsTopAppBarActionBadge * Add top app bar action badge to the demo screen * Add KDoc to OudsBadgedIcon * Fix accessibility on OudsBadgedIcon * Various fixes * Fix layout of standard OudsBadgedIcon in RTL * Review: Remove guard condition in when * Review: Change appearance of button to minimal in icon badge preview
1 parent 4ff46ee commit f75ba3c

File tree

344 files changed

+2892
-515
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

344 files changed

+2892
-515
lines changed

NOTICE.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ theme-orange/src/main/res/drawable/ic_orange_component_link_previous.xml
112112
theme-orange/src/main/res/drawable/ic_orange_component_radio_button_selected.xml
113113
theme-orange/src/main/res/drawable/ic_orange_component_switch_selected_switch.xml
114114
theme-orange/src/main/res/drawable/ic_orange_component_tag_close.xml
115+
theme-orange/src/main/res/drawable/ic_orange_functional_actions_delete.xml
116+
theme-orange/src/main/res/drawable/ic_orange_functional_navigation_form_chevron_left.xml
117+
theme-orange/src/main/res/drawable/ic_orange_functional_navigation_menu.xml
115118

116119
theme-sosh/src/main/res/drawable/ic_sosh_component_alert_important_fill.xml
117120
theme-sosh/src/main/res/drawable/ic_sosh_component_alert_info_fill.xml
@@ -126,6 +129,9 @@ theme-sosh/src/main/res/drawable/ic_sosh_component_link_previous.xml
126129
theme-sosh/src/main/res/drawable/ic_sosh_component_radio_button_selected.xml
127130
theme-sosh/src/main/res/drawable/ic_sosh_component_switch_selected_switch.xml
128131
theme-sosh/src/main/res/drawable/ic_sosh_component_tag_close.xml
132+
theme-sosh/src/main/res/drawable/ic_sosh_functional_actions_delete.xml
133+
theme-sosh/src/main/res/drawable/ic_sosh_functional_navigation_form_chevron_left.xml
134+
theme-sosh/src/main/res/drawable/ic_sosh_functional_navigation_menu.xml
129135
theme-sosh/src/main/res/font/sosh_black.ttf
130136
theme-sosh/src/main/res/font/sosh_bold.ttf
131137
theme-sosh/src/main/res/font/sosh_medium.ttf
@@ -145,6 +151,9 @@ theme-wireframe/src/main/res/drawable/ic_wireframe_component_link_previous.xml
145151
theme-wireframe/src/main/res/drawable/ic_wireframe_component_radio_button_selected.xml
146152
theme-wireframe/src/main/res/drawable/ic_wireframe_component_switch_selected_switch.xml
147153
theme-wireframe/src/main/res/drawable/ic_wireframe_component_tag_close.xml
154+
theme-wireframe/src/main/res/drawable/ic_wireframe_functional_actions_delete.xml
155+
theme-wireframe/src/main/res/drawable/ic_wireframe_functional_navigation_form_chevron_left.xml
156+
theme-wireframe/src/main/res/drawable/ic_wireframe_functional_navigation_menu.xml
148157

149158
End of the parts list under Orange SA Copyright
150159

app/src/main/java/com/orange/ouds/app/ui/BottomBar.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
package com.orange.ouds.app.ui
1414

15+
import android.os.Build
1516
import androidx.annotation.StringRes
1617
import androidx.compose.animation.AnimatedVisibility
1718
import androidx.compose.animation.animateColorAsState
@@ -24,10 +25,12 @@ import androidx.compose.foundation.layout.Spacer
2425
import androidx.compose.foundation.layout.WindowInsets
2526
import androidx.compose.foundation.layout.WindowInsetsSides
2627
import androidx.compose.foundation.layout.consumeWindowInsets
28+
import androidx.compose.foundation.layout.displayCutout
2729
import androidx.compose.foundation.layout.fillMaxWidth
2830
import androidx.compose.foundation.layout.navigationBars
2931
import androidx.compose.foundation.layout.only
3032
import androidx.compose.foundation.layout.windowInsetsBottomHeight
33+
import androidx.compose.foundation.layout.windowInsetsPadding
3134
import androidx.compose.material3.MaterialTheme
3235
import androidx.compose.runtime.Composable
3336
import androidx.compose.runtime.getValue
@@ -46,7 +49,7 @@ import com.orange.ouds.core.theme.OudsTheme
4649

4750
@Composable
4851
fun BottomBar(currentRoute: String, navigateToRoute: (String) -> Unit, modifier: Modifier = Modifier, visible: Boolean = true) {
49-
Column {
52+
Column(modifier = Modifier.windowInsetsPadding(WindowInsets.displayCutout.only(WindowInsetsSides.Horizontal))) {
5053
val systemNavigationBackgroundColor = OudsTheme.colorScheme.background.secondary //TODO Temporary color. Waiting for Material colors from Maxime.
5154
AnimatedVisibility(
5255
visible = visible,
@@ -63,7 +66,7 @@ fun BottomBar(currentRoute: String, navigateToRoute: (String) -> Unit, modifier:
6366
)
6467
},
6568
modifier = modifier.consumeWindowInsets(WindowInsets.navigationBars.only(WindowInsetsSides.Bottom)),
66-
translucent = true
69+
translucent = Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2
6770
)
6871
}
6972
val systemNavigationBarBackgroundColor by animateColorAsState(if (visible) systemNavigationBackgroundColor else MaterialTheme.colorScheme.surface)

app/src/main/java/com/orange/ouds/app/ui/MainScreen.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,20 @@ fun MainScreen(
9999
var changeThemeDialogVisible by rememberSaveable { mutableStateOf(false) }
100100
var changeThemeSettingsDialogVisible by rememberSaveable { mutableStateOf(false) }
101101

102-
val hazeState = rememberHazeState(blurEnabled = true)
103-
104102
OudsTheme(
105103
theme = mainState.themeState.currentTheme,
106104
darkThemeEnabled = isSystemInDarkTheme,
107105
) {
106+
val hazeState = rememberHazeState(blurEnabled = true)
107+
val hazeStyle = HazeStyle(tint = null, blurRadius = OudsTheme.components.bar.blurRadius.dp)
108+
108109
CompositionLocalProvider(LocalThemeDrawableResources provides ThemeDrawableResources(mainState.themeState.currentTheme)) {
109110
Scaffold(
110111
contentWindowInsets = ScaffoldDefaults.contentWindowInsets.union(WindowInsets.displayCutout),
111112
topBar = {
112113
val context = LocalContext.current
113114
TopBar(
115+
modifier = Modifier.hazeEffect(state = hazeState, style = hazeStyle),
114116
topBarState = mainState.topBarState,
115117
upPress = mainState.navigationState::upPress,
116118
onActionClick = { action ->
@@ -124,10 +126,7 @@ fun MainScreen(
124126
},
125127
bottomBar = {
126128
BottomBar(
127-
modifier = Modifier.hazeEffect(
128-
state = hazeState,
129-
style = HazeStyle(tint = null, blurRadius = OudsTheme.components.navigationBar.blurRadius.dp)
130-
),
129+
modifier = Modifier.hazeEffect(state = hazeState, style = hazeStyle),
131130
currentRoute = mainState.navigationState.currentRoute.orEmpty(),
132131
navigateToRoute = { route ->
133132
mainState.navigationState.navigateToBottomBarRoute(route)
@@ -137,7 +136,7 @@ fun MainScreen(
137136
}
138137
) { innerPadding ->
139138
val paddingValues = PaddingValues(
140-
top = innerPadding.calculateTopPadding(),
139+
top = 0.dp,
141140
bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding(),
142141
start = innerPadding.calculateStartPadding(LocalLayoutDirection.current),
143142
end = innerPadding.calculateEndPadding(LocalLayoutDirection.current)

app/src/main/java/com/orange/ouds/app/ui/TopBar.kt

Lines changed: 39 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,39 @@
1212

1313
package com.orange.ouds.app.ui
1414

15-
import androidx.compose.foundation.Image
15+
import android.os.Build
1616
import androidx.compose.foundation.isSystemInDarkTheme
1717
import androidx.compose.foundation.layout.WindowInsets
1818
import androidx.compose.foundation.layout.WindowInsetsSides
1919
import androidx.compose.foundation.layout.displayCutout
2020
import androidx.compose.foundation.layout.only
2121
import androidx.compose.foundation.layout.windowInsetsPadding
22-
import androidx.compose.material.icons.Icons
23-
import androidx.compose.material.icons.automirrored.filled.ArrowBack
2422
import androidx.compose.material3.ExperimentalMaterial3Api
25-
import androidx.compose.material3.Icon
26-
import androidx.compose.material3.IconButton
27-
import androidx.compose.material3.Text
28-
import androidx.compose.material3.TopAppBar
2923
import androidx.compose.runtime.Composable
3024
import androidx.compose.ui.Modifier
31-
import androidx.compose.ui.graphics.ColorFilter
25+
import androidx.compose.ui.graphics.painter.Painter
3226
import androidx.compose.ui.res.painterResource
3327
import androidx.compose.ui.res.stringResource
34-
import androidx.compose.ui.semantics.isTraversalGroup
35-
import androidx.compose.ui.semantics.semantics
36-
import androidx.compose.ui.semantics.traversalIndex
3728
import androidx.compose.ui.tooling.preview.PreviewLightDark
3829
import com.orange.ouds.app.R
30+
import com.orange.ouds.app.ui.utilities.LightDarkResourceId
3931
import com.orange.ouds.app.ui.utilities.LocalThemeDrawableResources
4032
import com.orange.ouds.app.ui.utilities.composable.AppPreview
41-
import com.orange.ouds.core.theme.OudsTheme
33+
import com.orange.ouds.app.ui.utilities.painterResource
34+
import com.orange.ouds.core.component.OudsTopAppBar
35+
import com.orange.ouds.core.component.OudsTopAppBarAction
36+
import com.orange.ouds.core.component.OudsTopAppBarNavigationIcon
4237

4338

4439
@Composable
4540
fun TopBar(
4641
topBarState: TopBarState,
4742
upPress: () -> Unit,
48-
onActionClick: (TopBarAction) -> Unit
43+
onActionClick: (TopBarAction) -> Unit,
44+
modifier: Modifier = Modifier
4945
) {
5046
TopBar(
47+
modifier = modifier,
5148
title = topBarState.title,
5249
showNavigationIcon = topBarState.showNavigationIcon,
5350
actions = topBarState.actions,
@@ -63,74 +60,46 @@ private fun TopBar(
6360
title: String,
6461
actions: List<TopBarAction>,
6562
upPress: () -> Unit,
66-
onActionClick: (TopBarAction) -> Unit
63+
onActionClick: (TopBarAction) -> Unit,
64+
modifier: Modifier = Modifier
6765
) {
68-
TopAppBar(
69-
modifier = Modifier
70-
.semantics { isTraversalGroup = true }
71-
.windowInsetsPadding(WindowInsets.displayCutout.only(WindowInsetsSides.Horizontal)),
72-
navigationIcon = {
73-
if (showNavigationIcon) {
74-
IconButton(onClick = upPress) {
75-
Image(
76-
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
77-
contentDescription = stringResource(id = R.string.app_common_back_a11y),
78-
colorFilter = ColorFilter.tint(OudsTheme.colorScheme.content.default)
79-
)
80-
}
81-
}
82-
},
83-
title = {
84-
Text(
85-
text = title,
86-
color = OudsTheme.colorScheme.content.default,
87-
modifier = Modifier.semantics { traversalIndex = -1f },
88-
style = OudsTheme.typography.heading.medium
66+
OudsTopAppBar(
67+
modifier = modifier.windowInsetsPadding(WindowInsets.displayCutout.only(WindowInsetsSides.Horizontal)),
68+
translucent = Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2,
69+
title = title,
70+
navigationIcon = if (showNavigationIcon) OudsTopAppBarNavigationIcon.Back(onClick = upPress) else null,
71+
actions = actions.map { action ->
72+
OudsTopAppBarAction.Icon(
73+
painter = action.painter,
74+
contentDescription = action.contentDescription,
75+
onClick = { onActionClick(action) }
8976
)
90-
},
91-
actions = {
92-
actions.map { it.TopBarIconButton(onActionClick = onActionClick) }
9377
}
9478
)
9579
}
9680

9781
enum class TopBarAction {
9882
ChangeThemeSettings, ChangeTheme, ChangeMode;
9983

100-
@Composable
101-
fun TopBarIconButton(onActionClick: (TopBarAction) -> Unit) = when (this) {
102-
ChangeThemeSettings -> ChangeThemeSettingsAction(onActionClick)
103-
ChangeTheme -> ChangeThemeAction(onActionClick)
104-
ChangeMode -> ChangeModeAction(onActionClick)
105-
}
106-
}
107-
108-
@Composable
109-
private fun ChangeThemeSettingsAction(onClick: (TopBarAction) -> Unit) {
110-
IconButton(onClick = { onClick(TopBarAction.ChangeThemeSettings) }) {
111-
Icon(
112-
painter = painterResource(id = LocalThemeDrawableResources.current.filters),
113-
contentDescription = stringResource(id = R.string.app_topBar_themeSettings_button_a11y)
114-
)
115-
}
116-
}
117-
118-
@Composable
119-
private fun ChangeThemeAction(onClick: (TopBarAction) -> Unit) {
120-
IconButton(onClick = { onClick(TopBarAction.ChangeTheme) }) {
121-
Icon(painter = painterResource(id = R.drawable.ic_solar_palette), contentDescription = stringResource(id = R.string.app_topBar_theme_button_a11y))
122-
}
123-
}
84+
val painter: Painter
85+
@Composable
86+
get() = when (this) {
87+
ChangeThemeSettings -> painterResource(id = LocalThemeDrawableResources.current.filters)
88+
ChangeTheme -> painterResource(id = R.drawable.ic_solar_palette)
89+
ChangeMode -> painterResource(LightDarkResourceId(R.drawable.ic_ui_light_mode, R.drawable.ic_ui_dark_mode))
90+
}
12491

125-
@Composable
126-
private fun ChangeModeAction(onClick: (TopBarAction) -> Unit) {
127-
val isSystemInDarkTheme = isSystemInDarkTheme()
128-
val painterRes = if (isSystemInDarkTheme) R.drawable.ic_ui_light_mode else R.drawable.ic_ui_dark_mode
129-
val iconDesc = if (isSystemInDarkTheme) R.string.app_topBar_lightMode_button_a11y else R.string.app_topBar_darkMode_button_a11y
92+
val contentDescription: String
93+
@Composable
94+
get() {
95+
val id = when (this) {
96+
ChangeThemeSettings -> R.string.app_topBar_themeSettings_button_a11y
97+
ChangeTheme -> R.string.app_topBar_theme_button_a11y
98+
ChangeMode -> if (isSystemInDarkTheme()) R.string.app_topBar_lightMode_button_a11y else R.string.app_topBar_darkMode_button_a11y
99+
}
130100

131-
IconButton(onClick = { onClick(TopBarAction.ChangeMode) }) {
132-
Icon(painter = painterResource(id = painterRes), contentDescription = stringResource(id = iconDesc))
133-
}
101+
return stringResource(id = id)
102+
}
134103
}
135104

136105
@PreviewLightDark

app/src/main/java/com/orange/ouds/app/ui/about/AboutFileScreen.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@ import android.webkit.WebResourceRequest
1818
import android.webkit.WebView
1919
import android.webkit.WebViewClient
2020
import androidx.compose.foundation.isSystemInDarkTheme
21+
import androidx.compose.foundation.layout.WindowInsets
22+
import androidx.compose.foundation.layout.WindowInsetsSides
23+
import androidx.compose.foundation.layout.consumeWindowInsets
2124
import androidx.compose.foundation.layout.fillMaxSize
25+
import androidx.compose.foundation.layout.only
26+
import androidx.compose.foundation.layout.statusBars
2227
import androidx.compose.runtime.Composable
2328
import androidx.compose.ui.Modifier
2429
import androidx.compose.ui.platform.LocalContext
2530
import androidx.compose.ui.viewinterop.AndroidView
2631
import com.orange.ouds.app.ui.utilities.composable.Screen
2732
import com.orange.ouds.app.ui.utilities.injectLightDarkModeCss
2833
import com.orange.ouds.app.ui.utilities.launchUrl
34+
import com.orange.ouds.app.ui.utilities.topBarsTopPadding
2935
import com.orange.ouds.core.theme.OudsTheme
3036
import java.io.BufferedReader
3137
import java.nio.charset.StandardCharsets
@@ -37,19 +43,22 @@ private const val FilePath = "file:///android_res/$FileResourceDir/"
3743
internal fun AboutFileScreen(fileMenuItem: AboutFileMenuItem) {
3844
val context = LocalContext.current
3945
val horizontalPadding = OudsTheme.grids.margin.value
40-
val verticalPadding = OudsTheme.spaces.fixed.medium.value
46+
val topPadding = topBarsTopPadding + OudsTheme.spaces.fixed.medium
47+
val bottomPadding = OudsTheme.spaces.fixed.medium.value
4148
val isSystemInDarkTheme = isSystemInDarkTheme()
4249
Screen {
4350
AndroidView(
44-
modifier = Modifier.fillMaxSize(),
51+
modifier = Modifier
52+
.fillMaxSize()
53+
.consumeWindowInsets(WindowInsets.statusBars.only(WindowInsetsSides.Top)),
4554
factory = {
4655
WebView(context).apply {
4756
@SuppressLint("SetJavaScriptEnabled")
4857
settings.javaScriptEnabled = true
4958
webViewClient = object : WebViewClient() {
5059
override fun onPageFinished(view: WebView?, url: String?) {
5160
super.onPageFinished(view, url)
52-
view?.loadUrl("javascript:(function(){ document.body.style.padding = '${verticalPadding}px ${horizontalPadding}px' })();")
61+
view?.loadUrl("javascript:(function(){ document.body.style.paddingTop = '${topPadding.value}px'; document.body.style.paddingBottom = '${bottomPadding}px'; document.body.style.paddingLeft = '${horizontalPadding}px'; document.body.style.paddingRight = '${horizontalPadding}px'; })();")
5362
view?.injectLightDarkModeCss(isSystemInDarkTheme)
5463
}
5564

app/src/main/java/com/orange/ouds/app/ui/about/AboutMaterialComponentsScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
146146
import androidx.compose.ui.unit.dp
147147
import com.orange.ouds.app.ui.utilities.composable.AppPreview
148148
import com.orange.ouds.app.ui.utilities.composable.Screen
149+
import com.orange.ouds.app.ui.utilities.consumeTopBarsTopWindowInsets
149150
import com.orange.ouds.app.ui.utilities.listItemHorizontalPadding
151+
import com.orange.ouds.app.ui.utilities.topBarsTopPadding
150152
import com.orange.ouds.core.theme.OudsTheme
151153
import kotlinx.coroutines.CoroutineScope
152154
import kotlinx.coroutines.launch
@@ -167,7 +169,8 @@ fun AboutMaterialComponentsScreen() {
167169
modifier = Modifier
168170
.fillMaxSize()
169171
.verticalScroll(rememberScrollState())
170-
.padding(bottom = OudsTheme.spaces.fixed.medium)
172+
.consumeTopBarsTopWindowInsets()
173+
.padding(top = topBarsTopPadding, bottom = OudsTheme.spaces.fixed.medium)
171174
) {
172175

173176
// APP BARS

app/src/main/java/com/orange/ouds/app/ui/about/AboutScreen.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,18 @@ import androidx.annotation.StringRes
2222
import androidx.compose.foundation.clickable
2323
import androidx.compose.foundation.layout.Arrangement
2424
import androidx.compose.foundation.layout.Column
25-
import androidx.compose.foundation.layout.padding
25+
import androidx.compose.foundation.layout.PaddingValues
26+
import androidx.compose.foundation.layout.WindowInsets
27+
import androidx.compose.foundation.layout.WindowInsetsSides
28+
import androidx.compose.foundation.layout.asPaddingValues
29+
import androidx.compose.foundation.layout.consumeWindowInsets
30+
import androidx.compose.foundation.layout.only
31+
import androidx.compose.foundation.layout.statusBars
2632
import androidx.compose.foundation.lazy.LazyColumn
2733
import androidx.compose.foundation.lazy.items
2834
import androidx.compose.material3.ListItem
2935
import androidx.compose.material3.Text
36+
import androidx.compose.material3.TopAppBarDefaults
3037
import androidx.compose.runtime.Composable
3138
import androidx.compose.ui.Modifier
3239
import androidx.compose.ui.platform.LocalContext
@@ -42,7 +49,9 @@ import com.orange.ouds.app.BuildConfig
4249
import com.orange.ouds.app.R
4350
import com.orange.ouds.app.ui.utilities.composable.AppPreview
4451
import com.orange.ouds.app.ui.utilities.composable.Screen
52+
import com.orange.ouds.app.ui.utilities.consumeTopBarsTopWindowInsets
4553
import com.orange.ouds.app.ui.utilities.listItemHorizontalPadding
54+
import com.orange.ouds.app.ui.utilities.topBarsTopPadding
4655
import com.orange.ouds.core.component.OudsNavigationBarHeight
4756
import com.orange.ouds.core.theme.OudsTheme
4857

@@ -80,7 +89,13 @@ class AboutAppSettingsItem(id: Int, @StringRes labelRes: Int) : AboutMenuItem(id
8089
fun AboutScreen(onMenuItemClick: (id: Int) -> Unit) {
8190
val context = LocalContext.current
8291
Screen {
83-
LazyColumn(modifier = Modifier.padding(bottom = OudsNavigationBarHeight)) {
92+
LazyColumn(
93+
modifier = Modifier.consumeTopBarsTopWindowInsets(),
94+
contentPadding = PaddingValues(
95+
top = topBarsTopPadding,
96+
bottom = OudsTheme.spaces.fixed.medium + OudsNavigationBarHeight
97+
)
98+
) {
8499
item {
85100
val version = stringResource(R.string.app_about_version_label, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE.toLong())
86101
val issueNumbers: IntArray? = BuildConfig.ISSUE_NUMBERS

0 commit comments

Comments
 (0)