mirror of
https://github.com/nextcloud/android.git
synced 2024-11-23 21:55:48 +03:00
Solve git conflicts
Signed-off-by: alperozturk <alper_ozturk@proton.me>
This commit is contained in:
commit
ca4b4211e1
66 changed files with 2101 additions and 225 deletions
4
.github/workflows/codeql.yml
vendored
4
.github/workflows/codeql.yml
vendored
|
@ -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
|
||||
|
|
2
.github/workflows/scorecard.yml
vendored
2
.github/workflows/scorecard.yml
vendored
|
@ -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
|
||||
|
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
|
@ -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
|
||||
|
|
1173
app/schemas/com.nextcloud.client.database.NextcloudDatabase/75.json
Normal file
1173
app/schemas/com.nextcloud.client.database.NextcloudDatabase/75.json
Normal file
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 |
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,12 +490,14 @@ 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();
|
||||
parent = parent.endsWith(PATH_SEPARATOR) ? parent : parent + PATH_SEPARATOR;
|
||||
remotePath = parent + name;
|
||||
if (isFolder()) {
|
||||
remotePath += PATH_SEPARATOR;
|
||||
if (parent != null) {
|
||||
parent = parent.endsWith(PATH_SEPARATOR) ? parent : parent + PATH_SEPARATOR;
|
||||
remotePath = parent + name;
|
||||
if (isFolder()) {
|
||||
remotePath += PATH_SEPARATOR;
|
||||
}
|
||||
Log_OC.d(TAG, "OCFile name changed to " + remotePath);
|
||||
}
|
||||
Log_OC.d(TAG, "OCFile name changed to " + remotePath);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
return parentPath.endsWith(PATH_SEPARATOR) ? parentPath : parentPath + PATH_SEPARATOR;
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
@ -2305,7 +2308,7 @@ public class FileDisplayActivity extends FileActivity
|
|||
* Opens EditImageActivity with given file loaded. If file is not available locally, it will be synced before
|
||||
* opening the image editor.
|
||||
*
|
||||
* @param file {@link OCFile} (image) to be loaded into image editor
|
||||
* @param file {@link OCFile} (image) to be loaded into image editor
|
||||
*/
|
||||
public void startImageEditor(OCFile file) {
|
||||
if (file.isDown()) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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?
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -433,7 +488,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|||
holder.getTagMore().setVisibility(View.GONE);
|
||||
|
||||
holder.getFirstTag().setText(file.getTags().get(0));
|
||||
|
||||
|
||||
if (file.getTags().size() > 1) {
|
||||
viewThemeUtils.material.themeChipSuggestion(holder.getSecondTag());
|
||||
holder.getSecondTag().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());
|
||||
}
|
||||
|
@ -849,11 +886,11 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|||
contentValues.add(cv);
|
||||
} catch (
|
||||
RemoteOperationFailedException |
|
||||
OperationCanceledException |
|
||||
AuthenticatorException |
|
||||
IOException |
|
||||
AccountUtils.AccountNotFoundException |
|
||||
IllegalStateException e) {
|
||||
OperationCanceledException |
|
||||
AuthenticatorException |
|
||||
IOException |
|
||||
AccountUtils.AccountNotFoundException |
|
||||
IllegalStateException e) {
|
||||
Log_OC.e(TAG, "Error saving file with parent" + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -246,11 +246,16 @@ public class ExtendedListFragment extends Fragment implements
|
|||
|
||||
@Override
|
||||
public boolean onQueryTextSubmit(String query) {
|
||||
performSearch(query, false);
|
||||
return true;
|
||||
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,9 +302,13 @@ public class ExtendedListFragment extends Fragment implements
|
|||
|
||||
@Override
|
||||
public boolean onClose() {
|
||||
performSearch("", true);
|
||||
|
||||
return false;
|
||||
RecyclerView.Adapter adapter = getRecyclerView().getAdapter();
|
||||
if (adapter instanceof OCFileListAdapter) {
|
||||
ArrayList<String> listOfHiddenFiles = ((OCFileListAdapter) adapter).listOfHiddenFiles;
|
||||
performSearch("", listOfHiddenFiles,true);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
private fun setupFileDisplayActivity() {
|
||||
(activity as? FileDisplayActivity)?.run {
|
||||
setMainFabVisible(false)
|
||||
updateActionBarTitleAndHomeButtonByString(null)
|
||||
}
|
||||
}
|
||||
|
||||
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 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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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;
|
||||
|
@ -526,7 +550,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
|
|||
|
||||
try {
|
||||
bitmapResult = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth,
|
||||
minHeight);
|
||||
minHeight);
|
||||
|
||||
if (isCancelled()) {
|
||||
return new LoadImage(bitmapResult, null, ocFile);
|
||||
|
@ -564,7 +588,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
|
|||
} catch (NoSuchFieldError e) {
|
||||
mErrorMessageId = R.string.common_error_unknown;
|
||||
Log_OC.e(TAG, "Error from access to non-existing field despite protection; file "
|
||||
+ storagePath, e);
|
||||
+ storagePath, e);
|
||||
|
||||
} catch (Throwable t) {
|
||||
mErrorMessageId = R.string.common_error_unknown;
|
||||
|
@ -603,7 +627,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
|
|||
if (imageView != null) {
|
||||
if (bitmap != null) {
|
||||
Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" +
|
||||
bitmap.getHeight());
|
||||
bitmap.getHeight());
|
||||
|
||||
if (MIME_TYPE_PNG.equalsIgnoreCase(result.ocFile.getMimeType()) ||
|
||||
MIME_TYPE_GIF.equalsIgnoreCase(result.ocFile.getMimeType())) {
|
||||
|
@ -718,7 +742,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
|
|||
Snackbar.LENGTH_INDEFINITE).show();
|
||||
}
|
||||
}
|
||||
).show();
|
||||
).show();
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
Log_OC.d(TAG, e.getMessage());
|
||||
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() }
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
9
app/src/main/res/drawable/ic_live_photo.xml
Normal file
9
app/src/main/res/drawable/ic_live_photo.xml
Normal 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>
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 >= 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 & myndskeiða</string>
|
||||
<string name="screenshot_06_davdroid_heading">Dagatal & 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ð >= 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue