Solve git conflicts

Signed-off-by: alperozturk <alper_ozturk@proton.me>
This commit is contained in:
alperozturk 2023-12-11 11:59:57 +01:00
commit ca4b4211e1
No known key found for this signature in database
GPG key ID: 4E577DC593B59BDF
66 changed files with 2101 additions and 225 deletions

View file

@ -32,7 +32,7 @@ jobs:
with:
swap-size-gb: 10
- name: Initialize CodeQL
uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/init@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9
with:
languages: ${{ matrix.language }}
- name: Set up JDK 17
@ -46,4 +46,4 @@ jobs:
echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
./gradlew assembleDebug
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/analyze@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9

View file

@ -37,6 +37,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
uses: github/codeql-action/upload-sarif@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9
with:
sarif_file: results.sarif

View file

@ -14,7 +14,7 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
with:
days-before-stale: 28
days-before-close: 14

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -349,6 +349,11 @@ public abstract class AbstractIT {
public void uploadOCUpload(OCUpload ocUpload) {
ConnectivityService connectivityServiceMock = new ConnectivityService() {
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isInternetWalled() {
return false;

View file

@ -185,6 +185,11 @@ public abstract class AbstractOnServerIT extends AbstractIT {
public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) {
ConnectivityService connectivityServiceMock = new ConnectivityService() {
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isInternetWalled() {
return false;

View file

@ -70,6 +70,11 @@ public class UploadIT extends AbstractOnServerIT {
targetContext.getContentResolver());
private ConnectivityService connectivityServiceMock = new ConnectivityService() {
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isInternetWalled() {
return false;
@ -283,6 +288,11 @@ public class UploadIT extends AbstractOnServerIT {
@Test
public void testUploadOnWifiOnlyButNoWifi() {
ConnectivityService connectivityServiceMock = new ConnectivityService() {
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isInternetWalled() {
return false;
@ -362,6 +372,11 @@ public class UploadIT extends AbstractOnServerIT {
@Test
public void testUploadOnWifiOnlyButMeteredWifi() {
ConnectivityService connectivityServiceMock = new ConnectivityService() {
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isInternetWalled() {
return false;

View file

@ -43,9 +43,13 @@ import org.junit.Before
import org.junit.Test
abstract class FileUploaderIT : AbstractOnServerIT() {
var uploadsStorageManager: UploadsStorageManager? = null
private var uploadsStorageManager: UploadsStorageManager? = null
private val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
override fun isConnected(): Boolean {
return false
}
val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
override fun isInternetWalled(): Boolean = false
override fun getConnectivity(): Connectivity = Connectivity.CONNECTED_WIFI
}

View file

@ -66,6 +66,16 @@ class OCFileListFragmentStaticServerIT : AbstractIT() {
sut.storageManager.saveFile(this)
}
OCFile("/live photo.png").apply {
mimeType = "image/png"
isPreviewAvailable = false
fileLength = 3072000
modificationTimestamp = 746443755000
parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId
setLivePhoto("/video.mov")
sut.storageManager.saveFile(this)
}
OCFile("/video.mp4").apply {
mimeType = "video/mp4"
isPreviewAvailable = false

View file

@ -39,7 +39,7 @@ class UnifiedSearchFragmentIT : AbstractIT() {
@Test
fun showSearchResult() {
val activity = testActivityRule.launchActivity(null)
val sut = UnifiedSearchFragment.newInstance(null)
val sut = UnifiedSearchFragment.newInstance(null, null)
activity.addFragment(sut)
@ -72,7 +72,7 @@ class UnifiedSearchFragmentIT : AbstractIT() {
@Test
fun search() {
val activity = testActivityRule.launchActivity(null) as TestActivity
val sut = UnifiedSearchFragment.newInstance(null)
val sut = UnifiedSearchFragment.newInstance(null, null)
val testViewModel = UnifiedSearchViewModel(activity.application)
testViewModel.setConnectivityService(activity.connectivityServiceMock)
val localRepository = UnifiedSearchFakeRepository()

View file

@ -56,6 +56,10 @@ class TestActivity :
private lateinit var binding: TestLayoutBinding
val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
override fun isConnected(): Boolean {
return false
}
override fun isInternetWalled(): Boolean {
return false
}

View file

@ -67,7 +67,8 @@ import com.owncloud.android.db.ProviderMeta
AutoMigration(from = 70, to = 71, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class),
AutoMigration(from = 71, to = 72),
AutoMigration(from = 72, to = 73),
AutoMigration(from = 73, to = 74, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class)
AutoMigration(from = 73, to = 74, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class),
AutoMigration(from = 74, to = 75)
],
exportSchema = true
)

View file

@ -78,8 +78,13 @@ data class FileEntity(
val isDownloading: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_FAVORITE)
val favorite: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_HIDDEN)
val hidden: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_IS_ENCRYPTED)
val isEncrypted: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_ETAG_IN_CONFLICT)
val etagInConflict: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_SHARED_WITH_SHAREE)
@ -102,6 +107,8 @@ data class FileEntity(
val richWorkspace: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_METADATA_SIZE)
val metadataSize: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_METADATA_LIVE_PHOTO)
val metadataLivePhoto: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_LOCKED)
val locked: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_LOCK_TYPE)

View file

@ -261,8 +261,14 @@ class FilesUploadWorker(
uploadResult: RemoteOperationResult<Any?>
) {
Log_OC.d(TAG, "NotifyUploadResult with resultCode: " + uploadResult.code)
if (uploadResult.isSuccess) {
cancelOldErrorNotification(uploadFileOperation)
return
}
// Only notify if the upload fails
if (uploadResult.isSuccess || uploadResult.isCancelled) {
if (uploadResult.isCancelled) {
return
}
@ -312,9 +318,12 @@ class FilesUploadWorker(
)
}
notificationBuilder.setContentText(content)
if (!uploadResult.isSuccess) {
notificationManager.notify(SecureRandom().nextInt(), notificationBuilder.build())
}
notificationManager.notify(
NotificationUtils.createUploadNotificationTag(uploadFileOperation.file),
NOTIFICATION_ERROR_ID,
notificationBuilder.build()
)
}
}
@ -386,10 +395,25 @@ class FilesUploadWorker(
totalToTransfer,
fileAbsoluteName
)
currentUploadFileOperation?.let { cancelOldErrorNotification(it) }
}
lastPercent = percent
}
private fun cancelOldErrorNotification(uploadFileOperation: UploadFileOperation) {
// cancel for old file because of file conflicts
if (uploadFileOperation.oldFile != null) {
notificationManager.cancel(
NotificationUtils.createUploadNotificationTag(uploadFileOperation.oldFile),
NOTIFICATION_ERROR_ID
)
}
notificationManager.cancel(
NotificationUtils.createUploadNotificationTag(uploadFileOperation.file),
NOTIFICATION_ERROR_ID
)
}
override fun onStopped() {
super.onStopped()
currentUploadFileOperation?.cancel(null)
@ -399,6 +423,7 @@ class FilesUploadWorker(
companion object {
val TAG: String = FilesUploadWorker::class.java.simpleName
private const val FOREGROUND_SERVICE_ID: Int = 412
const val NOTIFICATION_ERROR_ID: Int = 413
private const val MAX_PROGRESS: Int = 100
const val ACCOUNT = "data_account"
var currentUploadFileOperation: UploadFileOperation? = null

View file

@ -32,13 +32,19 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.owncloud.android.R
import com.owncloud.android.lib.common.utils.Log_OC
class ExoplayerListener(private val context: Context, private val playerView: View, private val exoPlayer: ExoPlayer) :
class ExoplayerListener(
private val context: Context,
private val playerView: View,
private val exoPlayer: ExoPlayer,
private val onCompleted: () -> Unit = { }
) :
Player.Listener {
override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
if (playbackState == Player.STATE_ENDED) {
onCompletion()
onCompleted()
}
}

View file

@ -25,6 +25,7 @@ package com.nextcloud.client.network;
* and server reachability.
*/
public interface ConnectivityService {
boolean isConnected();
/**
* Check if server is accessible by issuing HTTP status check request.

View file

@ -47,7 +47,6 @@ class ConnectivityServiceImpl implements ConnectivityService {
private final GetRequestBuilder requestBuilder;
private final WalledCheckCache walledCheckCache;
static class GetRequestBuilder implements Function1<String, GetMethod> {
@Override
public GetMethod invoke(String url) {
@ -67,6 +66,21 @@ class ConnectivityServiceImpl implements ConnectivityService {
this.walledCheckCache = walledCheckCache;
}
@Override
public boolean isConnected() {
Network nw = platformConnectivityManager.getActiveNetwork();
NetworkCapabilities actNw = platformConnectivityManager.getNetworkCapabilities(nw);
if (actNw == null) {
return false;
}
return actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ||
actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH);
}
@Override
public boolean isInternetWalled() {
final Boolean cachedValue = walledCheckCache.getValue();

View file

@ -22,6 +22,7 @@
package com.nextcloud.utils.extensions
import android.os.SystemClock
import android.text.Selection
import android.text.Spannable
import android.text.SpannableString
@ -35,6 +36,22 @@ import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
fun clickWithDebounce(view: View, debounceTime: Long = 600L, action: () -> Unit) {
view.setOnClickListener(object : View.OnClickListener {
private var lastClickTime: Long = 0
override fun onClick(v: View) {
if (SystemClock.elapsedRealtime() - lastClickTime < debounceTime) {
return
} else {
action()
}
lastClickTime = SystemClock.elapsedRealtime()
}
})
}
fun TextView.makeLinks(vararg links: Pair<String, View.OnClickListener>) {
val spannableString = SpannableString(this.text)
var startIndexOfLink = -1

View file

@ -462,6 +462,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_REMOTE_ID, fileOrFolder.getRemoteId());
cv.put(ProviderTableMeta.FILE_LOCAL_ID, fileOrFolder.getLocalId());
cv.put(ProviderTableMeta.FILE_FAVORITE, fileOrFolder.isFavorite());
cv.put(ProviderTableMeta.FILE_HIDDEN, fileOrFolder.shouldHide());
cv.put(ProviderTableMeta.FILE_UNREAD_COMMENTS_COUNT, fileOrFolder.getUnreadCommentsCount());
cv.put(ProviderTableMeta.FILE_OWNER_ID, fileOrFolder.getOwnerId());
cv.put(ProviderTableMeta.FILE_OWNER_DISPLAY_NAME, fileOrFolder.getOwnerDisplayName());
@ -501,6 +502,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_LOCKED, file.isLocked());
final FileLockType lockType = file.getLockType();
cv.put(ProviderTableMeta.FILE_LOCK_TYPE, lockType != null ? lockType.getValue() : -1);
cv.put(ProviderTableMeta.FILE_HIDDEN, file.shouldHide());
cv.put(ProviderTableMeta.FILE_LOCK_OWNER, file.getLockOwnerId());
cv.put(ProviderTableMeta.FILE_LOCK_OWNER_DISPLAY_NAME, file.getLockOwnerDisplayName());
cv.put(ProviderTableMeta.FILE_LOCK_OWNER_EDITOR, file.getLockOwnerEditor());
@ -510,6 +512,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp());
cv.put(ProviderTableMeta.FILE_METADATA_SIZE, gson.toJson(file.getImageDimension()));
cv.put(ProviderTableMeta.FILE_METADATA_GPS, gson.toJson(file.getGeoLocation()));
cv.put(ProviderTableMeta.FILE_METADATA_LIVE_PHOTO, file.getLinkedFileIdForLivePhoto());
return cv;
}
@ -931,6 +934,7 @@ public class FileDataStorageManager {
ocFile.setNote(fileEntity.getNote());
ocFile.setRichWorkspace(fileEntity.getRichWorkspace());
ocFile.setLocked(nullToZero(fileEntity.getLocked()) == 1);
final int lockTypeInt = nullToZero(fileEntity.getLockType()); // TODO - what value should be used for NULL???
ocFile.setLockType(lockTypeInt != -1 ? FileLockType.fromValue(lockTypeInt) : null);
ocFile.setLockOwnerId(fileEntity.getLockOwner());
@ -939,6 +943,8 @@ public class FileDataStorageManager {
ocFile.setLockTimestamp(nullToZero(fileEntity.getLockTimestamp()));
ocFile.setLockTimeout(nullToZero(fileEntity.getLockTimeout()));
ocFile.setLockToken(fileEntity.getLockToken());
ocFile.setLivePhoto(fileEntity.getMetadataLivePhoto());
ocFile.setHidden(nullToZero(fileEntity.getHidden()) == 1);
String sharees = fileEntity.getSharees();
// Surprisingly JSON deserialization causes significant overhead.
@ -1752,7 +1758,7 @@ public class FileDataStorageManager {
ProviderTableMeta.CONTENT_URI_FILE,
projection,
whereForDescencentsInConflict,
new String[]{user.getAccountName(), parentPath + "%"},
new String[]{user.getAccountName(), parentPath + '%'},
null
);
} else {

View file

@ -52,6 +52,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import third_parties.daveKoeller.AlphanumComparator;
public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterface {
private final static String PERMISSION_SHARED_WITH_ME = "S";
@VisibleForTesting
public final static String PERMISSION_CAN_RESHARE = "R";
@ -83,6 +84,8 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
private long lastSyncDateForProperties;
private long lastSyncDateForData;
private boolean previewAvailable;
private String livePhoto;
public OCFile livePhotoVideo;
private String etag;
private String etagOnServer;
private boolean sharedViaLink;
@ -94,6 +97,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
private String etagInConflict; // Only saves file etag in the server, when there is a conflict
private boolean sharedWithSharee;
private boolean favorite;
private boolean hidden;
private boolean encrypted;
private WebdavEntry.MountType mountType;
private int unreadCommentsCount;
@ -181,6 +185,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
etagInConflict = source.readString();
sharedWithSharee = source.readInt() == 1;
favorite = source.readInt() == 1;
hidden = source.readInt() == 1;
encrypted = source.readInt() == 1;
ownerId = source.readString();
ownerDisplayName = source.readString();
@ -196,6 +201,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
lockTimestamp = source.readLong();
lockTimeout = source.readLong();
lockToken = source.readString();
livePhoto = source.readString();
}
@Override
@ -224,6 +230,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
dest.writeString(etagInConflict);
dest.writeInt(sharedWithSharee ? 1 : 0);
dest.writeInt(favorite ? 1 : 0);
dest.writeInt(hidden ? 1 : 0);
dest.writeInt(encrypted ? 1 : 0);
dest.writeString(ownerId);
dest.writeString(ownerDisplayName);
@ -239,6 +246,15 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
dest.writeLong(lockTimestamp);
dest.writeLong(lockTimeout);
dest.writeString(lockToken);
dest.writeString(livePhoto);
}
public String getLinkedFileIdForLivePhoto() {
return livePhoto;
}
public void setLivePhoto(String livePhoto) {
this.livePhoto = livePhoto;
}
public void setDecryptedRemotePath(String path) {
@ -344,11 +360,13 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
return false;
}
public String getFileNameWithExtension(int fileNameLength) {
String fileName = getFileName();
String shortFileName = fileName.substring(0, Math.min(fileName.length(), fileNameLength));
String extension = "." + fileName.substring(fileName.lastIndexOf('.') + 1);
return shortFileName + extension;
public String getFileNameWithoutExtension(String fileName) {
int dotIndex = fileName.lastIndexOf('.');
if (dotIndex > 0) {
return fileName.substring(0, dotIndex);
} else {
return fileName;
}
}
/**
@ -472,6 +490,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
Log_OC.d(TAG, "OCFile name changing from " + remotePath);
if (!TextUtils.isEmpty(name) && !name.contains(PATH_SEPARATOR) && !ROOT_PATH.equals(remotePath)) {
String parent = new File(this.getRemotePath()).getParent();
if (parent != null) {
parent = parent.endsWith(PATH_SEPARATOR) ? parent : parent + PATH_SEPARATOR;
remotePath = parent + name;
if (isFolder()) {
@ -480,6 +499,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
Log_OC.d(TAG, "OCFile name changed to " + remotePath);
}
}
}
/**
* Used internally. Reset all file properties
@ -509,6 +529,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
etagInConflict = null;
sharedWithSharee = false;
favorite = false;
hidden = false;
encrypted = false;
mountType = WebdavEntry.MountType.INTERNAL;
richWorkspace = "";
@ -521,7 +542,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
lockTimestamp = 0;
lockTimeout = 0;
lockToken = null;
livePhoto = null;
imageDimension = null;
}
@ -532,7 +553,11 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
*/
public String getParentRemotePath() {
String parentPath = new File(this.getRemotePath()).getParent();
if (parentPath != null) {
return parentPath.endsWith(PATH_SEPARATOR) ? parentPath : parentPath + PATH_SEPARATOR;
} else {
return null;
}
}
@Override
@ -776,6 +801,10 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
return this.favorite;
}
public boolean shouldHide() {
return this.hidden;
}
public boolean isEncrypted() {
return this.encrypted;
}
@ -888,6 +917,10 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
this.favorite = favorite;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public void setEncrypted(boolean encrypted) {
this.encrypted = encrypted;
}

View file

@ -201,7 +201,7 @@ public class UploadsStorageManager extends Observable {
TAG,
"Updating " + path + " with status:" + status + " and result:"
+ (result == null ? "null" : result.toString()) + " (old:"
+ upload.toFormattedString() + ")");
+ upload.toFormattedString() + ')');
upload.setUploadStatus(status);
upload.setLastResult(result);

View file

@ -35,7 +35,7 @@ import java.util.List;
*/
public class ProviderMeta {
public static final String DB_NAME = "filelist";
public static final int DB_VERSION = 74;
public static final int DB_VERSION = 75;
private ProviderMeta() {
// No instance
@ -107,6 +107,7 @@ public class ProviderMeta {
public static final String FILE_IS_DOWNLOADING = "is_downloading";
public static final String FILE_ETAG_IN_CONFLICT = "etag_in_conflict";
public static final String FILE_FAVORITE = "favorite";
public static final String FILE_HIDDEN = "hidden";
public static final String FILE_IS_ENCRYPTED = "is_encrypted";
public static final String FILE_MOUNT_TYPE = "mount_type";
public static final String FILE_HAS_PREVIEW = "has_preview";
@ -118,6 +119,7 @@ public class ProviderMeta {
public static final String FILE_RICH_WORKSPACE = "rich_workspace";
public static final String FILE_METADATA_SIZE = "metadata_size";
public static final String FILE_METADATA_GPS = "metadata_gps";
public static final String FILE_METADATA_LIVE_PHOTO = "metadata_live_photo";
public static final String FILE_LOCKED = "locked";
public static final String FILE_LOCK_TYPE = "lock_type";
public static final String FILE_LOCK_OWNER = "lock_owner";
@ -156,6 +158,7 @@ public class ProviderMeta {
FILE_IS_DOWNLOADING,
FILE_ETAG_IN_CONFLICT,
FILE_FAVORITE,
FILE_HIDDEN,
FILE_IS_ENCRYPTED,
FILE_MOUNT_TYPE,
FILE_HAS_PREVIEW,
@ -174,6 +177,7 @@ public class ProviderMeta {
FILE_LOCK_TIMEOUT,
FILE_LOCK_TOKEN,
FILE_METADATA_SIZE,
FILE_METADATA_LIVE_PHOTO,
FILE_TAGS,
FILE_METADATA_GPS));
public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME + " collate nocase asc";

View file

@ -135,6 +135,7 @@ public class FileUploader extends Service
public static final String ACTION_PAUSE_BROADCAST = "PAUSE";
private static final int FOREGROUND_SERVICE_ID = 411;
private static final int NOTIFICATION_ERROR_ID = FilesUploadWorker.NOTIFICATION_ERROR_ID;
public static final String KEY_FILE = "FILE";
public static final String KEY_LOCAL_FILE = "LOCAL_FILE";
@ -781,6 +782,7 @@ public class FileUploader extends Service
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
mNotificationManager.notify(FOREGROUND_SERVICE_ID, mNotificationBuilder.build());
cancelOldErrorNotification(mCurrentUpload);
}
mLastPercent = percent;
}
@ -799,6 +801,10 @@ public class FileUploader extends Service
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
if (uploadResult.isSuccess()){
cancelOldErrorNotification(upload);
}
// Only notify if the upload fails
if (!uploadResult.isCancelled() &&
!uploadResult.isSuccess() &&
@ -1436,6 +1442,26 @@ public class FileUploader extends Service
}
}
private void cancelOldErrorNotification(UploadFileOperation uploadFileOperation){
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
if (uploadFileOperation == null) return;
mNotificationManager.cancel(NotificationUtils.createUploadNotificationTag(uploadFileOperation.getFile()),
NOTIFICATION_ERROR_ID);
//cancel for old file because of file conflicts
OCFile oldFile = uploadFileOperation.getOldFile();
if ( oldFile != null) {
mNotificationManager.cancel(NotificationUtils.createUploadNotificationTag(oldFile),
NOTIFICATION_ERROR_ID);
}
}
/**
* Upload worker. Performs the pending uploads in the order they were requested.

View file

@ -21,6 +21,7 @@ package com.owncloud.android.media;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
@ -140,7 +141,7 @@ public class MediaControlView extends LinearLayout implements OnClickListener, O
}
}
private final Handler handler = new Handler() {
private final Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.what == SHOW_PROGRESS) {

View file

@ -254,6 +254,7 @@ public class SynchronizeFileOperation extends SyncOperation {
} else {
// TODO CHECK: is this really useful in some point in the code?
mServerFile.setFavorite(mLocalFile.isFavorite());
mServerFile.setHidden(mLocalFile.shouldHide());
mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData());
mServerFile.setStoragePath(mLocalFile.getStoragePath());
mServerFile.setParentId(mLocalFile.getParentId());

View file

@ -124,6 +124,7 @@ public abstract class FileActivity extends DrawerActivity
LoadingVersionNumberTask.VersionDevInterface, FileDetailSharingFragment.OnEditShareListener {
public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
public static final String EXTRA_LIVE_PHOTO_FILE = "com.owncloud.android.ui.activity.LIVE.PHOTO.FILE";
public static final String EXTRA_USER = "com.owncloud.android.ui.activity.USER";
public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
public static final String APP_OPENED_COUNT = "APP_OPENED_COUNT";
@ -241,6 +242,12 @@ public abstract class FileActivity extends DrawerActivity
}
}
public void checkInternetConnection() {
if (connectivityService.isConnected()) {
hideInfoBox();
}
}
@Override
protected void onStart() {
super.onStart();

View file

@ -1047,7 +1047,8 @@ public class FileDisplayActivity extends FileActivity
searchView.clearFocus();
// Remove the list to the original state
listOfFiles.performSearch("", true);
ArrayList<String> listOfHiddenFiles = listOfFiles.getAdapter().listOfHiddenFiles;
listOfFiles.performSearch("", listOfHiddenFiles, true);
hideSearchView(getCurrentDir());
@ -2147,6 +2148,7 @@ public class FileDisplayActivity extends FileActivity
public void startImagePreview(OCFile file, boolean showPreview) {
Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
showDetailsIntent.putExtra(EXTRA_FILE, file);
showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo);
showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new));
if (showPreview) {
startActivity(showDetailsIntent);
@ -2166,6 +2168,7 @@ public class FileDisplayActivity extends FileActivity
public void startImagePreview(OCFile file, VirtualFolderType type, boolean showPreview) {
Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_FILE, file);
showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new));
showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type);
@ -2197,7 +2200,7 @@ public class FileDisplayActivity extends FileActivity
}
if (showPreview && file.isDown() && !file.isDownloading() || streamMedia) {
configureToolbarForMediaPreview(file);
Fragment mediaFragment = PreviewMediaFragment.newInstance(file, user.get(), startPlaybackPosition, autoplay);
Fragment mediaFragment = PreviewMediaFragment.newInstance(file, user.get(), startPlaybackPosition, autoplay, false);
setLeftFragment(mediaFragment);
} else {
Intent previewIntent = new Intent();
@ -2628,8 +2631,8 @@ public class FileDisplayActivity extends FileActivity
return null;
}
public void performUnifiedSearch(String query) {
UnifiedSearchFragment unifiedSearchFragment = UnifiedSearchFragment.Companion.newInstance(query);
public void performUnifiedSearch(String query, ArrayList<String> listOfHiddenFiles) {
UnifiedSearchFragment unifiedSearchFragment = UnifiedSearchFragment.Companion.newInstance(query, listOfHiddenFiles);
setLeftFragment(unifiedSearchFragment);
}

View file

@ -219,7 +219,6 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
/**
* Hides the toolbar's info box.
*/
@VisibleForTesting
public final void hideInfoBox() {
mInfoBox.setVisibility(View.GONE);
}

View file

@ -48,6 +48,7 @@ import com.owncloud.android.R;
import com.owncloud.android.databinding.UploadListLayoutBinding;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.datamodel.UploadsStorageManager;
import com.owncloud.android.db.OCUpload;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.lib.common.operations.RemoteOperation;
@ -263,6 +264,9 @@ public class UploadListActivity extends FileActivity {
openDrawer();
}
} else if (itemId == R.id.action_clear_failed_uploads) {
for (OCUpload upload : uploadsStorageManager.getFailedButNotDelayedUploadsForCurrentAccount()){
uploadListAdapter.cancelOldErrorNotification(upload);
}
uploadsStorageManager.clearFailedButNotDelayedUploads();
uploadListAdapter.loadUploadItemsFromDb();
} else {

View file

@ -23,6 +23,7 @@ package com.owncloud.android.ui.adapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.elyeproj.loaderviewlibrary.LoaderImageView
interface ListGridImageViewHolder {
@ -35,4 +36,8 @@ interface ListGridImageViewHolder {
val checkbox: ImageView
val itemLayout: View
val unreadComments: ImageView
val gridLivePhotoIndicator: TextView?
val livePhotoIndicator: TextView?
val livePhotoIndicatorSeparator: TextView?
}

View file

@ -42,6 +42,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import com.elyeproj.loaderviewlibrary.LoaderImageView;
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
import com.nextcloud.client.account.User;
import com.nextcloud.client.preferences.AppPreferences;
import com.owncloud.android.MainApp;
@ -112,7 +113,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private boolean hideItemOptions;
private long lastTimestamp;
private boolean gridView;
public ArrayList<String> listOfHiddenFiles = new ArrayList<>();
private FileDataStorageManager mStorageManager;
private User user;
private OCFileListFragmentInterface ocFileListFragmentInterface;
@ -288,6 +289,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
new Handler(Looper.getMainLooper()).post(this::notifyDataSetChanged);
}
@Override
public long getItemId(int position) {
if (mFiles == null || mFiles.size() <= position) {
@ -358,14 +360,12 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
@Override
@SuppressFBWarnings("ITC_INHERITANCE_TYPE_CHECKING")
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof OCFileListFooterViewHolder) {
OCFileListFooterViewHolder footerViewHolder = (OCFileListFooterViewHolder) holder;
if (holder instanceof OCFileListFooterViewHolder footerViewHolder) {
footerViewHolder.getFooterText().setText(getFooterText());
viewThemeUtils.platform.colorCircularProgressBar(footerViewHolder.getLoadingProgressBar());
viewThemeUtils.platform.colorCircularProgressBar(footerViewHolder.getLoadingProgressBar(), ColorRole.ON_SURFACE_VARIANT);
footerViewHolder.getLoadingProgressBar().setVisibility(
ocFileListFragmentInterface.isLoading() ? View.VISIBLE : View.GONE);
} else if (holder instanceof OCFileListHeaderViewHolder) {
OCFileListHeaderViewHolder headerViewHolder = (OCFileListHeaderViewHolder) holder;
} else if (holder instanceof OCFileListHeaderViewHolder headerViewHolder) {
String text = currentDirectory.getRichWorkspace();
PreviewTextFragment.setText(headerViewHolder.getHeaderText(), text, null, activity, true, true, viewThemeUtils);
@ -388,6 +388,61 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
if (holder instanceof ListGridItemViewHolder) {
bindListGridItemViewHolder((ListGridItemViewHolder) holder, file);
}
updateLivePhotoIndicators(gridViewHolder, file);
}
}
private void mergeOCFilesForLivePhoto() {
List<OCFile> filesToRemove = new ArrayList<>();
for (int i = 0; i < mFiles.size(); i++) {
OCFile file = mFiles.get(i);
for (int j = i + 1; j < mFiles.size(); j++) {
OCFile nextFile = mFiles.get(j);
String fileLocalId = String.valueOf(file.getLocalId());
String nextFileLinkedLocalId = nextFile.getLinkedFileIdForLivePhoto();
if (fileLocalId.equals(nextFileLinkedLocalId)) {
if (MimeTypeUtil.isVideo(file.getMimeType())) {
nextFile.livePhotoVideo = file;
filesToRemove.add(file);
} else if (MimeTypeUtil.isVideo(nextFile.getMimeType())) {
file.livePhotoVideo = nextFile;
filesToRemove.add(nextFile);
}
}
}
}
mFiles.removeAll(filesToRemove);
filesToRemove.clear();
}
private void updateLivePhotoIndicators(ListGridImageViewHolder holder, OCFile file) {
boolean isLivePhoto = file.getLinkedFileIdForLivePhoto() != null;
if (holder instanceof OCFileListItemViewHolder) {
holder.getLivePhotoIndicator().setVisibility(isLivePhoto ? (View.VISIBLE) : (View.GONE));
holder.getLivePhotoIndicatorSeparator().setVisibility(isLivePhoto ? (View.VISIBLE) : (View.GONE));
} else if (holder instanceof OCFileListGridImageViewHolder) {
holder.getGridLivePhotoIndicator().setVisibility(isLivePhoto ? (View.VISIBLE) : (View.GONE));
}
}
private void bindListGridItemViewHolder(ListGridItemViewHolder holder, OCFile file) {
holder.getFileName().setText(file.getDecryptedFileName());
boolean gridImage = MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file);
if (gridView && gridImage) {
holder.getFileName().setVisibility(View.GONE);
} else {
if (gridView && ocFileListFragmentInterface.getColumnsCount() > showFilenameColumnThreshold) {
holder.getFileName().setVisibility(View.GONE);
} else {
holder.getFileName().setVisibility(View.VISIBLE);
}
}
}
@ -488,7 +543,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
holder.getLastModification().setVisibility(View.GONE);
}
if (isMultiSelect() || gridView || hideItemOptions) {
holder.getOverflowMenu().setVisibility(View.GONE);
} else {
@ -504,22 +558,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
}
private void bindListGridItemViewHolder(ListGridItemViewHolder holder, OCFile file) {
holder.getFileName().setText(file.getDecryptedFileName());
boolean gridImage = MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file);
if (gridView && gridImage) {
holder.getFileName().setVisibility(View.GONE);
} else {
if (gridView && ocFileListFragmentInterface.getColumnsCount() > showFilenameColumnThreshold) {
holder.getFileName().setVisibility(View.GONE);
} else {
holder.getFileName().setVisibility(View.VISIBLE);
}
}
}
@Override
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof ListGridImageViewHolder) {
@ -548,7 +586,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
}
return generateFooterText(filesCount, foldersCount);
}
@ -641,8 +678,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
@NonNull User account,
@NonNull OCFile directory,
@NonNull FileDataStorageManager updatedStorageManager,
boolean onlyOnDevice, @NonNull String limitToMimeType
) {
boolean onlyOnDevice, @NonNull String limitToMimeType) {
this.onlyOnDevice = onlyOnDevice;
if (!updatedStorageManager.equals(mStorageManager)) {
@ -652,7 +688,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
if (mStorageManager != null) {
mFiles = mStorageManager.getFolderContent(directory, onlyOnDevice);
if (!preferences.isShowHiddenFilesEnabled()) {
mFiles = filterHiddenFiles(mFiles);
}
@ -661,9 +696,10 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
sortOrder = preferences.getSortOrderByFolder(directory);
mFiles = sortOrder.sortCloudFiles(mFiles);
prepareListOfHiddenFiles();
mergeOCFilesForLivePhoto();
mFilesAll.clear();
mFilesAll.addAll(mFiles);
currentDirectory = directory;
} else {
mFiles.clear();
@ -688,6 +724,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
.isShareesOnDavSupported());
}
if (mStorageManager == null) {
mStorageManager = new FileDataStorageManager(user, activity.getContentResolver());
}
@ -904,6 +941,16 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
return mFiles;
}
private void prepareListOfHiddenFiles() {
listOfHiddenFiles.clear();
mFiles.forEach(file -> {
if (file.shouldHide()) {
listOfHiddenFiles.add(file.getFileName());
}
});
}
public void resetLastTimestamp() {
lastTimestamp = -1;
}

View file

@ -23,6 +23,7 @@ package com.owncloud.android.ui.adapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.elyeproj.loaderviewlibrary.LoaderImageView
import com.owncloud.android.databinding.GridImageBinding
@ -54,6 +55,13 @@ internal class OCFileListGridImageViewHolder(var binding: GridImageBinding) :
override val unreadComments: ImageView
get() = binding.unreadComments
override val gridLivePhotoIndicator: TextView
get() = binding.gridLivePhotoIndicator
override val livePhotoIndicator: TextView?
get() = null
override val livePhotoIndicatorSeparator: TextView?
get() = null
init {
binding.favoriteAction.drawable.mutate()
}

View file

@ -57,6 +57,13 @@ internal class OCFileListGridItemViewHolder(var binding: GridItemBinding) :
override val unreadComments: ImageView
get() = binding.unreadComments
override val gridLivePhotoIndicator: TextView?
get() = null
override val livePhotoIndicator: TextView?
get() = null
override val livePhotoIndicatorSeparator: TextView?
get() = null
init {
binding.favoriteAction.drawable.mutate()
}

View file

@ -37,6 +37,13 @@ internal class OCFileListItemViewHolder(private var binding: ListItemBinding) :
binding.root
),
ListItemViewHolder {
override val gridLivePhotoIndicator: TextView?
get() = null
override val livePhotoIndicator: TextView
get() = binding.livePhotoIndicator
override val livePhotoIndicatorSeparator: TextView
get() = binding.livePhotoIndicatorSeparator
override val fileSize: TextView
get() = binding.fileSize
override val fileSizeSeparator: View

View file

@ -23,6 +23,7 @@
*/
package com.owncloud.android.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
@ -155,6 +156,7 @@ class UnifiedSearchListAdapter(
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(sections: List<UnifiedSearchSection>) {
this.sections = sections
notifyDataSetChanged()

View file

@ -24,6 +24,7 @@
package com.owncloud.android.ui.adapter;
import android.app.NotificationManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@ -42,6 +43,7 @@ import com.nextcloud.client.account.User;
import com.nextcloud.client.account.UserAccountManager;
import com.nextcloud.client.core.Clock;
import com.nextcloud.client.device.PowerManagementService;
import com.nextcloud.client.jobs.FilesUploadWorker;
import com.nextcloud.client.network.ConnectivityService;
import com.nextcloud.java.util.Optional;
import com.owncloud.android.MainApp;
@ -63,6 +65,7 @@ import com.owncloud.android.operations.RefreshFolderOperation;
import com.owncloud.android.ui.activity.ConflictsResolveActivity;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.notifications.NotificationUtils;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
@ -86,6 +89,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
private ConnectivityService connectivityService;
private PowerManagementService powerManagementService;
private UserAccountManager accountManager;
private NotificationManager mNotificationManager;
private Clock clock;
private UploadGroup[] uploadGroups;
private boolean showUser;
@ -556,6 +560,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
private void removeUpload(OCUpload item) {
uploadsStorageManager.removeUpload(item);
cancelOldErrorNotification(item);
loadUploadItemsFromDb();
}
@ -873,4 +878,17 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
return items == null ? 0 : items.length;
}
}
public void cancelOldErrorNotification(OCUpload upload){
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) parentActivity.getSystemService(parentActivity.NOTIFICATION_SERVICE);
}
if (upload == null) return;
mNotificationManager.cancel(NotificationUtils.createUploadNotificationTag(upload.getRemotePath(),upload.getLocalPath()),
FilesUploadWorker.NOTIFICATION_ERROR_ID);
}
}

View file

@ -246,11 +246,16 @@ public class ExtendedListFragment extends Fragment implements
@Override
public boolean onQueryTextSubmit(String query) {
performSearch(query, false);
RecyclerView.Adapter adapter = getRecyclerView().getAdapter();
if (adapter instanceof OCFileListAdapter) {
ArrayList<String> listOfHiddenFiles = ((OCFileListAdapter) adapter).listOfHiddenFiles;
performSearch(query, listOfHiddenFiles, false);
return true;
}
return false;
}
public void performSearch(final String query, boolean isBackPressed) {
public void performSearch(final String query, final ArrayList<String> listOfHiddenFiles, boolean isBackPressed) {
handler.removeCallbacksAndMessages(null);
RecyclerView.Adapter adapter = getRecyclerView().getAdapter();
Activity activity = getActivity();
@ -269,7 +274,7 @@ public class ExtendedListFragment extends Fragment implements
.getVersion()
.isNewerOrEqual(OwnCloudVersion.nextcloud_20)
) {
((FileDisplayActivity) activity).performUnifiedSearch(query);
((FileDisplayActivity) activity).performUnifiedSearch(query, listOfHiddenFiles);
} else {
EventBus.getDefault().post(
new SearchEvent(query, SearchRemoteOperation.SearchType.FILE_SEARCH)
@ -297,10 +302,14 @@ public class ExtendedListFragment extends Fragment implements
@Override
public boolean onClose() {
performSearch("", true);
RecyclerView.Adapter adapter = getRecyclerView().getAdapter();
if (adapter instanceof OCFileListAdapter) {
ArrayList<String> listOfHiddenFiles = ((OCFileListAdapter) adapter).listOfHiddenFiles;
performSearch("", listOfHiddenFiles,true);
return false;
}
return true;
}
@Override
public void onAttach(@NonNull Context context) {

View file

@ -561,8 +561,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
getActivity(),
((FileActivity) getActivity()).getUser().orElseThrow(RuntimeException::new),
FileDisplayActivity.REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM,
getCurrentFile().isEncrypted()
);
getCurrentFile().isEncrypted());
}
@Override
@ -976,6 +975,8 @@ public class OCFileListFragment extends ExtendedListFragment implements
@Override
public void onItemClicked(OCFile file) {
((FileActivity) mContainerActivity).checkInternetConnection();
if (getCommonAdapter().isMultiSelect()) {
toggleItemToCheckedList(file);
} else {

View file

@ -25,6 +25,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
@ -54,6 +55,7 @@ import com.owncloud.android.ui.unifiedsearch.IUnifiedSearchViewModel
import com.owncloud.android.ui.unifiedsearch.ProviderID
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchViewModel
import com.owncloud.android.ui.unifiedsearch.filterOutHiddenFiles
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject
@ -74,6 +76,22 @@ class UnifiedSearchFragment :
private var searchView: SearchView? = null
lateinit var vm: IUnifiedSearchViewModel
companion object {
private const val TAG = "UnifiedSearchFragment"
const val ARG_QUERY = "ARG_QUERY"
const val ARG_HIDDEN_FILES = "ARG_HIDDEN_FILES"
fun newInstance(query: String?, listOfHiddenFiles: ArrayList<String>?): UnifiedSearchFragment {
val fragment = UnifiedSearchFragment()
val args = Bundle()
args.putString(ARG_QUERY, query)
args.putStringArrayList(ARG_HIDDEN_FILES, listOfHiddenFiles)
fragment.arguments = args
return fragment
}
}
@Inject
lateinit var vmFactory: ViewModelFactory
@ -92,6 +110,8 @@ class UnifiedSearchFragment :
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private var listOfHiddenFiles = ArrayList<String>()
private var showMoreActions = false
override fun onCreate(savedInstanceState: Bundle?) {
@ -100,12 +120,52 @@ class UnifiedSearchFragment :
setUpViewModel()
val query = savedInstanceState?.getString(ARG_QUERY) ?: arguments?.getString(ARG_QUERY)
listOfHiddenFiles =
savedInstanceState?.getStringArrayList(ARG_HIDDEN_FILES) ?: arguments?.getStringArrayList(ARG_HIDDEN_FILES)
?: ArrayList()
if (!query.isNullOrEmpty()) {
vm.setQuery(query)
vm.initialQuery()
}
}
@Suppress("DEPRECATION")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = ListFragmentBinding.inflate(inflater, container, false)
binding.listRoot.updatePadding(top = resources.getDimension(R.dimen.standard_half_padding).toInt())
setUpBinding()
setHasOptionsMenu(true)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupFileDisplayActivity()
setupAdapter()
}
@Deprecated("Deprecated in Java")
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val item = menu.findItem(R.id.action_search)
setupSearchView(item)
}
private fun setupSearchView(item: MenuItem) {
(item.actionView as? SearchView?)?.run {
// Required to align with TextView width.
// Because this fragment is opened with TextView onClick on the previous screen
maxWidth = Integer.MAX_VALUE
viewThemeUtils.androidx.themeToolbarSearchView(this)
setQuery(vm.query.value, false)
setOnQueryTextListener(this@UnifiedSearchFragment)
isIconified = false
clearFocus()
}
}
private fun setUpViewModel() {
vm.searchResults.observe(this, this::onSearchResultChanged)
vm.isLoading.observe(this) { loading ->
@ -173,25 +233,14 @@ class UnifiedSearchFragment :
}
}
@Suppress("DEPRECATION")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = ListFragmentBinding.inflate(inflater, container, false)
binding.listRoot.updatePadding(top = resources.getDimension(R.dimen.standard_half_padding).toInt())
setUpBinding()
setHasOptionsMenu(true)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (activity is FileDisplayActivity) {
val fileDisplayActivity = activity as FileDisplayActivity
fileDisplayActivity.setMainFabVisible(false)
fileDisplayActivity.updateActionBarTitleAndHomeButtonByString(null)
private fun setupFileDisplayActivity() {
(activity as? FileDisplayActivity)?.run {
setMainFabVisible(false)
updateActionBarTitleAndHomeButtonByString(null)
}
}
private fun setupAdapter() {
val gridLayoutManager = GridLayoutManager(requireContext(), 1)
adapter = UnifiedSearchListAdapter(
storageManager,
@ -208,11 +257,6 @@ class UnifiedSearchFragment :
binding.listRoot.adapter = adapter
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onSearchResultClicked(searchResultEntry: SearchResultEntry) {
showMoreActions = false
vm.openResult(searchResultEntry)
@ -226,8 +270,7 @@ class UnifiedSearchFragment :
fun onSearchResultChanged(result: List<UnifiedSearchSection>) {
Log_OC.d(TAG, "result")
binding.emptyList.emptyListView.visibility = View.GONE
adapter.setData(result)
adapter.setData(result.filterOutHiddenFiles(listOfHiddenFiles))
}
@VisibleForTesting
@ -236,39 +279,6 @@ class UnifiedSearchFragment :
setUpViewModel()
}
@Deprecated("Deprecated in Java")
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val item = menu.findItem(R.id.action_search)
searchView = item.actionView as SearchView?
// Required to align with TextView width.
// Because this fragment is opened with TextView onClick on the previous screen
searchView?.maxWidth = Integer.MAX_VALUE
viewThemeUtils.androidx.themeToolbarSearchView(searchView!!)
searchView?.setQuery(vm.query.value, false)
searchView?.setOnQueryTextListener(this)
searchView?.isIconified = false
searchView?.clearFocus()
}
companion object {
private const val TAG = "UnifiedSearchFragment"
const val ARG_QUERY = "ARG_QUERY"
/**
* Public factory method to get fragment.
*/
fun newInstance(query: String?): UnifiedSearchFragment {
val fragment = UnifiedSearchFragment()
val args = Bundle()
args.putString(ARG_QUERY, query)
fragment.arguments = args
return fragment
}
}
override fun onQueryTextSubmit(query: String): Boolean {
vm.setQuery(query)
vm.initialQuery()
@ -277,14 +287,15 @@ class UnifiedSearchFragment :
override fun onQueryTextChange(newText: String?): Boolean {
val closeButton = searchView?.findViewById<ImageView>(androidx.appcompat.R.id.search_close_btn)
if (newText?.isEmpty() == true) {
closeButton?.visibility = View.INVISIBLE
} else {
closeButton?.visibility = View.VISIBLE
}
closeButton?.visibility = if (newText?.isEmpty() == true) View.INVISIBLE else View.VISIBLE
return true
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun showFilesAction(searchResultEntry: SearchResultEntry) {
showMoreActions = true
vm.openResult(searchResultEntry)

View file

@ -25,6 +25,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.utils.theme.ViewThemeUtils;
import java.security.SecureRandom;
@ -81,4 +82,11 @@ public final class NotificationUtils {
((HandlerThread) Thread.currentThread()).getLooper().quit();
}, delayInMillis);
}
public static String createUploadNotificationTag(OCFile file){
return createUploadNotificationTag(file.getRemotePath(), file.getStoragePath());
}
public static String createUploadNotificationTag(String remotePath, String localPath){
return remotePath + localPath;
}
}

View file

@ -88,6 +88,8 @@ public class PreviewImageActivity extends FileActivity implements
private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER";
private static final String KEY_SYSTEM_VISIBLE = "TRUE";
private OCFile livePhotoFile;
private ViewPager mViewPager;
private PreviewImagePagerAdapter mPreviewImagePagerAdapter;
private int mSavedPosition;
@ -99,6 +101,8 @@ public class PreviewImageActivity extends FileActivity implements
@Inject AppPreferences preferences;
@Inject LocalBroadcastManager localBroadcastManager;
private ActionBar actionBar;
public static Intent previewFileIntent(Context context, User user, OCFile file) {
final Intent intent = new Intent(context, PreviewImageActivity.class);
intent.putExtra(FileActivity.EXTRA_FILE, file);
@ -110,7 +114,7 @@ public class PreviewImageActivity extends FileActivity implements
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar actionBar = getSupportActionBar();
actionBar = getSupportActionBar();
if (savedInstanceState != null && !savedInstanceState.getBoolean(KEY_SYSTEM_VISIBLE, true) &&
actionBar != null) {
@ -119,6 +123,8 @@ public class PreviewImageActivity extends FileActivity implements
setContentView(R.layout.preview_image_activity);
livePhotoFile = getIntent().getParcelableExtra(EXTRA_LIVE_PHOTO_FILE);
// Navigation Drawer
setupDrawer();
@ -139,7 +145,18 @@ public class PreviewImageActivity extends FileActivity implements
} else {
mRequestWaitingForBinder = false;
}
}
public void toggleActionBarVisibility(boolean hide) {
if (actionBar == null) {
return;
}
if (hide) {
actionBar.hide();
} else {
actionBar.show();
}
}
private void initViewPager(User user) {
@ -163,6 +180,7 @@ public class PreviewImageActivity extends FileActivity implements
mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(
getSupportFragmentManager(),
livePhotoFile,
parentFolder,
user,
getStorageManager(),

View file

@ -54,6 +54,7 @@ import com.nextcloud.client.di.Injectable;
import com.nextcloud.client.jobs.BackgroundJobManager;
import com.nextcloud.client.network.ConnectivityService;
import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
import com.nextcloud.utils.extensions.ExtensionsKt;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.databinding.PreviewImageFragmentBinding;
@ -84,8 +85,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.fragment.app.FragmentTransaction;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import pl.droidsonroids.gif.GifDrawable;
@ -94,12 +97,10 @@ import static com.owncloud.android.datamodel.ThumbnailsCacheManager.PREFIX_THUMB
/**
* This fragment shows a preview of a downloaded image.
*
* Trying to get an instance with a NULL {@link OCFile} will produce an
* {@link IllegalStateException}.
*
* If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on
* instantiation too.
* <p>
* Trying to get an instance with a NULL {@link OCFile} will produce an {@link IllegalStateException}.
* <p>
* If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too.
*/
public class PreviewImageFragment extends FileFragment implements Injectable {
@ -114,13 +115,11 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
private static final String MIME_TYPE_SVG = "image/svg+xml";
private Boolean showResizedImage;
private Bitmap bitmap;
private static final String TAG = PreviewImageFragment.class.getSimpleName();
private boolean ignoreFirstSavedState;
private LoadBitmapTask loadBitmapTask;
@Inject ConnectivityService connectivityService;
@ -132,17 +131,15 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
/**
* Public factory method to create a new fragment that previews an image.
*
* Android strongly recommends keep the empty constructor of fragments as the only public
* constructor, and
* use {@link #setArguments(Bundle)} to set the needed arguments.
*
* <p>
* Android strongly recommends keep the empty constructor of fragments as the only public constructor, and use
* {@link #setArguments(Bundle)} to set the needed arguments.
* <p>
* This method hides to client objects the need of doing the construction in two steps.
*
* @param imageFile An {@link OCFile} to preview as an image in the fragment
* @param ignoreFirstSavedState Flag to work around an unexpected behaviour of
* {@link FragmentStatePagerAdapter}
* ; TODO better solution
* @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter} ;
* TODO better solution
*/
public static PreviewImageFragment newInstance(@NonNull OCFile imageFile,
boolean ignoreFirstSavedState,
@ -159,12 +156,11 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
/**
* Creates an empty fragment for image previews.
*
* MUST BE KEPT: the system uses it when tries to re-instantiate a fragment automatically
* (for instance, when the device is turned a aside).
*
* DO NOT CALL IT: an {@link OCFile} and {@link User} must be provided for a successful
* construction
* <p>
* MUST BE KEPT: the system uses it when tries to re-instantiate a fragment automatically (for instance, when the
* device is turned a aside).
* <p>
* DO NOT CALL IT: an {@link OCFile} and {@link User} must be provided for a successful construction
*/
public PreviewImageFragment() {
ignoreFirstSavedState = false;
@ -200,12 +196,44 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
view.setOnClickListener(v -> togglePreviewImageFullScreen());
binding.image.setOnClickListener(v -> togglePreviewImageFullScreen());
checkLivePhotoAvailability();
setMultiListLoadingMessage();
return view;
}
private void checkLivePhotoAvailability() {
OCFile livePhotoVideo = getFile().livePhotoVideo;
if (livePhotoVideo == null) return;
binding.livePhotoIndicator.setVisibility(View.VISIBLE);
ExtensionsKt.clickWithDebounce(binding.livePhotoIndicator, 4000L, () -> {
playLivePhoto(livePhotoVideo);
return null;
});
}
private void hideActionBar() {
PreviewImageActivity activity = (PreviewImageActivity) requireActivity();
activity.toggleActionBarVisibility(true);
}
private void playLivePhoto(OCFile file) {
if (file == null) {
return;
}
hideActionBar();
Fragment mediaFragment = PreviewMediaFragment.newInstance(file, accountManager.getUser(), 0, true, true);
FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.top, mediaFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
/**
* {@inheritDoc}
*/
@ -395,11 +423,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
public void onFileActionChosen(final int itemId) {
if (itemId == R.id.action_send_share_file) {
if (getFile().isSharedWithMe() && !getFile().canReshare()) {
Snackbar.make(requireView(),
R.string.resharing_is_not_allowed,
Snackbar.LENGTH_LONG
)
.show();
Snackbar.make(requireView(), R.string.resharing_is_not_allowed, Snackbar.LENGTH_LONG).show();
} else {
containerActivity.getFileOperationsHelper().sendShareFile(getFile());
}
@ -457,9 +481,9 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
/**
* Weak reference to the target {@link ImageView} where the bitmap will be loaded into.
*
* Using a weak reference will avoid memory leaks if the target ImageView is retired from
* memory before the load finishes.
* <p>
* Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load
* finishes.
*/
private final WeakReference<PhotoView> imageViewRef;
private final WeakReference<LinearLayout> infoViewRef;
@ -734,8 +758,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
}
/**
* Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment}
* to be previewed.
* Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} to be previewed.
*
* @param file File to test if can be previewed.
* @return 'True' if the file can be handled by the fragment.

View file

@ -47,6 +47,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
*/
public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
private OCFile selectedFile;
private List<OCFile> mImageFiles;
private User user;
private Set<Object> mObsoleteFragments;
@ -64,6 +65,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
* @param storageManager Bridge to database.
*/
public PreviewImagePagerAdapter(FragmentManager fragmentManager,
OCFile selectedFile,
OCFile parentFolder,
User user,
FileDataStorageManager storageManager,
@ -78,6 +80,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
}
this.user = user;
this.selectedFile = selectedFile;
mStorageManager = storageManager;
mImageFiles = mStorageManager.getFolderImages(parentFolder, onlyOnDevice);
@ -147,6 +150,9 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
}
}
private void addVideoOfLivePhoto(OCFile file) {
file.livePhotoVideo = selectedFile;
}
@NonNull
public Fragment getItem(int i) {
@ -155,10 +161,11 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
if (file == null) {
fragment = PreviewImageErrorFragment.newInstance();
} else if (file.isDown()) {
fragment = PreviewImageFragment.newInstance(file, mObsoletePositions.contains(i), false);
} else {
addVideoOfLivePhoto(file);
if (mDownloadErrors.remove(i)) {
fragment = FileDownloadFragment.newInstance(file, user, true);
((FileDownloadFragment) fragment).setError(true);
@ -166,7 +173,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
if (file.isEncrypted()) {
fragment = FileDownloadFragment.newInstance(file, user, mObsoletePositions.contains(i));
} else if (PreviewMediaFragment.canBePreviewed(file)) {
fragment = PreviewMediaFragment.newInstance(file, user, 0, false);
fragment = PreviewMediaFragment.newInstance(file, user, 0, false, file.livePhotoVideo != null);
} else {
fragment = PreviewImageFragment.newInstance(file, mObsoletePositions.contains(i), true);
}

View file

@ -38,6 +38,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -94,6 +95,8 @@ import androidx.core.graphics.drawable.DrawableCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
/**
* This fragment shows a preview of a downloaded media file (audio or video).
@ -123,11 +126,13 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
private static final String USER = "USER";
private static final String PLAYBACK_POSITION = "PLAYBACK_POSITION";
private static final String AUTOPLAY = "AUTOPLAY";
private static final String IS_LIVE_PHOTO = "IS_LIVE_PHOTO";
private User user;
private long savedPlaybackPosition;
private boolean autoplay;
private boolean isLivePhoto;
private boolean prepared;
private PlayerServiceConnection mediaPlayerServiceConnection;
@ -151,7 +156,8 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
public static PreviewMediaFragment newInstance(OCFile fileToDetail,
User user,
long startPlaybackPosition,
boolean autoplay) {
boolean autoplay,
boolean isLivePhoto) {
PreviewMediaFragment previewMediaFragment = new PreviewMediaFragment();
Bundle bundle = new Bundle();
@ -159,6 +165,7 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
bundle.putParcelable(USER, user);
bundle.putLong(PLAYBACK_POSITION, startPlaybackPosition);
bundle.putBoolean(AUTOPLAY, autoplay);
bundle.putBoolean(IS_LIVE_PHOTO, isLivePhoto);
previewMediaFragment.setArguments(bundle);
@ -175,6 +182,7 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
*/
public PreviewMediaFragment() {
super();
savedPlaybackPosition = 0;
autoplay = true;
}
@ -187,10 +195,13 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
Bundle bundle = getArguments();
setFile(bundle.getParcelable(FILE));
user = bundle.getParcelable(USER);
savedPlaybackPosition = bundle.getLong(PLAYBACK_POSITION);
autoplay = bundle.getBoolean(AUTOPLAY);
mediaPlayerServiceConnection = new PlayerServiceConnection(getContext());
isLivePhoto = bundle.getBoolean(IS_LIVE_PHOTO);
mediaPlayerServiceConnection = new PlayerServiceConnection(requireContext());
}
@Override
@ -350,13 +361,18 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
if (exoPlayer != null) {
playVideo();
} else {
final Handler handler = new Handler();
final Handler handler = new Handler(Looper.getMainLooper());
Executors.newSingleThreadExecutor().execute(() -> {
try {
nextcloudClient = clientFactory.createNextcloudClient(accountManager.getUser());
handler.post(() ->{
exoPlayer = NextcloudExoPlayer.createNextcloudExoplayer(requireContext(), nextcloudClient);
exoPlayer.addListener(new ExoplayerListener(requireContext(), binding.exoplayerView, exoPlayer));
exoPlayer.addListener(new ExoplayerListener(requireContext(), binding.exoplayerView, exoPlayer, () -> {
goBackToLivePhoto();
return null;
}));
playVideo();
});
} catch (ClientFactory.CreationException e) {
@ -370,6 +386,23 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
}
}
private void goBackToLivePhoto() {
if (!isLivePhoto) {
return;
}
showActionBar();
requireActivity().getSupportFragmentManager().popBackStack();
}
private void showActionBar() {
Activity currentActivity = requireActivity();
if (currentActivity instanceof PreviewImageActivity activity) {
activity.toggleActionBarVisibility(false);
}
}
private void setupVideoView() {
binding.exoplayerView.setPlayer(exoPlayer);
LinearLayout linearLayout = binding.exoplayerView.findViewById(R.id.exo_center_controls);

View file

@ -10,3 +10,13 @@ data class UnifiedSearchSection(
val entries: List<SearchResultEntry>,
val hasMoreResults: Boolean
)
fun List<UnifiedSearchSection>.filterOutHiddenFiles(listOfHiddenFiles: List<String>): List<UnifiedSearchSection> {
return map { searchSection ->
val entriesWithoutHiddenFiles = searchSection.entries.filterNot { entry ->
listOfHiddenFiles.contains(entry.title)
}
searchSection.copy(entries = entriesWithoutHiddenFiles)
}.filter { it.entries.isNotEmpty() }
}

View file

@ -295,7 +295,7 @@ public final class DisplayUtils {
hostStart = url.indexOf('@') + "@".length();
}
int hostEnd = url.substring(hostStart).indexOf("/");
int hostEnd = url.substring(hostStart).indexOf('/');
// Handle URL which doesn't have a path (path is implicitly '/')
hostEnd = hostEnd == -1 ? urlNoDots.length() : hostStart + hostEnd;

View file

@ -116,7 +116,7 @@ public final class EncryptionUtils {
public static final String ivDelimiter = "|"; // not base64 encoded
public static final String ivDelimiterOld = "fA=="; // "|" base64 encoded
private static final String HASH_DELIMITER = "$";
private static final char HASH_DELIMITER = '$';
private static final int iterationCount = 1024;
private static final int keyStrength = 256;
private static final String AES_CIPHER = "AES/GCM/NoPadding";

View file

@ -260,6 +260,8 @@ public final class FileStorageUtils {
file.setTags(new ArrayList<>(Arrays.asList(remote.getTags())));
file.setImageDimension(remote.getImageDimension());
file.setGeoLocation(remote.getGeoLocation());
file.setLivePhoto(remote.getLivePhoto());
file.setHidden(remote.getHidden());
return file;
}

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,16.5v-9l6,4.5 -6,4.5z"
android:fillColor="#000000"/>
</vector>

View file

@ -17,6 +17,7 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ListItemLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -46,9 +47,10 @@
android:src="@drawable/file_image" />
<ImageView
tools:visibility="visible"
android:id="@+id/favorite_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="top|end"
android:layout_margin="@dimen/standard_quarter_margin"
android:contentDescription="@string/favorite_icon"
@ -56,21 +58,12 @@
android:src="@drawable/favorite" />
<ImageView
android:id="@+id/sharedIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_marginTop="@dimen/grid_image_shared_icon_layout_top_margin"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:contentDescription="@string/shared_icon_shared_via_link"
android:src="@drawable/shared_via_link" />
<ImageView
tools:visibility="visible"
android:id="@+id/unreadComments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_marginTop="@dimen/grid_image_shared_icon_layout_top_margin"
android:layout_marginTop="70dp"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:clickable="true"
android:contentDescription="@string/unread_comments"
@ -79,9 +72,10 @@
android:visibility="gone" />
<ImageView
tools:visibility="visible"
android:id="@+id/localFileIndicator"
android:layout_width="@dimen/grid_image_local_file_indicator_layout_width"
android:layout_height="@dimen/grid_image_local_file_indicator_layout_height"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="bottom|end"
android:layout_marginTop="@dimen/standard_quarter_margin"
android:layout_marginEnd="@dimen/standard_quarter_margin"
@ -89,7 +83,55 @@
android:contentDescription="@string/synced_icon"
android:src="@drawable/ic_synced" />
<FrameLayout
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="top|end"
android:layout_marginTop="32dp"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:background="@drawable/rounded_rect"
android:backgroundTint="#F6F6F6">
<ImageView
android:id="@+id/sharedIcon"
tools:visibility="visible"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/shared_icon_shared_via_link"
android:src="@drawable/shared_via_link" />
</FrameLayout>
<TextView
android:id="@+id/grid_live_photo_indicator"
tools:visibility="visible"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:drawableTint="@color/list_item_lastmod_and_filesize_text"
android:background="@drawable/rounded_rect"
android:backgroundTint="#F6F6F6"
android:paddingVertical="10dp"
android:paddingHorizontal="2dp"
android:layout_marginLeft="@dimen/standard_quarter_margin"
android:layout_marginRight="@dimen/standard_quarter_margin"
android:text="@string/file_list_live"
android:drawablePadding="@dimen/standard_eight_padding"
android:gravity="center"
android:layout_gravity="start|bottom"
android:textColor="@color/list_item_lastmod_and_filesize_text"
android:textSize="@dimen/two_line_secondary_text_size"
app:drawableTopCompat="@drawable/ic_live_photo" />
<TextView
android:id="@+id/live_photo_indicator_separator"
android:visibility="gone"
android:layout_width="0dp"
android:layout_height="0dp"/>
<ImageView
tools:visibility="visible"
android:id="@+id/custom_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -72,12 +72,12 @@
android:id="@+id/videoOverlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:contentDescription="@string/video_overlay_icon"
android:src="@drawable/video_white"
android:visibility="gone"
tools:visibility="visible"
android:contentDescription="@string/video_overlay_icon" />
tools:visibility="visible" />
</FrameLayout>
@ -88,19 +88,19 @@
android:layout_gravity="top|end"
android:layout_marginTop="@dimen/grid_item_shared_icon_layout_top_margin"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:src="@drawable/shared_via_link"
android:contentDescription="@string/shared_icon_shared_via_link" />
android:contentDescription="@string/shared_icon_shared_via_link"
android:src="@drawable/shared_via_link" />
<ImageView
android:id="@+id/unreadComments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:contentDescription="@string/unread_comments"
android:focusable="true"
android:layout_gravity="top|end"
android:layout_marginTop="@dimen/grid_item_shared_icon_layout_top_margin"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:clickable="true"
android:contentDescription="@string/unread_comments"
android:focusable="true"
android:src="@drawable/ic_comment_grid"
android:visibility="gone" />
@ -109,21 +109,21 @@
android:layout_width="@dimen/grid_item_local_file_indicator_layout_width"
android:layout_height="@dimen/grid_item_local_file_indicator_layout_height"
android:layout_gravity="bottom|end"
android:layout_marginBottom="@dimen/standard_quarter_margin"
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:layout_marginTop="@dimen/standard_quarter_margin"
android:src="@drawable/ic_synced"
android:contentDescription="@string/synced_icon"/>
android:layout_marginEnd="@dimen/standard_quarter_margin"
android:layout_marginBottom="@dimen/standard_quarter_margin"
android:contentDescription="@string/synced_icon"
android:src="@drawable/ic_synced" />
<ImageView
android:id="@+id/custom_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|top"
android:layout_marginLeft="@dimen/standard_quarter_margin"
android:layout_marginRight="@dimen/standard_quarter_margin"
android:layout_gravity="center_vertical|top"
android:src="@android:drawable/checkbox_off_background"
android:contentDescription="@string/checkbox"/>
android:contentDescription="@string/checkbox"
android:src="@android:drawable/checkbox_off_background" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -163,6 +163,33 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/live_photo_indicator"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/file_list_live"
android:drawablePadding="@dimen/standard_eight_padding"
android:gravity="center"
android:textColor="@color/list_item_lastmod_and_filesize_text"
android:textSize="@dimen/two_line_secondary_text_size"
app:drawableLeftCompat="@drawable/ic_live_photo"
app:drawableTint="@color/list_item_lastmod_and_filesize_text" />
<TextView
android:id="@+id/live_photo_indicator_separator"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:paddingStart="@dimen/zero"
android:paddingEnd="@dimen/standard_quarter_padding"
android:text="@string/info_separator"
android:textColor="@color/list_item_lastmod_and_filesize_text"
android:textSize="@dimen/two_line_secondary_text_size" />
<TextView
android:id="@+id/file_size"
android:layout_width="wrap_content"
@ -206,7 +233,7 @@
<ImageView
android:id="@+id/unreadComments"
android:layout_width="wrap_content"
android:layout_width="48dp"
android:layout_height="match_parent"
android:clickable="true"
android:contentDescription="@string/unread_comments"
@ -214,6 +241,7 @@
android:paddingStart="@dimen/standard_half_padding"
android:paddingEnd="@dimen/list_item_share_right_margin"
android:src="@drawable/ic_comment"
tools:visibility="visible"
android:visibility="gone" />
<ImageView
@ -227,11 +255,12 @@
android:minHeight="@dimen/min_list_item_size"
android:paddingStart="@dimen/list_item_share_right_margin"
android:paddingEnd="@dimen/list_item_share_right_margin"
android:src="@drawable/ic_unshared" />
android:src="@drawable/ic_unshared"
tools:visibility="visible"/>
<com.owncloud.android.ui.AvatarGroupLayout
android:id="@+id/sharedAvatars"
android:layout_width="100dp"
android:layout_width="75dp"
android:layout_height="@dimen/min_list_item_size"
android:layout_gravity="top"
android:contentDescription="@string/shared_avatar_desc"

View file

@ -18,11 +18,32 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/live_photo_indicator"
android:visibility="gone"
tools:visibility="visible"
android:layout_marginTop="@dimen/live_photo_indicator_margin"
android:layout_marginStart="@dimen/standard_quarter_margin"
android:paddingVertical="@dimen/live_photo_indicator_vertical_padding"
android:paddingHorizontal="@dimen/live_photo_indicator_horizontal_padding"
android:background="@drawable/rounded_rect"
android:backgroundTint="#E5E5E5"
android:textColor="@color/black"
android:layout_gravity="start|top"
android:gravity="center"
android:translationZ="2dp"
android:drawablePadding="@dimen/standard_quarter_margin"
android:text="@string/file_list_live"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:drawableStartCompat="@drawable/ic_live_photo" />
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/image"
android:layout_width="match_parent"

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">لم تقم بمشاركة أية بيانات بعد</string>
<string name="file_list_empty_unified_search_no_results">لا توجد نتائج لطلبك</string>
<string name="file_list_folder">مجلد</string>
<string name="file_list_live">مُباشِر</string>
<string name="file_list_loading">جارِ التحميل …</string>
<string name="file_list_no_app_for_file_type">لم يُعّد التطبيق يدعم نوع الملف هذا.</string>
<string name="file_list_seconds_ago">منذ ثواني</string>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">Nothing shared yet</string>
<string name="file_list_empty_unified_search_no_results">No results found for your query</string>
<string name="file_list_folder">folder</string>
<string name="file_list_live">LIVE</string>
<string name="file_list_loading">Loading…</string>
<string name="file_list_no_app_for_file_type">No app set up to handle this file type.</string>
<string name="file_list_seconds_ago">seconds ago</string>
@ -884,6 +885,7 @@
<string name="upload_lock_failed">Locking folder failed</string>
<string name="upload_old_android">Encryption is only possible with &gt;= Android 5.0</string>
<string name="upload_query_move_foreign_files">Insufficient space prevents copying the selected files into the %1$s folder. Would you like to move them there instead?</string>
<string name="upload_quota_exceeded">Storage quota exceeded</string>
<string name="upload_scan_doc_upload">Scan document from camera</string>
<string name="upload_sync_conflict">Sync conflict, please resolve manually</string>
<string name="upload_unknown_error">Unknown error</string>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">Noch nichts geteilt</string>
<string name="file_list_empty_unified_search_no_results">Keine Ergebnisse für Ihre Suche gefunden</string>
<string name="file_list_folder">Ordner</string>
<string name="file_list_live">LIVE</string>
<string name="file_list_loading">Lade…</string>
<string name="file_list_no_app_for_file_type">Es wurde keine App für diesen Dateityp gefunden.</string>
<string name="file_list_seconds_ago">Gerade eben</string>

View file

@ -18,6 +18,7 @@
<string name="actionbar_copy">Kopiatu</string>
<string name="actionbar_mkdir">Karpeta berria</string>
<string name="actionbar_move">Mugitu</string>
<string name="actionbar_move_or_copy">Mugitu edo kopiatu</string>
<string name="actionbar_open_with">Ireki honekin</string>
<string name="actionbar_search">Bilatu</string>
<string name="actionbar_see_details">Xehetasunak</string>
@ -159,6 +160,7 @@
<string name="conflict_message_description">Bi bertsioak hautatzen badituzu, fitxategi lokalaren izenari zenbaki bat gehituko zaio.</string>
<string name="conflict_server_file">Zerbitzariko fitxategia</string>
<string name="contact_backup_title">Kontaktuen segurtasun kopia</string>
<string name="contact_no_permission">Kontaktuak atzitzeko baimena behar da.</string>
<string name="contactlist_item_icon">Erabiltzailearen ikonoa kontaktuen zerrendarako</string>
<string name="contactlist_no_permission">Ez da baimenik eman, ez da ezer inportatu.</string>
<string name="contacts">Kontaktuak</string>
@ -257,6 +259,7 @@
<string name="ecosystem_apps_more">Nextcloud aplikazio gehiago</string>
<string name="ecosystem_apps_notes">Nextcloud Oharrak</string>
<string name="ecosystem_apps_talk">Nextcloud Talk</string>
<string name="email_pick_failed">Ezin izan da helbide elektronikoa hautatu.</string>
<string name="encrypted">Ezarri zifratu gisa</string>
<string name="end_to_end_encryption_confirm_button">Konfiguratu zifratzea</string>
<string name="end_to_end_encryption_decrypting">Deszifratzen...</string>
@ -647,6 +650,8 @@
<string name="remove_e2e">Lokalean, muturretik muturrerako enkriptatzea ken dezakezu bezero honetan</string>
<string name="remove_e2e_message">Lokalean, muturretik muturrerako enkriptatzea ken dezakezu bezero honetan. Enkriptatutako fitxategiek zerbitzarian jarraituko dute, baina ez dira ordenagailu honekin sinkronizatuko.</string>
<string name="remove_fail_msg">Ezabatzeak huts egin du</string>
<string name="remove_local_account">Kendu tokiko kontua</string>
<string name="remove_local_account_details">Kendu kontua gailutik eta ezabatu tokiko fitxategi guztiak</string>
<string name="remove_notification_failed">Huts egin du jakinarazpena kentzean</string>
<string name="remove_push_notification">Ezabatu</string>
<string name="remove_success_msg">Ezabatuta</string>
@ -654,6 +659,8 @@
<string name="rename_local_fail_msg">Ezin izan da kopia lokala berrizendatu, saiatu beste izen batekin</string>
<string name="rename_server_fail_msg">Ezin izan da berrizendatu, izena hartua zegoen</string>
<string name="request_account_deletion">Eskatu kontuaren ezabaketa</string>
<string name="request_account_deletion_button">Ezabatzeko eskaera</string>
<string name="request_account_deletion_details">Eskatu kontua behin betiko ezabatzea zerbitzu-hornitzailetik</string>
<string name="reshare_not_allowed">Birpartekatzea ez da onartzen</string>
<string name="resharing_is_not_allowed">Birpartekatzea ez da onartzen</string>
<string name="resized_image_not_possible_download">Ez dago tamainaz aldatutako irudirik eskuragarri. Irudi osoa deskargatu nahi duzu?</string>
@ -877,6 +884,7 @@
<string name="upload_lock_failed">Karpeta blokeatzeak huts egin du</string>
<string name="upload_old_android">Zifratzea >= Android 5.0 bertsioarekin soilik da posible</string>
<string name="upload_query_move_foreign_files">Hautatutako fitxategiak ezin dira %1$sra kopiatu ez dagoelako toki nahikorik. Kopiatu ordez bertara mugitu nahi dituzu?</string>
<string name="upload_quota_exceeded">Biltegiratze kuota gainditu da</string>
<string name="upload_scan_doc_upload">Eskaneatu dokumentua kamararekin</string>
<string name="upload_sync_conflict">Sinkronizazio gatazka, ebatzi eskuz</string>
<string name="upload_unknown_error">Akats ezezaguna</string>
@ -945,7 +953,9 @@
<string name="wait_a_moment">Itxaron momentu bat…</string>
<string name="wait_checking_credentials">Gordetako nortasun-datuak konprobatzen</string>
<string name="wait_for_tmp_copy_from_private_storage">Fitxategia biltegiratze pribatutik kopiatzen</string>
<string name="webview_version_check_alert_dialog_message">Eguneratu Android System WebView aplikazioa saioa hasteko</string>
<string name="webview_version_check_alert_dialog_positive_button_title">Eguneratu</string>
<string name="webview_version_check_alert_dialog_title">Eguneratu Android System WebView</string>
<string name="what_s_new_image">Zer da irudi berria</string>
<string name="whats_new_skip">Salto egin</string>
<string name="whats_new_title">Berria %1$s-n</string>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">Aínda non hai nada compartido</string>
<string name="file_list_empty_unified_search_no_results">Non se atoparon resultados para a súa consulta</string>
<string name="file_list_folder">cartafol</string>
<string name="file_list_live">DIRECTO</string>
<string name="file_list_loading">Cargando…</string>
<string name="file_list_no_app_for_file_type">Non foi configurada unha aplicación para manexar este tipo de ficheiro.</string>
<string name="file_list_seconds_ago">hai uns segundos</string>

View file

@ -14,9 +14,11 @@
<string name="action_send_share">Senda/Deila</string>
<string name="action_switch_grid_view">Reitasýn</string>
<string name="action_switch_list_view">Listasýn</string>
<string name="actionbar_calendar_contacts_restore">Endurheimta tengiliði og dagatal</string>
<string name="actionbar_copy">Afrita</string>
<string name="actionbar_mkdir">Ný mappa</string>
<string name="actionbar_move">Færa</string>
<string name="actionbar_move_or_copy">Færa eða afrita</string>
<string name="actionbar_open_with">Opna með</string>
<string name="actionbar_search">Leita</string>
<string name="actionbar_see_details">Nánar</string>
@ -34,6 +36,7 @@
<string name="add_to_cloud">Bæta við %1$s</string>
<string name="advanced_settings">Ítarlegar stillingar</string>
<string name="allow_resharing">Leyfa endurdeilingu</string>
<string name="app_widget_description">Sýnir einn viðmótshluta af stjórnborði</string>
<string name="appbar_search_in">Leita í %s</string>
<string name="associated_account_not_found">Tengdur notandaaðgangur fannst ekki!</string>
<string name="auth_access_failed">Aðgangur mistókst: %1$s</string>
@ -75,19 +78,25 @@
<string name="autoupload_hide_folder">Fela möppu</string>
<string name="avatar">Auðkennismynd</string>
<string name="away">Fjarverandi</string>
<string name="backup_settings">Stillingar öryggisafritunar</string>
<string name="backup_title">Öryggisafrit tengiliða og dagatals</string>
<string name="battery_optimization_close">Loka</string>
<string name="battery_optimization_disable">Gera óvirkt</string>
<string name="battery_optimization_message">Tækið þitt gæti verið með virka orkusparnaðarstýringu. Sjalfvirka innsendingaforritið (AutoUpload) virkar ekki rétt nema að þetta forrit sé undanþegið í slíkri stýringu.</string>
<string name="battery_optimization_title">Bestun fyrir rafhlöðunotkun</string>
<string name="brute_force_delay">Frestað vegna of margra tilrauna</string>
<string name="calendar">Dagatal</string>
<string name="calendars">Dagatöl</string>
<string name="certificate_load_problem">Það kom upp vandamál við að lesa inn skilríkið.</string>
<string name="changelog_dev_version">Breytingaskrá þróunarútgáfu</string>
<string name="check_back_later_or_reload">Athugaðu aftur síðar eða endurlestu.</string>
<string name="checkbox">Gátreitur</string>
<string name="choose_local_folder">Veldu staðværa möppu…</string>
<string name="choose_location">Veldu staðsetningu</string>
<string name="choose_remote_folder">Veldu fjartengda möppu…</string>
<string name="choose_template_helper_text">Veldu sniðmát og settu inn skráarheiti.</string>
<string name="choose_which_file">Veldu hvaða skrá á að halda!</string>
<string name="choose_widget">Veldu viðmótshluta</string>
<string name="clear_notifications_failed">Mistókst að hreinsa tilkynningar.</string>
<string name="clear_status_message">Hreinsa stöðuskilaboð</string>
<string name="clear_status_message_after">Hreinsa stöðuskilaboð eftir</string>
@ -138,6 +147,7 @@
<string name="community_testing_headline">Hjálpaðu til við prófanir</string>
<string name="community_testing_report_text">Tilkynntu um vandamál á GitHub</string>
<string name="configure_new_media_folder_detection_notifications">Stilla</string>
<string name="confirm_removal">Fjarlægja staðværa dulritun</string>
<string name="confirmation_remove_file_alert">Viltu virkilega eyða \'%s\'?</string>
<string name="confirmation_remove_files_alert">Ertu viss um að þú viljir eyða völdum atriðum?</string>
<string name="confirmation_remove_folder_alert">Ertu viss um að þú viljir eyða %1$s og innihaldi þess?</string>
@ -147,6 +157,8 @@
<string name="conflict_local_file">Skrá á tölvunni</string>
<string name="conflict_message_description">Ef þú velur báðar útgáfur, þá mun verða bætt tölustaf aftan við heiti afrituðu skrárinnar.</string>
<string name="conflict_server_file">Skrá á netþjóni</string>
<string name="contact_backup_title">Öryggisafrit tengiliða</string>
<string name="contact_no_permission">Heimild til aðgangs að tengiliðum er nauðsynleg.</string>
<string name="contactlist_item_icon">Táknmynd notanda fyrir tengiliðalista</string>
<string name="contactlist_no_permission">Engin heimild gefin, ekkert flutt inn.</string>
<string name="contacts">Tengiliðir</string>
@ -176,23 +188,37 @@
<string name="create_rich_workspace">Bæta við upplýsingum möppu</string>
<string name="creates_rich_workspace">býr til upplýsingar um möppu</string>
<string name="credentials_disabled">Auðkenni óvirk</string>
<string name="daily_backup">Dagleg öryggisafritun</string>
<string name="data_to_back_up">Gögn sem á að taka öryggisafrit af</string>
<string name="default_credentials_wrong">Röng auðkenni</string>
<string name="delete_account">Fjarlægja reikning</string>
<string name="delete_account_warning">Fjarlægja notandaaðgang %s og eyða öllum staðværum skrám?\n\nEkki er hægt að afturkalla aðgerðina.</string>
<string name="delete_entries">Eyða færslum</string>
<string name="delete_link">Eyða tengli</string>
<string name="deselect_all">Afvelja allt</string>
<string name="destination_filename">Móttökuskráarheiti</string>
<string name="dev_version_new_version_available">Ný útgáfa er tiltæk</string>
<string name="dev_version_no_information_available">Engar upplýsingar tiltækar</string>
<string name="dev_version_no_new_version_available">Engin ný útgáfa tiltæk.</string>
<string name="dialog_close">Loka</string>
<string name="did_not_check_for_dupes">Athugaði ekki með tvítök.</string>
<string name="digest_algorithm_not_available">Þetta reiknirit fyrir gátsummur er ekki tiltækt á símanum þínum.</string>
<string name="direct_login_failed">Innskráning í gegnum beinan tengil mistókst!</string>
<string name="direct_login_text">Skrá inn með %1$s á %2$s</string>
<string name="disable_new_media_folder_detection_notifications">Gera óvirkt</string>
<string name="dismiss">Hafna</string>
<string name="dismiss_notification_description">Afgreiða tilkynningu</string>
<string name="displays_mnemonic">Birtir 12 orða aðgangssetninguna þína</string>
<string name="dnd">Ónáðið ekki</string>
<string name="document_scan_export_dialog_images">Margar myndir</string>
<string name="document_scan_export_dialog_pdf">PDF-skrá</string>
<string name="document_scan_export_dialog_title">Veldu tegund útflutnings</string>
<string name="document_scan_pdf_generation_failed">Gerð PDF tókst ekki</string>
<string name="document_scan_pdf_generation_in_progress">Útbý PDF…</string>
<string name="done">Lokið</string>
<string name="dontClear">Ekki hreinsa</string>
<string name="download_cannot_create_file">Get ekki búið til skrá á tölvu</string>
<string name="download_download_invalid_local_file_name">Ógilt skráarheiti fyrir staðværa skrá</string>
<string name="download_latest_dev_version">Sækja nýjustu þróunarútgáfuna</string>
<string name="downloader_download_failed_content">Gat ekki sótt %1$s</string>
<string name="downloader_download_failed_credentials_error">Niðurhal mistókst, skráðu þig inn aftur</string>
@ -210,6 +236,7 @@
<string name="drawer_item_all_files">Allar skrár</string>
<string name="drawer_item_favorites">Eftirlæti</string>
<string name="drawer_item_gallery">Margmiðlunargögn</string>
<string name="drawer_item_groupfolders">Hópamöppur</string>
<string name="drawer_item_home">Heim</string>
<string name="drawer_item_notifications">Tilkynningar</string>
<string name="drawer_item_on_device">Á tækinu</string>
@ -222,7 +249,15 @@
<string name="drawer_quota">%1$s af %2$s notað</string>
<string name="drawer_quota_unlimited">%s notað</string>
<string name="drawer_synced_folders">Sjálfvirk innsending</string>
<string name="e2e_not_yet_setup">Ekki búið að setja upp E2E</string>
<string name="e2e_offline">Ekki mögulegt án internettengingar</string>
<string name="ecosystem_apps_display_more">Meira</string>
<string name="ecosystem_apps_display_notes">Minnispunktar</string>
<string name="ecosystem_apps_display_talk">Spjalla</string>
<string name="ecosystem_apps_more">Fleiri Nextcloud-forrit</string>
<string name="ecosystem_apps_notes">Nextcloud-minnispunktar</string>
<string name="ecosystem_apps_talk">Nextcloud Talk</string>
<string name="email_pick_failed">Mistókst að velja tölvupóstfang.</string>
<string name="encrypted">Setja sem dulritað</string>
<string name="end_to_end_encryption_confirm_button">Setja upp dulritun</string>
<string name="end_to_end_encryption_decrypting">Afkóðun</string>
@ -239,14 +274,21 @@
<string name="end_to_end_encryption_title">Setja upp dulritun</string>
<string name="end_to_end_encryption_unsuccessful">Gat ekki vistað dulritunarlykla, reyndu aftur.</string>
<string name="end_to_end_encryption_wrong_password">Villa kom upp við afkóðun. Rangt lykilorð?</string>
<string name="enter_destination_filename">Settu inn heiti móttökuskráar</string>
<string name="enter_filename">Settu inn skráarheiti</string>
<string name="error__upload__local_file_not_copied">%1$s var ekki hægt að afrita í staðværu %2$s möppuna</string>
<string name="error_cant_bind_to_operations_service">Alvarleg villa: Ekki hægt að framkvæma aðgerðir</string>
<string name="error_choosing_date">Villa við að velja dagsetningu</string>
<string name="error_comment_file">Villa við að gera athugasemd við skrá</string>
<string name="error_crash_title">%1$s hrundi</string>
<string name="error_creating_file_from_template">Villa við að búa til skrá út frá sniðmáti</string>
<string name="error_file_actions">Villa við birtingu skráaaðgerða</string>
<string name="error_file_lock">Villa við að breyta stöðu læsingar á skrá</string>
<string name="error_report_issue_action">Skýrsla</string>
<string name="error_report_issue_text">Tilkynna um vandamál í verkbeiðnakerfið? (krefst GitHub-aðgangs)</string>
<string name="error_retrieving_file">Villa við að ná í skrá</string>
<string name="error_retrieving_templates">Villa við að ná í sniðmát</string>
<string name="error_showing_encryption_dialog">Villa við að birta uppsetningarglugga dulritunar!</string>
<string name="error_starting_direct_camera_upload">Villa við að ræsa myndavél</string>
<string name="etm_accounts">Aðgangar</string>
<string name="etm_background_job_name">Heiti verks</string>
@ -274,6 +316,7 @@
<string name="failed_to_download">Mistókst að senda skrá í niðurhalsstýringu</string>
<string name="failed_to_print">Mistókst að prenta skrá</string>
<string name="failed_to_start_editor">Mistókst að ræsa ritil</string>
<string name="failed_update_ui">Mistókst að uppfæra viðmótið</string>
<string name="favorite">Bæta í Eftirlæti</string>
<string name="favorite_icon">Eftirlæti</string>
<string name="file_already_exists">Skráarheitið er þegar til staðar</string>
@ -285,6 +328,7 @@
<string name="file_list_empty">Sendu inn eitthvað efni eða samstilltu við tækin þín!</string>
<string name="file_list_empty_favorite_headline">Ekkert er eftirlæti ennþá</string>
<string name="file_list_empty_favorites_filter_list">Skrár og möppur sem þú merkir sem eftirlæti birtast hér.</string>
<string name="file_list_empty_gallery">Fann engar myndir eða myndskeið</string>
<string name="file_list_empty_headline">Engar skrár hér</string>
<string name="file_list_empty_headline_search">Engar niðurstöður í þessari möppu</string>
<string name="file_list_empty_headline_server_search">Engar niðurstöður</string>
@ -294,13 +338,17 @@
<string name="file_list_empty_search">Er þetta kannski í einhverri annarri möppu?</string>
<string name="file_list_empty_shared">Skrár og möppur sem þú deilir birtast hér.</string>
<string name="file_list_empty_shared_headline">Engu deilt ennþá</string>
<string name="file_list_empty_unified_search_no_results">Engar niðurstöður fundust fyrir leitina þína</string>
<string name="file_list_folder">mappa</string>
<string name="file_list_live">BEINT</string>
<string name="file_list_loading">Hleð inn…</string>
<string name="file_list_no_app_for_file_type">Ekkert forrit er uppsett til að meðhöndla þessa tegund skráa.</string>
<string name="file_list_seconds_ago">sekúndum síðan</string>
<string name="file_management_permission">Heimilda er krafist</string>
<string name="file_management_permission_optional">Heimildir gagnageymslu</string>
<string name="file_migration_checking_destination">Athuga áfangastað…</string>
<string name="file_migration_cleaning">Hreinsun</string>
<string name="file_migration_dialog_title">Uppfæri möppu fyrir geymslu gagna</string>
<string name="file_migration_directory_already_exists">Gagnamappa er þegar til. Veldu eitt af eftirfarandi:</string>
<string name="file_migration_failed_dir_already_exists">Nextcloud-mappa er þegar til staðar</string>
<string name="file_migration_failed_not_enough_space">Þarf meira geymslupláss</string>
@ -314,6 +362,7 @@
<string name="file_migration_preparing">Undirbý yfirfærslu...</string>
<string name="file_migration_restoring_accounts_configuration">Endurheimti aðgangsuppsetningar…</string>
<string name="file_migration_saving_accounts_configuration">Vista aðgangsuppsetningar…</string>
<string name="file_migration_source_not_readable">Viltu breyta möppu fyrir geymslurými gagna yfir í %1$s?\n\nAthugaðu: Sækja þarf öll gögn aftur.</string>
<string name="file_migration_source_not_readable_title">Upprunamappa er ekki lesanleg!</string>
<string name="file_migration_updating_index">Uppfæri atriðaskrá…</string>
<string name="file_migration_use_data_folder">Nota</string>
@ -335,12 +384,14 @@
<string name="filename_hint">Skráarheiti</string>
<string name="first_run_1_text">Haltu gögnum þínum öruggum og undir þinni stjórn</string>
<string name="first_run_2_text">Örugg samvinna og skráaskipti</string>
<string name="first_run_3_text">Auðlærður vefpóstur, dagatal og tengiliðir</string>
<string name="first_run_4_text">Skjádeiling, netfundir og vefráðstefnur</string>
<string name="folder_already_exists">Mappa er þegar til staðar</string>
<string name="folder_confirm_create">Búa til</string>
<string name="folder_list_empty_headline">Engar möppur hér</string>
<string name="folder_picker_choose_button_text">Velja</string>
<string name="folder_picker_choose_caption_text">Veldu úttaksmöppu</string>
<string name="folder_picker_copy_button_text">Afrita</string>
<string name="folder_picker_move_button_text">Færa</string>
<string name="forbidden_permissions">Þú hefur ekki heimild %s</string>
<string name="forbidden_permissions_copy">til að afrita þessa skrá</string>
@ -357,11 +408,28 @@
<string name="foreign_files_success">Allar skrár voru færðar</string>
<string name="forward">Áfram</string>
<string name="fourHours">4 klukkustundir</string>
<string name="hidden_file_name_warning">Heitið mun valda falinni skrá</string>
<string name="hint_name">Heiti</string>
<string name="hint_note">Minnispunktur</string>
<string name="hint_password">Lykilorð</string>
<string name="host_not_available">Þjónn er ekki tiltækur</string>
<string name="host_your_own_server">Hýstu þinn eigin þjón</string>
<string name="icon_for_empty_list">Tákn fyrir tóman lista</string>
<string name="icon_of_dashboard_widget">Táknmynd stjórnborðshluta</string>
<string name="icon_of_widget_entry">Táknmynd viðmótshlutafærslu</string>
<string name="image_editor_file_edited_suffix">breytti</string>
<string name="image_editor_flip_horizontal">Fletta lárétt</string>
<string name="image_editor_flip_vertical">Fletta lóðrétt</string>
<string name="image_editor_rotate_ccw">Snúa rangsælis</string>
<string name="image_editor_rotate_cw">Snúa réttsælis</string>
<string name="image_editor_unable_to_edit_image">Gat ekki breytt mynd.</string>
<string name="image_preview_filedetails">Nánar um skrá</string>
<string name="image_preview_image_taking_conditions">Skilyrði við myndatöku</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">í möppunni %1$s</string>
<string name="instant_upload_existing">Senda líka inn fyrirliggjandi skrár</string>
<string name="instant_upload_on_charging">Einungis senda inn þegar verið er að hlaða</string>
@ -371,7 +439,9 @@
<string name="label_empty">Merki má ekki vera tómt</string>
<string name="last_backup">Síðasta öryggisafrit: %1$s</string>
<string name="link">Tengill</string>
<string name="link_name">Heiti tengils</string>
<string name="link_share_allow_upload_and_editing">Leyfa innsendingu og breytingar</string>
<string name="link_share_editing">Breytingar</string>
<string name="link_share_file_drop">Slepping skráa (einungis innsending)</string>
<string name="link_share_view_only">Einungis skoða</string>
<string name="list_layout">Framsetning sem listi</string>
@ -381,12 +451,18 @@
<string name="local_folder_friendly_path">%1$s/%2$s</string>
<string name="local_folder_list_empty">Það eru engar fleiri möppur.</string>
<string name="locate_folder">Staðsetja möppu</string>
<string name="lock_expiration_info">Rennur út: %1$s</string>
<string name="lock_file">Læsa skrá</string>
<string name="locked_by">Læst af %1$s</string>
<string name="locked_by_app">Læst af %1$s-forritinu</string>
<string name="log_send_mail_subject">%1$s atvikaskrár Android-forrita</string>
<string name="log_send_no_mail_app">Ekkert forrit fannst til að senda atvikaskrár. Settu upp tölvupóstforrit.</string>
<string name="logged_in_as">Skráð inn sem %1$s</string>
<string name="login">Skrá inn</string>
<string name="logs_menu_delete">Eyða atvikaskrám</string>
<string name="logs_menu_refresh">Endurnýja</string>
<string name="logs_menu_search">Leita í atvikaskrám</string>
<string name="logs_menu_send">Senda atvikaskrár með tölvupósti</string>
<string name="logs_status_filtered">Atvikaskráning: %1$d kB, fyrirspurn samsvaraði %2$d / %3$d á %4$d ms</string>
<string name="logs_status_loading">Hleð inn…</string>
<string name="logs_status_not_filtered">Atvikaskráning: %1$d kB, engin sía</string>
@ -427,9 +503,15 @@
<string name="new_media_folder_videos">Myndskeið</string>
<string name="new_notification">Ný tilkynning</string>
<string name="new_version_was_created">Ný útgáfa var útbúin</string>
<string name="no_actions">Engar aðgerðir fyrir þennan notanda</string>
<string name="no_browser_available">Ekkert forrit tiltækt til að meðhöndla tengla</string>
<string name="no_calendar_exists">Ekkert dagatal er til staðar</string>
<string name="no_email_app_available">Ekkert forrit er tiltækt sem getur meðhöndlað tölvupóstföng</string>
<string name="no_items">Engin atriði</string>
<string name="no_map_app_availble">Ekkert forrit er tiltækt sem getur meðhöndlað landakort</string>
<string name="no_mutliple_accounts_allowed">Aðeins leyfður einn notandaaðgangur</string>
<string name="no_pdf_app_available">Ekkert forrit tiltækt til að meðhöndla PDF-skrár</string>
<string name="no_send_app">Ekkert forrit er tiltækt sem getur sent völdu skrárnar</string>
<string name="note_confirm">Senda</string>
<string name="note_could_not_sent">Gat ekki sent minnispunkt</string>
<string name="note_icon_hint">Táknmynd fyrir athugasemd</string>
@ -468,17 +550,22 @@
<string name="permission_deny">Neita</string>
<string name="permission_storage_access">Krafist er viðbótarheimilda til að senda inn og sækja skrár.</string>
<string name="picture_set_as_no_app">Engin forrit fundust til að setja mynd</string>
<string name="pin_home">Festa á upphafsskjá</string>
<string name="pin_shortcut_label">Opna %1$s</string>
<string name="placeholder_fileSize">KB</string>
<string name="placeholder_filename">frátökutákn.txt</string>
<string name="placeholder_media_time">12:23:45</string>
<string name="placeholder_sentence">Þetta er frátökutákn</string>
<string name="placeholder_timestamp">e.h.</string>
<string name="player_stop">stöðva</string>
<string name="player_toggle">víxla</string>
<string name="power_save_check_dialog_message">Sé orkusparnaðarprófun gerð óvirk getur það leitt til þess að verið sé að senda inn skrár þegar mjög lítið er eftir á rafhlöðunni!</string>
<string name="pref_behaviour_entries_delete_file">eytt</string>
<string name="pref_behaviour_entries_keep_file">áfram í upprunalegri möppu</string>
<string name="pref_behaviour_entries_move">færð í forritsmöppu</string>
<string name="pref_instant_name_collision_policy_dialogTitle">Hvað á að gera ef skráin er þegar til staðar?</string>
<string name="pref_instant_name_collision_policy_entries_always_ask">Spyrja í hvert sinn</string>
<string name="pref_instant_name_collision_policy_entries_cancel">Sleppa innsendingu</string>
<string name="pref_instant_name_collision_policy_entries_overwrite">Skrifa yfir fjartengda útgáfu</string>
<string name="pref_instant_name_collision_policy_entries_rename">Endurnefna nýja útgáfu</string>
<string name="pref_instant_name_collision_policy_title">Hvað á að gera ef skráin er þegar til staðar?</string>
@ -492,7 +579,9 @@
<string name="prefs_category_dev">Dev</string>
<string name="prefs_category_general">Almennt</string>
<string name="prefs_category_more">Meira</string>
<string name="prefs_daily_backup_summary">Daglegt öryggisafrit af dagatalinu þínu og tengiliðum</string>
<string name="prefs_daily_contact_backup_summary">Daglegt öryggisafrit af tengiliðum</string>
<string name="prefs_e2e_active">Enda-í-enda dulritun er virk!</string>
<string name="prefs_e2e_mnemonic">E2E minnistækni</string>
<string name="prefs_e2e_no_device_credentials">Til að birta minnishjálp skaltu virkja auðkenningu tækisins.</string>
<string name="prefs_enable_media_scan_notifications">Birta tilkynningar vegna skönnunar eftir margmiðlunarefni</string>
@ -503,6 +592,8 @@
<string name="prefs_instant_behaviour_dialogTitle">Upprunaleg skrá verður…</string>
<string name="prefs_instant_behaviour_title">Upprunaleg skrá verður…</string>
<string name="prefs_instant_upload_path_use_subfolders_title">Nota undirmöppur</string>
<string name="prefs_instant_upload_subfolder_rule_title">Valkostir undirmappa</string>
<string name="prefs_keys_exist">Bæta enda-í-enda dulritun við þetta forrit</string>
<string name="prefs_license">Notkunarleyfi</string>
<string name="prefs_lock">Lykilkóði forritsins</string>
<string name="prefs_lock_device_credentials_enabled">Auðkenni tækis virkjuð</string>
@ -512,8 +603,15 @@
<string name="prefs_lock_using_device_credentials">Auðkenni tækis</string>
<string name="prefs_lock_using_passcode">Lykilkóða</string>
<string name="prefs_manage_accounts">Sýsla með notendaaðganga</string>
<string name="prefs_recommend">Mæla með við vin</string>
<string name="prefs_remove_e2e">Fjarlægja staðværa dulritun</string>
<string name="prefs_setup_e2e">Setja upp enda-í-enda dulritun</string>
<string name="prefs_show_ecosystem_apps">Sýna forritaskipti</string>
<string name="prefs_show_ecosystem_apps_summary">Tillögur Nextcloud-forrita í flakkfyrirsögn</string>
<string name="prefs_show_hidden_files">Sýna faldar skrár</string>
<string name="prefs_sourcecode">Náðu í grunnkóðann</string>
<string name="prefs_storage_path">Mappa fyrir geymslu gagna</string>
<string name="prefs_sycned_folders_summary">Sýsla með möppur vegna sjálfvirkra innsendinga</string>
<string name="prefs_synced_folders_local_path_title">Staðvær mappa</string>
<string name="prefs_synced_folders_remote_path_title">Fjartengd mappa</string>
<string name="prefs_theme_title">Þema</string>
@ -529,12 +627,18 @@
<string name="push_notifications_not_implemented">Ýti-tilkynningar eru óvirkar vegna ósamhæfis við séreignahugbúnað í Google Play þjónustu.</string>
<string name="push_notifications_old_login">Engar ýtitilkynningar vegna útrunnirnnar innskráningarsetu. Íhugaðu að setja aðganginn þinn inn aftur.</string>
<string name="push_notifications_temp_error">Ýti-tilkynningar eru ekki tiltækar þessa stundina.</string>
<string name="qr_could_not_be_read">Ekki tókst að lesa QR-kóða!</string>
<string name="recommend_subject">Prófaðu %1$s á snjalltækinu þínu!</string>
<string name="recommend_text">Mér langar til að bjóða þér að nota %1$s á snjalltækinu þínu.\nSæktu það hér: %2$s</string>
<string name="recommend_urls">%1$s eða %2$s</string>
<string name="refresh_content">Endurlesa efni</string>
<string name="reload">Endurhlaða</string>
<string name="remote">(fjartengt)</string>
<string name="remote_file_fetch_failed">Mistókst að finna skrá!</string>
<string name="remove_e2e">Þú getur fjarlægt staðværa enda-í-enda dulritun úr þessu forriti</string>
<string name="remove_fail_msg">Mistókst að eyða</string>
<string name="remove_local_account">Fjarlægja staðværan aðgang</string>
<string name="remove_local_account_details">Fjarlægja notandaaðgang af tæki og eyða öllum staðværum skrám</string>
<string name="remove_notification_failed">Mistókst að fjarlægja tilkynningu.</string>
<string name="remove_push_notification">Fjarlægja</string>
<string name="remove_success_msg">Eytt</string>
@ -542,14 +646,19 @@
<string name="rename_local_fail_msg">Gat endurnefnt staðvært afrit, prófaðu annað heiti</string>
<string name="rename_server_fail_msg">Ekki hægt að endurnefna, heitið er frátekið</string>
<string name="request_account_deletion">Biðja um að aðgangi sé eytt</string>
<string name="request_account_deletion_button">Biðja um eyðingu</string>
<string name="request_account_deletion_details">Biðja um endanlega eyðingu aðgangs hjá þjónustuveitu</string>
<string name="reshare_not_allowed">Endurdeiling er ekki leyfð</string>
<string name="resharing_is_not_allowed">Endurdeiling er ekki leyfð</string>
<string name="resized_image_not_possible_download">Engin stærðarbreytt mynd í boði. Sækja alla myndina?</string>
<string name="restore">Endurheimta skrá</string>
<string name="restore_backup">Endurheimta úr öryggisafriti</string>
<string name="restore_button_description">Endurheimta eydda skrá</string>
<string name="restore_selected">Endurheimta valið</string>
<string name="retrieving_file">Sæki skrá…</string>
<string name="richdocuments_failed_to_load_document">Mistókst að hlaða inn skjali!</string>
<string name="scanQR_description">Skrá inn með QR-kóða</string>
<string name="scan_page">Skanna síðu</string>
<string name="screenshot_01_gridView_heading">Verndar gögnin þín</string>
<string name="screenshot_01_gridView_subline">vinnugögn hýst á eigin vegum</string>
<string name="screenshot_02_listView_heading">Skoða og deila</string>
@ -562,23 +671,30 @@
<string name="screenshot_05_autoUpload_subline">mynda &amp; myndskeiða</string>
<string name="screenshot_06_davdroid_heading">Dagatal &amp; tengiliðir</string>
<string name="screenshot_06_davdroid_subline">Samstilla með DAVx5</string>
<string name="search_error">Villa við að sækja leitarniðurstöður</string>
<string name="select_all">Velja allt</string>
<string name="select_one_template">Veldu eitt sniðmát</string>
<string name="select_template">Veldu sniðmát</string>
<string name="send">Senda</string>
<string name="send_note">Senda minnispunkt til viðtakanda</string>
<string name="send_share">Senda sameign</string>
<string name="sendbutton_description">Táknmynd á sendihnappi</string>
<string name="set_as">Setja sem</string>
<string name="set_note">Setja minnispunkt</string>
<string name="set_picture_as">Nota mynd sem</string>
<string name="set_status">Setja stöðu</string>
<string name="set_status_message">Setja stöðuskilaboð</string>
<string name="share">Deila</string>
<string name="share_copy_link">Deila og afrita tengil</string>
<string name="share_dialog_title">Deiling</string>
<string name="share_expiration_date_format">%1$s</string>
<string name="share_expiration_date_label">Rennur út %1$s</string>
<string name="share_file">Deila %1$s</string>
<string name="share_group_clarification">%s hópurinn</string>
<string name="share_internal_link">Deila innri tengli</string>
<string name="share_internal_link_to_file_text">Innri deilingartengill virkar bara fyrir notendur sem eiga aðgang að þessari skrá</string>
<string name="share_internal_link_to_folder_text">Innri deilingartengill virkar bara fyrir notendur sem eiga aðgang að þessari möppu</string>
<string name="share_known_remote_on_clarification">á %1$s</string>
<string name="share_link">Deila tengli</string>
<string name="share_link_empty_password">Þú verður að setja lykilorð</string>
<string name="share_link_file_error">Villa kom upp við að reyna að deila þessari skrá eða möppu.</string>
@ -586,14 +702,18 @@
<string name="share_link_forbidden_permissions">til að deila þessari skrá</string>
<string name="share_link_optional_password_title">Settu inn valkvætt lykilorð</string>
<string name="share_link_password_title">Settu inn lykilorð</string>
<string name="share_link_with_label">Tengill á sameign(%1$s)</string>
<string name="share_no_expiration_date_label">Setja gildistíma</string>
<string name="share_no_password_title">Skrá lykilorð</string>
<string name="share_password_title">Verja með lykilorði</string>
<string name="share_permission_can_edit">Getur breytt</string>
<string name="share_permission_file_drop">Slepping skráa</string>
<string name="share_permission_view_only">Einungis skoða</string>
<string name="share_permissions">Heimildir sameignar</string>
<string name="share_remote_clarification">%1$s (fjartengt)</string>
<string name="share_room_clarification">%1$s (samtal)</string>
<string name="share_search">Nafn, skýjasambandsauðkenni eða tölvupóstfang …</string>
<string name="share_send_new_email">Senda nýjan tölvupóst</string>
<string name="share_send_note">Minnispunktur til viðtakanda</string>
<string name="share_settings">Stillingar</string>
<string name="share_via_link_hide_download">Fela niðurhal</string>
@ -607,6 +727,8 @@
<string name="shared_icon_shared_via_link">deilt með tengli</string>
<string name="shared_with_you_by">Deilt með þér af %s</string>
<string name="sharee_add_failed">Mistókst að bæta við deilingu</string>
<string name="show_images">Sýna ljósmyndir</string>
<string name="show_video">Sýna myndskeið</string>
<string name="signup_with_provider">Skráðu þig hjá þjónustu</string>
<string name="single_sign_on_request_token" formatted="true">Leyfa %1$s að að fá aðgang að %2$s Nextcloud-aðgangnum þínum?</string>
<string name="sort_by">Raða eftir</string>
@ -650,6 +772,8 @@
<string name="storage_internal_storage">Innbyggð geymsla</string>
<string name="storage_movies">Kvikmyndir</string>
<string name="storage_music">Tónlist</string>
<string name="storage_permission_full_access">Fullur aðgangur</string>
<string name="storage_permission_media_read_only">Skrifvarinn gagnamiðill</string>
<string name="storage_pictures">Ljósmyndir</string>
<string name="store_full_desc">Nextcloud-kerfið er opið og frjálst, og heldur þér við stjórnvölinn.\n\nEiginleikar:\n* Einfalt, nútímalegt viðmót, með þema í samræmi við netþjóninn þinn\n* Sendir skrár inn á Nextcloud-þjóninn þinn\n* Deilir skránum þínum með öðrum\n* Heldur eftirlætisskránum og möppunum þínum samstilltum\n* Leitar í öllum möppum á þjóninum þínum\n* Sjálfvirk innsending mynda og myndskeiða sem tekin eru með tækjunum þínum\n* Heldur uppfærðu með tilkynningum\n* Styður við marga notandaaðganga\n* Öruggur aðgangur að gögnunum þínum með fingrafari eða PIN-númeri\n* Samþætting við DAVdroid fyrir auðvelda uppsetningu á samstillingu dagatals og tengiliða\n\nTilkynntu um vandamál á https://github.com/nextcloud/android/issues og ræddu um þetta forrit á https://help.nextcloud.com/c/clients/android\n\nNýr í Nextcloud? Nextcloud er þinn eiginn vefþjónn til samstillingar, samskipta og deilingar á skrám. Kóði hugbúnaðarins er fullkomlega opinn og frjáls til afnota; þú getur hýst hann sjálfur eða borgað fyrirtæki fyrir að gera það fyrir þig. Á þennan máta, hefur þú sjálfur full yfirráð yfir myndunum þínum, dagatalinu, tengiliðaskránum, skjölunum þínum og öllu öðru tilheyrandi.\n\nSkoðaðu fleira um Nextcloud á https://nextcloud.com</string>
<string name="store_full_dev_desc">Nextcloud-kerfið er opið og frjálst, og heldur þér við stjórnvölinn.\nÞetta er opinbera þróunarútgáfan, sem kemur með daglegan skammt af óprófuðum nýjum eiginleikum, sem aftur gætu mögulega valdið truflunum og gagnatapi. Forritið er fyrir þá notendur sem vilja taka þátt í að prófa og tilkynna um villur, ef þær eiga sér stað. Ekki nota þetta í alvöru vinnuumhverfi!\n\nBæði opinbera þróunarútgáfan og venjulega útgáfan eru tiltækar á F-droid, og er hægt að setja þær upp samhliða hvorri annarri.</string>
@ -658,9 +782,16 @@
<string name="stream">Streyma með…</string>
<string name="stream_not_possible_headline">Innra streymi er ekki mögulegt</string>
<string name="stream_not_possible_message">Endilega sæktu frekar gagnamiðil eða notaðu utanaðkomandi forrit.</string>
<string name="strict_mode">Strangur hamur: engar HTTP-tengingar leyfðar!</string>
<string name="sub_folder_rule_day">Ár/Mánuður/Dagur</string>
<string name="sub_folder_rule_month">Ár/Mánuður</string>
<string name="sub_folder_rule_year">Ár</string>
<string name="subject_shared_with_you">\"%1$s\" hefur verið deilt með þér</string>
<string name="subject_user_shared_with_you">%1$s deildi \"%2$s\" með þér</string>
<string name="subtitle_photos_only">Einungis ljósmyndir</string>
<string name="subtitle_photos_videos">Ljósmyndir og myndskeið</string>
<string name="subtitle_videos_only">Einungis myndskeið</string>
<string name="suggest">Stinga upp á</string>
<string name="sync_conflicts_in_favourites_ticker">Árekstrar fundust</string>
<string name="sync_current_folder_was_removed">Mappan %1$ser ekki lengur til</string>
<string name="sync_fail_content">Gat ekki samstillt %1$s</string>
@ -693,6 +824,7 @@
<string name="thumbnail">Smámynd</string>
<string name="thumbnail_for_existing_file_description">Smámynd fyrirliggjandi skráar</string>
<string name="thumbnail_for_new_file_desc">Smámynd nýrrar skráar</string>
<string name="timeout_richDocuments">Hleðsla tekur lengri tíma en búist var við</string>
<string name="today">Í dag</string>
<string name="trashbin_activity_title">eyddar skrár</string>
<string name="trashbin_empty_headline">Engar eyddar skrár</string>
@ -700,6 +832,7 @@
<string name="trashbin_file_not_deleted">Ekki tókst að eyða %1$s skránni!</string>
<string name="trashbin_file_not_restored">Ekki tókst að endurheimta %1$s skrána!</string>
<string name="trashbin_file_remove">Eyða varanlega</string>
<string name="trashbin_loading_failed">Mistókst að hlaða inn ruslinu!</string>
<string name="trashbin_not_emptied">Ekki tókst að eyða skránum endanlega!</string>
<string name="unlock_file">Aflæsa skrá</string>
<string name="unread_comments">Ólesnar athugasemdir eru fyrirliggjandi</string>
@ -735,6 +868,8 @@
<string name="upload_lock_failed">Læsing möppu mistókst</string>
<string name="upload_old_android">Dulritun er aðeins möguleg með &gt;= Android 5.0</string>
<string name="upload_query_move_foreign_files">Ónógt pláss hamlar því að hægt sé að afrita valdar skrár í %1$s möppuna. Viltu færa þær þangað í staðinn?</string>
<string name="upload_quota_exceeded">Geymslukvóti er uppurinn</string>
<string name="upload_scan_doc_upload">Skanna skjal með myndavél</string>
<string name="upload_sync_conflict">Árekstur í samstillingu, leystu þetta handvirkt</string>
<string name="upload_unknown_error">Óþekkt villa</string>
<string name="uploader_btn_alternative_text">Velja</string>
@ -743,6 +878,7 @@
<string name="uploader_error_message_read_permission_not_granted">%1$s hefur ekki heimild til að lesa móttekna skrá</string>
<string name="uploader_error_message_source_file_not_copied">Gat ekki afritað skrá í bráðabirgðamöppu. Prófaðu að endursenda hana.</string>
<string name="uploader_error_message_source_file_not_found">Skrá sem valin var til sendingar fannst ekki. Athugaðu hvort skráin sé til</string>
<string name="uploader_error_title_file_cannot_be_uploaded">Þessa skrá er ekki hægt að senda inn</string>
<string name="uploader_error_title_no_file_to_upload">Engin skrá til að senda inn</string>
<string name="uploader_info_dirname">Heiti möppu</string>
<string name="uploader_top_message">Veldu innsendingarmöppu</string>
@ -785,6 +921,7 @@
<string name="uploads_view_upload_status_virus_detected">Vírus fannst í skránni. Ekki er hægt að ljúka innsendingu!</string>
<string name="uploads_view_upload_status_waiting_exit_power_save_mode">Bíð eftir að hætt sé í orkusparnaðarham</string>
<string name="uploads_view_upload_status_waiting_for_charging">Bíð eftir hleðslu</string>
<string name="uploads_view_upload_status_waiting_for_wifi">Bíð eftir Wi-Fi tengingu án mælingar gagnamagns</string>
<string name="user_icon">Notandi</string>
<string name="user_info_address">Vistfang</string>
<string name="user_info_email">Tölvupóstur</string>
@ -804,8 +941,10 @@
<string name="whats_new_skip">Sleppa</string>
<string name="whats_new_title">(Nýtt í %s)</string>
<string name="whats_your_status">Hver er staðan á þér?</string>
<string name="widgets_not_available">Viðmótshlutar eru einungis í boði á %1$s 25 eða nýrra</string>
<string name="widgets_not_available_title">Not available</string>
<string name="write_email">Senda tölvupóst</string>
<string name="wrong_storage_path">Gagnageymslumappa er ekki til!</string>
<plurals name="sync_fail_in_favourites_content">
<item quantity="one">Ekki var hægt að samstilla %1$d skrá (árekstrar: %2$d)</item>
<item quantity="other">Ekki var hægt að samstilla %1$d skrár (árekstrar: %2$d)</item>
@ -814,6 +953,34 @@
<item quantity="one">Mistókst að afrita %1$d skrá úr %2$s möppunni yfir í</item>
<item quantity="other">Mistókst að afrita %1$d skrár úr %2$s möppunni yfir í</item>
</plurals>
<plurals name="wrote_n_events_to">
<item quantity="one">Skrifaði %1$d atburði í %2$s</item>
<item quantity="other">Skrifaði %1$d atburði í %2$s</item>
</plurals>
<plurals name="processed_n_entries">
<item quantity="one">Vann úr %d færslu.</item>
<item quantity="other">Vann úr %d færslum.</item>
</plurals>
<plurals name="found_n_duplicates">
<item quantity="one">Fann %d tvíteknar færslu.</item>
<item quantity="other">Fann %d tvíteknar færslur.</item>
</plurals>
<plurals name="export_successful">
<item quantity="one">Flutti út %d skrá</item>
<item quantity="other">Flutti út %d skrár</item>
</plurals>
<plurals name="export_failed">
<item quantity="one">Mistókst að flytja út %d skrá</item>
<item quantity="other">Mistókst að flytja út %d skrár</item>
</plurals>
<plurals name="export_partially_failed">
<item quantity="one">Flutti út %d skrá, sleppti afgangnum vegna villu</item>
<item quantity="other">Flutti út %d skrár, sleppti afgangnum vegna villu</item>
</plurals>
<plurals name="export_start">
<item quantity="one">%d skrá verður flutt út. Skoðaðu tilkynningu til að sjá nánari upplýsingar.</item>
<item quantity="other">%d skrár verða fluttar út. Skoðaðu tilkynningu til að sjá nánari upplýsingar.</item>
</plurals>
<plurals name="file_list__footer__folder">
<item quantity="one">%1$d mappa</item>
<item quantity="other">%1$d möppur</item>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">Inget delat ännu</string>
<string name="file_list_empty_unified_search_no_results">Inga sökresultat funna på din sökning</string>
<string name="file_list_folder">mapp</string>
<string name="file_list_live">LIVE</string>
<string name="file_list_loading">Läser in…</string>
<string name="file_list_no_app_for_file_type">Det finns ingen applikation för att hantera denna filtyp</string>
<string name="file_list_seconds_ago">sekunder sedan</string>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">還沒有分享任何資料</string>
<string name="file_list_empty_unified_search_no_results">未找到與您的查詢相符的結果</string>
<string name="file_list_folder">資料夾</string>
<string name="file_list_live">直播</string>
<string name="file_list_loading">載入中…</string>
<string name="file_list_no_app_for_file_type">未設定處理此檔案類型適用的APP</string>
<string name="file_list_seconds_ago">秒前</string>
@ -884,6 +885,7 @@
<string name="upload_lock_failed">鎖定資料夾失敗</string>
<string name="upload_old_android">加密功能只適用於 Android 5.0 及以上版本</string>
<string name="upload_query_move_foreign_files">空間不足導致無法將所選檔案複製到 %1$s 資料夾中。您想改為將檔案移到那裡嗎?</string>
<string name="upload_quota_exceeded">超過儲存空間配額</string>
<string name="upload_scan_doc_upload">使用相機掃描文件</string>
<string name="upload_sync_conflict">同步發生抵觸,請手動處理</string>
<string name="upload_unknown_error">未知的錯誤</string>

View file

@ -344,6 +344,7 @@
<string name="file_list_empty_shared_headline">還沒有分享任何資料</string>
<string name="file_list_empty_unified_search_no_results">找不到與您的搜尋相符的結果</string>
<string name="file_list_folder">資料夾</string>
<string name="file_list_live">即時</string>
<string name="file_list_loading">正在載入……</string>
<string name="file_list_no_app_for_file_type">未設定處理此檔案類型適用的應用程式。</string>
<string name="file_list_seconds_ago">幾秒前</string>

View file

@ -24,6 +24,7 @@
<dimen name="bottom_sheet_item_height">56dp</dimen>
<dimen name="bottom_sheet_menu_item_divider_standard_margin">80dp</dimen>
<dimen name="file_icon_size">40dp</dimen>
<dimen name="live_photo_indicator_margin">100dp</dimen>
<dimen name="file_icon_size_grid">128dp</dimen>
<dimen name="file_icon_rounded_corner_radius">8dp</dimen>
<dimen name="file_icon_rounded_corner_radius_for_grid_mode">3dp</dimen>
@ -48,6 +49,9 @@
<dimen name="two_line_primary_text_size">16sp</dimen>
<dimen name="two_line_secondary_text_size">12sp</dimen>
<dimen name="list_item_share_right_margin">12dp</dimen>
<dimen name="live_photo_indicator_vertical_padding">3dp</dimen>
<dimen name="live_photo_indicator_horizontal_padding">16dp</dimen>
<dimen name="file_list_item_avatar_icon_radius">10dp</dimen>
<dimen name="account_action_layout_height">72dp</dimen>
<dimen name="zero">0dp</dimen>
@ -106,9 +110,6 @@
<dimen name="contactlist_item_icon_layout_height">40dp</dimen>
<dimen name="empty_list_icon_layout_width">72dp</dimen>
<dimen name="empty_list_icon_layout_height">72dp</dimen>
<dimen name="grid_image_shared_icon_layout_top_margin">24dp</dimen>
<dimen name="grid_image_local_file_indicator_layout_width">16dp</dimen>
<dimen name="grid_image_local_file_indicator_layout_height">16dp</dimen>
<dimen name="grid_image_icon_margin">14dp</dimen>
<dimen name="grid_image_icon_padding">14dp</dimen>
<dimen name="grid_item_shared_icon_layout_top_margin">24dp</dimen>

View file

@ -86,6 +86,7 @@
<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="file_list_seconds_ago">seconds ago</string>
<string name="file_list_live">LIVE</string>
<string name="file_list_empty_headline">No files here</string>
<string name="folder_list_empty_headline">No folders here</string>
<string name="file_list_empty">Upload some content or sync with your devices.</string>

View file

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