Merge pull request #11684 from nextcloud/conflictNotification

Show conflict notification with newer API
This commit is contained in:
Tobias Kaminsky 2023-06-05 14:42:28 +02:00 committed by GitHub
commit 4c6768a43e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 117 additions and 0 deletions

View file

@ -20,6 +20,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />

View file

@ -22,6 +22,7 @@
package com.nextcloud.client.jobs package com.nextcloud.client.jobs
import android.accounts.Account
import android.app.NotificationManager import android.app.NotificationManager
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context import android.content.Context
@ -37,6 +38,7 @@ import com.nextcloud.client.device.PowerManagementService
import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.network.ConnectivityService
import com.nextcloud.client.utils.FileUploaderDelegate import com.nextcloud.client.utils.FileUploaderDelegate
import com.owncloud.android.R import com.owncloud.android.R
import com.owncloud.android.authentication.AuthenticatorActivity
import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.ThumbnailsCacheManager import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.datamodel.UploadsStorageManager import com.owncloud.android.datamodel.UploadsStorageManager
@ -45,13 +47,17 @@ import com.owncloud.android.lib.common.OwnCloudAccount
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
import com.owncloud.android.lib.common.network.OnDatatransferProgressListener import com.owncloud.android.lib.common.network.OnDatatransferProgressListener
import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode
import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.files.FileUtils import com.owncloud.android.lib.resources.files.FileUtils
import com.owncloud.android.operations.UploadFileOperation import com.owncloud.android.operations.UploadFileOperation
import com.owncloud.android.ui.activity.ConflictsResolveActivity
import com.owncloud.android.ui.activity.UploadListActivity import com.owncloud.android.ui.activity.UploadListActivity
import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.ui.notifications.NotificationUtils
import com.owncloud.android.utils.ErrorMessageAdapter
import com.owncloud.android.utils.theme.ViewThemeUtils import com.owncloud.android.utils.theme.ViewThemeUtils
import java.io.File import java.io.File
import java.security.SecureRandom
@Suppress("LongParameterList") @Suppress("LongParameterList")
class FilesUploadWorker( class FilesUploadWorker(
@ -168,6 +174,9 @@ class FilesUploadWorker(
} finally { } finally {
uploadsStorageManager.updateDatabaseUploadResult(uploadResult, uploadFileOperation) uploadsStorageManager.updateDatabaseUploadResult(uploadResult, uploadFileOperation)
// / notify result
notifyUploadResult(uploadFileOperation, uploadResult)
// cancel notification // cancel notification
notificationManager.cancel(FOREGROUND_SERVICE_ID) notificationManager.cancel(FOREGROUND_SERVICE_ID)
} }
@ -220,6 +229,113 @@ class FilesUploadWorker(
// TODO generalize for automated uploads // TODO generalize for automated uploads
} }
/**
* adapted from [com.owncloud.android.files.services.FileUploader.notifyUploadResult]
*/
private fun notifyUploadResult(
uploadFileOperation: UploadFileOperation,
uploadResult: RemoteOperationResult<Any?>
) {
Log_OC.d(TAG, "NotifyUploadResult with resultCode: " + uploadResult.code)
// Only notify if the upload fails
if (uploadResult.isSuccess || uploadResult.isCancelled) {
return
}
val notDelayed = uploadResult.code != ResultCode.DELAYED_FOR_WIFI &&
uploadResult.code != ResultCode.DELAYED_FOR_CHARGING &&
uploadResult.code != ResultCode.DELAYED_IN_POWER_SAVE_MODE
if (notDelayed &&
uploadResult.code != ResultCode.LOCAL_FILE_NOT_FOUND &&
uploadResult.code != ResultCode.LOCK_FAILED
) {
var tickerId = R.string.uploader_upload_failed_ticker
// check credentials error
val needsToUpdateCredentials = uploadResult.code == ResultCode.UNAUTHORIZED
if (needsToUpdateCredentials) {
tickerId = R.string.uploader_upload_failed_credentials_error
} else if (uploadResult.code == ResultCode.SYNC_CONFLICT) {
// check file conflict
tickerId = R.string.uploader_upload_failed_sync_conflict_error
}
notificationBuilder
.setTicker(context.getString(tickerId))
.setContentTitle(context.getString(tickerId))
.setAutoCancel(true)
.setOngoing(false)
.setProgress(0, 0, false)
val content = ErrorMessageAdapter.getErrorCauseMessage(uploadResult, uploadFileOperation, context.resources)
if (needsToUpdateCredentials) {
createUpdateCredentialsNotification(uploadFileOperation.user.toPlatformAccount())
} else {
val intent = if (uploadResult.code == ResultCode.SYNC_CONFLICT) {
createResolveConflictIntent(uploadFileOperation)
} else {
createUploadListIntent(uploadFileOperation)
}
notificationBuilder.setContentIntent(
PendingIntent.getActivity(
context,
System.currentTimeMillis().toInt(),
intent,
PendingIntent.FLAG_IMMUTABLE
)
)
}
notificationBuilder.setContentText(content)
if (!uploadResult.isSuccess) {
notificationManager.notify(SecureRandom().nextInt(), notificationBuilder.build())
}
}
}
private fun createUploadListIntent(uploadFileOperation: UploadFileOperation): Intent {
return UploadListActivity.createIntent(
uploadFileOperation.file,
uploadFileOperation.user,
Intent.FLAG_ACTIVITY_CLEAR_TOP,
context
)
}
private fun createResolveConflictIntent(uploadFileOperation: UploadFileOperation): Intent {
return ConflictsResolveActivity.createIntent(
uploadFileOperation.file,
uploadFileOperation.user,
uploadFileOperation.ocUploadId,
Intent.FLAG_ACTIVITY_CLEAR_TOP,
context
)
}
private fun createUpdateCredentialsNotification(account: Account) {
// let the user update credentials with one click
val updateAccountCredentials = Intent(context, AuthenticatorActivity::class.java)
updateAccountCredentials.putExtra(
AuthenticatorActivity.EXTRA_ACCOUNT,
account
)
updateAccountCredentials.putExtra(
AuthenticatorActivity.EXTRA_ACTION,
AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN
)
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND)
notificationBuilder.setContentIntent(
PendingIntent.getActivity(
context,
System.currentTimeMillis().toInt(),
updateAccountCredentials,
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
)
)
}
/** /**
* see [com.owncloud.android.files.services.FileUploader.onTransferProgress] * see [com.owncloud.android.files.services.FileUploader.onTransferProgress]
*/ */