mirror of https://github.com/nextcloud/android
Compare commits
22 Commits
46bf27c6d8
...
32d0efbb5e
Author | SHA1 | Date |
---|---|---|
alperozturk | 32d0efbb5e | |
alperozturk | f1e4bdb2ac | |
alperozturk | 13113f23bf | |
alperozturk | 4f9580edc0 | |
alperozturk | 146d20ce3d | |
alperozturk | 84bcbee37f | |
alperozturk | 2b14660559 | |
alperozturk | 84d91f6e76 | |
alperozturk | 7a49a3f521 | |
alperozturk | 37dd41a157 | |
alperozturk | 1e420bbeab | |
Alper Öztürk | 20cabd4aab | |
Unpublished | e7badaec39 | |
Unpublished | 724115de3e | |
Andy Scherzinger | f2cb841854 | |
Nextcloud bot | 3644710cc6 | |
nextcloud-android-bot | 8567928d16 | |
Andy Scherzinger | f58e7fc75a | |
Andy Scherzinger | bbe218a265 | |
Andy Scherzinger | e3a729c2cf | |
Andy Scherzinger | 92392d49a7 | |
tobiasKaminsky | 0334871f64 |
|
@ -44,7 +44,7 @@ jobs:
|
|||
echo "repo=${{ github.event.pull_request.head.repo.full_name }}"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
repository: ${{ steps.get-vars.outputs.repo }}
|
||||
ref: ${{ steps.get-vars.outputs.branch }}
|
||||
|
|
|
@ -33,13 +33,13 @@ jobs:
|
|||
language: [ 'java' ]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
- name: Set Swap Space
|
||||
uses: pierotofy/set-swap-space@49819abfb41bd9b44fb781159c033dba90353a7c # v1.0
|
||||
with:
|
||||
swap-size-gb: 10
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
||||
uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Set up JDK 17
|
||||
|
@ -53,4 +53,4 @@ jobs:
|
|||
echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
|
||||
./gradlew assembleDebug
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
||||
uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
|
||||
|
|
|
@ -25,5 +25,5 @@ jobs:
|
|||
name: "Validation"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
- uses: gradle/wrapper-validation-action@5188e9b5527a0a094cee21e2fe9a8ca44b4629af # v3.3.1
|
||||
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
- uses: gradle/wrapper-validation-action@216d1ad2b3710bf005dc39237337b9673fd8fcd5 # v3.3.2
|
||||
|
|
|
@ -29,7 +29,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3
|
||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
@ -42,6 +42,6 @@ jobs:
|
|||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
||||
uses: github/codeql-action/upload-sarif@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
|
|
@ -17,7 +17,7 @@ concurrency:
|
|||
|
||||
jobs:
|
||||
screenshot:
|
||||
runs-on: macOS-latest
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
|
@ -48,6 +48,12 @@ jobs:
|
|||
distribution: "temurin"
|
||||
java-version: 17
|
||||
|
||||
- name: Enable KVM group perms
|
||||
run: |
|
||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger --name-match=kvm
|
||||
|
||||
- name: create AVD and generate snapshot for caching
|
||||
if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||
uses: reactivecircus/android-emulator-runner@6b0df4b0efb23bb0ec63d881db79aefbc976e4b2 # v2.30.1
|
||||
|
|
|
@ -20,8 +20,8 @@ Copyright: 2015-2016 ownCloud Inc.
|
|||
License: GPL-2.0-only
|
||||
|
||||
Files: app/src/*/res/mipmap-*dpi/ic_launcher.png app/src/*/ic_launcher-web.png src/generic/fastlane/metadata/android/en-US/images/icon.png src/versionDev/fastlane/metadata/android/en-US/images/icon.png app/src/main/ic_launcher-web-round.png
|
||||
Copyright: 2017-2024 Nextcloud GmbH. All rights reserved. Trademarks apply, see https://nextcloud.com/trademarks/
|
||||
License: AGPL-3.0-or-later
|
||||
Copyright: 2017-2024 Nextcloud GmbH <https://nextcloud.com/trademarks/>
|
||||
License: LicenseRef-NextcloudTrademarks
|
||||
|
||||
Files: .idea/* app/schemas/com.nextcloud.client.database.NextcloudDatabase/*.json app/screenshots/gplay/debug/*.png app/src/main/res/values-*/strings.xml src/*/fastlane/metadata/android/*/*.txt src/versionDev/fastlane/metadata/android/*/changelogs/*.txt app/src/androidTest/assets/* app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker app/src/*/google-services.json app/src/main/res/drawable-*dpi/checker_16_16.png app/src/main/res/raw/encryption_key_words.txt app/src/main/resources/ical4j.properties app/src/main/res/drawable-*dpi/apk.png app/src/main/res/drawable-*dpi/fdroid.png app/src/main/res/drawable-*dpi/playstore.png app/src/main/res/drawable-*dpi/background.png app/src/main/res/drawable-*dpi/background_nc18.png
|
||||
Copyright: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
|
|
25
CHANGELOG.md
25
CHANGELOG.md
|
@ -1,17 +1,29 @@
|
|||
<!--
|
||||
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
~ SPDX-FileCopyrightText: 2016-2024 Tobias Kaminsky <tobias@kaminsky.me>
|
||||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
## 3.29.0 (April 24, 2024)
|
||||
|
||||
- NC Assistant
|
||||
- Client certificates
|
||||
- Personal files view
|
||||
- REUSE compliance
|
||||
- Bugfixes
|
||||
|
||||
Minimum: NC 16 Server, Android 7.0 Nougat
|
||||
|
||||
For a full list, please see https://github.com/nextcloud/android/milestone/89
|
||||
|
||||
## 3.28.2 (April 4th, 2024)
|
||||
|
||||
- Bugfixes
|
||||
|
||||
|
||||
Minimum: NC 16 Server, Android 7.0 Nougat
|
||||
|
||||
For a full list, please see https://github.com/nextcloud/android/milestone/90
|
||||
|
||||
<!--
|
||||
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
|
||||
## 3.28.1 (March 25th, 2024)
|
||||
|
||||
- Bugfixes
|
||||
|
@ -25,7 +37,6 @@ For a full list, please see https://github.com/nextcloud/android/milestone/90
|
|||
- E2E sharing
|
||||
- Bugfixes
|
||||
|
||||
|
||||
Minimum: NC 16 Server, Android 7.0 Nougat
|
||||
|
||||
For a full list, please see https://github.com/nextcloud/android/milestone/88
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
The Nextcloud marks
|
||||
Nextcloud and the Nextcloud logo is a registered trademark of Nextcloud GmbH in Germany and/or other countries.
|
||||
These guidelines cover the following marks pertaining both to the product names and the logo: “Nextcloud”
|
||||
and the blue/white cloud logo with or without the word Nextcloud; the service “Nextcloud Enterprise”;
|
||||
and our products: “Nextcloud Files”; “Nextcloud Groupware” and “Nextcloud Talk”.
|
||||
This set of marks is collectively referred to as the “Nextcloud marks.”
|
||||
|
||||
Use of Nextcloud logos and other marks is only permitted under the guidelines provided by the Nextcloud GmbH.
|
||||
A copy can be found at https://nextcloud.com/trademarks/
|
Binary file not shown.
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 31 KiB |
Binary file not shown.
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
@ -18,7 +18,6 @@ import android.os.Handler
|
|||
import android.os.Looper
|
||||
import androidx.core.app.NotificationCompat
|
||||
import com.owncloud.android.R
|
||||
import com.owncloud.android.lib.resources.files.FileUtils
|
||||
import com.owncloud.android.operations.DownloadFileOperation
|
||||
import com.owncloud.android.ui.notifications.NotificationUtils
|
||||
import com.owncloud.android.utils.theme.ViewThemeUtils
|
||||
|
@ -29,15 +28,11 @@ import java.security.SecureRandom
|
|||
class DownloadNotificationManager(
|
||||
private val id: Int,
|
||||
private val context: Context,
|
||||
private val viewThemeUtils: ViewThemeUtils
|
||||
viewThemeUtils: ViewThemeUtils
|
||||
) {
|
||||
private var notification: Notification
|
||||
private var notificationBuilder: NotificationCompat.Builder
|
||||
private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
init {
|
||||
notificationBuilder = NotificationUtils.newNotificationBuilder(context, viewThemeUtils).apply {
|
||||
setContentTitle(context.getString(R.string.downloader_download_in_progress_ticker))
|
||||
private var currentOperationTitle: String? = null
|
||||
private var notificationBuilder: NotificationCompat.Builder =
|
||||
NotificationUtils.newNotificationBuilder(context, viewThemeUtils).apply {
|
||||
setTicker(context.getString(R.string.downloader_download_in_progress_ticker))
|
||||
setSmallIcon(R.drawable.notification_icon)
|
||||
setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon))
|
||||
|
@ -46,32 +41,24 @@ class DownloadNotificationManager(
|
|||
setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD)
|
||||
}
|
||||
}
|
||||
|
||||
notification = notificationBuilder.build()
|
||||
}
|
||||
private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
fun prepareForStart(operation: DownloadFileOperation) {
|
||||
notificationBuilder = NotificationUtils.newNotificationBuilder(context, viewThemeUtils).apply {
|
||||
setSmallIcon(R.drawable.notification_icon)
|
||||
setOngoing(true)
|
||||
fun prepareForStart(operation: DownloadFileOperation, currentDownloadIndex: Int, totalDownloadSize: Int) {
|
||||
currentOperationTitle = String.format(
|
||||
context.getString(R.string.downloader_notification_manager_download_text),
|
||||
currentDownloadIndex,
|
||||
totalDownloadSize,
|
||||
File(operation.savePath).name
|
||||
)
|
||||
|
||||
notificationBuilder.run {
|
||||
setContentTitle(currentOperationTitle)
|
||||
setOngoing(false)
|
||||
setProgress(100, 0, operation.size < 0)
|
||||
setContentText(
|
||||
String.format(
|
||||
context.getString(R.string.downloader_download_in_progress), 0,
|
||||
File(operation.savePath).name
|
||||
)
|
||||
)
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD)
|
||||
}
|
||||
|
||||
notificationManager.notify(
|
||||
id,
|
||||
this.build()
|
||||
)
|
||||
}
|
||||
|
||||
showNotification()
|
||||
}
|
||||
|
||||
fun prepareForResult() {
|
||||
|
@ -82,16 +69,19 @@ class DownloadNotificationManager(
|
|||
}
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
fun updateDownloadProgress(filePath: String, percent: Int, totalToTransfer: Long) {
|
||||
fun updateDownloadProgress(percent: Int, totalToTransfer: Long) {
|
||||
val progressText = String.format(
|
||||
context.getString(R.string.downloader_notification_manager_in_progress_text),
|
||||
percent
|
||||
)
|
||||
|
||||
notificationBuilder.run {
|
||||
setProgress(100, percent, totalToTransfer < 0)
|
||||
val fileName: String = filePath.substring(filePath.lastIndexOf(FileUtils.PATH_SEPARATOR) + 1)
|
||||
val text =
|
||||
String.format(context.getString(R.string.downloader_download_in_progress), percent, fileName)
|
||||
val title =
|
||||
context.getString(R.string.downloader_download_in_progress_ticker)
|
||||
updateNotificationText(title, text)
|
||||
setContentTitle(currentOperationTitle)
|
||||
setContentText(progressText)
|
||||
}
|
||||
|
||||
showNotification()
|
||||
}
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
|
@ -106,24 +96,12 @@ class DownloadNotificationManager(
|
|||
|
||||
notificationBuilder.run {
|
||||
setProgress(0, 0, false)
|
||||
setContentTitle(null)
|
||||
setContentText(text)
|
||||
setContentTitle(text)
|
||||
setOngoing(false)
|
||||
notificationManager.notify(notifyId, this.build())
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateNotificationText(title: String?, text: String) {
|
||||
notificationBuilder.run {
|
||||
title?.let {
|
||||
setContentTitle(title)
|
||||
}
|
||||
|
||||
setContentText(text)
|
||||
notificationManager.notify(id, this.build())
|
||||
}
|
||||
}
|
||||
|
||||
fun setContentIntent(intent: Intent, flag: Int) {
|
||||
notificationBuilder.setContentIntent(
|
||||
PendingIntent.getActivity(
|
||||
|
@ -135,6 +113,10 @@ class DownloadNotificationManager(
|
|||
)
|
||||
}
|
||||
|
||||
private fun showNotification() {
|
||||
notificationManager.notify(id, notificationBuilder.build())
|
||||
}
|
||||
|
||||
fun getId(): Int {
|
||||
return id
|
||||
}
|
||||
|
|
|
@ -126,8 +126,8 @@ class FileDownloadWorker(
|
|||
)
|
||||
setForegroundAsync(foregroundInfo)
|
||||
|
||||
requestDownloads.forEach {
|
||||
downloadFile(it)
|
||||
requestDownloads.forEachIndexed { currentDownloadIndex, requestedDownload ->
|
||||
downloadFile(requestedDownload, currentDownloadIndex, requestDownloads.size)
|
||||
}
|
||||
|
||||
downloadError?.let {
|
||||
|
@ -254,7 +254,7 @@ class FileDownloadWorker(
|
|||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "DEPRECATION")
|
||||
private fun downloadFile(downloadKey: String) {
|
||||
private fun downloadFile(downloadKey: String, currentDownloadIndex: Int, totalDownloadSize: Int) {
|
||||
currentDownload = pendingDownloads.get(downloadKey)
|
||||
|
||||
if (currentDownload == null) {
|
||||
|
@ -270,7 +270,13 @@ class FileDownloadWorker(
|
|||
return
|
||||
}
|
||||
|
||||
notifyDownloadStart(currentDownload!!)
|
||||
lastPercent = 0
|
||||
|
||||
notificationManager.run {
|
||||
prepareForStart(currentDownload!!, currentDownloadIndex + 1, totalDownloadSize)
|
||||
setContentIntent(intents.detailsIntent(currentDownload!!), PendingIntent.FLAG_IMMUTABLE)
|
||||
}
|
||||
|
||||
var downloadResult: RemoteOperationResult<*>? = null
|
||||
try {
|
||||
val ocAccount = getOCAccountForDownload()
|
||||
|
@ -291,15 +297,6 @@ class FileDownloadWorker(
|
|||
}
|
||||
}
|
||||
|
||||
private fun notifyDownloadStart(download: DownloadFileOperation) {
|
||||
lastPercent = 0
|
||||
|
||||
notificationManager.run {
|
||||
prepareForStart(download)
|
||||
setContentIntent(intents.detailsIntent(download), PendingIntent.FLAG_IMMUTABLE)
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private fun getOCAccountForDownload(): OwnCloudAccount {
|
||||
val currentDownloadAccount = currentDownload?.user?.toPlatformAccount()
|
||||
|
@ -368,6 +365,7 @@ class FileDownloadWorker(
|
|||
FileDownloadError.Cancelled -> {
|
||||
context.getString(R.string.downloader_file_download_cancelled)
|
||||
}
|
||||
|
||||
FileDownloadError.Failed -> {
|
||||
context.getString(R.string.downloader_file_download_failed)
|
||||
}
|
||||
|
@ -418,7 +416,7 @@ class FileDownloadWorker(
|
|||
|
||||
if (percent != lastPercent) {
|
||||
notificationManager.run {
|
||||
updateDownloadProgress(filePath, percent, totalToTransfer)
|
||||
updateDownloadProgress(percent, totalToTransfer)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ class FileUploadWorker(
|
|||
backgroundJobManager.logEndOfWorker(BackgroundJobManagerImpl.formatClassTag(this::class), result)
|
||||
result
|
||||
} catch (t: Throwable) {
|
||||
Log_OC.e(TAG, "Error caught at FileUploadWorker " + t.localizedMessage)
|
||||
Log_OC.e(TAG, "Error caught at FileUploadWorker $t")
|
||||
Result.failure()
|
||||
}
|
||||
}
|
||||
|
@ -159,27 +159,41 @@ class FileUploadWorker(
|
|||
val user = userAccountManager.getUser(accountName)
|
||||
setWorkerState(user.get(), uploads)
|
||||
|
||||
for (upload in uploads) {
|
||||
if (isStopped) {
|
||||
break
|
||||
}
|
||||
run uploads@{
|
||||
uploads.forEachIndexed { currentUploadIndex, upload ->
|
||||
if (isStopped) {
|
||||
return@uploads
|
||||
}
|
||||
|
||||
if (user.isPresent) {
|
||||
val uploadFileOperation = createUploadFileOperation(upload, user.get())
|
||||
if (user.isPresent) {
|
||||
val uploadFileOperation = createUploadFileOperation(upload, user.get())
|
||||
|
||||
currentUploadFileOperation = uploadFileOperation
|
||||
val result = upload(uploadFileOperation, user.get())
|
||||
currentUploadFileOperation = null
|
||||
currentUploadFileOperation = uploadFileOperation
|
||||
|
||||
fileUploaderDelegate.sendBroadcastUploadFinished(
|
||||
uploadFileOperation,
|
||||
result,
|
||||
uploadFileOperation.oldFile?.storagePath,
|
||||
context,
|
||||
localBroadcastManager
|
||||
)
|
||||
} else {
|
||||
uploadsStorageManager.removeUpload(upload.uploadId)
|
||||
notificationManager.prepareForStart(
|
||||
uploadFileOperation,
|
||||
cancelPendingIntent = intents.startIntent(uploadFileOperation),
|
||||
startIntent = intents.notificationStartIntent(uploadFileOperation),
|
||||
currentUploadIndex = currentUploadIndex + 1,
|
||||
totalUploadSize = uploads.size
|
||||
)
|
||||
|
||||
val result = upload(uploadFileOperation, user.get())
|
||||
|
||||
currentUploadFileOperation = null
|
||||
|
||||
fileUploaderDelegate.sendBroadcastUploadFinished(
|
||||
uploadFileOperation,
|
||||
result,
|
||||
uploadFileOperation.oldFile?.storagePath,
|
||||
context,
|
||||
localBroadcastManager
|
||||
)
|
||||
} else {
|
||||
uploadsStorageManager.removeUpload(upload.uploadId)
|
||||
}
|
||||
|
||||
notificationManager.dismissWorkerNotifications()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -208,12 +222,6 @@ class FileUploadWorker(
|
|||
private fun upload(uploadFileOperation: UploadFileOperation, user: User): RemoteOperationResult<Any?> {
|
||||
lateinit var result: RemoteOperationResult<Any?>
|
||||
|
||||
notificationManager.prepareForStart(
|
||||
uploadFileOperation,
|
||||
cancelPendingIntent = intents.startIntent(uploadFileOperation),
|
||||
intents.notificationStartIntent(uploadFileOperation)
|
||||
)
|
||||
|
||||
try {
|
||||
val storageManager = uploadFileOperation.storageManager
|
||||
val ocAccount = OwnCloudAccount(user.toPlatformAccount(), context)
|
||||
|
@ -300,8 +308,13 @@ class FileUploadWorker(
|
|||
null
|
||||
}
|
||||
|
||||
notifyForFailedResult(uploadResult.code, conflictResolveIntent, credentialIntent, errorMessage)
|
||||
showNewNotification(uploadFileOperation)
|
||||
notifyForFailedResult(
|
||||
uploadFileOperation,
|
||||
uploadResult.code,
|
||||
conflictResolveIntent,
|
||||
credentialIntent,
|
||||
errorMessage
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -317,14 +330,14 @@ class FileUploadWorker(
|
|||
notificationManager.run {
|
||||
val accountName = currentUploadFileOperation?.user?.accountName
|
||||
val remotePath = currentUploadFileOperation?.remotePath
|
||||
val filename = currentUploadFileOperation?.fileName ?: ""
|
||||
|
||||
updateUploadProgress(filename, percent, currentUploadFileOperation)
|
||||
updateUploadProgress(percent, currentUploadFileOperation)
|
||||
|
||||
if (accountName != null && remotePath != null) {
|
||||
val key: String =
|
||||
FileUploadHelper.buildRemoteName(accountName, remotePath)
|
||||
val boundListener = FileUploadHelper.mBoundListeners[key]
|
||||
val filename = currentUploadFileOperation?.fileName ?: ""
|
||||
|
||||
boundListener?.onTransferProgress(
|
||||
progressRate,
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
package com.nextcloud.client.jobs.upload
|
||||
|
||||
import android.app.Notification
|
||||
import android.app.NotificationManager
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
|
@ -25,10 +24,9 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
private const val ID = 411
|
||||
}
|
||||
|
||||
private var notification: Notification? = null
|
||||
private var notificationBuilder: NotificationCompat.Builder =
|
||||
NotificationUtils.newNotificationBuilder(context, viewThemeUtils).apply {
|
||||
setContentTitle(context.getString(R.string.foreground_service_upload))
|
||||
setTicker(context.getString(R.string.foreground_service_upload))
|
||||
setSmallIcon(R.drawable.notification_icon)
|
||||
setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon))
|
||||
|
||||
|
@ -36,30 +34,34 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD)
|
||||
}
|
||||
}
|
||||
private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
init {
|
||||
notification = notificationBuilder.build()
|
||||
}
|
||||
private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
private var currentOperationTitle: String? = "null"
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
fun prepareForStart(
|
||||
uploadFileOperation: UploadFileOperation,
|
||||
cancelPendingIntent: PendingIntent,
|
||||
startIntent: PendingIntent
|
||||
startIntent: PendingIntent,
|
||||
currentUploadIndex: Int,
|
||||
totalUploadSize: Int
|
||||
) {
|
||||
currentOperationTitle = String.format(
|
||||
context.getString(R.string.upload_notification_manager_start_text),
|
||||
currentUploadIndex,
|
||||
totalUploadSize,
|
||||
uploadFileOperation.fileName
|
||||
)
|
||||
val progressText = String.format(
|
||||
context.getString(R.string.upload_notification_manager_upload_in_progress_text),
|
||||
0
|
||||
)
|
||||
|
||||
notificationBuilder.run {
|
||||
setContentTitle(context.getString(R.string.uploader_upload_in_progress_ticker))
|
||||
setContentText(
|
||||
String.format(
|
||||
context.getString(R.string.uploader_upload_in_progress),
|
||||
0,
|
||||
uploadFileOperation.fileName
|
||||
)
|
||||
)
|
||||
setTicker(context.getString(R.string.foreground_service_upload))
|
||||
setProgress(100, 0, false)
|
||||
setOngoing(true)
|
||||
setContentTitle(currentOperationTitle)
|
||||
setContentText(progressText)
|
||||
setOngoing(false)
|
||||
clearActions()
|
||||
|
||||
addAction(
|
||||
|
@ -76,13 +78,31 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
}
|
||||
}
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
fun updateUploadProgress(percent: Int, currentOperation: UploadFileOperation?) {
|
||||
val progressText = String.format(
|
||||
context.getString(R.string.upload_notification_manager_upload_in_progress_text),
|
||||
percent
|
||||
)
|
||||
|
||||
notificationBuilder.run {
|
||||
setProgress(100, percent, false)
|
||||
setContentTitle(currentOperationTitle)
|
||||
setContentText(progressText)
|
||||
|
||||
showNotification()
|
||||
dismissOldErrorNotification(currentOperation)
|
||||
}
|
||||
}
|
||||
|
||||
fun notifyForFailedResult(
|
||||
uploadFileOperation: UploadFileOperation,
|
||||
resultCode: RemoteOperationResult.ResultCode,
|
||||
conflictsResolveIntent: PendingIntent?,
|
||||
credentialIntent: PendingIntent?,
|
||||
errorMessage: String
|
||||
) {
|
||||
val textId = resultTitle(resultCode)
|
||||
val textId = getFailedResultTitleId(resultCode)
|
||||
|
||||
notificationBuilder.run {
|
||||
setTicker(context.getString(textId))
|
||||
|
@ -106,9 +126,11 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
|
||||
setContentText(errorMessage)
|
||||
}
|
||||
|
||||
showNewNotification(uploadFileOperation)
|
||||
}
|
||||
|
||||
private fun resultTitle(resultCode: RemoteOperationResult.ResultCode): Int {
|
||||
private fun getFailedResultTitleId(resultCode: RemoteOperationResult.ResultCode): Int {
|
||||
val needsToUpdateCredentials = (resultCode == RemoteOperationResult.ResultCode.UNAUTHORIZED)
|
||||
|
||||
return if (needsToUpdateCredentials) {
|
||||
|
@ -128,7 +150,7 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
)
|
||||
}
|
||||
|
||||
fun showNewNotification(operation: UploadFileOperation) {
|
||||
private fun showNewNotification(operation: UploadFileOperation) {
|
||||
notificationManager.notify(
|
||||
NotificationUtils.createUploadNotificationTag(operation.file),
|
||||
FileUploadWorker.NOTIFICATION_ERROR_ID,
|
||||
|
@ -140,18 +162,6 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
notificationManager.notify(ID, notificationBuilder.build())
|
||||
}
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
fun updateUploadProgress(filename: String, percent: Int, currentOperation: UploadFileOperation?) {
|
||||
notificationBuilder.run {
|
||||
setProgress(100, percent, false)
|
||||
val text = String.format(context.getString(R.string.uploader_upload_in_progress), percent, filename)
|
||||
setContentText(text)
|
||||
|
||||
showNotification()
|
||||
dismissOldErrorNotification(currentOperation)
|
||||
}
|
||||
}
|
||||
|
||||
fun dismissOldErrorNotification(operation: UploadFileOperation?) {
|
||||
if (operation == null) {
|
||||
return
|
||||
|
@ -176,10 +186,10 @@ class UploadNotificationManager(private val context: Context, viewThemeUtils: Vi
|
|||
}
|
||||
|
||||
fun notifyPaused(intent: PendingIntent) {
|
||||
notificationBuilder.apply {
|
||||
notificationBuilder.run {
|
||||
setContentTitle(context.getString(R.string.upload_global_pause_title))
|
||||
setTicker(context.getString(R.string.upload_global_pause_title))
|
||||
setOngoing(true)
|
||||
setOngoing(false)
|
||||
setAutoCancel(false)
|
||||
setProgress(0, 0, false)
|
||||
clearActions()
|
||||
|
|
|
@ -650,10 +650,22 @@ public final class DisplayUtils {
|
|||
*/
|
||||
public static Snackbar showSnackMessage(Activity activity, String message) {
|
||||
final Snackbar snackbar = Snackbar.make(activity.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG);
|
||||
var fab = findFABView(activity);
|
||||
if (fab != null && fab.getVisibility() == View.VISIBLE) {
|
||||
snackbar.setAnchorView(fab);
|
||||
}
|
||||
snackbar.show();
|
||||
return snackbar;
|
||||
}
|
||||
|
||||
private static View findFABView(Activity activity) {
|
||||
return activity.findViewById(R.id.fab_main);
|
||||
}
|
||||
|
||||
private static View findFABView(View view) {
|
||||
return view.findViewById(R.id.fab_main);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a temporary message in a {@link Snackbar} bound to the given view.
|
||||
*
|
||||
|
@ -663,6 +675,10 @@ public final class DisplayUtils {
|
|||
*/
|
||||
public static Snackbar showSnackMessage(View view, @StringRes int messageResource) {
|
||||
final Snackbar snackbar = Snackbar.make(view, messageResource, Snackbar.LENGTH_LONG);
|
||||
var fab = findFABView(view.getRootView());
|
||||
if (fab != null && fab.getVisibility() == View.VISIBLE) {
|
||||
snackbar.setAnchorView(fab);
|
||||
}
|
||||
snackbar.show();
|
||||
return snackbar;
|
||||
}
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
<!--
|
||||
~ Nextcloud - Android Client
|
||||
~
|
||||
~ SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH, all rights reserved
|
||||
~ SPDX-FileCopyrightText: 2023-2024 Tobias Kaminsky <tobias@kaminsky.me>
|
||||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH <https://nextcloud.com/trademarks/>
|
||||
~ SPDX-License-Identifier: LicenseRef-NextcloudTrademarks
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
<!--
|
||||
~ Nextcloud - Android Client
|
||||
~
|
||||
~ SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH, all rights reserved
|
||||
~ SPDX-FileCopyrightText: 2021 Tobias Kaminsky <tobias@kaminsky.me>
|
||||
~ SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH <https://nextcloud.com/trademarks/>
|
||||
~ SPDX-License-Identifier: LicenseRef-NextcloudTrademarks
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">فشل التنزيل، قم بتسجيل الدخول مرة أخرى</string>
|
||||
<string name="downloader_download_failed_ticker">فشل التحميل</string>
|
||||
<string name="downloader_download_file_not_found">الملف غير متوفر في الخادم</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% تحميل %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">جارِ التنزيل …</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s مُنزَّلَة</string>
|
||||
|
@ -970,7 +969,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">الإبقاء على الملف في المجلد الأصلي</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">إحذف الملف من المجلد الأصلي</string>
|
||||
<string name="uploader_upload_forbidden_permissions">للرفع إلى هذا المجلد</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% رفع %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">يتم الرفع…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">تم رفع %1$s</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Download failed, log in again</string>
|
||||
<string name="downloader_download_failed_ticker">Download failed</string>
|
||||
<string name="downloader_download_file_not_found">The file is no longer available on the server</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Downloading…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s downloaded</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Keep file in source folder</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Delete file from source folder</string>
|
||||
<string name="uploader_upload_forbidden_permissions">to upload to this folder</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Uploading…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s uploaded</string>
|
||||
|
|
|
@ -227,7 +227,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Stahování se nezdařilo, přihlaste se znovu</string>
|
||||
<string name="downloader_download_failed_ticker">Stahování se nezdařilo</string>
|
||||
<string name="downloader_download_file_not_found">Tento soubor už není na serveru k dispozici</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Stahuje se %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Stahování…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s staženo</string>
|
||||
|
@ -901,7 +900,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Ponechat soubor ve zdrojové složce</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Vymazat soubor ze zdrojové složky</string>
|
||||
<string name="uploader_upload_forbidden_permissions">pro nahrávání do této složky</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Odesílání %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Nahrávání…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s nahráno</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, erneute Anmeldung erforderlich</string>
|
||||
<string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string>
|
||||
<string name="downloader_download_file_not_found">Diese Datei steht auf dem Server nicht mehr zur Verfügung</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Lade herunter…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s heruntergeladen</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Hochladen und im Quellordner behalten</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Hochladen und Datei im Quellordner löschen</string>
|
||||
<string name="uploader_upload_forbidden_permissions">diesen Ordner hochzuladen</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Lade hoch…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s hochgeladen</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">La descarga falló, inicia sesión de nuevo</string>
|
||||
<string name="downloader_download_failed_ticker">Falla en la descarga</string>
|
||||
<string name="downloader_download_file_not_found">El archivo ya no se encuentra disponible en el servidor</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Descargando %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Descargando…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s descargado</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Mantener el archivo en la carpeta de origen</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Borrar el archivo de la carpeta de origen</string>
|
||||
<string name="uploader_upload_forbidden_permissions">para cargar a esta carpeta</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Cargando %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Cargando</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s cargado</string>
|
||||
|
|
|
@ -230,7 +230,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Descarga fallida, vuelve a iniciar sesión</string>
|
||||
<string name="downloader_download_failed_ticker">Fallo al descargar</string>
|
||||
<string name="downloader_download_file_not_found">Este archivo ya no se encuentra en el servidor</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Descargado de %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Descargando…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s descargado</string>
|
||||
|
@ -908,7 +907,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Mantener el archivo en la carpeta original</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Borrar archivo de la carpeta original</string>
|
||||
<string name="uploader_upload_forbidden_permissions">para subir archivos a esta carpeta</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Subiendo %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Subiendo…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s subido</string>
|
||||
|
|
|
@ -231,7 +231,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Deskargak huts egin du, hasi saioa berriz</string>
|
||||
<string name="downloader_download_failed_ticker">Deskargak huts egin du</string>
|
||||
<string name="downloader_download_file_not_found">Fitxategia jadanik ez dago eskuragarri zerbitzarian</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Deskargatzen %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Deskargatzen…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s deskargatuta</string>
|
||||
|
@ -929,7 +928,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Mantendu fitxategia jatorrizko karpetan</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Ezabatu fitxategia jatorrizko karpetatik</string>
|
||||
<string name="uploader_upload_forbidden_permissions">kargatzeko karpeta honetara</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Igotzen %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Kargatzen…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s igota</string>
|
||||
|
|
|
@ -226,7 +226,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">بارگیری شکست خورد. دوباره وارد شوید</string>
|
||||
<string name="downloader_download_failed_ticker">دانلود ناموفق</string>
|
||||
<string name="downloader_download_file_not_found">این فایل دیگر روی سرور وجود ندارد</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% در حال دانلود %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">بارگیری…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$sدانلود شده </string>
|
||||
|
@ -923,7 +922,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">نگهداری فایل در پوشه منبع</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">حذف فایل از پوشه منبع</string>
|
||||
<string name="uploader_upload_forbidden_permissions">برای بارگذاری در این پوشه</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% در حال آپلود%2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">بارگذاری…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s آپلود شده</string>
|
||||
|
|
|
@ -241,7 +241,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Téléchargement échoué, reconnectez-vous</string>
|
||||
<string name="downloader_download_failed_ticker">Le téléchargement a échoué</string>
|
||||
<string name="downloader_download_file_not_found">Ce fichier n’est plus disponible sur le serveur</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">Téléchargement de %2$s : %1$d%% effectués</string>
|
||||
<string name="downloader_download_in_progress_ticker">Réception en cours…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s reçu</string>
|
||||
|
@ -941,7 +940,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Conserver le fichier dans le dossier original</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Supprimer le fichier du dossier original</string>
|
||||
<string name="uploader_upload_forbidden_permissions">d\'envoyer dans ce dossier</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">Téléversement de %2$s : %1$d%%</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Téléversement en cours…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s envoyé</string>
|
||||
|
|
|
@ -221,7 +221,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Scaricamento non riuscito, effettua nuovamente l\'accesso</string>
|
||||
<string name="downloader_download_failed_ticker">Scaricamento non riuscito</string>
|
||||
<string name="downloader_download_file_not_found">Il file non è più disponibile sul server</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Scaricamento di %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Scaricamento in corso…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s scaricato</string>
|
||||
|
@ -885,7 +884,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Mantieni il file nella cartella di origine</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Elimina il file dalla cartella di origine</string>
|
||||
<string name="uploader_upload_forbidden_permissions">per caricare in questa cartella</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Caricamento di %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Caricamento in corso…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s caricato</string>
|
||||
|
|
|
@ -241,7 +241,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Nedlasting mislyktes, prøv igjen</string>
|
||||
<string name="downloader_download_failed_ticker">Nedlasting mislyktes</string>
|
||||
<string name="downloader_download_file_not_found">Filen finnes ikke på serveren lenger</string>
|
||||
<string name="downloader_download_in_progress">%1$d %% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Laster ned %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Laster ned…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s lastet ned</string>
|
||||
|
@ -942,7 +941,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Behold filen i kildemappe</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Slett filen fra kildemappen</string>
|
||||
<string name="uploader_upload_forbidden_permissions">å laste opp i denne mappen</string>
|
||||
<string name="uploader_upload_in_progress">%1$d %% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Laster opp %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Laster opp…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s lastet opp</string>
|
||||
|
|
|
@ -234,7 +234,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Downloaden mislukt, je moet opnieuw inloggen</string>
|
||||
<string name="downloader_download_failed_ticker">Downloaden mislukt</string>
|
||||
<string name="downloader_download_file_not_found">Dit bestand is niet langer beschikbaar op de server</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Downloaden van %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Downloaden…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s gedownload.</string>
|
||||
|
@ -883,7 +882,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Bewaar het bestand in de bronmap</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Verwijder bestand uit bronmap</string>
|
||||
<string name="uploader_upload_forbidden_permissions">om dit bestand in deze map te uploaden</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Uploaden van %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Uploaden…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s geüpload</string>
|
||||
|
|
|
@ -241,7 +241,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Download falhou, logue-se novamente</string>
|
||||
<string name="downloader_download_failed_ticker">Download falhou</string>
|
||||
<string name="downloader_download_file_not_found">Este arquivo não está mais disponível neste servidor</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Baixando %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Baixando…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s baixado</string>
|
||||
|
@ -942,7 +941,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Manter arquivo na pasta de origem</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Excluir arquivo da pasta de origem</string>
|
||||
<string name="uploader_upload_forbidden_permissions">para enviar a esta pasta</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% enviando %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Enviando…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s enviado</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Ошибка скачивания, необходимо авторизоваться</string>
|
||||
<string name="downloader_download_failed_ticker">Сбой при скачивании</string>
|
||||
<string name="downloader_download_file_not_found">Этот файл больше недоступен на сервере</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Скачивается %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Скачивается…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s скачано</string>
|
||||
|
@ -944,7 +943,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Оставить файл в исходной папке</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Удалить файл из исходной папки</string>
|
||||
<string name="uploader_upload_forbidden_permissions">для передачи в эту папку</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% «%2$s»</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Передача…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">Передача файла «%1$s» завершена</string>
|
||||
|
|
|
@ -239,7 +239,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Sťahovanie neúspešné, je potrebné sa znovu prihlásiť</string>
|
||||
<string name="downloader_download_failed_ticker">Stiahnutie zlyhalo</string>
|
||||
<string name="downloader_download_file_not_found">Súbor už na serveri nie je dostupný</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Sťahovanie %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Sťahujem…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s stiahnuté</string>
|
||||
|
@ -940,7 +939,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Ponechaj súbor v pôvodnom priečinku</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Odstráň súbor z pôvodného priečinka</string>
|
||||
<string name="uploader_upload_forbidden_permissions">nahrávať do tohto priečinka</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Odosielam %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Nahrávanie…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s odoslané</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Неуспешно преузимање. Поново се пријавите</string>
|
||||
<string name="downloader_download_failed_ticker">Преузимање није успело</string>
|
||||
<string name="downloader_download_file_not_found">Фајл није више доступан на серверу</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% преузимам %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Преузимам…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s преузето</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Остави фајл у изворној фасцикли</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Избриши фајл из изворне фасцикле</string>
|
||||
<string name="uploader_upload_forbidden_permissions">да отпремите ову фасциклу</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Отпремање %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Отпремам…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s отпремљено</string>
|
||||
|
|
|
@ -241,7 +241,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">Hämtningen misslyckades, logga in igen</string>
|
||||
<string name="downloader_download_failed_ticker">Hämtning misslyckades</string>
|
||||
<string name="downloader_download_file_not_found">Filen är inte längre tillgänglig på servern</string>
|
||||
<string name="downloader_download_in_progress">%1$d%%%2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Hämtar %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">Hämtar…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s hämtad</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Behåll fil i källmappen</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Ta bort fil från källmappen</string>
|
||||
<string name="uploader_upload_forbidden_permissions">att ladda upp denna mapp</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%%%2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Laddar upp %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Laddar upp…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s uppladdad</string>
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
<string name="assistant_screen_top_bar_title">Yardımcı</string>
|
||||
<string name="assistant_screen_unknown_task_status_text">Bilinmiyor</string>
|
||||
<string name="assistant_task_detail_screen_input_button_title">Giriş</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">Çıktı</string>
|
||||
<string name="assistant_task_detail_screen_output_button_title">Çıkış</string>
|
||||
<string name="associated_account_not_found">İlişkili hesap bulunamadı!</string>
|
||||
<string name="auth_access_failed">Erişilemedi: %1$s</string>
|
||||
<string name="auth_account_does_not_exist">Aygıt üzerinde henüz bu hesap açılmamış</string>
|
||||
|
@ -172,6 +172,7 @@
|
|||
<string name="confirmation_remove_folder_alert">%1$s klasörünü ve içindekileri silmek istediğinize emin misiniz?</string>
|
||||
<string name="confirmation_remove_folders_alert">Seçilmiş ögeleri ve içindekileri silmek istediğinize emin misiniz?</string>
|
||||
<string name="confirmation_remove_local">Yalnızca yerel</string>
|
||||
<string name="conflict_dialog_error">Çakışma çözümleme penceresi oluşturulamadı</string>
|
||||
<string name="conflict_file_headline">%1$s dosyası çakışıyor</string>
|
||||
<string name="conflict_local_file">Yerel dosya</string>
|
||||
<string name="conflict_message_description">İki sürümü de saklamayı seçerseniz, yerel dosyanın adına bir numara eklenecek.</string>
|
||||
|
@ -241,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">İndirilemedi, yeniden oturum açmalısınız</string>
|
||||
<string name="downloader_download_failed_ticker">İndirilemedi</string>
|
||||
<string name="downloader_download_file_not_found">Bu dosya artık sunucuda yok</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%%%1$d İndirilen: %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">İndiriliyor …</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s indirildi</string>
|
||||
|
@ -942,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">Kaynak klasördeki dosya tutulsun</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">Dosya kaynak klasörden silinsin</string>
|
||||
<string name="uploader_upload_forbidden_permissions">bu klasöre yükleyemezsiniz</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%%%1$d Yüklenen: %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">Yükleniyor …</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s yüklendi</string>
|
||||
|
|
|
@ -254,7 +254,7 @@
|
|||
<string name="drawer_community">Спільнота</string>
|
||||
<string name="drawer_header_background">Зображення тла верхньої панелі</string>
|
||||
<string name="drawer_item_activities">Події</string>
|
||||
<string name="drawer_item_all_files">Усі файли</string>
|
||||
<string name="drawer_item_all_files">Усі документи</string>
|
||||
<string name="drawer_item_assistant">Помічник</string>
|
||||
<string name="drawer_item_favorites">Із зірочкою</string>
|
||||
<string name="drawer_item_gallery">Зображення та відео</string>
|
||||
|
@ -354,7 +354,7 @@
|
|||
<string name="file_list_empty_favorite_headline">Поки що ви нічого не позначили зірочкою</string>
|
||||
<string name="file_list_empty_favorites_filter_list">Тут можна буде знайти файли та каталоги, які ви позначити зірочкою.</string>
|
||||
<string name="file_list_empty_gallery">Не знайдено ані зображень, ані відео</string>
|
||||
<string name="file_list_empty_headline">Тут немає файлів</string>
|
||||
<string name="file_list_empty_headline">Тут відсутні файли</string>
|
||||
<string name="file_list_empty_headline_search">Жодного збігу у цьому каталозі</string>
|
||||
<string name="file_list_empty_headline_server_search">Жодного збігу</string>
|
||||
<string name="file_list_empty_moving">Тут нічого немає. Ви можете створити каталог.</string>
|
||||
|
|
|
@ -230,7 +230,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">下载失败,请重新登录</string>
|
||||
<string name="downloader_download_failed_ticker">下载失败</string>
|
||||
<string name="downloader_download_file_not_found">该文件在服务器上不可用</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% 正在下载 %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">正在下载…</string>
|
||||
<string name="downloader_download_succeeded_content">已下载了 %1$s</string>
|
||||
|
@ -951,7 +950,6 @@ Nextcloud 是一个私有文件同步、共享和通信服务器。它是自由
|
|||
<string name="uploader_upload_files_behaviour_only_upload">在原文件夹中保留文件</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">从原文件夹中删除文件</string>
|
||||
<string name="uploader_upload_forbidden_permissions">上传到此文件夹</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% 正在上传 %2$s</string>
|
||||
<string name="uploader_upload_in_progress_ticker">正在上传…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">已上传了 %1$s</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">下載失敗,再重新登入</string>
|
||||
<string name="downloader_download_failed_ticker">下載失敗</string>
|
||||
<string name="downloader_download_file_not_found">這個檔案已經不存在於伺服器中</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% 下載中 %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">下載中…</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s 已下載</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">在來源資料夾保留檔案</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">刪除來源資料夾中的檔案</string>
|
||||
<string name="uploader_upload_forbidden_permissions">上傳至此資料夾</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% 上傳 %2$s 中</string>
|
||||
<string name="uploader_upload_in_progress_ticker">上傳中…</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s 已上傳</string>
|
||||
|
|
|
@ -242,7 +242,6 @@
|
|||
<string name="downloader_download_failed_credentials_error">下載失敗,再重新登入</string>
|
||||
<string name="downloader_download_failed_ticker">下載失敗</string>
|
||||
<string name="downloader_download_file_not_found">這個檔案已經不存在於伺服器中</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% 下載中 %2$s</string>
|
||||
<string name="downloader_download_in_progress_ticker">正在下載……</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s 已下載</string>
|
||||
|
@ -943,7 +942,6 @@
|
|||
<string name="uploader_upload_files_behaviour_only_upload">在來源資料夾保留檔案</string>
|
||||
<string name="uploader_upload_files_behaviour_upload_and_delete_from_source">刪除來源資料夾中的檔案</string>
|
||||
<string name="uploader_upload_forbidden_permissions">上傳至此資料夾</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% 上傳 %2$s 中</string>
|
||||
<string name="uploader_upload_in_progress_ticker">正在上傳……</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s 已上傳</string>
|
||||
|
|
|
@ -181,8 +181,11 @@
|
|||
<string name="active_user">Active user</string>
|
||||
<string name="upload_chooser_title">Upload from…</string>
|
||||
<string name="uploader_info_dirname">Folder name</string>
|
||||
|
||||
<string name="upload_notification_manager_start_text" translatable="false">%1$d / %2$d - %3$s</string>
|
||||
<string name="upload_notification_manager_upload_in_progress_text" translatable="false">%1$d%%</string>
|
||||
|
||||
<string name="uploader_upload_in_progress_ticker">Uploading…</string>
|
||||
<string name="uploader_upload_in_progress">%1$d%% %2$s</string>
|
||||
<string name="uploader_upload_in_progress_content">%1$d%% Uploading %2$s</string>
|
||||
<string name="uploader_upload_succeeded_content_single">%1$s uploaded</string>
|
||||
<string name="uploader_upload_failed_ticker">Upload failed</string>
|
||||
|
@ -211,8 +214,11 @@
|
|||
<string name="uploads_view_upload_status_fetching_server_version">Fetching server version…</string>
|
||||
<string name="uploads_view_later_waiting_to_upload">Waiting to upload</string>
|
||||
<string name="uploads_view_group_header" translatable="false">%1$s (%2$d)</string>
|
||||
|
||||
<string name="downloader_notification_manager_download_text" translatable="false">%1$d / %2$d - %3$s</string>
|
||||
<string name="downloader_notification_manager_in_progress_text" translatable="false">%1$d%%</string>
|
||||
|
||||
<string name="downloader_download_in_progress_ticker">Downloading…</string>
|
||||
<string name="downloader_download_in_progress">%1$d%% %2$s</string>
|
||||
<string name="downloader_download_in_progress_content">%1$d%% Downloading %2$s</string>
|
||||
<string name="downloader_download_succeeded_ticker">Downloaded</string>
|
||||
<string name="downloader_download_succeeded_content">%1$s downloaded</string>
|
||||
|
|
Loading…
Reference in New Issue