diff --git a/app/build.gradle b/app/build.gradle
index 77acb98..e425768 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -47,6 +47,7 @@ dependencies {
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'
implementation "androidx.work:work-runtime-ktx:2.2.0"
implementation "androidx.room:room-runtime:2.2.0-rc01"
+ implementation 'androidx.preference:preference:1.1.0'
kapt "androidx.room:room-compiler:2.2.0-rc01"
implementation "androidx.room:room-ktx:2.2.0-rc01"
testImplementation 'junit:junit:4.12'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 564207b..dfc7fcf 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,6 +12,10 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
+
@@ -25,6 +29,7 @@
android:name=".LicensesActivity"
android:label="@string/title_licenses"
android:parentActivityName=".MainActivity" />
+
diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
index 7e33e75..5663e74 100644
--- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
+++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
@@ -103,6 +103,10 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle item selection
return when (item.itemId) {
+ R.id.menu_main_settings -> {
+ startActivity(Intent(this, SettingsActivity::class.java))
+ true
+ }
R.id.menu_main_about -> {
showInfoDialog()
true
diff --git a/app/src/main/java/net/underdesk/circolapp/SettingsActivity.kt b/app/src/main/java/net/underdesk/circolapp/SettingsActivity.kt
new file mode 100644
index 0000000..1a7fdab
--- /dev/null
+++ b/app/src/main/java/net/underdesk/circolapp/SettingsActivity.kt
@@ -0,0 +1,76 @@
+/*
+ * Circolapp
+ * Copyright (C) 2019 Matteo Schiff
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.underdesk.circolapp
+
+import android.os.Bundle
+import android.text.InputType
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.preference.EditTextPreference
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.SwitchPreferenceCompat
+import net.underdesk.circolapp.works.PollWork
+
+class SettingsActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.settings_activity)
+ supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.settings, SettingsFragment())
+ .commit()
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ }
+
+ class SettingsFragment : PreferenceFragmentCompat() {
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.root_preferences, rootKey)
+
+ val darkThemePreference = findPreference("dark_theme")
+ val listener =
+ Preference.OnPreferenceChangeListener { _, value ->
+ when (value) {
+ "auto" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
+ "enabled" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
+ "disabled" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
+ }
+ true
+ }
+ darkThemePreference?.onPreferenceChangeListener = listener
+
+ val pollIntervalPreference = findPreference("poll_interval")
+ pollIntervalPreference?.setOnBindEditTextListener { editText ->
+ editText.inputType = InputType.TYPE_CLASS_NUMBER
+ }
+
+ val notificationPreference =
+ findPreference("notify_new_circulars")
+
+ val notificationPrefChangedListener =
+ Preference.OnPreferenceChangeListener { _, _ ->
+ activity?.let { PollWork.enqueue(it) }
+ true
+ }
+ pollIntervalPreference?.onPreferenceChangeListener = notificationPrefChangedListener
+ notificationPreference?.onPreferenceChangeListener = notificationPrefChangedListener
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt b/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt
index 08dbb97..29016e2 100644
--- a/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt
+++ b/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt
@@ -27,6 +27,7 @@ import android.net.Uri
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
+import androidx.preference.PreferenceManager
import androidx.work.*
import net.underdesk.circolapp.R
import net.underdesk.circolapp.data.AppDatabase
@@ -46,13 +47,13 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
private const val repeatIntervalMin: Long = 15
private const val flexIntervalMin: Long = 10
- private fun getPollWorkRequest(): PeriodicWorkRequest {
+ private fun getPollWorkRequest(repeatInterval: Long): PeriodicWorkRequest {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
return PeriodicWorkRequestBuilder(
- repeatIntervalMin,
+ repeatInterval,
TimeUnit.MINUTES,
flexIntervalMin,
TimeUnit.MINUTES
@@ -60,12 +61,24 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
}
fun enqueue(context: Context) {
- WorkManager.getInstance(context)
- .enqueueUniquePeriodicWork(
- pollWorkName,
- ExistingPeriodicWorkPolicy.KEEP,
- getPollWorkRequest()
- )
+ val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
+
+ if (sharedPreferences.getBoolean("notify_new_circulars", true)) {
+ WorkManager.getInstance(context)
+ .enqueueUniquePeriodicWork(
+ pollWorkName,
+ ExistingPeriodicWorkPolicy.KEEP,
+ getPollWorkRequest(
+ sharedPreferences.getString(
+ "poll_interval",
+ null
+ )?.toLong() ?: repeatIntervalMin
+ )
+ )
+ } else {
+ WorkManager.getInstance(context)
+ .cancelUniqueWork(pollWorkName)
+ }
}
}
diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
new file mode 100644
index 0000000..de6591a
--- /dev/null
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 694502e..b8a71fb 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -8,6 +8,9 @@
android:title="@string/menu_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..8e85b55
--- /dev/null
+++ b/app/src/main/res/values/arrays.xml
@@ -0,0 +1,13 @@
+
+
+ - Automatic
+ - Enabled
+ - Disabled
+
+
+
+ - auto
+ - enabled
+ - disabled
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3cae338..b92ad80 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,10 +4,19 @@
Favourites
Reminders
Third party licenses
+ Settings
About
Search
+ General
+ Notifications
+ Dark theme
+ Show notifications
+ Synchronization interval
+ Show a notification when a new circular is published
+ How long to wait before checking if new circulars are published
+
Circular letter number %1$d
New circulars published
New circulars
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
new file mode 100644
index 0000000..5495f76
--- /dev/null
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+