Merge remote-tracking branch 'origin/master' into dev

This commit is contained in:
Tobias Kaminsky 2023-12-08 03:36:42 +01:00
commit b36caee4c7
12 changed files with 217 additions and 80 deletions

View file

@ -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)!!

View file

@ -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
}

View file

@ -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 <https://www.gnu.org/licenses/>.
*/
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)
}
}
}

View file

@ -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 <https://www.gnu.org/licenses/>.
*/
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
}
}
}

View file

@ -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.
* <p>
* 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");

View file

@ -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<String> 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.");

View file

@ -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;

View file

@ -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)) {

View file

@ -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);

View file

@ -18,6 +18,7 @@
<string name="actionbar_copy">Kopírovať</string>
<string name="actionbar_mkdir">Nový priečinok</string>
<string name="actionbar_move">Presunúť</string>
<string name="actionbar_move_or_copy">Presunúť alebo Kopírovať</string>
<string name="actionbar_open_with">Otvoriť pomocou</string>
<string name="actionbar_search">Hľadať</string>
<string name="actionbar_see_details">Podrobnosti</string>
@ -32,6 +33,7 @@
<string name="activity_icon">Aktivita</string>
<string name="add_another_public_share_link">Pridať ďalší odkaz</string>
<string name="add_new_public_share">Pridajte nový odkaz na verejné zdieľanie</string>
<string name="add_new_secure_file_drop">Pridať nový zabezpečený file drop</string>
<string name="add_to_cloud">Pridaj do %1$s</string>
<string name="advanced_settings">Rozšírené nastavenia</string>
<string name="allow_resharing">Povoliť sprístupňovanie ďalej</string>
@ -157,6 +159,8 @@
<string name="conflict_local_file">Lokálny súbor</string>
<string name="conflict_message_description">Ak vyberiete obe verzie, miestny súbor bude mať k svojmu názvu pridané číslo.</string>
<string name="conflict_server_file">Súbor na serveri</string>
<string name="contact_backup_title">Záloha kontaktov</string>
<string name="contact_no_permission">Vyžaduje sa prístup ku kontaktom</string>
<string name="contactlist_item_icon">Používateľská ikona pre zoznam kontaktov</string>
<string name="contactlist_no_permission">Žiadne povolenia neboli udelené, nič nebolo importnuté.</string>
<string name="contacts">Kontakty</string>
@ -202,14 +206,21 @@
<string name="did_not_check_for_dupes">Nekontrolovať duplicity</string>
<string name="digest_algorithm_not_available">Algoritmus digest nie je na vašom telefóne dostupný.</string>
<string name="direct_login_failed">Prihlásenie pomocou priameho odkazu zlyhalo!</string>
<string name="direct_login_text">Prihlásiť sa s %1$s do %2$s</string>
<string name="disable_new_media_folder_detection_notifications">Zakázať</string>
<string name="dismiss">Odmietnuť</string>
<string name="dismiss_notification_description">Odmietnuť upozornenie</string>
<string name="displays_mnemonic">Zobrazí vaše prístupové heslo o 12-tich slovách</string>
<string name="dnd">Nerušiť</string>
<string name="document_scan_export_dialog_images">Viacero obrázkov</string>
<string name="document_scan_export_dialog_pdf">PDF súbor</string>
<string name="document_scan_export_dialog_title">Vyberte typ exportu</string>
<string name="document_scan_pdf_generation_failed">Generovanie PDF zlyhalo</string>
<string name="document_scan_pdf_generation_in_progress">Generuje sa PDF...</string>
<string name="done">Hotové</string>
<string name="dontClear">Nemazať</string>
<string name="download_cannot_create_file">Nieje možné vytvoriť lokálny súbor</string>
<string name="download_download_invalid_local_file_name">Nesprávny názov pre lokálny súbor</string>
<string name="download_latest_dev_version">Stiahnuť poslednú vývojársku verziu</string>
<string name="downloader_download_failed_content">Nepodarilo sa stiahnuť %1$s</string>
<string name="downloader_download_failed_credentials_error">Sťahovanie neúspešné, je potrebné sa znovu prihlásiť</string>
@ -227,6 +238,7 @@
<string name="drawer_item_all_files">Všetky súbory</string>
<string name="drawer_item_favorites">Obľúbené</string>
<string name="drawer_item_gallery">Média</string>
<string name="drawer_item_groupfolders">Skupinové priečinky</string>
<string name="drawer_item_home">Domov</string>
<string name="drawer_item_notifications">Upozornenia</string>
<string name="drawer_item_on_device">V zariadení</string>
@ -240,10 +252,14 @@
<string name="drawer_quota_unlimited">%1$s použitých</string>
<string name="drawer_synced_folders">Automatické nahratie</string>
<string name="e2e_not_yet_setup">E2E zatiaľ nie je nastavené</string>
<string name="e2e_offline">Nie je možné bez internetového pripojenia</string>
<string name="ecosystem_apps_display_more">Viac</string>
<string name="ecosystem_apps_display_notes">Poznámky</string>
<string name="ecosystem_apps_display_talk">Rozhovor</string>
<string name="ecosystem_apps_more">Ďalšie Nextcloud aplikácie</string>
<string name="ecosystem_apps_notes">Nextcloud poznámky</string>
<string name="ecosystem_apps_talk">Nextcloud Talk</string>
<string name="email_pick_failed">Nepodarilo sa vybrať e-mailovú adresu.</string>
<string name="encrypted">Nastaviť ako zašifrované</string>
<string name="end_to_end_encryption_confirm_button">Nastavenie šifrovania</string>
<string name="end_to_end_encryption_decrypting">Dešifrujem…</string>
@ -274,7 +290,9 @@
<string name="error_report_issue_text">Nahlásiť chybu? (vyžaduje účet na Githube)</string>
<string name="error_retrieving_file">Chyba pri získavaní súboru</string>
<string name="error_retrieving_templates">Chyba pri načítaní šablón</string>
<string name="error_showing_encryption_dialog">Chyba pri zobrazovaní dialogu nastavenia šifrovania!</string>
<string name="error_starting_direct_camera_upload">Chyba pri otváraní fotoaparátu</string>
<string name="error_starting_doc_scan">Chyba pri spustení skenovania dokumentu</string>
<string name="etm_accounts">Účty</string>
<string name="etm_background_job_name">Názov úlohy</string>
<string name="etm_background_job_progress">Pokrok</string>
@ -371,12 +389,14 @@
<string name="filename_hint">Názov súboru</string>
<string name="first_run_1_text">Majte svoje dáta pod vlastnou kontrolou a zabezpečené</string>
<string name="first_run_2_text">Bezpečná kolaborácia&amp;výmena súborov</string>
<string name="first_run_3_text">Jednoduchý webmail, kalendár &amp; kontakty</string>
<string name="first_run_4_text">Zdieľanie obrazovky, online meetingy &amp; web konferencie</string>
<string name="folder_already_exists">Priečinok už existuje</string>
<string name="folder_confirm_create">Vytvoriť</string>
<string name="folder_list_empty_headline">Nie sú tu žiadne priečinky</string>
<string name="folder_picker_choose_button_text">Vybrať</string>
<string name="folder_picker_choose_caption_text">Vyberte cieľový priečinok</string>
<string name="folder_picker_copy_button_text">Kopírovať</string>
<string name="folder_picker_move_button_text">Presunúť</string>
<string name="forbidden_permissions">Nemáte oprávnenie %s</string>
<string name="forbidden_permissions_copy">kopírovať súbor</string>
@ -402,6 +422,19 @@
<string name="icon_for_empty_list">Ikona pre prázdny zoznam</string>
<string name="icon_of_dashboard_widget">Ikona widgetu na hlavnom paneli</string>
<string name="icon_of_widget_entry">Ikona položky ovládacieho panelu</string>
<string name="image_editor_file_edited_suffix">upravené</string>
<string name="image_editor_flip_horizontal">Preklopiť horizontálne</string>
<string name="image_editor_flip_vertical">Preklopiť vertikálne</string>
<string name="image_editor_rotate_ccw">Otočť v protismere hodinových ručičiek</string>
<string name="image_editor_rotate_cw">Otočiť v smere hodinových ručičiek</string>
<string name="image_editor_unable_to_edit_image">Nie je možné upraviť obrázok</string>
<string name="image_preview_filedetails">Detaily súboru</string>
<string name="image_preview_image_taking_conditions">Podmienky snímania</string>
<string name="image_preview_unit_fnumber">ƒ/%s</string>
<string name="image_preview_unit_iso">ISO %s</string>
<string name="image_preview_unit_megapixel">%s MP</string>
<string name="image_preview_unit_millimetres">%s mm</string>
<string name="image_preview_unit_seconds">%s s</string>
<string name="in_folder">v priečinku %1$s</string>
<string name="instant_upload_existing">Nahrať aj existujúce súbory</string>
<string name="instant_upload_on_charging">Nahrať iba počas nabíjania</string>
@ -429,6 +462,7 @@
<string name="locked_by_app">Zamknuté od aplikácie %1$s</string>
<string name="log_send_mail_subject">%1$s Android app logs</string>
<string name="log_send_no_mail_app">Aplikácia na odoslanie logov nenájdená. Prosím nainštalujte emailovú aplikáciu.</string>
<string name="logged_in_as">Prihlásený ako %1$s</string>
<string name="login">Prihlásiť sa</string>
<string name="login_url_helper_text">Odkaz k vašemu %1$s webovému rozhraniu keď ho otvoríte v prehliadači. </string>
<string name="logs_menu_delete">Zmazať záznamy</string>
@ -481,6 +515,7 @@
<string name="no_calendar_exists">Neexistuje žiadny kalendár</string>
<string name="no_email_app_available">Aplikácia pre prácu s e-mailovými adresami nenájdená</string>
<string name="no_items">Žiadne položky</string>
<string name="no_map_app_availble">Nie je dostupná žiadna aplikácia na spracovanie máp.</string>
<string name="no_mutliple_accounts_allowed">Povolený je iba jeden účet</string>
<string name="no_pdf_app_available">Aplikácia na prácu s PDF nenájdená</string>
<string name="no_send_app">Nie je k dispozícii žiadna aplikácia na odosielanie vybratých súborov</string>
@ -519,6 +554,7 @@
<string name="pass_code_removed">Bezpečnostný kód odstránený</string>
<string name="pass_code_stored">Bezpečnostný kód uložený</string>
<string name="pass_code_wrong">Nesprávne heslo</string>
<string name="pdf_password_protected">Nepodarilo sa otvoriť heslom chránený PDF súbor. Prosím, použite externý PDF prehliadač.</string>
<string name="pdf_zoom_tip">Klepnutím na stránku priblížite</string>
<string name="permission_allow">Povoliť</string>
<string name="permission_deny">Odmietnuť</string>
@ -555,6 +591,7 @@
<string name="prefs_category_more">Viac</string>
<string name="prefs_daily_backup_summary">Denná záloha vašeho kalendára &amp; kontaktov</string>
<string name="prefs_daily_contact_backup_summary">Denná záloha vašich kontaktov</string>
<string name="prefs_davx5_setup_error">Neočakávaná chyba pri nastavovaní DAVx5 (predtým známy ako DAVdroid)</string>
<string name="prefs_e2e_active">End-to-end šifrovanie je nastavené!</string>
<string name="prefs_e2e_mnemonic">E2E mnemotechnické</string>
<string name="prefs_e2e_no_device_credentials">Pre zobrazenie mnemotechnické, zapnite prihlasovacie údaje zariadenia.</string>
@ -565,7 +602,9 @@
<string name="prefs_imprint">Podmienky používania</string>
<string name="prefs_instant_behaviour_dialogTitle">Pôvodný súbor bude…</string>
<string name="prefs_instant_behaviour_title">Pôvodný súbor bude…</string>
<string name="prefs_instant_upload_path_use_date_subfolders_summary">Uložiť v podpriečinkoch podľa dátumu</string>
<string name="prefs_instant_upload_path_use_subfolders_title">Použi podpriečinky</string>
<string name="prefs_instant_upload_subfolder_rule_title">Možnosti podpriečinka</string>
<string name="prefs_keys_exist">Pridať end-to-end šifrovanie do tohto klienta</string>
<string name="prefs_license">Licencia</string>
<string name="prefs_lock">Prístupový kód apky</string>
@ -579,6 +618,8 @@
<string name="prefs_recommend">Odporučiť priateľom</string>
<string name="prefs_remove_e2e">Lokálne odstrániť šifrovanie</string>
<string name="prefs_setup_e2e">Nastaviť šifrovanie end-to-end</string>
<string name="prefs_show_ecosystem_apps">Zobraziť prepínač aplikácií</string>
<string name="prefs_show_ecosystem_apps_summary">Návrhy Nextcloud aplikácií v navigačnom záhlaví</string>
<string name="prefs_show_hidden_files">Zobraziť skryté súbory</string>
<string name="prefs_sourcecode">Získajte zdrojový kód</string>
<string name="prefs_storage_path">Priečinok dátového úložiska</string>
@ -606,7 +647,11 @@
<string name="reload">Znovu načítať</string>
<string name="remote">(vzdialené)</string>
<string name="remote_file_fetch_failed">Nepodarilo sa nájsť súbor</string>
<string name="remove_e2e">Môžete odstrániť end-to-end šifrovanie lokálne na tomto klientovi.</string>
<string name="remove_e2e_message">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.</string>
<string name="remove_fail_msg">Zmazanie zlyhalo</string>
<string name="remove_local_account">Odstrániť lokálny účet</string>
<string name="remove_local_account_details">Odstrániť účet zo zariadenia a odstrániť všetky lokálne súbory</string>
<string name="remove_notification_failed">Odstránenie upozornenia zlyhalo.</string>
<string name="remove_push_notification">Odstrániť</string>
<string name="remove_success_msg">Zmazané</string>
@ -614,6 +659,8 @@
<string name="rename_local_fail_msg">Nepodarilo sa premenovať lokálnu kópiu, skúste iné meno</string>
<string name="rename_server_fail_msg">Premenovanie sa nepodarilo, meno sa už používa</string>
<string name="request_account_deletion">Žiadosť o zmazanie účtu</string>
<string name="request_account_deletion_button">Žiadosť o zmazanie</string>
<string name="request_account_deletion_details">Žiadosť o trvalé odstránenie účtu poskytovateľom</string>
<string name="reshare_not_allowed">Opätovné sprístupňovanie nie je povolené</string>
<string name="resharing_is_not_allowed">Sprístupnenie už sprístupnenej položky nie je povolené</string>
<string name="resized_image_not_possible_download">Obrázok v inom rozlíšení nedostupný. Stiahnuť pôvodný obrázok?</string>
@ -624,6 +671,7 @@
<string name="retrieving_file">Získava sa súbor…</string>
<string name="richdocuments_failed_to_load_document">Nepodarilo sa načítať dokument!</string>
<string name="scanQR_description">Prihlásiť sa pomocou QR kódu</string>
<string name="scan_page">Skenovať stránku</string>
<string name="screenshot_01_gridView_heading">Chránte vaše údaje</string>
<string name="screenshot_01_gridView_subline">Nástroje pre produktivitu s vlastným hosťovaním</string>
<string name="screenshot_02_listView_heading">Prehliadajte a zdieľajte</string>
@ -650,6 +698,7 @@
<string name="set_picture_as">Použiť obrázok ako</string>
<string name="set_status">Nastaviť stav</string>
<string name="set_status_message">Nastaviť správu o stave</string>
<string name="setup_e2e">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!</string>
<string name="share">Zdieľať</string>
<string name="share_copy_link">Zdieľať &amp; Kopírovať Odkaz</string>
<string name="share_dialog_title">Sprístupnenie</string>
@ -674,6 +723,7 @@
<string name="share_password_title">Chránené heslom</string>
<string name="share_permission_can_edit">Môže upravovať</string>
<string name="share_permission_file_drop">Vložiť súbor</string>
<string name="share_permission_secure_file_drop">Zabezpečený file drop</string>
<string name="share_permission_view_only">Iba pre čítanie</string>
<string name="share_permissions">Zdieľať oprávnenia</string>
<string name="share_remote_clarification">%1$s (vzdialený)</string>
@ -749,6 +799,8 @@
<string name="stream_not_possible_headline">Vnútorné streamovanie nie je možné</string>
<string name="stream_not_possible_message">Médium si namiesto toho stiahnite alebo použite externú aplikáciu.</string>
<string name="strict_mode">Striktný mód: HTTP spojenie nie je povolené!</string>
<string name="sub_folder_rule_day">Rok/Mesiac/Deň</string>
<string name="sub_folder_rule_month">Rok/Mesiac</string>
<string name="sub_folder_rule_year">Rok</string>
<string name="subject_shared_with_you">\"%1$s\" vám bol sprístupnený</string>
<string name="subject_user_shared_with_you">%1$s vám sprístupnil \"%2$s\"</string>
@ -788,6 +840,7 @@
<string name="thumbnail">Náhľad</string>
<string name="thumbnail_for_existing_file_description">Náhľad existujúceho súboru</string>
<string name="thumbnail_for_new_file_desc">Náhľad nového súboru</string>
<string name="timeout_richDocuments">Načítavanie trvá dlhšie ako sa očakávalo</string>
<string name="today">Dnes</string>
<string name="trashbin_activity_title">Zmazané súbory</string>
<string name="trashbin_empty_headline">Žiadne zmazané súbory</string>
@ -831,6 +884,7 @@
<string name="upload_lock_failed">Uzamknutie priečinka zlyhalo</string>
<string name="upload_old_android">Šifrovanie je možné iba pri &gt;= Android 5.0</string>
<string name="upload_query_move_foreign_files">Pre skopírovanie vybratých súborov do adresára %1$s nie je dostatok voľného miesta. Chcete ich namiesto toho presunúť?</string>
<string name="upload_quota_exceeded">Kapacita úložiska prekročená</string>
<string name="upload_scan_doc_upload">Naskenujte dokument z fotoaparátu</string>
<string name="upload_sync_conflict">Chyba synchronizácie, prosím vyriešte manuálne</string>
<string name="upload_unknown_error">Neznáma chyba</string>
@ -899,7 +953,9 @@
<string name="wait_a_moment">Počkajte chvíľu…</string>
<string name="wait_checking_credentials">Overujem uložené prihlasovacie údaje</string>
<string name="wait_for_tmp_copy_from_private_storage">Kopírovanie súboru z privátneho úložiska</string>
<string name="webview_version_check_alert_dialog_message">Pre prihlásenie prosím aktualizujte aplikáciu Android System WebView</string>
<string name="webview_version_check_alert_dialog_positive_button_title">Aktualizovať</string>
<string name="webview_version_check_alert_dialog_title">Aktualizujte Android System WebView</string>
<string name="what_s_new_image">Obrázok čo je nové</string>
<string name="whats_new_skip">Preskočiť</string>
<string name="whats_new_title">Nové v %1$s</string>

View file

@ -885,6 +885,7 @@
<string name="upload_lock_failed">Misslyckades låsa mappen</string>
<string name="upload_old_android">Kryptering är endast möjlig med &gt;= Android 5.0</string>
<string name="upload_query_move_foreign_files">Otillräckligt utrymme förhindrar kopiering av de valda filerna till %1$s -mappen. Vill du flytta dem dit i stället?</string>
<string name="upload_quota_exceeded">Lagringskvot överskriden</string>
<string name="upload_scan_doc_upload">Slams dokument från kamera</string>
<string name="upload_sync_conflict">Synkroniseringskonflikt, lös problemet manuellt</string>
<string name="upload_unknown_error">Okänt fel</string>

View file

@ -1,2 +1,2 @@
DO NOT TOUCH; GENERATED BY DRONE
<span class="mdl-layout-title">Lint Report: 9 errors and 75 warnings</span>
<span class="mdl-layout-title">Lint Report: 3 errors and 75 warnings</span>