Loading app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt +1 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc private fun startNotificationMutedChecker() { lifecycleScope.launch(Dispatchers.IO) { delay(1000) // Just to be sure we've initialized all the things, we wait a bit ... delay(5000) // Just to be sure we've initialized all the things, we wait a bit ... while (isActive) { Log.d(DetailActivity.TAG, "Checking global and subscription-specific 'muted until' timestamp") Loading app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt +7 −3 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.os.Bundle import android.util.Log import android.widget.RadioButton import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope Loading @@ -16,8 +17,9 @@ import kotlinx.coroutines.launch import java.util.* class NotificationFragment : DialogFragment() { var settingsListener: NotificationSettingsListener? = null private lateinit var repository: Repository private lateinit var settingsListener: NotificationSettingsListener private lateinit var muteFor30minButton: RadioButton private lateinit var muteFor1hButton: RadioButton private lateinit var muteFor2hButton: RadioButton Loading @@ -31,8 +33,10 @@ class NotificationFragment : DialogFragment() { override fun onAttach(context: Context) { super.onAttach(context) if (settingsListener == null) { settingsListener = activity as NotificationSettingsListener } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { if (activity == null) { Loading Loading @@ -85,7 +89,7 @@ class NotificationFragment : DialogFragment() { private fun onClick(mutedUntilTimestamp: Long) { lifecycleScope.launch(Dispatchers.Main) { delay(150) // Another hack: Let the animation finish before dismissing the window settingsListener.onNotificationMutedUntilChanged(mutedUntilTimestamp) settingsListener?.onNotificationMutedUntilChanged(mutedUntilTimestamp) dismiss() } } Loading app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +36 −2 Original line number Diff line number Diff line Loading @@ -8,12 +8,14 @@ import android.text.TextUtils import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentManager import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.app.Application import io.heckel.ntfy.data.Repository import io.heckel.ntfy.util.formatDateShort class SettingsActivity : AppCompatActivity() { private val repository by lazy { (application as Application).repository } Loading @@ -27,7 +29,7 @@ class SettingsActivity : AppCompatActivity() { if (savedInstanceState == null) { supportFragmentManager .beginTransaction() .replace(R.id.settings_layout, SettingsFragment(repository)) .replace(R.id.settings_layout, SettingsFragment(repository, supportFragmentManager)) .commit() } Loading @@ -38,7 +40,7 @@ class SettingsActivity : AppCompatActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) } class SettingsFragment(val repository: Repository) : PreferenceFragmentCompat() { class SettingsFragment(val repository: Repository, private val supportFragmentManager: FragmentManager) : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.main_preferences, rootKey) Loading @@ -46,6 +48,38 @@ class SettingsActivity : AppCompatActivity() { // preferenceDataStore is overridden to use the repository. This is convenient, because // everybody has access to the repository. // Notifications muted until (global) val mutedUntilPrefId = context?.getString(R.string.pref_notifications_muted_until) ?: return val mutedUntilSummary = { s: Long -> when (s) { 0L -> getString(R.string.settings_notifications_muted_until_enabled) 1L -> getString(R.string.settings_notifications_muted_until_disabled_forever) else -> { val formattedDate = formatDateShort(s) getString(R.string.settings_notifications_muted_until_disabled_until, formattedDate) } } } val mutedUntil: Preference? = findPreference(mutedUntilPrefId) mutedUntil?.preferenceDataStore = object : PreferenceDataStore() { } // Dummy store to protect from accidentally overwriting mutedUntil?.summary = mutedUntilSummary(repository.getGlobalMutedUntil()) mutedUntil?.onPreferenceClickListener = OnPreferenceClickListener { if (repository.getGlobalMutedUntil() > 0) { repository.setGlobalMutedUntil(0) mutedUntil?.summary = mutedUntilSummary(0) } else { val notificationFragment = NotificationFragment() notificationFragment.settingsListener = object : NotificationFragment.NotificationSettingsListener { override fun onNotificationMutedUntilChanged(mutedUntilTimestamp: Long) { repository.setGlobalMutedUntil(mutedUntilTimestamp) mutedUntil?.summary = mutedUntilSummary(mutedUntilTimestamp) } } notificationFragment.show(supportFragmentManager, NotificationFragment.TAG) } true } // UnifiedPush Enabled val upEnabledPrefId = context?.getString(R.string.pref_unified_push_enabled) ?: return val upEnabled: SwitchPreference? = findPreference(upEnabledPrefId) Loading app/src/main/res/values/strings.xml +10 −4 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ <string name="channel_subscriber_notification_text">You are subscribed to instant delivery topics</string> <string name="channel_subscriber_notification_text_one">You are subscribed to one instant delivery topic</string> <string name="channel_subscriber_notification_text_two">You are subscribed to two instant delivery topics</string> <string name="channel_subscriber_notification_text_three">You are subscribed to three instant delivery topics </string> <string name="channel_subscriber_notification_text_three">You are subscribed to three instant delivery topics</string> <string name="channel_subscriber_notification_text_four">You are subscribed to four instant delivery topics</string> <string name="channel_subscriber_notification_text_more">You are subscribed to %1$d instant delivery topics</string> Loading Loading @@ -147,19 +146,26 @@ <!-- Settings --> <string name="settings_title">Settings</string> <string name="settings_notifications_header">Notifications</string> <string name="settings_notifications_header_summary">General settings for all subscribed topics</string> <string name="settings_notifications_muted_until_title">Pause notifications</string> <string name="settings_notifications_muted_until_enabled">All notifications will be displayed</string> <string name="settings_notifications_muted_until_disabled_forever">Notifications muted until re-enabled</string> <string name="settings_notifications_muted_until_disabled_until">Notifications muted until %1$s</string> <string name="settings_unified_push_header">UnifiedPush</string> <string name="settings_unified_push_header_summary">Allows other apps to use ntfy as a message distributor. Find out more at unifiedpush.org.</string> <string name="settings_unified_push_enabled_title">Enabled</string> <string name="settings_unified_push_enabled_title">Enable distributor</string> <string name="settings_unified_push_enabled_summary_on">Apps can use ntfy as distributor</string> <string name="settings_unified_push_enabled_summary_off">Apps cannot use ntfy as distributor</string> <string name="settings_unified_push_base_url_title">Server URL</string> <string name="settings_unified_push_base_url_default_summary">%1$s (default)</string> <string name="settings_about_header">About</string> <string name="settings_about_version">Version</string> <string name="settings_about_version_title">Version</string> <string name="settings_about_version_format">ntfy %1$s (%2$s)</string> <string name="settings_about_version_copied_to_clipboard_message">Copied to clipboard</string> <!-- Preferences IDs --> <string name="pref_notifications_muted_until">MutedUntil</string> <string name="pref_unified_push_enabled">UnifiedPushEnabled</string> <string name="pref_unified_push_base_url">UnifiedPushBaseURL</string> <string name="pref_version">Version</string> Loading app/src/main/res/xml/main_preferences.xml +10 −1 Original line number Diff line number Diff line <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" app:title="@string/settings_title"> <PreferenceCategory app:title="@string/settings_notifications_header" app:summary="@string/settings_notifications_header_summary" app:layout="@layout/preference_category_material_edited"> <Preference app:key="@string/pref_notifications_muted_until" app:title="@string/settings_notifications_muted_until_title"/> </PreferenceCategory> <PreferenceCategory app:title="@string/settings_unified_push_header" app:summary="@string/settings_unified_push_header_summary" Loading @@ -16,6 +25,6 @@ <PreferenceCategory app:title="@string/settings_about_header"> <Preference app:key="@string/pref_version" app:title="@string/settings_about_version"/> app:title="@string/settings_about_version_title"/> </PreferenceCategory> </PreferenceScreen> Loading
app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt +1 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc private fun startNotificationMutedChecker() { lifecycleScope.launch(Dispatchers.IO) { delay(1000) // Just to be sure we've initialized all the things, we wait a bit ... delay(5000) // Just to be sure we've initialized all the things, we wait a bit ... while (isActive) { Log.d(DetailActivity.TAG, "Checking global and subscription-specific 'muted until' timestamp") Loading
app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt +7 −3 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.os.Bundle import android.util.Log import android.widget.RadioButton import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope Loading @@ -16,8 +17,9 @@ import kotlinx.coroutines.launch import java.util.* class NotificationFragment : DialogFragment() { var settingsListener: NotificationSettingsListener? = null private lateinit var repository: Repository private lateinit var settingsListener: NotificationSettingsListener private lateinit var muteFor30minButton: RadioButton private lateinit var muteFor1hButton: RadioButton private lateinit var muteFor2hButton: RadioButton Loading @@ -31,8 +33,10 @@ class NotificationFragment : DialogFragment() { override fun onAttach(context: Context) { super.onAttach(context) if (settingsListener == null) { settingsListener = activity as NotificationSettingsListener } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { if (activity == null) { Loading Loading @@ -85,7 +89,7 @@ class NotificationFragment : DialogFragment() { private fun onClick(mutedUntilTimestamp: Long) { lifecycleScope.launch(Dispatchers.Main) { delay(150) // Another hack: Let the animation finish before dismissing the window settingsListener.onNotificationMutedUntilChanged(mutedUntilTimestamp) settingsListener?.onNotificationMutedUntilChanged(mutedUntilTimestamp) dismiss() } } Loading
app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +36 −2 Original line number Diff line number Diff line Loading @@ -8,12 +8,14 @@ import android.text.TextUtils import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentManager import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.app.Application import io.heckel.ntfy.data.Repository import io.heckel.ntfy.util.formatDateShort class SettingsActivity : AppCompatActivity() { private val repository by lazy { (application as Application).repository } Loading @@ -27,7 +29,7 @@ class SettingsActivity : AppCompatActivity() { if (savedInstanceState == null) { supportFragmentManager .beginTransaction() .replace(R.id.settings_layout, SettingsFragment(repository)) .replace(R.id.settings_layout, SettingsFragment(repository, supportFragmentManager)) .commit() } Loading @@ -38,7 +40,7 @@ class SettingsActivity : AppCompatActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) } class SettingsFragment(val repository: Repository) : PreferenceFragmentCompat() { class SettingsFragment(val repository: Repository, private val supportFragmentManager: FragmentManager) : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.main_preferences, rootKey) Loading @@ -46,6 +48,38 @@ class SettingsActivity : AppCompatActivity() { // preferenceDataStore is overridden to use the repository. This is convenient, because // everybody has access to the repository. // Notifications muted until (global) val mutedUntilPrefId = context?.getString(R.string.pref_notifications_muted_until) ?: return val mutedUntilSummary = { s: Long -> when (s) { 0L -> getString(R.string.settings_notifications_muted_until_enabled) 1L -> getString(R.string.settings_notifications_muted_until_disabled_forever) else -> { val formattedDate = formatDateShort(s) getString(R.string.settings_notifications_muted_until_disabled_until, formattedDate) } } } val mutedUntil: Preference? = findPreference(mutedUntilPrefId) mutedUntil?.preferenceDataStore = object : PreferenceDataStore() { } // Dummy store to protect from accidentally overwriting mutedUntil?.summary = mutedUntilSummary(repository.getGlobalMutedUntil()) mutedUntil?.onPreferenceClickListener = OnPreferenceClickListener { if (repository.getGlobalMutedUntil() > 0) { repository.setGlobalMutedUntil(0) mutedUntil?.summary = mutedUntilSummary(0) } else { val notificationFragment = NotificationFragment() notificationFragment.settingsListener = object : NotificationFragment.NotificationSettingsListener { override fun onNotificationMutedUntilChanged(mutedUntilTimestamp: Long) { repository.setGlobalMutedUntil(mutedUntilTimestamp) mutedUntil?.summary = mutedUntilSummary(mutedUntilTimestamp) } } notificationFragment.show(supportFragmentManager, NotificationFragment.TAG) } true } // UnifiedPush Enabled val upEnabledPrefId = context?.getString(R.string.pref_unified_push_enabled) ?: return val upEnabled: SwitchPreference? = findPreference(upEnabledPrefId) Loading
app/src/main/res/values/strings.xml +10 −4 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ <string name="channel_subscriber_notification_text">You are subscribed to instant delivery topics</string> <string name="channel_subscriber_notification_text_one">You are subscribed to one instant delivery topic</string> <string name="channel_subscriber_notification_text_two">You are subscribed to two instant delivery topics</string> <string name="channel_subscriber_notification_text_three">You are subscribed to three instant delivery topics </string> <string name="channel_subscriber_notification_text_three">You are subscribed to three instant delivery topics</string> <string name="channel_subscriber_notification_text_four">You are subscribed to four instant delivery topics</string> <string name="channel_subscriber_notification_text_more">You are subscribed to %1$d instant delivery topics</string> Loading Loading @@ -147,19 +146,26 @@ <!-- Settings --> <string name="settings_title">Settings</string> <string name="settings_notifications_header">Notifications</string> <string name="settings_notifications_header_summary">General settings for all subscribed topics</string> <string name="settings_notifications_muted_until_title">Pause notifications</string> <string name="settings_notifications_muted_until_enabled">All notifications will be displayed</string> <string name="settings_notifications_muted_until_disabled_forever">Notifications muted until re-enabled</string> <string name="settings_notifications_muted_until_disabled_until">Notifications muted until %1$s</string> <string name="settings_unified_push_header">UnifiedPush</string> <string name="settings_unified_push_header_summary">Allows other apps to use ntfy as a message distributor. Find out more at unifiedpush.org.</string> <string name="settings_unified_push_enabled_title">Enabled</string> <string name="settings_unified_push_enabled_title">Enable distributor</string> <string name="settings_unified_push_enabled_summary_on">Apps can use ntfy as distributor</string> <string name="settings_unified_push_enabled_summary_off">Apps cannot use ntfy as distributor</string> <string name="settings_unified_push_base_url_title">Server URL</string> <string name="settings_unified_push_base_url_default_summary">%1$s (default)</string> <string name="settings_about_header">About</string> <string name="settings_about_version">Version</string> <string name="settings_about_version_title">Version</string> <string name="settings_about_version_format">ntfy %1$s (%2$s)</string> <string name="settings_about_version_copied_to_clipboard_message">Copied to clipboard</string> <!-- Preferences IDs --> <string name="pref_notifications_muted_until">MutedUntil</string> <string name="pref_unified_push_enabled">UnifiedPushEnabled</string> <string name="pref_unified_push_base_url">UnifiedPushBaseURL</string> <string name="pref_version">Version</string> Loading
app/src/main/res/xml/main_preferences.xml +10 −1 Original line number Diff line number Diff line <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" app:title="@string/settings_title"> <PreferenceCategory app:title="@string/settings_notifications_header" app:summary="@string/settings_notifications_header_summary" app:layout="@layout/preference_category_material_edited"> <Preference app:key="@string/pref_notifications_muted_until" app:title="@string/settings_notifications_muted_until_title"/> </PreferenceCategory> <PreferenceCategory app:title="@string/settings_unified_push_header" app:summary="@string/settings_unified_push_header_summary" Loading @@ -16,6 +25,6 @@ <PreferenceCategory app:title="@string/settings_about_header"> <Preference app:key="@string/pref_version" app:title="@string/settings_about_version"/> app:title="@string/settings_about_version_title"/> </PreferenceCategory> </PreferenceScreen>