Browse Source

Share exported files safely and show background transfer progress

master
evgeny 2 days ago
parent
commit
11b6f78924
  1. 8
      tools/chatgui-android/app/src/main/AndroidManifest.xml
  2. 30
      tools/chatgui-android/app/src/main/java/com/utun/chat/headless/HeadlessService.kt
  3. 4
      tools/chatgui-android/app/src/main/res/xml/member_files_paths.xml

8
tools/chatgui-android/app/src/main/AndroidManifest.xml

@ -40,6 +40,14 @@
<meta-data android:name="autoStoreLocales" android:value="true" />
</service>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.memberfiles"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/member_files_paths" />
</provider>
<activity
android:name=".MainActivity"
android:exported="true"

30
tools/chatgui-android/app/src/main/java/com/utun/chat/headless/HeadlessService.kt

@ -16,6 +16,7 @@ import com.utun.chat.data.LogManager
import com.utun.chat.data.NativeLib
import com.utun.chat.data.NetworkActivityMonitor
import com.utun.chat.data.NetworkChangeMonitor
import com.utun.chat.data.fileStatusResource
class HeadlessService : Service() {
companion object {
@ -27,6 +28,11 @@ class HeadlessService : Service() {
service.getSystemService(NotificationManager::class.java).notify(1, service.notification())
}
}
fun refreshFiles() {
currentService?.let { service ->
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() {

4
tools/chatgui-android/app/src/main/res/xml/member_files_paths.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="member_files" path="member_files/" />
</paths>
Loading…
Cancel
Save