Loading app/src/main/AndroidManifest.xml +9 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,15 @@ android:value=".ui.MainActivity"/> </activity> <!-- Detail settings activity --> <activity android:name=".ui.DetailSettingsActivity" android:parentActivityName=".ui.DetailActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".ui.DetailActivity"/> </activity> <!-- Subscriber foreground service for hosts other than ntfy.sh --> <service android:name=".service.SubscriberService"/> Loading app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt +14 −4 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.app.AlertDialog import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.os.Bundle import android.text.Html import android.view.ActionMode Loading Loading @@ -220,15 +221,15 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra true } R.id.detail_menu_notifications_enabled -> { onNotificationSettingsClick(enable = false) onMutedUntilClick(enable = false) true } R.id.detail_menu_notifications_disabled_until -> { onNotificationSettingsClick(enable = true) onMutedUntilClick(enable = true) true } R.id.detail_menu_notifications_disabled_forever -> { onNotificationSettingsClick(enable = true) onMutedUntilClick(enable = true) true } R.id.detail_menu_enable_instant -> { Loading @@ -251,6 +252,10 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra onClearClick() true } R.id.detail_menu_settings -> { onSettingsClick() true } R.id.detail_menu_unsubscribe -> { onDeleteClick() true Loading Loading @@ -283,7 +288,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra } } private fun onNotificationSettingsClick(enable: Boolean) { private fun onMutedUntilClick(enable: Boolean) { if (!enable) { Log.d(TAG, "Showing notification settings dialog for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") val notificationFragment = NotificationFragment() Loading Loading @@ -441,6 +446,11 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra dialog.show() } private fun onSettingsClick() { Log.d(TAG, "Opening subscription settings for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") startActivity(Intent(this, DetailSettingsActivity::class.java)) } private fun onDeleteClick() { Log.d(TAG, "Deleting subscription ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") Loading app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt 0 → 100644 +93 −0 Original line number Diff line number Diff line package io.heckel.ntfy.ui import android.Manifest import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.text.TextUtils import android.widget.Toast import androidx.annotation.Keep import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import com.google.gson.Gson import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.db.Repository import io.heckel.ntfy.db.User import io.heckel.ntfy.log.Log import io.heckel.ntfy.service.SubscriberService import io.heckel.ntfy.service.SubscriberServiceManager import io.heckel.ntfy.util.formatBytes import io.heckel.ntfy.util.formatDateShort import io.heckel.ntfy.util.shortUrl import io.heckel.ntfy.util.toPriorityString import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import java.util.* import java.util.concurrent.TimeUnit /** * Subscription settings */ class DetailSettingsActivity : AppCompatActivity() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager private lateinit var settingsFragment: SettingsFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) Log.d(TAG, "Create $this") repository = Repository.getInstance(this) serviceManager = SubscriberServiceManager(this) if (savedInstanceState == null) { settingsFragment = SettingsFragment() // Empty constructor! supportFragmentManager .beginTransaction() .replace(R.id.settings_layout, settingsFragment) .commit() } title = getString(R.string.detail_settings_title) // Show 'Back' button supportActionBar?.setDisplayHomeAsUpEnabled(true) } class SettingsFragment : PreferenceFragmentCompat() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.detail_preferences, rootKey) // Dependencies (Fragments need a default constructor) repository = Repository.getInstance(requireActivity()) serviceManager = SubscriberServiceManager(requireActivity()) // xxxxxxxxxxxxxxx } } companion object { private const val TAG = "NtfyDetailSettingsActiv" } } app/src/main/res/menu/menu_detail_action_bar.xml +1 −0 Original line number Diff line number Diff line Loading @@ -14,5 +14,6 @@ <item android:id="@+id/detail_menu_test" android:title="@string/detail_menu_test"/> <item android:id="@+id/detail_menu_copy_url" android:title="@string/detail_menu_copy_url"/> <item android:id="@+id/detail_menu_clear" android:title="@string/detail_menu_clear"/> <item android:id="@+id/detail_menu_settings" android:title="@string/detail_menu_settings"/> <item android:id="@+id/detail_menu_unsubscribe" android:title="@string/detail_menu_unsubscribe"/> </menu> app/src/main/res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -162,6 +162,7 @@ <string name="detail_menu_test">Send test notification</string> <string name="detail_menu_copy_url">Copy topic address</string> <string name="detail_menu_clear">Clear all notifications</string> <string name="detail_menu_settings">Subscription settings</string> <string name="detail_menu_unsubscribe">Unsubscribe</string> <!-- Detail activity: Action mode --> Loading @@ -173,6 +174,15 @@ <string name="detail_action_mode_delete_dialog_permanently_delete">Permanently delete</string> <string name="detail_action_mode_delete_dialog_cancel">Cancel</string> <!-- Detail settings --> <string name="detail_settings_title">Subscription settings</string> <string name="detail_settings_auth_header">Login</string> <string name="detail_settings_auth_header_summary">For topics that require a login, you may pick the login user here. You can add/edit users in the main settings.</string> <string name="detail_settings_auth_user_key">SubscriptionAuthUserKey</string> <string name="detail_settings_auth_user_title">Login user</string> <string name="detail_settings_auth_user_summary_none">No user selected to log in to the topic</string> <string name="detail_settings_auth_user_summary_user_x">User %1$s selected as a login user</string> <!-- Notification dialog --> <string name="notification_dialog_title">Pause notifications</string> <string name="notification_dialog_cancel">Cancel</string> Loading Loading
app/src/main/AndroidManifest.xml +9 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,15 @@ android:value=".ui.MainActivity"/> </activity> <!-- Detail settings activity --> <activity android:name=".ui.DetailSettingsActivity" android:parentActivityName=".ui.DetailActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".ui.DetailActivity"/> </activity> <!-- Subscriber foreground service for hosts other than ntfy.sh --> <service android:name=".service.SubscriberService"/> Loading
app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt +14 −4 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.app.AlertDialog import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.os.Bundle import android.text.Html import android.view.ActionMode Loading Loading @@ -220,15 +221,15 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra true } R.id.detail_menu_notifications_enabled -> { onNotificationSettingsClick(enable = false) onMutedUntilClick(enable = false) true } R.id.detail_menu_notifications_disabled_until -> { onNotificationSettingsClick(enable = true) onMutedUntilClick(enable = true) true } R.id.detail_menu_notifications_disabled_forever -> { onNotificationSettingsClick(enable = true) onMutedUntilClick(enable = true) true } R.id.detail_menu_enable_instant -> { Loading @@ -251,6 +252,10 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra onClearClick() true } R.id.detail_menu_settings -> { onSettingsClick() true } R.id.detail_menu_unsubscribe -> { onDeleteClick() true Loading Loading @@ -283,7 +288,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra } } private fun onNotificationSettingsClick(enable: Boolean) { private fun onMutedUntilClick(enable: Boolean) { if (!enable) { Log.d(TAG, "Showing notification settings dialog for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") val notificationFragment = NotificationFragment() Loading Loading @@ -441,6 +446,11 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra dialog.show() } private fun onSettingsClick() { Log.d(TAG, "Opening subscription settings for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") startActivity(Intent(this, DetailSettingsActivity::class.java)) } private fun onDeleteClick() { Log.d(TAG, "Deleting subscription ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}") Loading
app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt 0 → 100644 +93 −0 Original line number Diff line number Diff line package io.heckel.ntfy.ui import android.Manifest import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.text.TextUtils import android.widget.Toast import androidx.annotation.Keep import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.preference.* import androidx.preference.Preference.OnPreferenceClickListener import com.google.gson.Gson import io.heckel.ntfy.BuildConfig import io.heckel.ntfy.R import io.heckel.ntfy.db.Repository import io.heckel.ntfy.db.User import io.heckel.ntfy.log.Log import io.heckel.ntfy.service.SubscriberService import io.heckel.ntfy.service.SubscriberServiceManager import io.heckel.ntfy.util.formatBytes import io.heckel.ntfy.util.formatDateShort import io.heckel.ntfy.util.shortUrl import io.heckel.ntfy.util.toPriorityString import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import java.util.* import java.util.concurrent.TimeUnit /** * Subscription settings */ class DetailSettingsActivity : AppCompatActivity() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager private lateinit var settingsFragment: SettingsFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) Log.d(TAG, "Create $this") repository = Repository.getInstance(this) serviceManager = SubscriberServiceManager(this) if (savedInstanceState == null) { settingsFragment = SettingsFragment() // Empty constructor! supportFragmentManager .beginTransaction() .replace(R.id.settings_layout, settingsFragment) .commit() } title = getString(R.string.detail_settings_title) // Show 'Back' button supportActionBar?.setDisplayHomeAsUpEnabled(true) } class SettingsFragment : PreferenceFragmentCompat() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.detail_preferences, rootKey) // Dependencies (Fragments need a default constructor) repository = Repository.getInstance(requireActivity()) serviceManager = SubscriberServiceManager(requireActivity()) // xxxxxxxxxxxxxxx } } companion object { private const val TAG = "NtfyDetailSettingsActiv" } }
app/src/main/res/menu/menu_detail_action_bar.xml +1 −0 Original line number Diff line number Diff line Loading @@ -14,5 +14,6 @@ <item android:id="@+id/detail_menu_test" android:title="@string/detail_menu_test"/> <item android:id="@+id/detail_menu_copy_url" android:title="@string/detail_menu_copy_url"/> <item android:id="@+id/detail_menu_clear" android:title="@string/detail_menu_clear"/> <item android:id="@+id/detail_menu_settings" android:title="@string/detail_menu_settings"/> <item android:id="@+id/detail_menu_unsubscribe" android:title="@string/detail_menu_unsubscribe"/> </menu>
app/src/main/res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -162,6 +162,7 @@ <string name="detail_menu_test">Send test notification</string> <string name="detail_menu_copy_url">Copy topic address</string> <string name="detail_menu_clear">Clear all notifications</string> <string name="detail_menu_settings">Subscription settings</string> <string name="detail_menu_unsubscribe">Unsubscribe</string> <!-- Detail activity: Action mode --> Loading @@ -173,6 +174,15 @@ <string name="detail_action_mode_delete_dialog_permanently_delete">Permanently delete</string> <string name="detail_action_mode_delete_dialog_cancel">Cancel</string> <!-- Detail settings --> <string name="detail_settings_title">Subscription settings</string> <string name="detail_settings_auth_header">Login</string> <string name="detail_settings_auth_header_summary">For topics that require a login, you may pick the login user here. You can add/edit users in the main settings.</string> <string name="detail_settings_auth_user_key">SubscriptionAuthUserKey</string> <string name="detail_settings_auth_user_title">Login user</string> <string name="detail_settings_auth_user_summary_none">No user selected to log in to the topic</string> <string name="detail_settings_auth_user_summary_user_x">User %1$s selected as a login user</string> <!-- Notification dialog --> <string name="notification_dialog_title">Pause notifications</string> <string name="notification_dialog_cancel">Cancel</string> Loading