diff --git a/app/src/main/java/com/nextcloud/client/files/downloader/FileTransferService.kt b/app/src/main/java/com/nextcloud/client/files/downloader/FileTransferService.kt index 87ff143f05..220230d43b 100644 --- a/app/src/main/java/com/nextcloud/client/files/downloader/FileTransferService.kt +++ b/app/src/main/java/com/nextcloud/client/files/downloader/FileTransferService.kt @@ -22,8 +22,6 @@ package com.nextcloud.client.files.downloader import android.app.Service import android.content.Context import android.content.Intent -import android.content.pm.ServiceInfo -import android.os.Build import android.os.IBinder import com.nextcloud.client.account.User import com.nextcloud.client.core.AsyncRunner @@ -33,7 +31,9 @@ import com.nextcloud.client.logger.Logger import com.nextcloud.client.network.ClientFactory import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.notifications.AppNotificationManager +import com.nextcloud.utils.ForegroundServiceHelper import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.datamodel.ForegroundServiceType import com.owncloud.android.datamodel.UploadsStorageManager import dagger.android.AndroidInjection import javax.inject.Inject @@ -109,18 +109,12 @@ class FileTransferService : Service() { } if (!isRunning) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - startForeground( - AppNotificationManager.TRANSFER_NOTIFICATION_ID, - notificationsManager.buildDownloadServiceForegroundNotification(), - ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC - ) - } else { - startForeground( - AppNotificationManager.TRANSFER_NOTIFICATION_ID, - notificationsManager.buildDownloadServiceForegroundNotification() - ) - } + ForegroundServiceHelper.startService( + this, + AppNotificationManager.TRANSFER_NOTIFICATION_ID, + notificationsManager.buildDownloadServiceForegroundNotification(), + ForegroundServiceType.DataSync + ) } val request: Request = intent.getParcelableExtra(EXTRA_REQUEST)!! diff --git a/app/src/main/java/com/nextcloud/client/media/PlayerService.kt b/app/src/main/java/com/nextcloud/client/media/PlayerService.kt index 3cfd22c9c6..5b2b190975 100644 --- a/app/src/main/java/com/nextcloud/client/media/PlayerService.kt +++ b/app/src/main/java/com/nextcloud/client/media/PlayerService.kt @@ -22,7 +22,6 @@ package com.nextcloud.client.media import android.app.PendingIntent import android.app.Service import android.content.Intent -import android.content.pm.ServiceInfo import android.media.AudioManager import android.os.Build import android.os.Bundle @@ -32,7 +31,9 @@ import android.widget.Toast import androidx.core.app.NotificationCompat import com.nextcloud.client.account.User import com.nextcloud.client.network.ClientFactory +import com.nextcloud.utils.ForegroundServiceHelper import com.owncloud.android.R +import com.owncloud.android.datamodel.ForegroundServiceType import com.owncloud.android.datamodel.OCFile import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.theme.ViewThemeUtils @@ -173,15 +174,12 @@ class PlayerService : Service() { notificationBuilder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_MEDIA) } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - startForeground( - R.string.media_notif_ticker, - notificationBuilder.build(), - ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK - ) - } else { - startForeground(R.string.media_notif_ticker, notificationBuilder.build()) - } + ForegroundServiceHelper.startService( + this, + R.string.media_notif_ticker, + notificationBuilder.build(), + ForegroundServiceType.MediaPlayback + ) isRunning = true } diff --git a/app/src/main/java/com/nextcloud/utils/ForegroundServiceHelper.kt b/app/src/main/java/com/nextcloud/utils/ForegroundServiceHelper.kt new file mode 100644 index 0000000000..9dd7d8008c --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/ForegroundServiceHelper.kt @@ -0,0 +1,48 @@ +/* + * Nextcloud Android client application + * + * @author Alper Ozturk + * Copyright (C) 2023 Alper Ozturk + * Copyright (C) 2023 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.utils + +import android.app.Notification +import android.app.Service +import android.os.Build +import androidx.core.app.ServiceCompat +import com.owncloud.android.datamodel.ForegroundServiceType + +object ForegroundServiceHelper { + fun startService( + service: Service, + id: Int, + notification: Notification, + foregroundServiceType: ForegroundServiceType + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceCompat.startForeground( + service, + id, + notification, + foregroundServiceType.getId() + ) + } else { + service.startForeground(id, notification) + } + } +} diff --git a/app/src/main/java/com/owncloud/android/datamodel/ForegroundServiceType.kt b/app/src/main/java/com/owncloud/android/datamodel/ForegroundServiceType.kt new file mode 100644 index 0000000000..986197ea36 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/datamodel/ForegroundServiceType.kt @@ -0,0 +1,45 @@ +/* + * Nextcloud Android client application + * + * @author Alper Ozturk + * Copyright (C) 2023 Alper Ozturk + * Copyright (C) 2023 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.datamodel + +import android.content.pm.ServiceInfo +import android.os.Build +import androidx.annotation.RequiresApi + +/** + * Enum to specify the type of foreground service. + * Use this enum when starting a foreground service to indicate its purpose. + * Note: Foreground service type is not available for older Android versions. + * This wrapper is designed for compatibility on those versions. + */ +enum class ForegroundServiceType { + DataSync, MediaPlayback; + + @RequiresApi(Build.VERSION_CODES.Q) + fun getId(): Int { + return if (this == DataSync) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + } else { + ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK + } + } +} diff --git a/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java b/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java index 288436788f..1533cd5346 100644 --- a/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java +++ b/app/src/main/java/com/owncloud/android/files/services/FileDownloader.java @@ -28,10 +28,8 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; -import android.content.pm.ServiceInfo; import android.graphics.BitmapFactory; import android.os.Binder; -import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -44,9 +42,11 @@ import com.nextcloud.client.account.User; import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.files.downloader.DownloadTask; import com.nextcloud.java.util.Optional; +import com.nextcloud.utils.ForegroundServiceHelper; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.ForegroundServiceType; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.UploadsStorageManager; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -83,7 +83,6 @@ import java.util.Vector; import javax.inject.Inject; import androidx.core.app.NotificationCompat; -import androidx.core.app.ServiceCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import dagger.android.AndroidInjection; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -156,7 +155,7 @@ public class FileDownloader extends Service mBinder = new FileDownloaderBinder(); NotificationCompat.Builder builder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils).setContentTitle( - getApplicationContext().getResources().getString(R.string.app_name)) + getApplicationContext().getResources().getString(R.string.app_name)) .setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_download)) .setSmallIcon(R.drawable.notification_icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon)); @@ -195,23 +194,15 @@ public class FileDownloader extends Service /** * Entry point to add one or several files to the queue of downloads. - * - * New downloads are added calling to startService(), resulting in a call to this method. - * This ensures the service will keep on working although the caller activity goes away. + *

+ * New downloads are added calling to startService(), resulting in a call to this method. This ensures the service + * will keep on working although the caller activity goes away. */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log_OC.d(TAG, "Starting command with id " + startId); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - ServiceCompat.startForeground( - this, - FOREGROUND_SERVICE_ID, - mNotification, - ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); - } else { - startForeground(FOREGROUND_SERVICE_ID, mNotification); - } + ForegroundServiceHelper.INSTANCE.startService(this, FOREGROUND_SERVICE_ID, mNotification, ForegroundServiceType.DataSync); if (intent == null || !intent.hasExtra(EXTRA_USER) || !intent.hasExtra(EXTRA_FILE)) { Log_OC.e(TAG, "Not enough information provided in intent"); diff --git a/app/src/main/java/com/owncloud/android/files/services/FileUploader.java b/app/src/main/java/com/owncloud/android/files/services/FileUploader.java index a377e16ed7..51e6e55b15 100644 --- a/app/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/app/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -37,7 +37,6 @@ import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.pm.ServiceInfo; import android.graphics.BitmapFactory; import android.os.Binder; import android.os.Build; @@ -59,10 +58,12 @@ import com.nextcloud.client.network.Connectivity; import com.nextcloud.client.network.ConnectivityService; import com.nextcloud.client.utils.FileUploaderDelegate; import com.nextcloud.java.util.Optional; +import com.nextcloud.utils.ForegroundServiceHelper; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.ForegroundServiceType; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.datamodel.UploadsStorageManager; @@ -315,11 +316,7 @@ public class FileUploader extends Service public int onStartCommand(Intent intent, int flags, int startId) { Log_OC.d(TAG, "Starting command with id " + startId); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - startForeground(FOREGROUND_SERVICE_ID, mNotification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); - } else { - startForeground(FOREGROUND_SERVICE_ID, mNotification); - } + ForegroundServiceHelper.INSTANCE.startService(this, FOREGROUND_SERVICE_ID, mNotification, ForegroundServiceType.DataSync); if (intent == null) { Log_OC.e(TAG, "Intent is null"); @@ -389,7 +386,7 @@ public class FileUploader extends Service List requestedUploads, boolean onWifiOnly, boolean whileChargingOnly - ) { + ) { String[] localPaths = null; String[] remotePaths = null; String[] mimeTypes = null; @@ -428,7 +425,7 @@ public class FileUploader extends Service remotePaths[i], localPaths[i], mimeTypes != null ? mimeTypes[i] : null - ); + ); if (files[i] == null) { Log_OC.e(TAG, "obtainNewOCFileToUpload() returned null for remotePaths[i]:" + remotePaths[i] + " and localPaths[i]:" + localPaths[i]); @@ -528,7 +525,7 @@ public class FileUploader extends Service user.getAccountName(), file.getRemotePath(), newUpload - ); + ); if (putResult != null) { requestedUploads.add(putResult.first); @@ -575,7 +572,7 @@ public class FileUploader extends Service user.getAccountName(), upload.getRemotePath(), newUpload - ); + ); if (putResult != null) { String uploadKey = putResult.first; requestedUploads.add(uploadKey); @@ -717,12 +714,12 @@ public class FileUploader extends Service */ private void notifyUploadStart(UploadFileOperation upload) { // / create status notification with a progress bar - Intent notificationActionIntent = new Intent(getApplicationContext(),UploadNotificationActionReceiver.class); - notificationActionIntent.putExtra(EXTRA_ACCOUNT_NAME,upload.getUser().getAccountName()); - notificationActionIntent.putExtra(EXTRA_REMOTE_PATH,upload.getRemotePath()); + Intent notificationActionIntent = new Intent(getApplicationContext(), UploadNotificationActionReceiver.class); + notificationActionIntent.putExtra(EXTRA_ACCOUNT_NAME, upload.getUser().getAccountName()); + notificationActionIntent.putExtra(EXTRA_REMOTE_PATH, upload.getRemotePath()); notificationActionIntent.setAction(ACTION_CANCEL_BROADCAST); - PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),secureRandomGenerator.nextInt(),notificationActionIntent, PendingIntent.FLAG_IMMUTABLE); + PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), secureRandomGenerator.nextInt(), notificationActionIntent, PendingIntent.FLAG_IMMUTABLE); mLastPercent = 0; mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, viewThemeUtils); mNotificationBuilder @@ -735,7 +732,7 @@ public class FileUploader extends Service String.format(getString(R.string.uploader_upload_in_progress_content), 0, upload.getFileName()) ) .clearActions() // to make sure there is only one action - .addAction(R.drawable.ic_action_cancel_grey,getApplicationContext().getString(R.string.common_cancel),pendingIntent); + .addAction(R.drawable.ic_action_cancel_grey, getApplicationContext().getString(R.string.common_cancel), pendingIntent); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -773,7 +770,7 @@ public class FileUploader extends Service long totalTransferredSoFar, long totalToTransfer, String filePath - ) { + ) { int percent = (int) (100.0 * ((double) totalTransferredSoFar) / ((double) totalToTransfer)); if (percent != mLastPercent) { mNotificationBuilder.setProgress(100, percent, false); @@ -839,11 +836,11 @@ public class FileUploader extends Service Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra( AuthenticatorActivity.EXTRA_ACCOUNT, upload.getUser().toPlatformAccount() - ); + ); 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); @@ -853,7 +850,7 @@ public class FileUploader extends Service (int) System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE - )); + )); } else { Intent intent; if (uploadResult.getCode() == ResultCode.SYNC_CONFLICT) { @@ -1179,11 +1176,11 @@ public class FileUploader extends Service */ public void cancel(String accountName, String remotePath, @Nullable ResultCode resultCode) { // Cancel for Android version >= Android 11 - if (useFilesUploadWorker(getApplicationContext())){ - try{ + if (useFilesUploadWorker(getApplicationContext())) { + try { new FilesUploadHelper().cancelFileUpload(remotePath, accountManager.getUser(accountName).get()); - }catch(NoSuchElementException e){ - Log_OC.e(TAG,"Error cancelling current upload because user does not exist!"); + } catch (NoSuchElementException e) { + Log_OC.e(TAG, "Error cancelling current upload because user does not exist!"); } } else { // Cancel for Android version <= Android 10 @@ -1222,7 +1219,7 @@ public class FileUploader extends Service cancelPendingUploads(accountName); if (useFilesUploadWorker(getApplicationContext())) { new FilesUploadHelper().restartUploadJob(accountManager.getUser(accountName).get()); - }else{ + } else { if (mCurrentUpload != null && mCurrentUpload.getUser().nameEquals(accountName)) { mCurrentUpload.cancel(ResultCode.CANCELLED); } @@ -1273,7 +1270,7 @@ public class FileUploader extends Service OnDatatransferProgressListener listener, User user, OCFile file - ) { + ) { if (user == null || file == null || listener == null) { return; } @@ -1291,7 +1288,7 @@ public class FileUploader extends Service public void addDatatransferProgressListener( OnDatatransferProgressListener listener, OCUpload ocUpload - ) { + ) { if (ocUpload == null || listener == null) { return; } @@ -1311,7 +1308,7 @@ public class FileUploader extends Service OnDatatransferProgressListener listener, User user, OCFile file - ) { + ) { if (user == null || file == null || listener == null) { return; } @@ -1331,7 +1328,7 @@ public class FileUploader extends Service public void removeDatatransferProgressListener( OnDatatransferProgressListener listener, OCUpload ocUpload - ) { + ) { if (ocUpload == null || listener == null) { return; } @@ -1348,7 +1345,7 @@ public class FileUploader extends Service long totalTransferredSoFar, long totalToTransfer, String fileName - ) { + ) { String key = buildRemoteName(mCurrentUpload.getUser().getAccountName(), mCurrentUpload.getFile().getRemotePath()); OnDatatransferProgressListener boundListener = mBoundListeners.get(key); @@ -1373,7 +1370,7 @@ public class FileUploader extends Service mCurrentUpload.getUser().getAccountName(), mCurrentUpload.getFile().getRemotePath(), cancelReason - ); + ); } } } @@ -1444,11 +1441,13 @@ public class FileUploader extends Service if (ACTION_CANCEL_BROADCAST.equals(action)) { Log_OC.d(TAG, "Cancel broadcast received for file " + remotePath + " at " + System.currentTimeMillis()); - if (accountName == null || remotePath == null) return; + if (accountName == null || remotePath == null) { + return; + } FileUploaderBinder uploadBinder = (FileUploaderBinder) mBinder; uploadBinder.cancel(accountName, remotePath, null); - }else if(ACTION_PAUSE_BROADCAST.equals(action)){ + } else if (ACTION_PAUSE_BROADCAST.equals(action)) { } else { Log_OC.d(TAG, "Unknown action to perform as UploadNotificationActionReceiver."); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 7a1b96cf4a..3d4aa776eb 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -66,6 +66,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; 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.resources.files.model.ServerFileInterface; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.operations.CreateShareViaLinkOperation; @@ -709,7 +710,7 @@ public abstract class FileActivity extends DrawerActivity snackbar.show(); } - public static void showShareLinkDialog(FileActivity activity, OCFile file, String link) { + public static void showShareLinkDialog(FileActivity activity, ServerFileInterface file, String link) { // Create dialog to allow the user choose an app to send the link Intent intentToShareLink = new Intent(Intent.ACTION_SEND); @@ -780,9 +781,11 @@ public abstract class FileActivity extends DrawerActivity } public void refreshList() { - final Fragment fileListFragment = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES); - if (fileListFragment != null) { - ((OCFileListFragment) fileListFragment).onRefresh(); + final Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES); + if (fragment instanceof OCFileListFragment listFragment) { + listFragment.onRefresh(); + } else if (fragment instanceof FileDetailFragment detailFragment) { + detailFragment.goBackToOCFileListFragment(); } } @@ -864,8 +867,7 @@ public abstract class FileActivity extends DrawerActivity if (fragment instanceof FileDetailSharingFragment) { return (FileDetailSharingFragment) fragment; - } else if (fragment instanceof FileDetailFragment) { - FileDetailFragment fileDetailFragment = (FileDetailFragment) fragment; + } else if (fragment instanceof FileDetailFragment fileDetailFragment) { return fileDetailFragment.getFileDetailSharingFragment(); } else { return null; diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 5b0908e037..11957f635b 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -844,7 +844,6 @@ public class FileDisplayActivity extends FileActivity */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE__SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 5a16f99fb6..79ecee98d9 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -195,6 +195,10 @@ public class FileDetailFragment extends FileFragment implements OnClickListener, return ((FileDetailTabAdapter) binding.pager.getAdapter()).getFileDetailActivitiesFragment(); } + public void goBackToOCFileListFragment() { + requireActivity().onBackPressed(); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index d065216c0d..0022382a96 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -18,6 +18,7 @@ Kopírovať Nový priečinok Presunúť + Presunúť alebo Kopírovať Otvoriť pomocou Hľadať Podrobnosti @@ -32,6 +33,7 @@ Aktivita Pridať ďalší odkaz Pridajte nový odkaz na verejné zdieľanie + Pridať nový zabezpečený file drop Pridaj do %1$s Rozšírené nastavenia Povoliť sprístupňovanie ďalej @@ -157,6 +159,8 @@ Lokálny súbor Ak vyberiete obe verzie, miestny súbor bude mať k svojmu názvu pridané číslo. Súbor na serveri + Záloha kontaktov + Vyžaduje sa prístup ku kontaktom Používateľská ikona pre zoznam kontaktov Žiadne povolenia neboli udelené, nič nebolo importnuté. Kontakty @@ -202,14 +206,21 @@ Nekontrolovať duplicity Algoritmus digest nie je na vašom telefóne dostupný. Prihlásenie pomocou priameho odkazu zlyhalo! + Prihlásiť sa s %1$s do %2$s Zakázať Odmietnuť Odmietnuť upozornenie Zobrazí vaše prístupové heslo o 12-tich slovách Nerušiť + Viacero obrázkov + PDF súbor + Vyberte typ exportu + Generovanie PDF zlyhalo + Generuje sa PDF... Hotové Nemazať Nieje možné vytvoriť lokálny súbor + Nesprávny názov pre lokálny súbor Stiahnuť poslednú vývojársku verziu Nepodarilo sa stiahnuť %1$s Sťahovanie neúspešné, je potrebné sa znovu prihlásiť @@ -227,6 +238,7 @@ Všetky súbory Obľúbené Média + Skupinové priečinky Domov Upozornenia V zariadení @@ -240,10 +252,14 @@ %1$s použitých Automatické nahratie E2E zatiaľ nie je nastavené + Nie je možné bez internetového pripojenia Viac Poznámky Rozhovor + Ďalšie Nextcloud aplikácie Nextcloud poznámky + Nextcloud Talk + Nepodarilo sa vybrať e-mailovú adresu. Nastaviť ako zašifrované Nastavenie šifrovania Dešifrujem… @@ -274,7 +290,9 @@ Nahlásiť chybu? (vyžaduje účet na Githube) Chyba pri získavaní súboru Chyba pri načítaní šablón + Chyba pri zobrazovaní dialogu nastavenia šifrovania! Chyba pri otváraní fotoaparátu + Chyba pri spustení skenovania dokumentu Účty Názov úlohy Pokrok @@ -371,12 +389,14 @@ Názov súboru Majte svoje dáta pod vlastnou kontrolou a zabezpečené Bezpečná kolaborácia&výmena súborov + Jednoduchý webmail, kalendár & kontakty Zdieľanie obrazovky, online meetingy & web konferencie Priečinok už existuje Vytvoriť Nie sú tu žiadne priečinky Vybrať Vyberte cieľový priečinok + Kopírovať Presunúť Nemáte oprávnenie %s kopírovať súbor @@ -402,6 +422,19 @@ Ikona pre prázdny zoznam Ikona widgetu na hlavnom paneli Ikona položky ovládacieho panelu + upravené + Preklopiť horizontálne + Preklopiť vertikálne + Otočť v protismere hodinových ručičiek + Otočiť v smere hodinových ručičiek + Nie je možné upraviť obrázok + Detaily súboru + Podmienky snímania + ƒ/%s + ISO %s + %s MP + %s mm + %s s v priečinku %1$s Nahrať aj existujúce súbory Nahrať iba počas nabíjania @@ -429,6 +462,7 @@ Zamknuté od aplikácie %1$s %1$s Android app logs Aplikácia na odoslanie logov nenájdená. Prosím nainštalujte emailovú aplikáciu. + Prihlásený ako %1$s Prihlásiť sa Odkaz k vašemu %1$s webovému rozhraniu keď ho otvoríte v prehliadači. Zmazať záznamy @@ -481,6 +515,7 @@ Neexistuje žiadny kalendár Aplikácia pre prácu s e-mailovými adresami nenájdená Žiadne položky + Nie je dostupná žiadna aplikácia na spracovanie máp. Povolený je iba jeden účet Aplikácia na prácu s PDF nenájdená Nie je k dispozícii žiadna aplikácia na odosielanie vybratých súborov @@ -519,6 +554,7 @@ Bezpečnostný kód odstránený Bezpečnostný kód uložený Nesprávne heslo + Nepodarilo sa otvoriť heslom chránený PDF súbor. Prosím, použite externý PDF prehliadač. Klepnutím na stránku priblížite Povoliť Odmietnuť @@ -555,6 +591,7 @@ Viac Denná záloha vašeho kalendára & kontaktov Denná záloha vašich kontaktov + Neočakávaná chyba pri nastavovaní DAVx5 (predtým známy ako DAVdroid) End-to-end šifrovanie je nastavené! E2E mnemotechnické Pre zobrazenie mnemotechnické, zapnite prihlasovacie údaje zariadenia. @@ -565,7 +602,9 @@ Podmienky používania Pôvodný súbor bude… Pôvodný súbor bude… + Uložiť v podpriečinkoch podľa dátumu Použi podpriečinky + Možnosti podpriečinka Pridať end-to-end šifrovanie do tohto klienta Licencia Prístupový kód apky @@ -579,6 +618,8 @@ Odporučiť priateľom Lokálne odstrániť šifrovanie Nastaviť šifrovanie end-to-end + Zobraziť prepínač aplikácií + Návrhy Nextcloud aplikácií v navigačnom záhlaví Zobraziť skryté súbory Získajte zdrojový kód Priečinok dátového úložiska @@ -606,7 +647,11 @@ Znovu načítať (vzdialené) Nepodarilo sa nájsť súbor + Môžete odstrániť end-to-end šifrovanie lokálne na tomto klientovi. + Môžete odstrániť end-to-end šifrovanie lokálne na tomto klientovi. Šifrované súbory zostanú na serveri, ale už nebudú synchronizované s týmto počítačom. Zmazanie zlyhalo + Odstrániť lokálny účet + Odstrániť účet zo zariadenia a odstrániť všetky lokálne súbory Odstránenie upozornenia zlyhalo. Odstrániť Zmazané @@ -614,6 +659,8 @@ Nepodarilo sa premenovať lokálnu kópiu, skúste iné meno Premenovanie sa nepodarilo, meno sa už používa Žiadosť o zmazanie účtu + Žiadosť o zmazanie + Žiadosť o trvalé odstránenie účtu poskytovateľom Opätovné sprístupňovanie nie je povolené Sprístupnenie už sprístupnenej položky nie je povolené Obrázok v inom rozlíšení nedostupný. Stiahnuť pôvodný obrázok? @@ -624,6 +671,7 @@ Získava sa súbor… Nepodarilo sa načítať dokument! Prihlásiť sa pomocou QR kódu + Skenovať stránku Chránte vaše údaje Nástroje pre produktivitu s vlastným hosťovaním Prehliadajte a zdieľajte @@ -650,6 +698,7 @@ Použiť obrázok ako Nastaviť stav Nastaviť správu o stave + Počas nastavovania end-to-end šifrovania dostanete náhodný 12-slovový mnemotechnický záznam, ktorý budete potrebovať na otvorenie svojich súborov na iných zariadeniach. Tento záznam bude uložený iba na tomto zariadení a môže byť znovu zobrazený na tejto obrazovke. Prosím, zapíšte si ho na bezpečné miesto! Zdieľať Zdieľať & Kopírovať Odkaz Sprístupnenie @@ -674,6 +723,7 @@ Chránené heslom Môže upravovať Vložiť súbor + Zabezpečený file drop Iba pre čítanie Zdieľať oprávnenia %1$s (vzdialený) @@ -749,6 +799,8 @@ Vnútorné streamovanie nie je možné Médium si namiesto toho stiahnite alebo použite externú aplikáciu. Striktný mód: HTTP spojenie nie je povolené! + Rok/Mesiac/Deň + Rok/Mesiac Rok \"%1$s\" vám bol sprístupnený %1$s vám sprístupnil \"%2$s\" @@ -788,6 +840,7 @@ Náhľad Náhľad existujúceho súboru Náhľad nového súboru + Načítavanie trvá dlhšie ako sa očakávalo Dnes Zmazané súbory Žiadne zmazané súbory @@ -831,6 +884,7 @@ Uzamknutie priečinka zlyhalo Šifrovanie je možné iba pri >= Android 5.0 Pre skopírovanie vybratých súborov do adresára %1$s nie je dostatok voľného miesta. Chcete ich namiesto toho presunúť? + Kapacita úložiska prekročená Naskenujte dokument z fotoaparátu Chyba synchronizácie, prosím vyriešte manuálne Neznáma chyba @@ -899,7 +953,9 @@ Počkajte chvíľu… Overujem uložené prihlasovacie údaje Kopírovanie súboru z privátneho úložiska + Pre prihlásenie prosím aktualizujte aplikáciu Android System WebView Aktualizovať + Aktualizujte Android System WebView Obrázok čo je nové Preskočiť Nové v %1$s diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index acd01625d1..f23fe21848 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -885,6 +885,7 @@ Misslyckades låsa mappen Kryptering är endast möjlig med >= Android 5.0 Otillräckligt utrymme förhindrar kopiering av de valda filerna till %1$s -mappen. Vill du flytta dem dit i stället? + Lagringskvot överskriden Slams dokument från kamera Synkroniseringskonflikt, lös problemet manuellt Okänt fel diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index a5b71a08f0..fa17990697 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 9 errors and 75 warnings + Lint Report: 3 errors and 75 warnings