From d3915dc020c7d0f02444ef23aa0455bb4d9aaa19 Mon Sep 17 00:00:00 2001 From: Matte23 Date: Wed, 25 Sep 2019 18:59:20 +0200 Subject: [PATCH] Add settings --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 5 ++ .../net/underdesk/circolapp/MainActivity.kt | 4 + .../underdesk/circolapp/SettingsActivity.kt | 76 +++++++++++++++++++ .../net/underdesk/circolapp/works/PollWork.kt | 29 +++++-- app/src/main/res/layout/settings_activity.xml | 9 +++ app/src/main/res/menu/menu_main.xml | 3 + app/src/main/res/values/arrays.xml | 13 ++++ app/src/main/res/values/strings.xml | 9 +++ app/src/main/res/xml/root_preferences.xml | 35 +++++++++ 10 files changed, 176 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/net/underdesk/circolapp/SettingsActivity.kt create mode 100644 app/src/main/res/layout/settings_activity.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/xml/root_preferences.xml 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 @@ + + + + + + + + + + + + + + + + +