improve sending error notifications (#2671)
* improve sending error notifications * rename draftNotification -> buildDraftNotification
This commit is contained in:
parent
edbc624625
commit
7a53bce439
|
@ -175,6 +175,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
if (accountRequested && accountId != activeAccount.id) {
|
if (accountRequested && accountId != activeAccount.id) {
|
||||||
accountManager.setActiveAccount(accountId)
|
accountManager.setActiveAccount(accountId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val openDrafts = intent.getBooleanExtra(OPEN_DRAFTS, false)
|
||||||
|
|
||||||
if (canHandleMimeType(intent.type)) {
|
if (canHandleMimeType(intent.type)) {
|
||||||
// Sharing to Tusky from an external app
|
// Sharing to Tusky from an external app
|
||||||
if (accountRequested) {
|
if (accountRequested) {
|
||||||
|
@ -199,6 +202,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
} else if (openDrafts) {
|
||||||
|
val intent = DraftsActivity.newIntent(this)
|
||||||
|
startActivity(intent)
|
||||||
} else if (accountRequested && savedInstanceState == null) {
|
} else if (accountRequested && savedInstanceState == null) {
|
||||||
// user clicked a notification, show notification tab
|
// user clicked a notification, show notification tab
|
||||||
showNotificationTab = true
|
showNotificationTab = true
|
||||||
|
@ -839,6 +845,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13
|
private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13
|
||||||
private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14
|
private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14
|
||||||
const val REDIRECT_URL = "redirectUrl"
|
const val REDIRECT_URL = "redirectUrl"
|
||||||
|
const val OPEN_DRAFTS = "draft"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ import androidx.core.app.NotificationCompat;
|
||||||
import androidx.core.app.NotificationManagerCompat;
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import androidx.core.app.RemoteInput;
|
import androidx.core.app.RemoteInput;
|
||||||
import androidx.core.app.TaskStackBuilder;
|
import androidx.core.app.TaskStackBuilder;
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import androidx.work.Constraints;
|
import androidx.work.Constraints;
|
||||||
import androidx.work.NetworkType;
|
import androidx.work.NetworkType;
|
||||||
import androidx.work.PeriodicWorkRequest;
|
import androidx.work.PeriodicWorkRequest;
|
||||||
|
@ -57,7 +56,6 @@ import com.keylesspalace.tusky.entity.Notification;
|
||||||
import com.keylesspalace.tusky.entity.Poll;
|
import com.keylesspalace.tusky.entity.Poll;
|
||||||
import com.keylesspalace.tusky.entity.PollOption;
|
import com.keylesspalace.tusky.entity.PollOption;
|
||||||
import com.keylesspalace.tusky.entity.Status;
|
import com.keylesspalace.tusky.entity.Status;
|
||||||
import com.keylesspalace.tusky.network.MastodonApi;
|
|
||||||
import com.keylesspalace.tusky.receiver.NotificationClearBroadcastReceiver;
|
import com.keylesspalace.tusky.receiver.NotificationClearBroadcastReceiver;
|
||||||
import com.keylesspalace.tusky.receiver.SendStatusBroadcastReceiver;
|
import com.keylesspalace.tusky.receiver.SendStatusBroadcastReceiver;
|
||||||
import com.keylesspalace.tusky.util.StringUtils;
|
import com.keylesspalace.tusky.util.StringUtils;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.keylesspalace.tusky.service
|
package com.keylesspalace.tusky.service
|
||||||
|
|
||||||
|
import android.app.Notification
|
||||||
import android.app.NotificationChannel
|
import android.app.NotificationChannel
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
|
@ -12,9 +13,11 @@ import android.os.Build
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import androidx.annotation.StringRes
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.ServiceCompat
|
import androidx.core.app.ServiceCompat
|
||||||
import at.connyduck.calladapter.networkresult.fold
|
import at.connyduck.calladapter.networkresult.fold
|
||||||
|
import com.keylesspalace.tusky.MainActivity
|
||||||
import com.keylesspalace.tusky.R
|
import com.keylesspalace.tusky.R
|
||||||
import com.keylesspalace.tusky.appstore.EventHub
|
import com.keylesspalace.tusky.appstore.EventHub
|
||||||
import com.keylesspalace.tusky.appstore.StatusComposedEvent
|
import com.keylesspalace.tusky.appstore.StatusComposedEvent
|
||||||
|
@ -184,14 +187,15 @@ class SendStatusService : Service(), Injectable {
|
||||||
statusesToSend.remove(statusId)
|
statusesToSend.remove(statusId)
|
||||||
saveStatusToDrafts(statusToSend)
|
saveStatusToDrafts(statusToSend)
|
||||||
|
|
||||||
val builder = NotificationCompat.Builder(this@SendStatusService, CHANNEL_ID)
|
val notification = buildDraftNotification(
|
||||||
.setSmallIcon(R.drawable.ic_notify)
|
R.string.send_post_notification_error_title,
|
||||||
.setContentTitle(getString(R.string.send_post_notification_error_title))
|
R.string.send_post_notification_saved_content,
|
||||||
.setContentText(getString(R.string.send_post_notification_saved_content))
|
statusToSend.accountId,
|
||||||
.setColor(getColor(R.color.notification_color))
|
statusId
|
||||||
|
)
|
||||||
|
|
||||||
notificationManager.cancel(statusId)
|
notificationManager.cancel(statusId)
|
||||||
notificationManager.notify(errorNotificationId--, builder.build())
|
notificationManager.notify(errorNotificationId--, notification)
|
||||||
} else {
|
} else {
|
||||||
// a network problem occurred, let's retry sending the status
|
// a network problem occurred, let's retry sending the status
|
||||||
retrySending(statusId)
|
retrySending(statusId)
|
||||||
|
@ -227,15 +231,18 @@ class SendStatusService : Service(), Injectable {
|
||||||
|
|
||||||
saveStatusToDrafts(statusToCancel)
|
saveStatusToDrafts(statusToCancel)
|
||||||
|
|
||||||
val builder = NotificationCompat.Builder(this@SendStatusService, CHANNEL_ID)
|
val notification = buildDraftNotification(
|
||||||
.setSmallIcon(R.drawable.ic_notify)
|
R.string.send_post_notification_cancel_title,
|
||||||
.setContentTitle(getString(R.string.send_post_notification_cancel_title))
|
R.string.send_post_notification_saved_content,
|
||||||
.setContentText(getString(R.string.send_post_notification_saved_content))
|
statusToCancel.accountId,
|
||||||
.setColor(getColor(R.color.notification_color))
|
statusId
|
||||||
|
)
|
||||||
|
|
||||||
notificationManager.notify(statusId, builder.build())
|
notificationManager.notify(statusId, notification)
|
||||||
|
|
||||||
delay(5000)
|
delay(5000)
|
||||||
|
|
||||||
|
stopSelfWhenDone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +266,41 @@ class SendStatusService : Service(), Injectable {
|
||||||
private fun cancelSendingIntent(statusId: Int): PendingIntent {
|
private fun cancelSendingIntent(statusId: Int): PendingIntent {
|
||||||
val intent = Intent(this, SendStatusService::class.java)
|
val intent = Intent(this, SendStatusService::class.java)
|
||||||
intent.putExtra(KEY_CANCEL, statusId)
|
intent.putExtra(KEY_CANCEL, statusId)
|
||||||
return PendingIntent.getService(this, statusId, intent, NotificationHelper.pendingIntentFlags(false))
|
return PendingIntent.getService(
|
||||||
|
this,
|
||||||
|
statusId,
|
||||||
|
intent,
|
||||||
|
NotificationHelper.pendingIntentFlags(false)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildDraftNotification(
|
||||||
|
@StringRes title: Int,
|
||||||
|
@StringRes content: Int,
|
||||||
|
accountId: Long,
|
||||||
|
statusId: Int
|
||||||
|
): Notification {
|
||||||
|
|
||||||
|
val intent = Intent(this, MainActivity::class.java)
|
||||||
|
intent.putExtra(NotificationHelper.ACCOUNT_ID, accountId)
|
||||||
|
intent.putExtra(MainActivity.OPEN_DRAFTS, true)
|
||||||
|
|
||||||
|
val pendingIntent = PendingIntent.getActivity(
|
||||||
|
this,
|
||||||
|
statusId,
|
||||||
|
intent,
|
||||||
|
NotificationHelper.pendingIntentFlags(false)
|
||||||
|
)
|
||||||
|
|
||||||
|
return NotificationCompat.Builder(this@SendStatusService, CHANNEL_ID)
|
||||||
|
.setSmallIcon(R.drawable.ic_notify)
|
||||||
|
.setContentTitle(getString(title))
|
||||||
|
.setContentText(getString(content))
|
||||||
|
.setColor(getColor(R.color.notification_color))
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setOngoing(false)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
@ -279,7 +320,6 @@ class SendStatusService : Service(), Injectable {
|
||||||
private var sendingNotificationId = -1 // use negative ids to not clash with other notis
|
private var sendingNotificationId = -1 // use negative ids to not clash with other notis
|
||||||
private var errorNotificationId = Int.MIN_VALUE // use even more negative ids to not clash with other notis
|
private var errorNotificationId = Int.MIN_VALUE // use even more negative ids to not clash with other notis
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun sendStatusIntent(
|
fun sendStatusIntent(
|
||||||
context: Context,
|
context: Context,
|
||||||
statusToSend: StatusToSend
|
statusToSend: StatusToSend
|
||||||
|
|
Loading…
Reference in New Issue