Fix date time locatization issue and race on toggling of instant delivery
This commit is contained in:
parent
89183c227d
commit
c3f9cfbb13
6 changed files with 44 additions and 25 deletions
|
@ -43,7 +43,9 @@ class SubscriberConnection(
|
||||||
val failed = AtomicBoolean(false)
|
val failed = AtomicBoolean(false)
|
||||||
val fail = { e: Exception ->
|
val fail = { e: Exception ->
|
||||||
failed.set(true)
|
failed.set(true)
|
||||||
stateChangeListener(subscriptions.values, ConnectionState.CONNECTING)
|
if (isActive && serviceActive()) { // Avoid UI update races if we're restarting a connection
|
||||||
|
stateChangeListener(subscriptions.values, ConnectionState.CONNECTING)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call /json subscribe endpoint and loop until the call fails, is canceled,
|
// Call /json subscribe endpoint and loop until the call fails, is canceled,
|
||||||
|
@ -57,8 +59,7 @@ class SubscriberConnection(
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "[$url] Connection failed: ${e.message}", e)
|
Log.e(TAG, "[$url] Connection failed: ${e.message}", e)
|
||||||
if (isActive && serviceActive()) {
|
if (isActive && serviceActive()) { // Avoid UI update races if we're restarting a connection
|
||||||
// Only update if we're not canceled, otherwise this may lead to races
|
|
||||||
stateChangeListener(subscriptions.values, ConnectionState.CONNECTING)
|
stateChangeListener(subscriptions.values, ConnectionState.CONNECTING)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,4 +125,10 @@ class AddFragment(private val viewModel: SubscriptionsViewModel, private val onS
|
||||||
getString(R.string.app_base_url)
|
getString(R.string.app_base_url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun newInstance() {
|
||||||
|
// ... make it not crash
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,12 +232,14 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
val url = topicUrl(subscriptionBaseUrl, subscriptionTopic)
|
val url = topicUrl(subscriptionBaseUrl, subscriptionTopic)
|
||||||
Log.d(TAG, "Copying topic URL $url to clipboard ")
|
Log.d(TAG, "Copying topic URL $url to clipboard ")
|
||||||
|
|
||||||
val clipboard: ClipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
runOnUiThread {
|
||||||
val clip = ClipData.newPlainText("topic address", url)
|
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
clipboard.setPrimaryClip(clip)
|
val clip = ClipData.newPlainText("topic address", url)
|
||||||
Toast
|
clipboard.setPrimaryClip(clip)
|
||||||
.makeText(this, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
Toast
|
||||||
.show()
|
.makeText(this, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun refresh() {
|
private fun refresh() {
|
||||||
|
@ -345,13 +347,15 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun copyToClipboard(notification: Notification) {
|
private fun copyToClipboard(notification: Notification) {
|
||||||
val message = notification.message + "\n\n" + Date(notification.timestamp * 1000).toString()
|
runOnUiThread {
|
||||||
val clipboard: ClipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
val message = notification.message + "\n\n" + Date(notification.timestamp * 1000).toString()
|
||||||
val clip = ClipData.newPlainText("notification message", message)
|
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
clipboard.setPrimaryClip(clip)
|
val clip = ClipData.newPlainText("notification message", message)
|
||||||
Toast
|
clipboard.setPrimaryClip(clip)
|
||||||
.makeText(this, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
Toast
|
||||||
.show()
|
.makeText(this, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onNotificationLongClick(notification: Notification) {
|
private fun onNotificationLongClick(notification: Notification) {
|
||||||
|
@ -407,10 +411,10 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
it.message + "\n" + Date(it.timestamp * 1000).toString()
|
it.message + "\n" + Date(it.timestamp * 1000).toString()
|
||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
}
|
}
|
||||||
val clipboard: ClipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
|
||||||
val clip = ClipData.newPlainText("notifications", content)
|
|
||||||
clipboard.setPrimaryClip(clip)
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
|
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
|
val clip = ClipData.newPlainText("notifications", content)
|
||||||
|
clipboard.setPrimaryClip(clip)
|
||||||
Toast
|
Toast
|
||||||
.makeText(this@DetailActivity, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
.makeText(this@DetailActivity, getString(R.string.detail_copied_to_clipboard_message), Toast.LENGTH_LONG)
|
||||||
.show()
|
.show()
|
||||||
|
|
|
@ -152,8 +152,9 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSubscribeButtonClick() {
|
private fun onSubscribeButtonClick() {
|
||||||
val newFragment = AddFragment(viewModel) { topic, baseUrl, instant -> onSubscribe(topic, baseUrl, instant) }
|
val newFragment = AddFragment(viewModel, ::onSubscribe)
|
||||||
newFragment.show(supportFragmentManager, "AddFragment")
|
newFragment
|
||||||
|
.show(supportFragmentManager, "AddFragment")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSubscribe(topic: String, baseUrl: String, instant: Boolean) {
|
private fun onSubscribe(topic: String, baseUrl: String, instant: Boolean) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ import io.heckel.ntfy.R
|
||||||
import io.heckel.ntfy.data.ConnectionState
|
import io.heckel.ntfy.data.ConnectionState
|
||||||
import io.heckel.ntfy.data.Subscription
|
import io.heckel.ntfy.data.Subscription
|
||||||
import io.heckel.ntfy.data.topicShortUrl
|
import io.heckel.ntfy.data.topicShortUrl
|
||||||
import java.text.SimpleDateFormat
|
import java.text.DateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,12 +62,18 @@ class MainAdapter(private val onClick: (Subscription) -> Unit, private val onLon
|
||||||
if (subscription.instant && subscription.state == ConnectionState.CONNECTING) {
|
if (subscription.instant && subscription.state == ConnectionState.CONNECTING) {
|
||||||
statusMessage += ", " + context.getString(R.string.main_item_status_reconnecting)
|
statusMessage += ", " + context.getString(R.string.main_item_status_reconnecting)
|
||||||
}
|
}
|
||||||
|
val date = Date(subscription.lastActive * 1000)
|
||||||
|
val dateStr = DateFormat.getDateInstance(DateFormat.SHORT).format(date)
|
||||||
|
val moreThanOneDay = System.currentTimeMillis()/1000 - subscription.lastActive > 24 * 60 * 60
|
||||||
|
val sameDay = dateStr == DateFormat.getDateInstance(DateFormat.SHORT).format(Date()) // Omg this is horrible
|
||||||
val dateText = if (subscription.lastActive == 0L) {
|
val dateText = if (subscription.lastActive == 0L) {
|
||||||
""
|
""
|
||||||
} else if (System.currentTimeMillis()/1000 - subscription.lastActive < 24 * 60 * 60) {
|
} else if (sameDay) {
|
||||||
SimpleDateFormat("HH:mm").format(Date(subscription.lastActive*1000))
|
DateFormat.getTimeInstance(DateFormat.SHORT).format(date)
|
||||||
|
} else if (!moreThanOneDay) {
|
||||||
|
context.getString(R.string.main_item_date_yesterday)
|
||||||
} else {
|
} else {
|
||||||
SimpleDateFormat("M/d/yy").format(Date(subscription.lastActive*1000))
|
dateStr
|
||||||
}
|
}
|
||||||
nameView.text = topicShortUrl(subscription.baseUrl, subscription.topic)
|
nameView.text = topicShortUrl(subscription.baseUrl, subscription.topic)
|
||||||
statusView.text = statusMessage
|
statusView.text = statusMessage
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
<string name="main_item_status_text_one">%1$d notification</string>
|
<string name="main_item_status_text_one">%1$d notification</string>
|
||||||
<string name="main_item_status_text_not_one">%1$d notifications</string>
|
<string name="main_item_status_text_not_one">%1$d notifications</string>
|
||||||
<string name="main_item_status_reconnecting">reconnecting …</string>
|
<string name="main_item_status_reconnecting">reconnecting …</string>
|
||||||
|
<string name="main_item_date_yesterday">Yesterday</string>
|
||||||
<string name="main_add_button_description">Add subscription</string>
|
<string name="main_add_button_description">Add subscription</string>
|
||||||
<string name="main_no_subscriptions_text">It looks like you don\'t have any subscriptions yet.</string>
|
<string name="main_no_subscriptions_text">It looks like you don\'t have any subscriptions yet.</string>
|
||||||
<string name="main_how_to_intro">Click the button below to create or subscribe to a topic. After that, you can send messages via PUT or POST and you\'ll receive notifications on your phone.</string>
|
<string name="main_how_to_intro">Click the button below to create or subscribe to a topic. After that, you can send messages via PUT or POST and you\'ll receive notifications on your phone.</string>
|
||||||
|
|
Loading…
Add table
Reference in a new issue