Loading app/src/main/java/io/heckel/ntfy/msg/NotificationDispatcher.kt +2 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ class NotificationDispatcher(val context: Context, val repository: Repository) { fun dispatch(subscription: Subscription, notification: Notification) { val muted = checkMuted(subscription) val notify = checkNotify(subscription, notification, muted) val broadcast = subscription.upAppId == null val distribute = subscription.upAppId != null val broadcast = subscription.upAppId == null // Never broadcast for UnifiedPush val distribute = subscription.upAppId != null // Only distribute for UnifiedPush subscriptions if (notify) { notifier.send(subscription, notification) } Loading app/src/main/java/io/heckel/ntfy/service/SubscriberServiceManager.kt +9 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,11 @@ import io.heckel.ntfy.up.BroadcastReceiver /** * This class only manages the SubscriberService, i.e. it starts or stops it. * It's used in multiple activities. * * We are starting the service via a worker and not directly because since Android 7 * (but officially since Lollipop!), any process called by a BroadcastReceiver * (only manifest-declared receiver) is run at low priority and hence eventually * killed by Android. */ class SubscriberServiceManager(private val context: Context) { fun refresh() { Loading @@ -20,6 +25,10 @@ class SubscriberServiceManager(private val context: Context) { workManager.enqueue(startServiceRequest) } /** * Starts or stops the foreground service by figuring out how many instant delivery subscriptions * exist. If there's > 0, then we need a foreground service. */ class RefreshWorker(private val context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { if (context.applicationContext !is Application) { Loading app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +21 −1 Original line number Diff line number Diff line package io.heckel.ntfy.ui import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Bundle import android.text.TextUtils import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.app.Application Loading Loading @@ -37,6 +42,10 @@ class SettingsActivity : AppCompatActivity() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.main_preferences, rootKey) // Important note: We do not use the default shared prefs to store settings. Every // preferenceDataStore is overridden to use the repository. This is convenient, because // everybody has access to the repository. // UnifiedPush Enabled val upEnabledPrefId = context?.getString(R.string.pref_unified_push_enabled) ?: return val upEnabled: SwitchPreference? = findPreference(upEnabledPrefId) Loading Loading @@ -82,7 +91,18 @@ class SettingsActivity : AppCompatActivity() { // Version val versionPrefId = context?.getString(R.string.pref_version) ?: return val versionPref: Preference? = findPreference(versionPrefId) versionPref?.summary = getString(R.string.settings_about_version_format, BuildConfig.VERSION_NAME, BuildConfig.FLAVOR) val version = getString(R.string.settings_about_version_format, BuildConfig.VERSION_NAME, BuildConfig.FLAVOR) versionPref?.summary = version versionPref?.onPreferenceClickListener = OnPreferenceClickListener { val context = context ?: return@OnPreferenceClickListener false val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("app version", version) clipboard.setPrimaryClip(clip) Toast .makeText(context, getString(R.string.settings_about_version_copied_to_clipboard_message), Toast.LENGTH_LONG) .show() true } } } } app/src/main/java/io/heckel/ntfy/up/BroadcastReceiver.kt +4 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ import kotlinx.coroutines.launch import java.util.* import kotlin.random.Random /** * This is the UnifiedPush broadcast receiver to handle the distributor actions REGISTER and UNREGISTER. * See https://unifiedpush.org/spec/android/ for details. */ class BroadcastReceiver : android.content.BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (context == null || intent == null) { Loading Loading @@ -69,7 +73,6 @@ class BroadcastReceiver : android.content.BroadcastReceiver() { newCount = 0, lastActive = Date().time/1000 ) Log.d(TAG, "Adding subscription with for app $appId (connectorToken $connectorToken): $subscription") repository.addSubscription(subscription) distributor.sendEndpoint(appId, connectorToken, endpoint) Loading app/src/main/java/io/heckel/ntfy/up/Distributor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,10 @@ import android.content.Context import android.content.Intent import android.util.Log /** * This is the UnifiedPush distributor, an amalgamation of messages to be sent as part of the spec. * See https://unifiedpush.org/spec/android/ for details. */ class Distributor(val context: Context) { fun sendMessage(app: String, connectorToken: String, message: String) { Log.d(TAG, "Sending MESSAGE to $app (token=$connectorToken): $message") Loading Loading
app/src/main/java/io/heckel/ntfy/msg/NotificationDispatcher.kt +2 −2 Original line number Diff line number Diff line Loading @@ -23,8 +23,8 @@ class NotificationDispatcher(val context: Context, val repository: Repository) { fun dispatch(subscription: Subscription, notification: Notification) { val muted = checkMuted(subscription) val notify = checkNotify(subscription, notification, muted) val broadcast = subscription.upAppId == null val distribute = subscription.upAppId != null val broadcast = subscription.upAppId == null // Never broadcast for UnifiedPush val distribute = subscription.upAppId != null // Only distribute for UnifiedPush subscriptions if (notify) { notifier.send(subscription, notification) } Loading
app/src/main/java/io/heckel/ntfy/service/SubscriberServiceManager.kt +9 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,11 @@ import io.heckel.ntfy.up.BroadcastReceiver /** * This class only manages the SubscriberService, i.e. it starts or stops it. * It's used in multiple activities. * * We are starting the service via a worker and not directly because since Android 7 * (but officially since Lollipop!), any process called by a BroadcastReceiver * (only manifest-declared receiver) is run at low priority and hence eventually * killed by Android. */ class SubscriberServiceManager(private val context: Context) { fun refresh() { Loading @@ -20,6 +25,10 @@ class SubscriberServiceManager(private val context: Context) { workManager.enqueue(startServiceRequest) } /** * Starts or stops the foreground service by figuring out how many instant delivery subscriptions * exist. If there's > 0, then we need a foreground service. */ class RefreshWorker(private val context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { if (context.applicationContext !is Application) { Loading
app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +21 −1 Original line number Diff line number Diff line package io.heckel.ntfy.ui import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Bundle import android.text.TextUtils import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.app.Application Loading Loading @@ -37,6 +42,10 @@ class SettingsActivity : AppCompatActivity() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.main_preferences, rootKey) // Important note: We do not use the default shared prefs to store settings. Every // preferenceDataStore is overridden to use the repository. This is convenient, because // everybody has access to the repository. // UnifiedPush Enabled val upEnabledPrefId = context?.getString(R.string.pref_unified_push_enabled) ?: return val upEnabled: SwitchPreference? = findPreference(upEnabledPrefId) Loading Loading @@ -82,7 +91,18 @@ class SettingsActivity : AppCompatActivity() { // Version val versionPrefId = context?.getString(R.string.pref_version) ?: return val versionPref: Preference? = findPreference(versionPrefId) versionPref?.summary = getString(R.string.settings_about_version_format, BuildConfig.VERSION_NAME, BuildConfig.FLAVOR) val version = getString(R.string.settings_about_version_format, BuildConfig.VERSION_NAME, BuildConfig.FLAVOR) versionPref?.summary = version versionPref?.onPreferenceClickListener = OnPreferenceClickListener { val context = context ?: return@OnPreferenceClickListener false val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("app version", version) clipboard.setPrimaryClip(clip) Toast .makeText(context, getString(R.string.settings_about_version_copied_to_clipboard_message), Toast.LENGTH_LONG) .show() true } } } }
app/src/main/java/io/heckel/ntfy/up/BroadcastReceiver.kt +4 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ import kotlinx.coroutines.launch import java.util.* import kotlin.random.Random /** * This is the UnifiedPush broadcast receiver to handle the distributor actions REGISTER and UNREGISTER. * See https://unifiedpush.org/spec/android/ for details. */ class BroadcastReceiver : android.content.BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (context == null || intent == null) { Loading Loading @@ -69,7 +73,6 @@ class BroadcastReceiver : android.content.BroadcastReceiver() { newCount = 0, lastActive = Date().time/1000 ) Log.d(TAG, "Adding subscription with for app $appId (connectorToken $connectorToken): $subscription") repository.addSubscription(subscription) distributor.sendEndpoint(appId, connectorToken, endpoint) Loading
app/src/main/java/io/heckel/ntfy/up/Distributor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,10 @@ import android.content.Context import android.content.Intent import android.util.Log /** * This is the UnifiedPush distributor, an amalgamation of messages to be sent as part of the spec. * See https://unifiedpush.org/spec/android/ for details. */ class Distributor(val context: Context) { fun sendMessage(app: String, connectorToken: String, message: String) { Log.d(TAG, "Sending MESSAGE to $app (token=$connectorToken): $message") Loading