Skip to content

Commit e1f9df8

Browse files
committed
1.1.1
1 parent f440265 commit e1f9df8

File tree

9 files changed

+105
-66
lines changed

9 files changed

+105
-66
lines changed

app/build.gradle

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

19-
versionCode 4
20-
versionName '1.1.0'
19+
versionCode 5
20+
versionName '1.1.1'
2121

2222
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
2323
}
@@ -69,6 +69,7 @@ android {
6969
dependencies {
7070
implementation libs.typedpreferences
7171
implementation libs.androidutils
72+
implementation libs.permissionhandler
7273

7374
// androidx
7475
implementation libs.androidx.core

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class HomeActivity : AppActivity() {
6060
savedStateHandle.contains(EXTRA_OPEN_PROPERTIES_CONFIGURATION_DIALOG_ON_START)
6161
.also { i { "openPropertiesConfigurationDialog: $it" } }
6262

63+
val ssidKey: String = widgetProperties::SSID.name
64+
6365
/**
6466
* Widget Creation Listening
6567
*/
@@ -84,6 +86,13 @@ class HomeActivity : AppActivity() {
8486
widgetProperties.getMutableStateMap()
8587
}
8688

89+
fun setSSIDState(value: Boolean, updatePropertyStatesDissimilar: Boolean = true) {
90+
when (updatePropertyStatesDissimilar) {
91+
true -> onChangePropertyState(ssidKey, value)
92+
false -> widgetPropertyStates[ssidKey] = value
93+
}
94+
}
95+
8796
fun syncWidgetPropertyStates() {
8897
widgetProperties.putAll(widgetPropertyStates)
8998
_propertyStatesDissimilar.value = false
@@ -187,15 +196,7 @@ class HomeActivity : AppActivity() {
187196
)
188197

189198
val lapRequestLauncher by lazy {
190-
LocationAccessPermissionHandler(this) { permissionGrantedMap ->
191-
if (permissionGrantedMap.containsValue(true)) {
192-
with(viewModel) {
193-
widgetPropertyStates[widgetProperties::SSID.name] = true
194-
syncWidgetPropertyStates()
195-
}
196-
}
197-
requestWidgetPin()
198-
}
199+
LocationAccessPermissionHandler(this)
199200
}
200201
}
201202

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
package com.w2sv.wifiwidget.activities
22

33
import android.Manifest
4+
import android.widget.Toast
45
import androidx.activity.ComponentActivity
5-
import androidx.activity.result.contract.ActivityResultContracts
6-
import com.w2sv.androidutils.ActivityCallContractHandler
6+
import com.w2sv.androidutils.extensions.showToast
7+
import com.w2sv.permissionhandler.AssociatedPermissionsHandler
78

8-
class LocationAccessPermissionHandler(
9-
activity: ComponentActivity,
10-
override val resultCallback: (Map<String, Boolean>) -> Unit
11-
) :
12-
ActivityCallContractHandler.Impl<Array<String>, Map<String, Boolean>>(
9+
class LocationAccessPermissionHandler(activity: ComponentActivity) :
10+
AssociatedPermissionsHandler(
1311
activity,
14-
ActivityResultContracts.RequestMultiplePermissions()
12+
arrayOf(
13+
Manifest.permission.ACCESS_COARSE_LOCATION,
14+
Manifest.permission.ACCESS_FINE_LOCATION
15+
),
16+
"LocationAccessPermissionHandler"
1517
) {
16-
17-
fun launch() {
18-
resultLauncher.launch(
19-
arrayOf(
20-
Manifest.permission.ACCESS_COARSE_LOCATION,
21-
Manifest.permission.ACCESS_FINE_LOCATION
22-
)
18+
override fun onPermissionRationalSuppressed() {
19+
activity.showToast(
20+
"Go to app settings and grant location access permission",
21+
Toast.LENGTH_LONG
2322
)
2423
}
2524
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import com.w2sv.wifiwidget.ui.WifiWidgetTheme
1818

1919
@Composable
2020
fun LocationAccessPermissionDialog(
21+
dismissButtonText: String,
2122
onConfirmButtonPressed: () -> Unit,
2223
onDismissButtonPressed: () -> Unit,
24+
onAnyButtonPressed: () -> Unit,
2325
onCloseDialog: () -> Unit
2426
) {
2527
AlertDialog(
@@ -44,14 +46,16 @@ fun LocationAccessPermissionDialog(
4446
confirmButton = {
4547
DialogButton({
4648
onConfirmButtonPressed()
49+
onAnyButtonPressed()
4750
onCloseDialog()
4851
}, modifier = Modifier.fillMaxWidth()) { JostText(text = "Go ahead") }
4952
},
5053
dismissButton = {
5154
DialogButton({
5255
onDismissButtonPressed()
56+
onAnyButtonPressed()
5357
onCloseDialog()
54-
}, modifier = Modifier.fillMaxWidth()) { JostText(text = "Proceed without SSID") }
58+
}, modifier = Modifier.fillMaxWidth()) { JostText(text = dismissButtonText) }
5559
},
5660
onDismissRequest = onCloseDialog
5761
)
@@ -61,9 +65,6 @@ fun LocationAccessPermissionDialog(
6165
@Composable
6266
private fun LocationAccessPermissionDialogPrev() {
6367
WifiWidgetTheme {
64-
LocationAccessPermissionDialog(
65-
onConfirmButtonPressed = { /*TODO*/ },
66-
onDismissButtonPressed = { /*TODO*/ }) {
67-
}
68+
LocationAccessPermissionDialog("Proceed without SSID", {}, {}, {}, {})
6869
}
6970
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,24 @@ fun PinWidgetButton() {
3333
if (triggerOnClickListener) {
3434
when (viewModel.lapDialogAnswered) {
3535
false -> LocationAccessPermissionDialog(
36+
"Proceed without SSID",
3637
onConfirmButtonPressed = {
37-
homeActivity.lapRequestLauncher.launch()
38-
viewModel.onLapDialogAnswered()
38+
homeActivity.lapRequestLauncher.requestPermissionIfRequired(
39+
onGranted = {
40+
with(viewModel) {
41+
setSSIDState(true, updatePropertyStatesDissimilar = false)
42+
syncWidgetPropertyStates()
43+
}
44+
},
45+
onRequestDismissed = {
46+
homeActivity.requestWidgetPin()
47+
}
48+
)
3949
},
4050
onDismissButtonPressed = {
4151
homeActivity.requestWidgetPin()
52+
},
53+
onAnyButtonPressed = {
4254
viewModel.onLapDialogAnswered()
4355
},
4456
onCloseDialog = {

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

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@ import androidx.compose.foundation.verticalScroll
88
import androidx.compose.material.icons.Icons
99
import androidx.compose.material.icons.outlined.Info
1010
import androidx.compose.material3.*
11-
import androidx.compose.runtime.Composable
12-
import androidx.compose.runtime.getValue
13-
import androidx.compose.runtime.mutableStateOf
11+
import androidx.compose.runtime.*
1412
import androidx.compose.runtime.saveable.rememberSaveable
15-
import androidx.compose.runtime.setValue
1613
import androidx.compose.ui.Alignment
1714
import androidx.compose.ui.Modifier
1815
import androidx.compose.ui.geometry.Offset
@@ -28,6 +25,7 @@ import androidx.compose.ui.unit.dp
2825
import androidx.compose.ui.unit.sp
2926
import androidx.compose.ui.window.Dialog
3027
import androidx.lifecycle.viewmodel.compose.viewModel
28+
import com.w2sv.androidutils.extensions.requireCastActivity
3129
import com.w2sv.androidutils.extensions.showToast
3230
import com.w2sv.wifiwidget.R
3331
import com.w2sv.wifiwidget.activities.HomeActivity
@@ -43,6 +41,7 @@ fun PropertySelectionDialog(
4341
) {
4442
val viewModel: HomeActivity.ViewModel = viewModel()
4543
val context = LocalContext.current
44+
val homeActivity = context.requireCastActivity<HomeActivity>()
4645

4746
var infoDialogPropertyIndex by rememberSaveable {
4847
mutableStateOf<Int?>(null)
@@ -54,6 +53,26 @@ fun PropertySelectionDialog(
5453
}
5554
}
5655

56+
var showLAPDialog by rememberSaveable {
57+
mutableStateOf(false)
58+
}
59+
60+
fun launchLAPRequestIfRequired() {
61+
homeActivity.lapRequestLauncher.requestPermissionIfRequired(
62+
onDenied = { viewModel.setSSIDState(false) },
63+
onGranted = { viewModel.setSSIDState(true) }
64+
)
65+
}
66+
67+
if (showLAPDialog)
68+
LocationAccessPermissionDialog(
69+
"Never mind",
70+
onConfirmButtonPressed = { launchLAPRequestIfRequired() },
71+
onDismissButtonPressed = { viewModel.setSSIDState(false) },
72+
onAnyButtonPressed = { viewModel.onLapDialogAnswered() },
73+
onCloseDialog = { showLAPDialog = false }
74+
)
75+
5776
StatelessPropertySelectionDialog(
5877
onCancel = onCancel,
5978
onConfirm = onConfirm,
@@ -64,7 +83,12 @@ fun PropertySelectionDialog(
6483
viewModel.widgetPropertyStates.getValue(property)
6584
},
6685
onCheckedChange = { property, newValue ->
67-
if (!viewModel.onChangePropertyState(property, newValue))
86+
if (property == viewModel.ssidKey && newValue) {
87+
if (!viewModel.lapDialogAnswered)
88+
showLAPDialog = true
89+
else
90+
launchLAPRequestIfRequired()
91+
} else if (!viewModel.onChangePropertyState(property, newValue))
6892
context.showToast(context.getString(R.string.uncheck_all_properties_toast))
6993
},
7094
inflateInfoDialog = { propertyIndex ->
@@ -123,31 +147,6 @@ private fun StatelessPropertySelectionDialog(
123147
}
124148
}
125149

126-
@Composable
127-
private fun ButtonRow(onCancel: () -> Unit, onConfirm: () -> Unit, confirmButtonEnabled: Boolean) {
128-
Row(
129-
modifier = Modifier
130-
.padding(vertical = 24.dp)
131-
.fillMaxWidth(),
132-
horizontalArrangement = Arrangement.SpaceEvenly
133-
) {
134-
DialogButton(onClick = onCancel) {
135-
JostText(text = "Cancel")
136-
}
137-
DialogButton(onClick = onConfirm, enabled = confirmButtonEnabled) {
138-
JostText(text = "Confirm")
139-
}
140-
}
141-
}
142-
143-
@Preview
144-
@Composable
145-
private fun ButtonRowPrev() {
146-
WifiWidgetTheme {
147-
ButtonRow(onCancel = { /*TODO*/ }, onConfirm = { /*TODO*/ }, confirmButtonEnabled = true)
148-
}
149-
}
150-
151150
@Composable
152151
private fun ColumnScope.StatelessPropertyRows(
153152
propertyChecked: (String) -> Boolean,
@@ -204,4 +203,29 @@ private fun StatelessPropertyRowsPrev() {
204203
StatelessPropertyRows({ true }, { _, _ -> }, {})
205204
}
206205
}
206+
}
207+
208+
@Composable
209+
private fun ButtonRow(onCancel: () -> Unit, onConfirm: () -> Unit, confirmButtonEnabled: Boolean) {
210+
Row(
211+
modifier = Modifier
212+
.padding(vertical = 24.dp)
213+
.fillMaxWidth(),
214+
horizontalArrangement = Arrangement.SpaceEvenly
215+
) {
216+
DialogButton(onClick = onCancel) {
217+
JostText(text = "Cancel")
218+
}
219+
DialogButton(onClick = onConfirm, enabled = confirmButtonEnabled) {
220+
JostText(text = "Confirm")
221+
}
222+
}
223+
}
224+
225+
@Preview
226+
@Composable
227+
private fun ButtonRowPrev() {
228+
WifiWidgetTheme {
229+
ButtonRow(onCancel = { /*TODO*/ }, onConfirm = { /*TODO*/ }, confirmButtonEnabled = true)
230+
}
207231
}

app/src/main/res/values/string_arrays.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<item>https://en.wikipedia.org/wiki/List_of_WLAN_channels</item>
2626
</string-array>
2727
<string-array name="gateway">
28-
<item>@string/frequency</item>
28+
<item>@string/gateway</item>
2929
<item>A Gateway is a device uniting the functionality of a modem, i.e., communicating with your ISP (Internet Service Provider), and a router, i.e., translating the data received by the modem and distributing it as WiFi signal to the client devices being present in the network.</item>
3030
<item>https://en.wikipedia.org/wiki/Gateway_(telecommunications)#Network_gateway</item>
3131
</string-array>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<string name="no_wifi_connection">No WiFi Connection</string>
1616
<string name="wifi_disabled">WiFi Disabled</string>
1717
<string name="updated_widget_properties">Updated Widget Properties</string>
18-
<string name="widget_properties_will_apply">Updated Widget Properties will apply</string>
18+
<string name="widget_properties_will_apply">Updated Widget Properties, yet no Widget in use</string>
1919
<string name="pinned_widget">Pinned Widget</string>
2020
<string name="lap_dialog_text">If you want your device\'s SSID to be displayed amongst the WiFi properties, you\'ll have to grant location access permission.</string>
2121
<string name="configure_widget">Configure widget</string>

gradle/libs.versions.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ compileSdk = '33'
44

55
compose-compiler = '1.4.0'
66
compose-tooling = '1.3.3'
7-
gradle-plugin = '7.4.0'
7+
gradle-plugin = '7.4.1'
88
kotlin = '1.8.0'
99
hilt = '2.44.2'
1010
junit = '5.9.2'
@@ -13,6 +13,7 @@ lifecycle = '2.6.0-alpha05'
1313
[libraries]
1414
typedpreferences = 'com.github.w2sv:TypedPreferences:1.0.0'
1515
androidutils = 'com.github.w2sv:AndroidUtils:0.0.15-rc3'
16+
permissionhandler = 'com.github.w2sv:PermissionHandler:1.0.0-rc2'
1617

1718
# androidx
1819
androidx-appcompat = 'androidx.appcompat:appcompat:1.7.0-alpha01'

0 commit comments

Comments
 (0)