From 23063516b0241d807e5ea236bb0a1c333ba60161 Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 24 Jan 2022 14:56:17 -0300 Subject: [PATCH 1/3] update notifications to snackbar --- .../java/com/geeksville/mesh/MainActivity.kt | 8 +++- .../geeksville/mesh/ui/SettingsFragment.kt | 46 +++++++++---------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 2fe89c6f1..5d7e432e1 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -62,6 +62,7 @@ import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.tasks.Task import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayoutMediator import com.google.protobuf.InvalidProtocolBufferException import com.vorlonsoft.android.rate.AppRate @@ -399,7 +400,12 @@ class MainActivity : AppCompatActivity(), Logging, return if (message != null) { errormsg("Denied permissions: $message") - showToast(message) + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_INDEFINITE) + .apply { view.findViewById(R.id.snackbar_text).isSingleLine = false } + .setAction(R.string.okay) { + // dismiss + } + .show() true } else false diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index ce9948838..0565d2a87 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -22,7 +22,7 @@ import android.view.inputmethod.EditorInfo import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.RadioButton -import android.widget.Toast +import android.widget.TextView import androidx.fragment.app.activityViewModels import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData @@ -50,6 +50,7 @@ import com.google.android.gms.location.LocationRequest import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationSettingsRequest import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import com.hoho.android.usbserial.driver.UsbSerialDriver import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -844,7 +845,9 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } // If the user has not turned on location access throw up a toast warning - private fun checkLocationEnabled() { + private fun checkLocationEnabled( + warningReason: String = getString(R.string.location_disabled_warning) + ) { val hasGps: Boolean = myActivity.packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS) @@ -863,23 +866,20 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { val locationSettingsResponse = LocationServices.getSettingsClient(requireActivity()) .checkLocationSettings(builder.build()) - fun weNeedAccess() { + fun weNeedAccess(warningReason: String) { warn("Telling user we need need location access") - var warningReason = getString(R.string.location_disabled) - if (!hasCompanionDeviceApi) - warningReason = getString(R.string.location_disabled_warning) - - Toast.makeText( - requireContext(), - warningReason, - Toast.LENGTH_LONG - ).show() + Snackbar.make(binding.changeRadioButton, warningReason, Snackbar.LENGTH_INDEFINITE) + .apply { view.findViewById(R.id.snackbar_text).isSingleLine = false } + .setAction(R.string.okay) { + // dismiss + } + .show() } locationSettingsResponse.addOnSuccessListener { if (!it.locationSettingsStates?.isBleUsable!! || !it.locationSettingsStates?.isLocationUsable!!) - weNeedAccess() + weNeedAccess(warningReason) else debug("We have location access") } @@ -901,7 +901,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { // For now just punt and show a dialog // The context might be gone (if activity is going away) by the time this handler is called - weNeedAccess() + weNeedAccess(warningReason) //} else // Exceptions.report(exception) @@ -938,18 +938,14 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { if (!hasUSB) { // Warn user if BLE is disabled if (scanModel.bluetoothAdapter?.isEnabled != true) { - Toast.makeText( - requireContext(), - R.string.error_bluetooth, - Toast.LENGTH_SHORT - ).show() + Snackbar.make(binding.changeRadioButton, R.string.error_bluetooth, Snackbar.LENGTH_INDEFINITE) + .setAction(R.string.okay) { + // dismiss + } + .show() } else { - if (!hasCompanionDeviceApi) { - if (!myActivity.warnMissingPermissions()) - checkLocationEnabled() - } else - if (binding.provideLocationCheckbox.isChecked) - checkLocationEnabled() + if (binding.provideLocationCheckbox.isChecked) + checkLocationEnabled(getString(R.string.location_disabled)) } } } From 0fa33eac6bf3d135eb2101ea484eb5b8cff21a3e Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 24 Jan 2022 16:44:18 -0300 Subject: [PATCH 2/3] refactor provideLocationCheckbox --- .../com/geeksville/mesh/ui/SettingsFragment.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 0565d2a87..8567c653c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -655,18 +655,17 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { binding.provideLocationCheckbox.isEnabled = isGooglePlayAvailable(requireContext()) binding.provideLocationCheckbox.setOnCheckedChangeListener { view, isChecked -> + model.provideLocation.value = isChecked + if (view.isChecked) { debug("User changed location tracking to $isChecked") if (view.isPressed) { // We want to ignore changes caused by code (as opposed to the user) - val hasLocationPermission = myActivity.hasLocationPermission() - val hasBackgroundPermission = myActivity.hasBackgroundPermission() - // Don't check the box until the system setting changes - view.isChecked = hasLocationPermission && hasBackgroundPermission + view.isChecked = myActivity.hasLocationPermission() && myActivity.hasBackgroundPermission() - if (!hasLocationPermission) // Make sure we have location permission (prerequisite) + if (!myActivity.hasLocationPermission()) // Make sure we have location permission (prerequisite) myActivity.requestLocationPermission() - if (hasLocationPermission && !hasBackgroundPermission) + else if (!myActivity.hasBackgroundPermission()) MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.background_required) .setMessage(R.string.why_background_required) @@ -679,12 +678,11 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { .show() if (view.isChecked) { - model.provideLocation.value = isChecked + checkLocationEnabled(getString(R.string.location_disabled)) model.meshService?.setupProvideLocation() } } } else { - model.provideLocation.value = isChecked model.meshService?.stopProvideLocation() } } From 2d663156c6bedfb829fb5b9c9c90c8af0a0a7586 Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 24 Jan 2022 16:50:20 -0300 Subject: [PATCH 3/3] update location_disabled strings --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58fae92b1..0e6dc375c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,7 +48,7 @@ Please pair device in Android Settings. Pairing completed, starting service Pairing failed, please select again - Location access is disabled, can not provide position to the mesh. + Location access is turned off, can not provide position to mesh. Share Disconnected Device sleeping @@ -69,7 +69,7 @@ Long Range / Slow UNRECOGNIZED Meshtastic Service Notifications - You must turn on (high accuracy) location services in Android Settings + Location must be turned on (high accuracy) to find new devices via bluetooth. You can turn it off again afterwards. About A list of nodes in the mesh Text messages