diff --git a/tools/chatgui-android/app/src/main/AndroidManifest.xml b/tools/chatgui-android/app/src/main/AndroidManifest.xml
index 3b8fef75..59fb4b41 100644
--- a/tools/chatgui-android/app/src/main/AndroidManifest.xml
+++ b/tools/chatgui-android/app/src/main/AndroidManifest.xml
@@ -40,6 +40,14 @@
+
+
+
+
+ service.getSystemService(NotificationManager::class.java).notify(1, service.notification())
+ }
+ }
}
override fun onCreate() {
@@ -67,23 +73,43 @@ class HeadlessService : Service() {
override fun onBind(intent: Intent?): IBinder? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ if (intent?.action == "com.utun.chat.CANCEL_FILES") {
+ ChatApplication.instance.memberFiles.cancel()
+ return START_STICKY
+ }
val source = if (intent == null) "sticky_restart" else intent.action ?: "manual"
LogManager.addLog("INFO", "SRV", "Service start command: source=$source startId=$startId flags=$flags ready=${NativeLib.isReady()}")
return START_STICKY
}
private fun notification(): android.app.Notification {
+ val operation = ChatApplication.instance.memberFiles.operation.value
val intent = Intent(this, MainActivity::class.java)
+ operation?.let { op ->
+ intent.putExtra("files_group", op.location.group).putExtra("files_server", op.location.server)
+ .putExtra("files_owner", op.location.owner).putExtra("files_path", op.location.path)
+ }
val pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
- return NotificationCompat.Builder(AppLanguage.context(), "utun_channel")
+ val builder = NotificationCompat.Builder(AppLanguage.context(), "utun_channel")
.setContentTitle("vibechat")
.setContentText(AppLanguage.text(R.string.service_notification))
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentIntent(pendingIntent)
.setOngoing(true)
.setOnlyAlertOnce(true)
- .build()
+ if (operation != null) {
+ val detail = operation.status?.let { AppLanguage.text(fileStatusResource(it)) } ?: AppLanguage.text(operation.stage)
+ builder.setContentText("${operation.name}: $detail")
+ if (operation.active) {
+ val percent = if (operation.total == 0L) 0 else (operation.done.toDouble() * 100 / operation.total).toInt()
+ builder.setProgress(100, percent, operation.total == 0L)
+ val cancel = PendingIntent.getService(this, 21, Intent(this, HeadlessService::class.java)
+ .setAction("com.utun.chat.CANCEL_FILES"), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
+ builder.addAction(android.R.drawable.ic_menu_close_clear_cancel, AppLanguage.text(R.string.cancel), cancel)
+ }
+ }
+ return builder.build()
}
private fun createNotificationChannel() {
diff --git a/tools/chatgui-android/app/src/main/res/xml/member_files_paths.xml b/tools/chatgui-android/app/src/main/res/xml/member_files_paths.xml
new file mode 100644
index 00000000..a725195b
--- /dev/null
+++ b/tools/chatgui-android/app/src/main/res/xml/member_files_paths.xml
@@ -0,0 +1,4 @@
+
+
+
+