aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2023-01-03 21:59:24 +0100
committerMinteck <contact@minteck.org>2023-01-03 21:59:24 +0100
commitb9b5a76b577e697566c6de216f90b7887166a6c4 (patch)
tree1818944ec132a9e06df53dd195fb7f8447e15ae8
parentc31de93af40d21ddc64fb4e21a929f2a28baabd4 (diff)
downloadponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.tar.gz
ponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.tar.bz2
ponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.zip
Update - This is an automated commit
-rw-r--r--app/build.gradle7
-rw-r--r--app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt3
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt8
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt14
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt20
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt7
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt10
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt7
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt25
-rw-r--r--app/src/main/java/io/heckel/ntfy/ui/UserFragment.kt95
-rw-r--r--app/src/main/java/io/heckel/ntfy/util/Util.kt6
-rw-r--r--app/src/main/res/drawable/ic_dns_white_24dp.xml5
-rw-r--r--app/src/main/res/layout/activity_detail.xml18
-rw-r--r--app/src/main/res/layout/activity_main.xml1
-rw-r--r--app/src/main/res/layout/activity_share.xml1
-rw-r--r--app/src/main/res/layout/fragment_add_dialog.xml3
-rw-r--r--app/src/main/res/layout/fragment_detail_item.xml23
-rw-r--r--app/src/main/res/layout/fragment_main_item.xml28
-rw-r--r--app/src/main/res/values-fr/strings.xml3
-rw-r--r--app/src/main/res/values-night/styles.xml43
-rw-r--r--app/src/main/res/values/colors.xml6
-rw-r--r--app/src/main/res/values/strings.xml15
-rw-r--r--app/src/main/res/values/styles.xml25
-rw-r--r--build.gradle2
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
25 files changed, 210 insertions, 167 deletions
diff --git a/app/build.gradle b/app/build.gradle
index bb096ae..6cd0ecf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,11 +11,11 @@ android {
defaultConfig {
applicationId "dev.equestria.notifications"
- minSdkVersion 21
+ minSdkVersion 27
targetSdkVersion 33
- versionCode 135
- versionName "1.6.0"
+ versionCode 136
+ versionName "2.7.1"
buildConfigField 'String', "NTFY_VERSION", '"1.16.0"'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -113,6 +113,7 @@ dependencies {
// Firebase, sigh ... (only Google Play)
playImplementation 'com.google.firebase:firebase-messaging:23.1.1'
+ playImplementation 'com.google.firebase:firebase-analytics:21.2.0'
// RecyclerView
implementation "androidx.recyclerview:recyclerview:1.3.0-rc01"
diff --git a/app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt b/app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt
index f9f0622..6979dd0 100644
--- a/app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt
+++ b/app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt
@@ -89,6 +89,7 @@ class NotificationService(val context: Context) {
}
private fun displayInternal(subscription: Subscription, notification: Notification, update: Boolean = false) {
+ // @ponypush
val tags = notification.tags.split(",").map { it.trim() }
val icon = if (tags.contains("bits")) {
@@ -107,6 +108,8 @@ class NotificationService(val context: Context) {
R.drawable.ic_explore_white_24dp
} else if (tags.contains("alarm")) {
R.drawable.ic_av_timer_white_24dp
+ } else if (tags.contains("status")) {
+ R.drawable.ic_dns_white_24dp
} else {
R.drawable.ic_notification
}
diff --git a/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt
index 2c80f25..12dd482 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt
@@ -11,6 +11,9 @@ import android.view.inputmethod.InputMethodManager
import android.widget.*
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import io.heckel.ntfy.BuildConfig
@@ -70,6 +73,9 @@ class AddFragment : DialogFragment() {
throw IllegalStateException("Activity cannot be null")
}
+ // @ponypush
+ DynamicColors.applyToActivityIfAvailable(requireActivity())
+
// Dependencies (Fragments need a default constructor)
repository = Repository.getInstance(requireActivity())
appBaseUrl = getString(R.string.app_base_url)
@@ -132,7 +138,7 @@ class AddFragment : DialogFragment() {
loginPasswordText.addTextChangedListener(loginTextWatcher)
// Build dialog
- val dialog = AlertDialog.Builder(activity)
+ val dialog = MaterialAlertDialogBuilder(activity!!)
.setView(view)
.setPositiveButton(R.string.add_dialog_button_subscribe) { _, _ ->
// This will be overridden below to avoid closing the dialog immediately
diff --git a/app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt
index 3f79891..d1286aa 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt
@@ -23,6 +23,9 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.snackbar.Snackbar
import io.heckel.ntfy.BuildConfig
import io.heckel.ntfy.R
@@ -72,6 +75,11 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
+ // @ponypush
+ DynamicColors.applyToActivitiesIfAvailable(application)
+ window.statusBarColor = SurfaceColors.SURFACE_2.getColor(this)
+ window.navigationBarColor = SurfaceColors.SURFACE_0.getColor(this)
+
Log.d(TAG, "Create $this")
// Dependencies that depend on Context
@@ -553,7 +561,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
private fun onClearClick() {
Log.d(TAG, "Clearing all notifications for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}")
- val builder = AlertDialog.Builder(this)
+ val builder = MaterialAlertDialogBuilder(this)
val dialog = builder
.setMessage(R.string.detail_clear_dialog_message)
.setPositiveButton(R.string.detail_clear_dialog_permanently_delete) { _, _ ->
@@ -585,7 +593,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
private fun onDeleteClick() {
Log.d(TAG, "Deleting subscription ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}")
- val builder = AlertDialog.Builder(this)
+ val builder = MaterialAlertDialogBuilder(this)
val dialog = builder
.setMessage(R.string.detail_delete_dialog_message)
.setPositiveButton(R.string.detail_delete_dialog_permanently_delete) { _, _ ->
@@ -701,7 +709,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback, NotificationFra
private fun onMultiDeleteClick() {
Log.d(TAG, "Showing multi-delete dialog for selected items")
- val builder = AlertDialog.Builder(this)
+ val builder = MaterialAlertDialogBuilder(this)
val dialog = builder
.setMessage(R.string.detail_action_mode_delete_dialog_message)
.setPositiveButton(R.string.detail_action_mode_delete_dialog_permanently_delete) { _, _ ->
diff --git a/app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt b/app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt
index 9885773..43df9da 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt
@@ -93,6 +93,24 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope:
private val actionsWrapperView: ConstraintLayout = itemView.findViewById(R.id.detail_item_actions_wrapper)
private val actionsFlow: Flow = itemView.findViewById(R.id.detail_item_actions_flow)
+ // @ponypush
+ fun categoryDescription(item: String): String {
+ val context = itemView.context
+
+ return when (item) {
+ "bits" -> context.getString(R.string.category_bits)
+ "switch" -> context.getString(R.string.category_switch)
+ "wakeup" -> context.getString(R.string.category_wakeup)
+ "pleasure" -> context.getString(R.string.category_pleasure)
+ "delta" -> context.getString(R.string.category_delta)
+ "emergency" -> context.getString(R.string.category_emergency)
+ "travelling" -> context.getString(R.string.category_travelling)
+ "alarm" -> context.getString(R.string.category_alarm)
+ "status" -> context.getString(R.string.category_status)
+ else -> context.getString(R.string.category_default, item)
+ }
+ }
+
fun bind(notification: Notification) {
this.notification = notification
@@ -123,7 +141,7 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope:
}
if (unmatchedTags.isNotEmpty()) {
tagsView.visibility = View.VISIBLE
- tagsView.text = context.getString(R.string.detail_item_tags, unmatchedTags.joinToString(", "))
+ tagsView.text = context.getString(R.string.detail_item_tags, unmatchedTags.map { categoryDescription(it) }.joinToString(", "))
} else {
tagsView.visibility = View.GONE
}
diff --git a/app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt
index 8e36c9d..63d9474 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt
@@ -18,6 +18,8 @@ import androidx.core.graphics.drawable.toDrawable
import androidx.lifecycle.lifecycleScope
import androidx.preference.*
import androidx.preference.Preference.OnPreferenceClickListener
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.elevation.SurfaceColors
import io.heckel.ntfy.BuildConfig
import io.heckel.ntfy.R
import io.heckel.ntfy.db.Repository
@@ -45,6 +47,11 @@ class DetailSettingsActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
+ // @ponypush
+ DynamicColors.applyToActivitiesIfAvailable(application)
+ window.statusBarColor = SurfaceColors.SURFACE_2.getColor(this)
+ window.navigationBarColor = SurfaceColors.SURFACE_0.getColor(this)
+
Log.d(TAG, "Create $this")
repository = Repository.getInstance(this)
diff --git a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt
index 4344a63..fa7b680 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt
@@ -28,6 +28,9 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.work.*
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.floatingactionbutton.FloatingActionButton
import io.heckel.ntfy.BuildConfig
import io.heckel.ntfy.R
@@ -76,6 +79,11 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+ // @ponypush
+ DynamicColors.applyToActivitiesIfAvailable(application)
+ window.statusBarColor = SurfaceColors.SURFACE_2.getColor(this)
+ window.navigationBarColor = SurfaceColors.SURFACE_0.getColor(this)
+
Log.init(this) // Init logs in all entry points
Log.d(TAG, "Create $this")
@@ -563,7 +571,7 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc
private fun onMultiDeleteClick() {
Log.d(DetailActivity.TAG, "Showing multi-delete dialog for selected items")
- val builder = AlertDialog.Builder(this)
+ val builder = MaterialAlertDialogBuilder(this)
val dialog = builder
.setMessage(R.string.main_action_mode_delete_dialog_message)
.setPositiveButton(R.string.main_action_mode_delete_dialog_permanently_delete) { _, _ ->
diff --git a/app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt
index 8b5b0e9..c932fbc 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/NotificationFragment.kt
@@ -7,6 +7,8 @@ import android.os.Bundle
import android.widget.RadioButton
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.heckel.ntfy.R
import io.heckel.ntfy.db.Repository
import kotlinx.coroutines.Dispatchers
@@ -41,6 +43,9 @@ class NotificationFragment : DialogFragment() {
throw IllegalStateException("Activity cannot be null")
}
+ // @ponypush
+ DynamicColors.applyToActivityIfAvailable(requireActivity())
+
// Dependencies
repository = Repository.getInstance(requireContext())
@@ -74,7 +79,7 @@ class NotificationFragment : DialogFragment() {
muteForeverButton = view.findViewById(R.id.notification_dialog_forever)
muteForeverButton.setOnClickListener{ onClick(Repository.MUTED_UNTIL_FOREVER) }
- return AlertDialog.Builder(activity)
+ return MaterialAlertDialogBuilder(activity!!)
.setView(view)
.create()
}
diff --git a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt
index 6e25175..8c433c9 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt
@@ -1,7 +1,6 @@
package io.heckel.ntfy.ui
import android.Manifest
-import android.app.AlertDialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
@@ -23,6 +22,9 @@ import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import androidx.preference.*
import androidx.preference.Preference.OnPreferenceClickListener
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.elevation.SurfaceColors
import com.google.gson.Gson
import io.heckel.ntfy.BuildConfig
import io.heckel.ntfy.R
@@ -58,6 +60,11 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
+ // @ponypush
+ DynamicColors.applyToActivitiesIfAvailable(application)
+ window.statusBarColor = SurfaceColors.SURFACE_2.getColor(this)
+ window.navigationBarColor = SurfaceColors.SURFACE_0.getColor(this)
+
Log.d(TAG, "Create $this")
repository = Repository.getInstance(this)
@@ -640,17 +647,19 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
private fun showScrubDialog(title: String) {
val scrubbed = Log.getScrubTerms()
val scrubbedText = if (scrubbed.isNotEmpty()) {
- val scrubTerms = scrubbed.map { e -> "${e.key} -> ${e.value}"}.joinToString(separator = "\n")
+ val scrubTerms =
+ scrubbed.map { e -> "${e.key} -> ${e.value}" }.joinToString(separator = "\n")
getString(R.string.settings_advanced_export_logs_scrub_dialog_text, scrubTerms)
} else {
getString(R.string.settings_advanced_export_logs_scrub_dialog_empty)
}
- val dialog = AlertDialog.Builder(activity)
- .setTitle(title)
- .setMessage(scrubbedText)
- .setPositiveButton(R.string.settings_advanced_export_logs_scrub_dialog_button_ok) { _, _ -> /* Nothing */ }
- .create()
- dialog.show()
+ activity?.let {
+ MaterialAlertDialogBuilder(it)
+ .setTitle(title)
+ .setMessage(scrubbedText)
+ .setPositiveButton(R.string.settings_advanced_export_logs_scrub_dialog_button_ok) { _, _ -> /* Nothing */ }
+ .create()
+ }?.show()
}
private fun deleteLogs() {
diff --git a/app/src/main/java/io/heckel/ntfy/ui/UserFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/UserFragment.kt
index 672031e..3673647 100644
--- a/app/src/main/java/io/heckel/ntfy/ui/UserFragment.kt
+++ b/app/src/main/java/io/heckel/ntfy/ui/UserFragment.kt
@@ -9,6 +9,8 @@ import android.view.WindowManager
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.DialogFragment
+import com.google.android.material.color.DynamicColors
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputEditText
import io.heckel.ntfy.R
import io.heckel.ntfy.db.User
@@ -47,6 +49,9 @@ class UserFragment : DialogFragment() {
user = User(baseUrl, username, password)
}
+ // @ponypush
+ DynamicColors.applyToActivityIfAvailable(requireActivity())
+
// Required for validation
baseUrlsInUse = arguments?.getStringArrayList(BUNDLE_BASE_URLS_IN_USE) ?: arrayListOf()
@@ -75,58 +80,68 @@ class UserFragment : DialogFragment() {
}
// Build dialog
- val builder = AlertDialog.Builder(activity)
- .setView(view)
- .setPositiveButton(positiveButtonTextResId) { _, _ ->
- saveClicked()
- }
- .setNegativeButton(R.string.user_dialog_button_cancel) { _, _ ->
- // Do nothing
- }
+ val builder = activity?.let {
+ MaterialAlertDialogBuilder(it)
+ .setView(view)
+ .setPositiveButton(positiveButtonTextResId) { _, _ ->
+ saveClicked()
+ }
+ .setNegativeButton(R.string.user_dialog_button_cancel) { _, _ ->
+ // Do nothing
+ }
+ }
if (user != null) {
- builder.setNeutralButton(R.string.user_dialog_button_delete) { _, _ ->
- if (this::listener.isInitialized) {
- listener.onDeleteUser(this, user!!.baseUrl)
+ if (builder != null) {
+ builder.setNeutralButton(R.string.user_dialog_button_delete) { _, _ ->
+ if (this::listener.isInitialized) {
+ listener.onDeleteUser(this, user!!.baseUrl)
+ }
}
}
}
- val dialog = builder.create()
- dialog.setOnShowListener {
- positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
-
- // Delete button should be red
- if (user != null) {
- dialog
- .getButton(AlertDialog.BUTTON_NEUTRAL)
- .dangerButton(requireContext())
- }
+ val dialog = builder?.create()
+ if (dialog != null) {
+ dialog.setOnShowListener {
+ if (dialog != null) {
+ positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
+ }
- // Validate input when typing
- val textWatcher = AfterChangedTextWatcher {
- validateInput()
- }
- baseUrlView.addTextChangedListener(textWatcher)
- usernameView.addTextChangedListener(textWatcher)
- passwordView.addTextChangedListener(textWatcher)
+ // Delete button should be red
+ if (user != null) {
+ dialog
+ .getButton(AlertDialog.BUTTON_NEUTRAL)
+ .dangerButton(requireContext())
+ }
- // Focus
- if (user != null) {
- usernameView.requestFocus()
- if (usernameView.text != null) {
- usernameView.setSelection(usernameView.text!!.length)
+ // Validate input when typing
+ val textWatcher = AfterChangedTextWatcher {
+ validateInput()
+ }
+ baseUrlView.addTextChangedListener(textWatcher)
+ usernameView.addTextChangedListener(textWatcher)
+ passwordView.addTextChangedListener(textWatcher)
+
+ // Focus
+ if (user != null) {
+ usernameView.requestFocus()
+ if (usernameView.text != null) {
+ usernameView.setSelection(usernameView.text!!.length)
+ }
+ } else {
+ baseUrlView.requestFocus()
}
- } else {
- baseUrlView.requestFocus()
- }
- // Validate now!
- validateInput()
+ // Validate now!
+ validateInput()
+ }
}
// Show keyboard when the dialog is shown (see https://stackoverflow.com/a/19573049/1440785)
- dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
+ if (dialog != null) {
+ dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
+ }
- return dialog
+ return dialog as Dialog
}
private fun saveClicked() {
diff --git a/app/src/main/java/io/heckel/ntfy/util/Util.kt b/app/src/main/java/io/heckel/ntfy/util/Util.kt
index 56c9e38..56931eb 100644
--- a/app/src/main/java/io/heckel/ntfy/util/Util.kt
+++ b/app/src/main/java/io/heckel/ntfy/util/Util.kt
@@ -498,11 +498,7 @@ fun String.sha256(): String {
}
fun Button.dangerButton(context: Context) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- setTextAppearance(R.style.DangerText)
- } else {
- setTextColor(ContextCompat.getColor(context, Colors.dangerText(context)))
- }
+ setTextColor(ContextCompat.getColor(context, Colors.dangerText(context)))
}
fun Long.nullIfZero(): Long? {
diff --git a/app/src/main/res/drawable/ic_dns_white_24dp.xml b/app/src/main/res/drawable/ic_dns_white_24dp.xml
new file mode 100644
index 0000000..831a467
--- /dev/null
+++ b/app/src/main/res/drawable/ic_dns_white_24dp.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+ android:viewportHeight="24" android:viewportWidth="24"
+ android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FFFFFF" android:pathData="M19,15v4H5v-4h14m1,-2H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-6c0,-0.55 -0.45,-1 -1,-1zM7,18.5c-0.82,0 -1.5,-0.67 -1.5,-1.5s0.68,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19,5v4H5V5h14m1,-2H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1zM7,8.5c-0.82,0 -1.5,-0.67 -1.5,-1.5S6.18,5.5 7,5.5s1.5,0.68 1.5,1.5S7.83,8.5 7,8.5z"/>
+</vector>
diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml
index 0b41cde..5ff37e5 100644
--- a/app/src/main/res/layout/activity_detail.xml
+++ b/app/src/main/res/layout/activity_detail.xml
@@ -8,7 +8,6 @@
tools:context=".ui.DetailActivity"
>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
- style="@style/CardViewBackground"
android:id="@+id/detail_notification_list_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -37,14 +36,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" app:srcCompat="@drawable/ic_sms_gray_48dp"
android:id="@+id/detail_no_notifications_image"/>
+
<TextView
- android:id="@+id/detail_no_notifications_text"
- android:text="@string/detail_no_notifications_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.AppCompat.Medium"
- android:padding="10dp" android:gravity="center_horizontal"
- android:paddingStart="50dp" android:paddingEnd="50dp"/>
+ android:id="@+id/detail_no_notifications_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:padding="10dp"
+ android:paddingStart="50dp"
+ android:paddingEnd="50dp"
+ android:text="@string/detail_no_notifications_text"
+ android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
</LinearLayout>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index f5349d7..3fd3f91 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -139,7 +139,6 @@
android:src="@drawable/ic_add_black_24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- style="@style/FloatingActionButton"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml
index dae99ae..be2b0ae 100644
--- a/app/src/main/res/layout/activity_share.xml
+++ b/app/src/main/res/layout/activity_share.xml
@@ -152,7 +152,6 @@
android:paddingStart="4dp"
app:layout_constraintEnd_toEndOf="parent"
android:paddingEnd="4dp"
- android:textAppearance="@style/DangerText"
app:layout_constraintStart_toEndOf="@id/share_error_image"
android:layout_marginTop="10dp" app:layout_constraintTop_toBottomOf="@id/share_suggested_topics"/>
<ImageView
diff --git a/app/src/main/res/layout/fragment_add_dialog.xml b/app/src/main/res/layout/fragment_add_dialog.xml
index 99f5e72..9e6937f 100644
--- a/app/src/main/res/layout/fragment_add_dialog.xml
+++ b/app/src/main/res/layout/fragment_add_dialog.xml
@@ -121,7 +121,6 @@
android:paddingStart="4dp"
android:paddingEnd="4dp"
android:text="Unable to resolve host example.com"
- android:textAppearance="@style/DangerText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/add_dialog_subscribe_error_text_image"
tools:layout_editor_absoluteY="237dp"
@@ -185,10 +184,8 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/add_dialog_login_password"
android:paddingEnd="4dp"
- android:textAppearance="@style/DangerText"
app:layout_constraintStart_toEndOf="@id/add_dialog_login_error_text_image"/>
<ProgressBar
- style="?android:attr/progressBarStyle"
android:layout_width="25dp"
android:layout_height="25dp"
android:id="@+id/add_dialog_login_progress"
diff --git a/app/src/main/res/layout/fragment_detail_item.xml b/app/src/main/res/layout/fragment_detail_item.xml
index 758e03c..4b51247 100644
--- a/app/src/main/res/layout/fragment_detail_item.xml
+++ b/app/src/main/res/layout/fragment_detail_item.xml
@@ -35,17 +35,20 @@
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="5dp" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="12dp"/>
+
<TextView
- android:layout_width="10dp"
- android:layout_height="10dp" android:id="@+id/detail_item_new_dot"
- android:layout_gravity="center"
- android:background="@drawable/ic_circle"
- android:gravity="center"
- app:layout_constraintTop_toTopOf="@+id/detail_item_date_text"
- app:layout_constraintBottom_toBottomOf="@+id/detail_item_date_text"
- android:layout_marginTop="1dp"
- app:layout_constraintStart_toEndOf="@id/detail_item_priority_image"
- android:layout_marginStart="5dp"/>
+ android:id="@+id/detail_item_new_dot"
+ android:layout_width="10dp"
+ android:layout_height="10dp"
+ android:layout_gravity="center"
+ android:layout_marginStart="5dp"
+ android:layout_marginTop="1dp"
+ android:background="@drawable/ic_circle"
+ android:backgroundTint="@color/material_dynamic_primary90"
+ android:gravity="center"
+ app:layout_constraintBottom_toBottomOf="@+id/detail_item_date_text"
+ app:layout_constraintStart_toEndOf="@id/detail_item_priority_image"
+ app:layout_constraintTop_toTopOf="@+id/detail_item_date_text" />
<ImageButton
android:layout_width="28dp"
android:layout_height="26dp" app:srcCompat="@drawable/ic_more_horiz_gray_24dp"
diff --git a/app/src/main/res/layout/fragment_main_item.xml b/app/src/main/res/layout/fragment_main_item.xml
index 1b99936..f1cc038 100644
--- a/app/src/main/res/layout/fragment_main_item.xml
+++ b/app/src/main/res/layout/fragment_main_item.xml
@@ -58,18 +58,22 @@
app:layout_constraintTop_toTopOf="@+id/main_item_instant_image"
app:layout_constraintEnd_toEndOf="parent"
android:paddingTop="2dp"/>
+
<TextView
- android:text="99+"
- android:layout_width="24dp"
- android:layout_height="24dp" android:id="@+id/main_item_new"
- android:layout_marginTop="3dp"
- android:layout_gravity="center"
- android:background="@drawable/ic_circle"
- android:gravity="center"
- android:textColor="@android:color/white"
- app:layout_constraintTop_toBottomOf="@+id/main_item_date"
- app:layout_constraintEnd_toEndOf="@+id/main_item_date"
- app:layout_constraintStart_toEndOf="@+id/main_item_instant_image"
- android:textSize="10sp" android:textStyle="bold"/>
+ android:id="@+id/main_item_new"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="center"
+ android:layout_marginTop="3dp"
+ android:background="@drawable/ic_circle"
+ android:backgroundTint="@color/material_dynamic_primary90"
+ android:gravity="center"
+ android:text="99+"
+ android:textColor="@color/material_dynamic_secondary10"
+ android:textSize="10sp"
+ android:textStyle="bold"
+ app:layout_constraintEnd_toEndOf="@+id/main_item_date"
+ app:layout_constraintStart_toEndOf="@+id/main_item_instant_image"
+ app:layout_constraintTop_toBottomOf="@+id/main_item_date" />
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 7048757..2279ae0 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -177,7 +177,7 @@
<string name="settings_general_dark_mode_entry_dark">Thème sombre</string>
<string name="settings_advanced_export_logs_entry_copy_original">Copier dans le presse-papier</string>
<string name="settings_advanced_export_logs_entry_copy_scrubbed">Copier dans le presse-papier (censuré)</string>
- <string name="settings_advanced_record_logs_summary_enabled">Enregistrement (jusqu\'à 1 000 entrées) sur l\'appareil …</string>
+ <string name="settings_advanced_record_logs_summary_enabled">Enregistrement (jusqu\'à 1 000 entrées) sur l\'appareil…</string>
<string name="settings_advanced_record_logs_summary_disabled">Activer l\'enregistrement de journaux de diagnostic pour faciliter le support technique</string>
<string name="settings_advanced_export_logs_scrub_dialog_button_ok">OK</string>
<string name="settings_advanced_export_logs_scrub_dialog_empty">Aucun nom de canal n\'a été censuré. Peut-être n\'avez-vous pas d\'abonnements \\?</string>
@@ -231,4 +231,5 @@
<string name="detail_settings_notifications_open_channels_title">Configurer les paramètres de notifications</string>
<string name="detail_item_cannot_open_apk">Les applications ne peuvent pas être installées pour des raisons de sécurité. Ouvrez ceci dans le navigateur à la place.</string>
<string name="detail_settings_notifications_open_channels_summary">Ignore Ne pas dérange (NPD), sons, etc.</string>
+ <string name="category_default">Inconnu (%1$s)</string>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
index 0f1a81a..61d3576 100644
--- a/app/src/main/res/values-night/styles.xml
+++ b/app/src/main/res/values-night/styles.xml
@@ -1,41 +1,10 @@
<resources>
- <!--
- This file contains only overrides for the dark theme.
- Also see "ui/Colors.kt" for colors that have to be defined in code.
+ <!-- Main app theme; dark theme styles see values-night/styles.xml -->
+ <style name="AppTheme" parent="Theme.Material3.DynamicColors.DayNight" />
- Resources:
- - https://material.io/design/color/dark-theme.html
- - https://material.io/develop/android/theming/dark
- - https://developer.android.com/codelabs/basic-android-kotlin-training-change-app-theme#4
- - https://developer.android.com/guide/topics/ui/look-and-feel/themes
- -->
-
- <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
- <item name="colorPrimary">@color/teal_light</item>
- <item name="colorAccent">@color/teal_light</item> <!-- checkboxes, text fields -->
- <item name="android:colorBackground">@color/black</item> <!-- background -->
- <item name="android:statusBarColor">@color/black</item>
- <item name="actionModeBackground">@color/black</item>
-
- <!-- Action bar background & text color -->
- <item name="colorSurface">@color/black</item>
- <item name="colorOnSurface">@color/white</item>
- </style>
-
- <style name="DangerText" parent="@android:style/TextAppearance">
- <item name="android:textColor">@color/red_light</item>
- </style>
-
- <style name="FloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
- <item name="tint">@color/black_900</item>
- <item name="backgroundTint">@color/teal_light</item>
- </style>
-
- <style name="CardView" parent="@style/Widget.MaterialComponents.CardView">
- <item name="cardBackgroundColor">@color/black</item>
- </style>
-
- <style name="CardViewBackground">
- <item name="android:background">@color/black_900</item>
+ <!-- Rounded corners in images, see https://stackoverflow.com/a/61960983/1440785 -->
+ <style name="roundedCornersImageView" parent="">
+ <item name="cornerFamily">rounded</item>
+ <item name="cornerSize">5dp</item>
</style>
</resources>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8037b6b..963be71 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -8,9 +8,9 @@
<color name="gray_400">#eeeeee</color> <!-- Item selection (light mode) -->
<color name="white">#ffffffff</color>
- <color name="teal">#A88DB5</color> <!-- Primary color (light mode) -->
- <color name="teal_light">#d7b4e7</color> <!-- Primary color (dark mode) -->
- <color name="teal_dark">#8E7799</color> <!-- Action bar background in action mode (light mode) -->
+ <color name="teal">#ff0000</color> <!-- Primary color (light mode) -->
+ <color name="teal_light">#ff0000</color> <!-- Primary color (dark mode) -->
+ <color name="teal_dark">#ff0000</color> <!-- Action bar background in action mode (light mode) -->
<color name="red_light">#fe4d2e</color> <!-- Danger text (dark mode) -->
<color name="red_dark">#c30000</color> <!-- Danger text (light mode) -->
</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ed62645..1f5013c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -44,7 +44,7 @@
<!-- Main activity: Action mode -->
<string name="main_action_mode_menu_unsubscribe">Unsubscribe</string>
- <string name="main_action_mode_delete_dialog_message">"\n Unsubscribe from the selected channel(s) and\n permanently delete all notifications?\n "</string>
+ <string name="main_action_mode_delete_dialog_message">"Unsubscribe from the selected channel(s) and permanently delete all notifications?\n "</string>
<string name="main_action_mode_delete_dialog_permanently_delete">Delete permanently</string>
<string name="main_action_mode_delete_dialog_cancel">Cancel</string>
@@ -303,7 +303,7 @@
<string name="settings_advanced_broadcast_summary_enabled" translatable="false">Apps can access notification content (advanced)</string>
<string name="settings_advanced_broadcast_summary_disabled" translatable="false">Apps cannot access notification content</string>
<string name="settings_advanced_record_logs_title">Diagnostics logs</string>
- <string name="settings_advanced_record_logs_summary_enabled">Logging (up to 1,000 entries) to device …</string>
+ <string name="settings_advanced_record_logs_summary_enabled">Logging (up to 1,000 entries) to device…</string>
<string name="settings_advanced_record_logs_summary_disabled">Enable recording diagnostics logs to help with technical support.</string>
<string name="settings_advanced_export_logs_title">Copy logs</string>
<string name="settings_advanced_export_logs_summary">Copy logs to the clipboard. Channel names can be censored, notifications will never be.</string>
@@ -372,5 +372,16 @@
<string name="user_dialog_button_save" translatable="false">Save</string>
<string name="detail_no_notifications_text">Nothing here yet.</string>
+ <!-- @ponypush -->
<!-- Equestria.dev: notification categories -->
+ <string name="category_default">Unknown (%1$s)</string>
+ <string name="category_bits">Bits notifications</string>
+ <string name="category_switch">Switches</string>
+ <string name="category_wakeup">Wake-up alerts</string>
+ <string name="category_pleasure">Pleasure alerts</string>
+ <string name="category_emergency">Emergency alerts</string>
+ <string name="category_delta">Delta change requests</string>
+ <string name="category_travelling">System travelling updates</string>
+ <string name="category_alarm">Automated alarms</string>
+ <string name="category_status">Server status updates</string>
</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4f0902d..61d3576 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,29 +1,6 @@
<resources>
<!-- Main app theme; dark theme styles see values-night/styles.xml -->
- <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
- <item name="colorPrimary">@color/teal</item>
- <item name="colorAccent">@color/teal</item> <!-- checkboxes, text fields -->
- <item name="android:colorBackground">@color/white</item> <!-- background -->
- <item name="android:statusBarColor">@color/teal</item>
- <item name="actionModeBackground">@color/teal_dark</item>
- </style>
-
- <style name="DangerText" parent="@android:style/TextAppearance">
- <item name="android:textColor">@color/red_dark</item>
- </style>
-
- <style name="FloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
- <item name="tint">@color/white</item>
- <item name="backgroundTint">@color/teal</item>
- </style>
-
- <style name="CardView" parent="@style/Widget.MaterialComponents.CardView">
- <item name="cardBackgroundColor">@color/white</item>
- </style>
-
- <style name="CardViewBackground">
- <item name="android:background">@color/gray_400</item>
- </style>
+ <style name="AppTheme" parent="Theme.Material3.DynamicColors.DayNight" />
<!-- Rounded corners in images, see https://stackoverflow.com/a/61960983/1440785 -->
<style name="roundedCornersImageView" parent="">
diff --git a/build.gradle b/build.gradle
index 3b8b15e..96d596d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.2.2'
+ classpath 'com.android.tools.build:gradle:7.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.14' // This is removed in the "fdroid" flavor
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1dbd5f6..43c4b95 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip