Skip to content

Commit 88b691d

Browse files
committed
Make in-app theme eligible; Add icon to widget configuration dialog; Fix widget property property values
1 parent 9be87f8 commit 88b691d

File tree

10 files changed

+209
-60
lines changed

10 files changed

+209
-60
lines changed

app/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ android {
1717
minSdk libs.versions.minSdk.get().toInteger()
1818
targetSdk libs.versions.compileSdk.get().toInteger()
1919

20-
versionCode 11
21-
versionName '1.1.7'
20+
versionCode 12
21+
versionName '1.1.8'
2222

2323
setProperty('archivesBaseName', versionName) // Stores built aab's as "{versionName}-{buildFlavor}.apk"
2424
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
@@ -81,6 +81,7 @@ dependencies {
8181

8282
implementation libs.androidutils
8383
implementation libs.permissionhandler
84+
implementation libs.kotlinutils
8485

8586
// androidx
8687
implementation libs.androidx.core

app/src/main/kotlin/com/w2sv/wifiwidget/activities/HomeActivity.kt

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import android.view.animation.AnticipateInterpolator
1313
import android.widget.Toast
1414
import androidx.activity.compose.setContent
1515
import androidx.activity.viewModels
16+
import androidx.compose.foundation.isSystemInDarkTheme
17+
import androidx.compose.runtime.collectAsState
18+
import androidx.compose.runtime.getValue
1619
import androidx.compose.runtime.snapshots.SnapshotStateMap
1720
import androidx.core.animation.doOnEnd
1821
import androidx.core.splashscreen.SplashScreen
@@ -26,6 +29,8 @@ import com.w2sv.androidutils.SelfManagingLocalBroadcastReceiver
2629
import com.w2sv.androidutils.extensions.getIntExtraOrNull
2730
import com.w2sv.androidutils.extensions.locationServicesEnabled
2831
import com.w2sv.androidutils.extensions.showToast
32+
import com.w2sv.common.Theme
33+
import com.w2sv.kotlinutils.extensions.getByOrdinal
2934
import com.w2sv.preferences.FloatPreferences
3035
import com.w2sv.preferences.GlobalFlags
3136
import com.w2sv.preferences.IntPreferences
@@ -78,6 +83,29 @@ class HomeActivity : AppActivity() {
7883
}
7984
}
8085

86+
var themeRequiringUpdate = MutableStateFlow(false)
87+
88+
var theme = MutableStateFlow(intPreferences.theme)
89+
.apply {
90+
viewModelScope.launch {
91+
collect {
92+
themeRequiringUpdate.value = it != intPreferences.theme
93+
}
94+
}
95+
}
96+
var usedTheme = MutableStateFlow<Theme>(getByOrdinal(intPreferences.theme))
97+
98+
fun updateTheme() {
99+
intPreferences.theme = theme.value
100+
usedTheme.value = getByOrdinal(theme.value)
101+
themeRequiringUpdate.value = false
102+
}
103+
104+
fun resetTheme() {
105+
theme.value = intPreferences.theme
106+
themeRequiringUpdate.value = false
107+
}
108+
81109
/**
82110
* Widget Pin Listening
83111
*/
@@ -253,7 +281,15 @@ class HomeActivity : AppActivity() {
253281
super.onCreate(savedInstanceState)
254282

255283
setContent {
256-
WifiWidgetTheme {
284+
val theme by viewModel.usedTheme.collectAsState()
285+
286+
WifiWidgetTheme(
287+
darkTheme = when (theme) {
288+
Theme.Light -> false
289+
Theme.Dark -> true
290+
Theme.SystemDefault -> isSystemInDarkTheme()
291+
}
292+
) {
257293
HomeScreen()
258294
}
259295
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.w2sv.wifiwidget.ui
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.geometry.Offset
5+
import androidx.compose.ui.graphics.Brush
6+
import androidx.compose.ui.graphics.Color
7+
8+
@Composable
9+
fun diagonalGradient(lowerLeftCorner: Color, upperRightCorner: Color): Brush =
10+
Brush.linearGradient(
11+
listOf(
12+
lowerLeftCorner,
13+
upperRightCorner
14+
),
15+
start = Offset(0f, Float.POSITIVE_INFINITY),
16+
end = Offset(Float.POSITIVE_INFINITY, 0f)
17+
)

app/src/main/kotlin/com/w2sv/wifiwidget/ui/Theme.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.w2sv.wifiwidget.ui
22

3-
import androidx.compose.foundation.isSystemInDarkTheme
43
import androidx.compose.material3.MaterialTheme
54
import androidx.compose.material3.darkColorScheme
65
import androidx.compose.material3.lightColorScheme
@@ -10,7 +9,7 @@ import androidx.compose.ui.res.colorResource
109
import com.w2sv.wifiwidget.R
1110

1211
@Composable
13-
fun WifiWidgetTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
12+
fun WifiWidgetTheme(darkTheme: Boolean = false, content: @Composable () -> Unit) {
1413
MaterialTheme(
1514
colorScheme = if (darkTheme)
1615
darkColorScheme(
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.w2sv.wifiwidget.ui.home.configurationdialog
1+
package com.w2sv.wifiwidget.ui
22

33
import androidx.annotation.StringRes
44
import androidx.compose.foundation.BorderStroke
@@ -23,10 +23,9 @@ import androidx.compose.ui.res.stringResource
2323
import androidx.compose.ui.unit.dp
2424
import androidx.compose.ui.unit.sp
2525
import com.w2sv.wifiwidget.R
26-
import com.w2sv.wifiwidget.ui.JostText
2726

2827
@Composable
29-
internal fun ThemeSelectionRow(
28+
fun ThemeSelectionRow(
3029
modifier: Modifier = Modifier,
3130
selected: () -> Int,
3231
onSelected: (Int) -> Unit

app/src/main/kotlin/com/w2sv/wifiwidget/ui/home/NavigationDrawer.kt

Lines changed: 130 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ import androidx.compose.foundation.shape.CircleShape
1313
import androidx.compose.material3.*
1414
import androidx.compose.runtime.Composable
1515
import androidx.compose.runtime.Stable
16+
import androidx.compose.runtime.collectAsState
17+
import androidx.compose.runtime.getValue
18+
import androidx.compose.runtime.mutableStateOf
1619
import androidx.compose.runtime.remember
1720
import androidx.compose.runtime.rememberCoroutineScope
21+
import androidx.compose.runtime.saveable.rememberSaveable
22+
import androidx.compose.runtime.setValue
1823
import androidx.compose.ui.Alignment
1924
import androidx.compose.ui.Modifier
2025
import androidx.compose.ui.draw.clip
@@ -32,7 +37,10 @@ import com.w2sv.androidutils.extensions.playStoreUrl
3237
import com.w2sv.androidutils.extensions.showToast
3338
import com.w2sv.wifiwidget.BuildConfig
3439
import com.w2sv.wifiwidget.R
40+
import com.w2sv.wifiwidget.activities.HomeActivity
41+
import com.w2sv.wifiwidget.ui.DialogButton
3542
import com.w2sv.wifiwidget.ui.JostText
43+
import com.w2sv.wifiwidget.ui.ThemeSelectionRow
3644
import com.w2sv.wifiwidget.ui.WifiWidgetTheme
3745
import kotlinx.coroutines.launch
3846

@@ -48,9 +56,39 @@ private fun NavigationDrawerPrev() {
4856

4957
@OptIn(ExperimentalMaterial3Api::class)
5058
@Composable
51-
fun NavigationDrawer(modifier: Modifier = Modifier, initialValue: DrawerValue = DrawerValue.Closed, content: @Composable (DrawerState) -> Unit) {
59+
fun NavigationDrawer(
60+
modifier: Modifier = Modifier,
61+
initialValue: DrawerValue = DrawerValue.Closed,
62+
viewModel: HomeActivity.ViewModel = androidx.lifecycle.viewmodel.compose.viewModel(),
63+
content: @Composable (DrawerState) -> Unit
64+
) {
5265
val drawerState = rememberDrawerState(initialValue = initialValue)
5366
val scope = rememberCoroutineScope()
67+
val context = LocalContext.current
68+
69+
var showThemeDialog by rememberSaveable {
70+
mutableStateOf(false)
71+
}
72+
73+
val theme by viewModel.theme.collectAsState()
74+
val themeRequiringUpdate by viewModel.themeRequiringUpdate.collectAsState()
75+
76+
if (showThemeDialog) {
77+
ThemeDialog(
78+
onDismissRequest = {
79+
viewModel.resetTheme()
80+
showThemeDialog = false
81+
},
82+
theme = { theme },
83+
onThemeSelected = { viewModel.theme.value = it },
84+
applyButtonEnabled = { themeRequiringUpdate },
85+
onApplyButtonPress = {
86+
viewModel.updateTheme()
87+
showThemeDialog = false
88+
context.showToast("Updated Theme")
89+
}
90+
)
91+
}
5492

5593
val closeDrawer: () -> Unit = {
5694
scope.launch {
@@ -63,7 +101,10 @@ fun NavigationDrawer(modifier: Modifier = Modifier, initialValue: DrawerValue =
63101
ModalNavigationDrawer(
64102
modifier = modifier,
65103
drawerContent = {
66-
NavigationDrawerContent(closeDrawer)
104+
NavigationDrawerContent(
105+
closeDrawer = closeDrawer,
106+
onItemThemePressed = { showThemeDialog = true }
107+
)
67108
},
68109
drawerState = drawerState
69110
) {
@@ -73,7 +114,7 @@ fun NavigationDrawer(modifier: Modifier = Modifier, initialValue: DrawerValue =
73114

74115
@OptIn(ExperimentalMaterial3Api::class)
75116
@Composable
76-
private fun NavigationDrawerContent(closeDrawer: () -> Unit) {
117+
private fun NavigationDrawerContent(closeDrawer: () -> Unit, onItemThemePressed: () -> Unit) {
77118
ModalDrawerSheet {
78119
Column(
79120
modifier = Modifier
@@ -97,7 +138,47 @@ private fun NavigationDrawerContent(closeDrawer: () -> Unit) {
97138
.padding(bottom = 12.dp)
98139
)
99140
remember {
100-
NavigationDrawerItemProperties.get()
141+
listOf(
142+
NavigationDrawerItem(
143+
R.drawable.ic_nightlight_24,
144+
R.string.theme
145+
) {
146+
onItemThemePressed()
147+
},
148+
NavigationDrawerItem(
149+
R.drawable.ic_share_24,
150+
R.string.share
151+
) {
152+
ShareCompat.IntentBuilder(it)
153+
.setType("text/plain")
154+
.setText("Check out WiFi Widget!\n${it.playStoreUrl}")
155+
.setChooserTitle("Choose an app")
156+
.startChooser()
157+
},
158+
NavigationDrawerItem(
159+
R.drawable.ic_star_rate_24,
160+
R.string.rate
161+
) {
162+
try {
163+
it.startActivity(
164+
Intent(
165+
Intent.ACTION_VIEW,
166+
Uri.parse(it.playStoreUrl)
167+
)
168+
.setPackage("com.android.vending")
169+
)
170+
} catch (e: ActivityNotFoundException) {
171+
it.showToast("You're not signed into the Play Store \uD83E\uDD14")
172+
}
173+
},
174+
NavigationDrawerItem(
175+
R.drawable.ic_github_24,
176+
R.string.code
177+
) {
178+
it
179+
.openUrl("https://github.com/w2sv/WiFi-Widget")
180+
}
181+
)
101182
}
102183
.forEach {
103184
NavigationDrawerItem(properties = it, closeDrawer = closeDrawer)
@@ -115,45 +196,15 @@ fun VersionText(modifier: Modifier = Modifier) {
115196
}
116197

117198
@Stable
118-
private data class NavigationDrawerItemProperties(
199+
private data class NavigationDrawerItem(
119200
@DrawableRes val icon: Int,
120201
@StringRes val label: Int,
121202
val callback: (Context) -> Unit
122-
) {
123-
companion object {
124-
fun get(): List<NavigationDrawerItemProperties> =
125-
listOf(
126-
NavigationDrawerItemProperties(R.drawable.ic_share_24, R.string.share) {
127-
ShareCompat.IntentBuilder(it)
128-
.setType("text/plain")
129-
.setText("Check out WiFi Widget!\n${it.playStoreUrl}")
130-
.setChooserTitle("Choose an app")
131-
.startChooser()
132-
},
133-
NavigationDrawerItemProperties(R.drawable.ic_star_rate_24, R.string.rate) {
134-
try {
135-
it.startActivity(
136-
Intent(
137-
Intent.ACTION_VIEW,
138-
Uri.parse(it.playStoreUrl)
139-
)
140-
.setPackage("com.android.vending")
141-
)
142-
} catch (e: ActivityNotFoundException) {
143-
it.showToast("You're not signed into the Play Store \uD83E\uDD14")
144-
}
145-
},
146-
NavigationDrawerItemProperties(R.drawable.ic_github_24, R.string.code) {
147-
it
148-
.openUrl("https://github.com/w2sv/WiFi-Widget")
149-
}
150-
)
151-
}
152-
}
203+
)
153204

154205
@Composable
155206
private fun NavigationDrawerItem(
156-
properties: NavigationDrawerItemProperties,
207+
properties: NavigationDrawerItem,
157208
closeDrawer: () -> Unit
158209
) {
159210
val context = LocalContext.current
@@ -183,4 +234,46 @@ private fun NavigationDrawerItem(
183234
fontWeight = FontWeight.Medium
184235
)
185236
}
237+
}
238+
239+
@Preview
240+
@Composable
241+
fun ThemeDialogPrev() {
242+
WifiWidgetTheme {
243+
ThemeDialog(
244+
onDismissRequest = { /*TODO*/ },
245+
theme = { 1 },
246+
onThemeSelected = {},
247+
applyButtonEnabled = { true },
248+
onApplyButtonPress = {}
249+
)
250+
}
251+
}
252+
253+
@Composable
254+
private fun ThemeDialog(
255+
onDismissRequest: () -> Unit,
256+
theme: () -> Int,
257+
onThemeSelected: (Int) -> Unit,
258+
applyButtonEnabled: () -> Boolean,
259+
onApplyButtonPress: () -> Unit
260+
) {
261+
AlertDialog(
262+
onDismissRequest = onDismissRequest,
263+
title = { JostText(text = stringResource(id = R.string.theme)) },
264+
icon = { Icon(painter = painterResource(id = R.drawable.ic_nightlight_24), contentDescription = "@null", tint = MaterialTheme.colorScheme.primary)},
265+
confirmButton = {
266+
DialogButton(onClick = { onApplyButtonPress() }, enabled = applyButtonEnabled()) {
267+
JostText(text = stringResource(id = R.string.apply))
268+
}
269+
},
270+
dismissButton = {
271+
DialogButton(onClick = onDismissRequest) {
272+
JostText(text = stringResource(id = R.string.cancel))
273+
}
274+
},
275+
text = {
276+
ThemeSelectionRow(selected = theme, onSelected = onThemeSelected)
277+
}
278+
)
186279
}

0 commit comments

Comments
 (0)