Loading app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt +8 −22 Original line number Diff line number Diff line Loading @@ -5,7 +5,6 @@ import android.content.ActivityNotFoundException import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.graphics.BitmapFactory import android.media.RingtoneManager import android.net.Uri import android.os.Build Loading Loading @@ -70,9 +69,8 @@ class NotificationService(val context: Context) { .setContentTitle(title) .setOnlyAlertOnce(true) // Do not vibrate or play sound if already showing (updates!) .setAutoCancel(true) // Cancel when notification is clicked setStyleAndText(builder, notification) // Preview picture or big text style setStyleAndText(builder, subscription, notification) // Preview picture or big text style setClickAction(builder, subscription, notification) maybeSetIcon(builder, subscription) maybeSetSound(builder, update) maybeSetProgress(builder, notification) maybeAddOpenAction(builder, notification) Loading @@ -85,18 +83,6 @@ class NotificationService(val context: Context) { notificationManager.notify(notification.notificationId, builder.build()) } private fun maybeSetIcon(builder: NotificationCompat.Builder, subscription: Subscription) { val icon = subscription.icon ?: return try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) builder.setLargeIcon(bitmap) } catch (e: Exception) { Log.w(TAG, "Cannot load subscription icon", e) } } private fun maybeSetSound(builder: NotificationCompat.Builder, update: Boolean) { if (!update) { val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) Loading @@ -106,20 +92,19 @@ class NotificationService(val context: Context) { } } private fun setStyleAndText(builder: NotificationCompat.Builder, notification: Notification) { private fun setStyleAndText(builder: NotificationCompat.Builder, subscription: Subscription, notification: Notification) { val contentUri = notification.attachment?.contentUri val isSupportedImage = supportedImage(notification.attachment?.type) val subscriptionIcon = if (subscription.icon != null) subscription.icon.readBitmapFromUriOrNull(context) else null if (contentUri != null && isSupportedImage) { try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(contentUri)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val attachmentBitmap = contentUri.readBitmapFromUri(context) builder .setContentText(maybeAppendActionErrors(formatMessage(notification), notification)) .setLargeIcon(bitmap) .setLargeIcon(attachmentBitmap) .setStyle(NotificationCompat.BigPictureStyle() .bigPicture(bitmap) .bigLargeIcon(null)) .bigPicture(attachmentBitmap) .bigLargeIcon(subscriptionIcon)) // May be null } catch (_: Exception) { val message = maybeAppendActionErrors(formatMessageMaybeWithAttachmentInfos(notification), notification) builder Loading @@ -131,6 +116,7 @@ class NotificationService(val context: Context) { builder .setContentText(message) .setStyle(NotificationCompat.BigTextStyle().bigText(message)) .setLargeIcon(subscriptionIcon) // May be null } } Loading app/src/main/java/io/heckel/ntfy/service/SubscriberService.kt +4 −0 Original line number Diff line number Diff line Loading @@ -233,6 +233,8 @@ class SubscriberService : Service() { 2 -> getString(R.string.channel_subscriber_notification_instant_text_two) 3 -> getString(R.string.channel_subscriber_notification_instant_text_three) 4 -> getString(R.string.channel_subscriber_notification_instant_text_four) 5 -> getString(R.string.channel_subscriber_notification_instant_text_five) 6 -> getString(R.string.channel_subscriber_notification_instant_text_six) else -> getString(R.string.channel_subscriber_notification_instant_text_more, instantSubscriptions.size) } } else { Loading @@ -241,6 +243,8 @@ class SubscriberService : Service() { 2 -> getString(R.string.channel_subscriber_notification_noinstant_text_two) 3 -> getString(R.string.channel_subscriber_notification_noinstant_text_three) 4 -> getString(R.string.channel_subscriber_notification_noinstant_text_four) 5 -> getString(R.string.channel_subscriber_notification_noinstant_text_five) 6 -> getString(R.string.channel_subscriber_notification_noinstant_text_six) else -> getString(R.string.channel_subscriber_notification_noinstant_text_more, instantSubscriptions.size) } } Loading app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt +1 −3 Original line number Diff line number Diff line Loading @@ -289,9 +289,7 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope: return } try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(attachment.contentUri)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val bitmap = attachment.contentUri?.readBitmapFromUri(context) ?: throw Exception("uri empty") attachmentImageView.setImageBitmap(bitmap) attachmentImageView.setOnClickListener { val loadImage = { view: ImageView, image: Bitmap -> view.setImageBitmap(image) } Loading app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt +3 −7 Original line number Diff line number Diff line Loading @@ -268,8 +268,7 @@ class DetailSettingsActivity : AppCompatActivity() { // Set icon (if it exists) if (subscription.icon != null) { try { val bitmapStream = resolver.openInputStream(Uri.parse(subscription.icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val bitmap = subscription.icon!!.readBitmapFromUri(requireContext()) iconRemovePref.icon = bitmap.toDrawable(resources) } catch (e: Exception) { Log.w(TAG, "Unable to set icon ${subscription.icon}", e) Loading @@ -292,11 +291,8 @@ class DetailSettingsActivity : AppCompatActivity() { it.copyTo(outputStream) } // Read image and set as preference icon val bitmapStream = resolver.openInputStream(Uri.parse(outputUri.toString())) val bitmap = BitmapFactory.decodeStream(bitmapStream) // Display "remove" preference // Read image & display "remove" preference val bitmap = outputUri.readBitmapFromUri(requireContext()) iconRemovePref.icon = bitmap.toDrawable(resources) iconRemovePref.isVisible = true iconSetPref.isVisible = false Loading app/src/main/java/io/heckel/ntfy/ui/MainAdapter.kt +2 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import io.heckel.ntfy.db.Repository import io.heckel.ntfy.db.Subscription import io.heckel.ntfy.msg.NotificationService import io.heckel.ntfy.util.Log import io.heckel.ntfy.util.readBitmapFromUriOrNull import io.heckel.ntfy.util.topicShortUrl import java.text.DateFormat import java.util.* Loading Loading @@ -91,14 +92,7 @@ class MainAdapter(private val repository: Repository, private val onClick: (Subs val showMutedForeverIcon = (subscription.mutedUntil == 1L || globalMutedUntil == 1L) && !isUnifiedPush val showMutedUntilIcon = !showMutedForeverIcon && (subscription.mutedUntil > 1L || globalMutedUntil > 1L) && !isUnifiedPush if (subscription.icon != null) { try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(subscription.icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) imageView.setImageBitmap(bitmap) } catch (e: Exception) { Log.w(TAG, "Cannot load subscription icon", e) } imageView.setImageBitmap(subscription.icon.readBitmapFromUriOrNull(context)) } nameView.text = topicShortUrl(subscription.baseUrl, subscription.topic) statusView.text = statusMessage Loading Loading
app/src/main/java/io/heckel/ntfy/msg/NotificationService.kt +8 −22 Original line number Diff line number Diff line Loading @@ -5,7 +5,6 @@ import android.content.ActivityNotFoundException import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.graphics.BitmapFactory import android.media.RingtoneManager import android.net.Uri import android.os.Build Loading Loading @@ -70,9 +69,8 @@ class NotificationService(val context: Context) { .setContentTitle(title) .setOnlyAlertOnce(true) // Do not vibrate or play sound if already showing (updates!) .setAutoCancel(true) // Cancel when notification is clicked setStyleAndText(builder, notification) // Preview picture or big text style setStyleAndText(builder, subscription, notification) // Preview picture or big text style setClickAction(builder, subscription, notification) maybeSetIcon(builder, subscription) maybeSetSound(builder, update) maybeSetProgress(builder, notification) maybeAddOpenAction(builder, notification) Loading @@ -85,18 +83,6 @@ class NotificationService(val context: Context) { notificationManager.notify(notification.notificationId, builder.build()) } private fun maybeSetIcon(builder: NotificationCompat.Builder, subscription: Subscription) { val icon = subscription.icon ?: return try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) builder.setLargeIcon(bitmap) } catch (e: Exception) { Log.w(TAG, "Cannot load subscription icon", e) } } private fun maybeSetSound(builder: NotificationCompat.Builder, update: Boolean) { if (!update) { val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) Loading @@ -106,20 +92,19 @@ class NotificationService(val context: Context) { } } private fun setStyleAndText(builder: NotificationCompat.Builder, notification: Notification) { private fun setStyleAndText(builder: NotificationCompat.Builder, subscription: Subscription, notification: Notification) { val contentUri = notification.attachment?.contentUri val isSupportedImage = supportedImage(notification.attachment?.type) val subscriptionIcon = if (subscription.icon != null) subscription.icon.readBitmapFromUriOrNull(context) else null if (contentUri != null && isSupportedImage) { try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(contentUri)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val attachmentBitmap = contentUri.readBitmapFromUri(context) builder .setContentText(maybeAppendActionErrors(formatMessage(notification), notification)) .setLargeIcon(bitmap) .setLargeIcon(attachmentBitmap) .setStyle(NotificationCompat.BigPictureStyle() .bigPicture(bitmap) .bigLargeIcon(null)) .bigPicture(attachmentBitmap) .bigLargeIcon(subscriptionIcon)) // May be null } catch (_: Exception) { val message = maybeAppendActionErrors(formatMessageMaybeWithAttachmentInfos(notification), notification) builder Loading @@ -131,6 +116,7 @@ class NotificationService(val context: Context) { builder .setContentText(message) .setStyle(NotificationCompat.BigTextStyle().bigText(message)) .setLargeIcon(subscriptionIcon) // May be null } } Loading
app/src/main/java/io/heckel/ntfy/service/SubscriberService.kt +4 −0 Original line number Diff line number Diff line Loading @@ -233,6 +233,8 @@ class SubscriberService : Service() { 2 -> getString(R.string.channel_subscriber_notification_instant_text_two) 3 -> getString(R.string.channel_subscriber_notification_instant_text_three) 4 -> getString(R.string.channel_subscriber_notification_instant_text_four) 5 -> getString(R.string.channel_subscriber_notification_instant_text_five) 6 -> getString(R.string.channel_subscriber_notification_instant_text_six) else -> getString(R.string.channel_subscriber_notification_instant_text_more, instantSubscriptions.size) } } else { Loading @@ -241,6 +243,8 @@ class SubscriberService : Service() { 2 -> getString(R.string.channel_subscriber_notification_noinstant_text_two) 3 -> getString(R.string.channel_subscriber_notification_noinstant_text_three) 4 -> getString(R.string.channel_subscriber_notification_noinstant_text_four) 5 -> getString(R.string.channel_subscriber_notification_noinstant_text_five) 6 -> getString(R.string.channel_subscriber_notification_noinstant_text_six) else -> getString(R.string.channel_subscriber_notification_noinstant_text_more, instantSubscriptions.size) } } Loading
app/src/main/java/io/heckel/ntfy/ui/DetailAdapter.kt +1 −3 Original line number Diff line number Diff line Loading @@ -289,9 +289,7 @@ class DetailAdapter(private val activity: Activity, private val lifecycleScope: return } try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(attachment.contentUri)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val bitmap = attachment.contentUri?.readBitmapFromUri(context) ?: throw Exception("uri empty") attachmentImageView.setImageBitmap(bitmap) attachmentImageView.setOnClickListener { val loadImage = { view: ImageView, image: Bitmap -> view.setImageBitmap(image) } Loading
app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt +3 −7 Original line number Diff line number Diff line Loading @@ -268,8 +268,7 @@ class DetailSettingsActivity : AppCompatActivity() { // Set icon (if it exists) if (subscription.icon != null) { try { val bitmapStream = resolver.openInputStream(Uri.parse(subscription.icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) val bitmap = subscription.icon!!.readBitmapFromUri(requireContext()) iconRemovePref.icon = bitmap.toDrawable(resources) } catch (e: Exception) { Log.w(TAG, "Unable to set icon ${subscription.icon}", e) Loading @@ -292,11 +291,8 @@ class DetailSettingsActivity : AppCompatActivity() { it.copyTo(outputStream) } // Read image and set as preference icon val bitmapStream = resolver.openInputStream(Uri.parse(outputUri.toString())) val bitmap = BitmapFactory.decodeStream(bitmapStream) // Display "remove" preference // Read image & display "remove" preference val bitmap = outputUri.readBitmapFromUri(requireContext()) iconRemovePref.icon = bitmap.toDrawable(resources) iconRemovePref.isVisible = true iconSetPref.isVisible = false Loading
app/src/main/java/io/heckel/ntfy/ui/MainAdapter.kt +2 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import io.heckel.ntfy.db.Repository import io.heckel.ntfy.db.Subscription import io.heckel.ntfy.msg.NotificationService import io.heckel.ntfy.util.Log import io.heckel.ntfy.util.readBitmapFromUriOrNull import io.heckel.ntfy.util.topicShortUrl import java.text.DateFormat import java.util.* Loading Loading @@ -91,14 +92,7 @@ class MainAdapter(private val repository: Repository, private val onClick: (Subs val showMutedForeverIcon = (subscription.mutedUntil == 1L || globalMutedUntil == 1L) && !isUnifiedPush val showMutedUntilIcon = !showMutedForeverIcon && (subscription.mutedUntil > 1L || globalMutedUntil > 1L) && !isUnifiedPush if (subscription.icon != null) { try { val resolver = context.applicationContext.contentResolver val bitmapStream = resolver.openInputStream(Uri.parse(subscription.icon)) val bitmap = BitmapFactory.decodeStream(bitmapStream) imageView.setImageBitmap(bitmap) } catch (e: Exception) { Log.w(TAG, "Cannot load subscription icon", e) } imageView.setImageBitmap(subscription.icon.readBitmapFromUriOrNull(context)) } nameView.text = topicShortUrl(subscription.baseUrl, subscription.topic) statusView.text = statusMessage Loading