srctree

Robin Linden parent f4730c65 7fbe8715
Allow replying from the notifications

atox/src/main/AndroidManifest.xml added: 82, removed: 7, total 75
@@ -26,6 +26,8 @@
</intent-filter>
</receiver>
 
<receiver android:name=".ReplyReceiver"/>
 
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="ltd.evilcorp.fileprovider"
 
filename was Deleted added: 82, removed: 7, total 75
@@ -0,0 +1,39 @@
package ltd.evilcorp.atox
 
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.core.app.RemoteInput
import javax.inject.Inject
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import ltd.evilcorp.atox.ui.NotificationHelper
import ltd.evilcorp.core.vo.Contact
import ltd.evilcorp.domain.feature.ChatManager
import ltd.evilcorp.domain.tox.PublicKey
import ltd.evilcorp.domain.tox.Tox
 
const val KEY_TEXT_REPLY = "text_reply"
const val KEY_CONTACT_PK = "contact_pk"
 
class ReplyReceiver : BroadcastReceiver() {
@Inject
lateinit var chatManager: ChatManager
 
@Inject
lateinit var notificationHelper: NotificationHelper
 
@Inject
lateinit var tox: Tox
 
override fun onReceive(context: Context, intent: Intent) {
(context.applicationContext as App).component.inject(this)
val results = RemoteInput.getResultsFromIntent(intent) ?: return
val input = results.getCharSequence(KEY_TEXT_REPLY)?.toString() ?: return
val pk = intent.getStringExtra(KEY_CONTACT_PK) ?: return
GlobalScope.launch {
chatManager.sendMessage(PublicKey(pk), input)
notificationHelper.showMessageNotification(Contact(pk, tox.getName().await()), input, outgoing = true)
}
}
}
 
atox/src/main/kotlin/di/AppComponent.kt added: 82, removed: 7, total 75
@@ -6,6 +6,7 @@ import dagger.Component
import javax.inject.Singleton
import ltd.evilcorp.atox.BootReceiver
import ltd.evilcorp.atox.MainActivity
import ltd.evilcorp.atox.ReplyReceiver
import ltd.evilcorp.atox.ToxService
import ltd.evilcorp.core.di.DaoModule
import ltd.evilcorp.core.di.DatabaseModule
@@ -21,4 +22,5 @@ interface AppComponent {
fun inject(activity: MainActivity)
fun inject(service: ToxService)
fun inject(receiver: BootReceiver)
fun inject(receiver: ReplyReceiver)
}
 
atox/src/main/kotlin/ui/NotificationHelper.kt added: 82, removed: 7, total 75
@@ -3,7 +3,9 @@ package ltd.evilcorp.atox.ui
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
@@ -13,6 +15,7 @@ import android.graphics.Rect
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.Person
import androidx.core.app.RemoteInput
import androidx.core.content.getSystemService
import androidx.core.graphics.drawable.IconCompat
import androidx.core.os.bundleOf
@@ -21,7 +24,10 @@ import com.squareup.picasso.Picasso
import com.squareup.picasso.Transformation
import javax.inject.Inject
import javax.inject.Singleton
import ltd.evilcorp.atox.KEY_CONTACT_PK
import ltd.evilcorp.atox.KEY_TEXT_REPLY
import ltd.evilcorp.atox.R
import ltd.evilcorp.atox.ReplyReceiver
import ltd.evilcorp.atox.ui.chat.CONTACT_PUBLIC_KEY
import ltd.evilcorp.core.vo.Contact
import ltd.evilcorp.core.vo.FriendRequest
@@ -85,7 +91,7 @@ class NotificationHelper @Inject constructor(
override fun key() = "circleTransform"
}
 
fun showMessageNotification(contact: Contact, message: String) {
fun showMessageNotification(contact: Contact, message: String, outgoing: Boolean = false) {
val notificationBuilder = NotificationCompat.Builder(context, MESSAGE)
.setSmallIcon(android.R.drawable.sym_action_chat)
.setContentTitle(contact.name)
@@ -98,6 +104,31 @@ class NotificationHelper @Inject constructor(
.createPendingIntent()
)
.setAutoCancel(true)
.addAction(
NotificationCompat.Action
.Builder(
IconCompat.createWithResource(context, R.drawable.send),
context.getString(R.string.reply),
PendingIntent.getBroadcast(
context,
contact.publicKey.hashCode(),
Intent(context, ReplyReceiver::class.java).putExtra(KEY_CONTACT_PK, contact.publicKey),
PendingIntent.FLAG_UPDATE_CURRENT
)
)
.addRemoteInput(
RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(context.getString(R.string.message))
.build()
)
.setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY)
.setAllowGeneratedReplies(true)
.build()
)
 
if (outgoing) {
notificationBuilder.setNotificationSilent()
}
 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notificationBuilder.setCategory(Notification.CATEGORY_MESSAGE)
@@ -110,7 +141,7 @@ class NotificationHelper @Inject constructor(
 
val chatPartner = Person.Builder()
.setName(contact.name)
.setKey(contact.publicKey)
.setKey(if (outgoing) "myself" else contact.publicKey)
.setIcon(icon)
.setImportant(true)
.build()
 
atox/src/main/res/values/strings.xml added: 82, removed: 7, total 75
@@ -123,4 +123,5 @@
<string name="bad_host">Bad host</string>
<string name="bad_port">Bad port</string>
<string name="tox_save_export_failure">Save export failed: %1$s</string>
<string name="reply">Reply</string>
</resources>