diff options
author | Minteck <contact@minteck.org> | 2023-01-03 21:59:24 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2023-01-03 21:59:24 +0100 |
commit | b9b5a76b577e697566c6de216f90b7887166a6c4 (patch) | |
tree | 1818944ec132a9e06df53dd195fb7f8447e15ae8 | |
parent | c31de93af40d21ddc64fb4e21a929f2a28baabd4 (diff) | |
download | ponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.tar.gz ponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.tar.bz2 ponypush-b9b5a76b577e697566c6de216f90b7887166a6c4.zip |
Update - This is an automated commit
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 |