/*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
import android.Manifest
import android.content.Intent
import android.content.SharedPreferences
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.content.pm.PackageManager
+import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.work.WorkManager
import com.stoutner.privacycell.R
+import com.stoutner.privacycell.activities.PrivacyCellActivity
+import com.stoutner.privacycell.dialogs.NotificationPermissionDialog
import com.stoutner.privacycell.services.RealtimeMonitoringService
class SettingsFragment : PreferenceFragmentCompat() {
// Declare the class variables.
- private lateinit var sharedPreferenceChangeListener: SharedPreferences.OnSharedPreferenceChangeListener
+ private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener
// Declare the class views.
private lateinit var realtimeMonitoringPreference: Preference
// Re-register the shared preference listener.
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
+
+ // Update the realtime monitoring preference summary.
+ updateRealtimeMonitoringSummary()
}
- private fun getSharedPreferenceChangeListener(): SharedPreferences.OnSharedPreferenceChangeListener {
+ private fun getSharedPreferenceChangeListener(): OnSharedPreferenceChangeListener {
// Return the shared preference change listener.
- return SharedPreferences.OnSharedPreferenceChangeListener {sharedPreferences, key ->
+ return OnSharedPreferenceChangeListener { sharedPreferences: SharedPreferences, key: String? ->
when (key) {
getString(R.string.realtime_monitoring_key) -> {
// Update the icon.
// Start or stop the service.
if (sharedPreferences.getBoolean(getString(R.string.realtime_monitoring_key), false)) { // Realtime monitoring has been enabled.
- // Start the realtime monitoring service.
- requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+ // Start the service according to the API.
+ if (Build.VERSION.SDK_INT >= 33) { // The device API is >= 33.
+ // Check to see if the post notification has been granted.
+ if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { // The permission has been granted.
+ // Start the realtime monitoring service.
+ requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+ } else { // The post notification permission has not been granted.
+ // Check if the user has previously denied the post notifications permission.
+ if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.POST_NOTIFICATIONS)) { // Show a dialog explaining the request first.
+ // Check to see if a notification permission dialog is already displayed. This happens if the app is restarted while the dialog is shown.
+ if (requireActivity().supportFragmentManager.findFragmentByTag(getString(R.string.notification_permission)) == null) { // No dialog is currently shown.
+ // Instantiate the notification permission dialog fragment.
+ val notificationPermissionDialogFragment = NotificationPermissionDialog()
+
+ // Show the notification permission alert dialog. The permission will be requested when the dialog is closed.
+ notificationPermissionDialogFragment.show(requireActivity().supportFragmentManager, getString(R.string.notification_permission))
+ }
+ } else { // Show the permission request directly.
+ // Request the post notifications permission directly.
+ ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.POST_NOTIFICATIONS), PrivacyCellActivity.NOTIFICATION_PERMISSION_REQUEST_CODE)
+ }
+ }
+ } else { // The device API is < 33.
+ // Start the realtime monitoring service.
+ requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+ }
} else { // Realtime monitoring has been disabled.
// Stop the realtime monitoring service.
requireActivity().stopService(Intent(context, RealtimeMonitoringService::class.java))
// Restart the activity after 400 milliseconds, so that the app has enough time to save the change to the preference.
restartHandler.postDelayed(restartRunnable, 400)
}
-}
\ No newline at end of file
+
+ fun updateRealtimeMonitoringSummary() {
+ // Update the summary according to the API.
+ if (Build.VERSION.SDK_INT >= 33) { // The API >= 33.
+ // Set the summary according to the notification permission status.
+ if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED)
+ realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary)
+ else
+ realtimeMonitoringPreference.summary = (getString(R.string.realtime_monitoring_summary) + " " + getString(R.string.notification_permission_denied))
+ } else { // The API is < 33.
+ // Set the realtime monitoring summary.
+ realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary)
+ }
+ }
+}