use localID everywhere

Co-authored-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
This commit is contained in:
tobiasKaminsky 2021-06-11 12:25:21 +02:00 committed by Álvaro Brey
parent 0b3707cf25
commit b78e991d54
25 changed files with 1270 additions and 51 deletions

File diff suppressed because it is too large Load diff

View file

@ -24,9 +24,14 @@ package com.owncloud.android.datamodel;
import com.owncloud.android.db.ProviderMeta;
public class FileDataStorageManagerContentProviderClientIT extends FileDataStorageManagerIT {
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class FileDataStorageManagerContentProviderClientIT extends FileDataStorageManagerIT {
protected FileDataStorageManager sut;
@Override
public void before() {
sut = new FileDataStorageManager(user,
targetContext
@ -36,4 +41,25 @@ public class FileDataStorageManagerContentProviderClientIT extends FileDataStora
super.before();
}
@Test
public void saveFile() {
before();
String path = "/1.txt";
OCFile file = new OCFile(path);
file.setRemoteId("00000008ocjycgrudn78");
// TODO check via reflection that every parameter is set
file.setFileLength(1024000);
file.setModificationTimestamp(1582019340);
sut.saveNewFile(file);
OCFile read = sut.getFileByPath(path);
assertNotNull(read);
assertEquals(file.getRemotePath(), read.getRemotePath());
}
}

View file

@ -369,4 +369,5 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
assertEquals(capability.getUserStatus(), newCapability.getUserStatus());
}
}

View file

@ -58,7 +58,8 @@ import com.owncloud.android.db.ProviderMeta
],
version = ProviderMeta.DB_VERSION,
autoMigrations = [
AutoMigration(from = 65, to = 66)
AutoMigration(from = 65, to = 66),
AutoMigration(from = 66, to = 67)
],
exportSchema = true
)

View file

@ -70,6 +70,8 @@ data class FileEntity(
val permissions: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_REMOTE_ID)
val remoteId: String?,
@ColumnInfo(name = ProviderTableMeta.FILE_LOCAL_ID)
val localId: Long?,
@ColumnInfo(name = ProviderTableMeta.FILE_UPDATE_THUMBNAIL)
val updateThumbnail: Int?,
@ColumnInfo(name = ProviderTableMeta.FILE_IS_DOWNLOADING)

View file

@ -28,7 +28,7 @@ import com.owncloud.android.lib.common.OwnCloudClient
internal class LoadUrlTask(
private val client: OwnCloudClient,
private val fileId: String,
private val fileId: Long,
private val onResult: (String?) -> Unit
) : AsyncTask<Void, Void, String>() {

View file

@ -96,7 +96,7 @@ internal class Player(
checkNotNull(user)
playedFile?.let {
val client = clientFactory.create(user)
val task = LoadUrlTask(client, it.remoteId, this@Player::onDownloaded)
val task = LoadUrlTask(client, it.localId, this@Player::onDownloaded)
task.execute()
loadUrlTask = task
}

View file

@ -458,6 +458,7 @@ public class FileDataStorageManager {
cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, fileOrFolder.isSharedWithSharee() ? 1 : 0);
cv.put(ProviderTableMeta.FILE_PERMISSIONS, fileOrFolder.getPermissions());
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_UNREAD_COMMENTS_COUNT, fileOrFolder.getUnreadCommentsCount());
cv.put(ProviderTableMeta.FILE_OWNER_ID, fileOrFolder.getOwnerId());

View file

@ -45,6 +45,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.FileProvider;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import third_parties.daveKoeller.AlphanumComparator;
public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterface {
@ -83,6 +84,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
private String etagOnServer;
private boolean sharedViaLink;
private String permissions;
private long localId; // unique fileId for the file within the instance
private String remoteId; // The fileid namespaced by the instance fileId, globally unique
private boolean updateThumbnailNeeded;
private boolean downloading;
@ -166,6 +168,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
etagOnServer = source.readString();
sharedViaLink = source.readInt() == 1;
permissions = source.readString();
localId = source.readLong();
remoteId = source.readString();
updateThumbnailNeeded = source.readInt() == 1;
downloading = source.readInt() == 1;
@ -208,6 +211,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
dest.writeString(etagOnServer);
dest.writeInt(sharedViaLink ? 1 : 0);
dest.writeString(permissions);
dest.writeLong(localId);
dest.writeString(remoteId);
dest.writeInt(updateThumbnailNeeded ? 1 : 0);
dest.writeInt(downloading ? 1 : 0);
@ -284,8 +288,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
}
/**
* Can be used to check, whether or not this file exists in the database
* already
* Can be used to check, whether or not this file exists in the database already
*
* @return true, if the file exists in the database
*/
@ -486,6 +489,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
etagOnServer = null;
sharedViaLink = false;
permissions = null;
localId = -1;
remoteId = null;
updateThumbnailNeeded = false;
downloading = false;
@ -594,17 +598,14 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
return !TextUtils.isEmpty(getFileName()) && getFileName().charAt(0) == '.';
}
/**
* The unique fileId for the file within the instance
*
* @return file fileId, unique within the instance
*/
@Nullable
public String getLocalId() {
if (getRemoteId() != null) {
return getRemoteId().substring(0, 8).replaceAll("^0*", "");
@SuppressFBWarnings("STT")
public long getLocalId() {
if (localId > 0) {
return localId;
} else if (remoteId != null) {
return Long.parseLong(remoteId.substring(0, 8).replaceAll("^0*", ""));
} else {
return null;
return -1;
}
}
@ -772,6 +773,10 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa
this.fileId = fileId;
}
public void setLocalId(long localId) {
this.localId = localId;
}
public void setParentId(long parentId) {
this.parentId = parentId;
}

View file

@ -689,7 +689,7 @@ public final class ThumbnailsCacheManager {
Bitmap bitmap;
if (MimeTypeUtil.isVideo(ocFile)) {
bitmap = ThumbnailUtils.createVideoThumbnail(ocFile.getStoragePath(),
MediaStore.Images.Thumbnails.MINI_KIND);
MediaStore.Images.Thumbnails.MINI_KIND);
} else {
bitmap = BitmapUtils.decodeSampledBitmapFromFile(ocFile.getStoragePath(), pxW, pxH);
}
@ -733,16 +733,16 @@ public final class ThumbnailsCacheManager {
pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
} else {
uri = mClient.getBaseUri() + "/index.php/apps/files_trashbin/preview?fileId=" +
file.getLocalId() + "&x=" + pxW + "&y=" + pxH;
file.getLocalId() + "&x=" + pxW + "&y=" + pxH;
}
Log_OC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri);
getMethod = new GetMethod(uri);
getMethod.setRequestHeader("Cookie",
"nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
"nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
getMethod.setRequestHeader(RemoteOperation.OCS_API_HEADER,
RemoteOperation.OCS_API_HEADER_VALUE);
RemoteOperation.OCS_API_HEADER_VALUE);
int status = mClient.executeMethod(getMethod, READ_TIMEOUT, CONNECTION_TIMEOUT);
if (status == HttpStatus.SC_OK) {

View file

@ -35,7 +35,7 @@ import java.util.List;
*/
public class ProviderMeta {
public static final String DB_NAME = "filelist";
public static final int DB_VERSION = 66;
public static final int DB_VERSION = 67;
private ProviderMeta() {
// No instance
@ -101,6 +101,7 @@ public class ProviderMeta {
public static final String FILE_SHARED_VIA_LINK = "share_by_link";
public static final String FILE_SHARED_WITH_SHAREE = "shared_via_users";
public static final String FILE_PERMISSIONS = "permissions";
public static final String FILE_LOCAL_ID = "local_id";
public static final String FILE_REMOTE_ID = "remote_id";
public static final String FILE_UPDATE_THUMBNAIL = "update_thumbnail";
public static final String FILE_IS_DOWNLOADING = "is_downloading";
@ -148,6 +149,7 @@ public class ProviderMeta {
FILE_SHARED_WITH_SHAREE,
FILE_PERMISSIONS,
FILE_REMOTE_ID,
FILE_LOCAL_ID,
FILE_UPDATE_THUMBNAIL,
FILE_IS_DOWNLOADING,
FILE_ETAG_IN_CONFLICT,

View file

@ -37,7 +37,7 @@ public class StreamMediaFileOperation extends RemoteOperation {
private static final int SYNC_CONNECTION_TIMEOUT = 5000;
private static final String STREAM_MEDIA_URL = "/ocs/v2.php/apps/dav/api/v1/direct";
private String fileID;
private final long fileID;
// JSON node names
private static final String NODE_OCS = "ocs";
@ -45,7 +45,7 @@ public class StreamMediaFileOperation extends RemoteOperation {
private static final String NODE_URL = "url";
private static final String JSON_FORMAT = "?format=json";
public StreamMediaFileOperation(String fileID) {
public StreamMediaFileOperation(long fileID) {
this.fileID = fileID;
}
@ -55,7 +55,7 @@ public class StreamMediaFileOperation extends RemoteOperation {
try {
postMethod = new Utf8PostMethod(client.getBaseUri() + STREAM_MEDIA_URL + JSON_FORMAT);
postMethod.setParameter("fileId", fileID);
postMethod.setParameter("fileId", String.valueOf(fileID));
// remote request
postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);

View file

@ -33,14 +33,14 @@ import com.owncloud.android.lib.resources.comments.CommentFileRemoteOperation;
public class CommentFileOperation extends RemoteOperation {
private final String message;
private final String fileId;
private final long fileId;
/**
* Constructor
*
* @param message Comment to store
*/
public CommentFileOperation(String message, String fileId) {
public CommentFileOperation(String message, long fileId) {
this.message = message;
this.fileId = fileId;
}

View file

@ -62,12 +62,12 @@ public class RemoveRemoteEncryptedFileOperation extends RemoteOperation {
private static final int REMOVE_READ_TIMEOUT = 30000;
private static final int REMOVE_CONNECTION_TIMEOUT = 5000;
private String remotePath;
private String parentId;
private final String remotePath;
private final long parentId;
private User user;
private ArbitraryDataProvider arbitraryDataProvider;
private String fileName;
private final ArbitraryDataProvider arbitraryDataProvider;
private final String fileName;
/**
* Constructor
@ -76,7 +76,7 @@ public class RemoveRemoteEncryptedFileOperation extends RemoteOperation {
* @param parentId local id of parent folder
*/
RemoveRemoteEncryptedFileOperation(String remotePath,
String parentId,
long parentId,
User user,
Context context,
String fileName) {

View file

@ -51,10 +51,10 @@ public class RichDocumentsUrlOperation extends RemoteOperation {
private static final String NODE_URL = "url";
private static final String JSON_FORMAT = "?format=json";
private String fileID;
private final long fileId;
public RichDocumentsUrlOperation(String fileID) {
this.fileID = fileID;
public RichDocumentsUrlOperation(long fileID) {
this.fileId = fileID;
}
@NextcloudServer(max = 18)
@ -64,7 +64,7 @@ public class RichDocumentsUrlOperation extends RemoteOperation {
try {
postMethod = new Utf8PostMethod(client.getBaseUri() + DOCUMENT_URL + JSON_FORMAT);
postMethod.setParameter(FILE_ID, fileID);
postMethod.setParameter(FILE_ID, String.valueOf(fileId));
// remote request
postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE);
@ -86,7 +86,7 @@ public class RichDocumentsUrlOperation extends RemoteOperation {
}
} catch (Exception e) {
result = new RemoteOperationResult(e);
Log_OC.e(TAG, "Get rich document url for file with id " + fileID + " failed: " + result.getLogMessage(),
Log_OC.e(TAG, "Get rich document url for file with id " + fileId + " failed: " + result.getLogMessage(),
result.getException());
} finally {
if (postMethod != null) {

View file

@ -721,7 +721,7 @@ public class OperationsService extends Service {
case ACTION_RESTORE_VERSION:
FileVersion fileVersion = operationIntent.getParcelableExtra(EXTRA_FILE_VERSION);
operation = new RestoreFileVersionRemoteOperation(fileVersion.getRemoteId(),
operation = new RestoreFileVersionRemoteOperation(fileVersion.getLocalId(),
fileVersion.getFileName());
break;

View file

@ -23,12 +23,12 @@ package com.owncloud.android.ui.events;
* Event for set folder as encrypted/decrypted
*/
public class EncryptionEvent {
public final String localId;
public final long localId;
public final String remotePath;
public final String remoteId;
public final boolean shouldBeEncrypted;
public EncryptionEvent(String localId, String remoteId, String remotePath, boolean shouldBeEncrypted) {
public EncryptionEvent(long localId, String remoteId, String remotePath, boolean shouldBeEncrypted) {
this.localId = localId;
this.remoteId = remoteId;
this.remotePath = remotePath;

View file

@ -457,12 +457,14 @@ public class FileDetailActivitiesFragment extends Fragment implements
private static class SubmitCommentTask extends AsyncTask<Void, Void, Boolean> {
private String message;
private String fileId;
private VersionListInterface.CommentCallback callback;
private OwnCloudClient client;
private final String message;
private final long fileId;
private final VersionListInterface.CommentCallback callback;
private final OwnCloudClient client;
private SubmitCommentTask(String message, String fileId, VersionListInterface.CommentCallback callback,
private SubmitCommentTask(String message,
long fileId,
VersionListInterface.CommentCallback callback,
OwnCloudClient client) {
this.message = message;
this.fileId = fileId;

View file

@ -1696,7 +1696,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
}
}
private void encryptFolder(String localId, String remoteId, String remotePath, boolean shouldBeEncrypted) {
private void encryptFolder(long localId, String remoteId, String remotePath, boolean shouldBeEncrypted) {
try {
User user = accountManager.getUser();
OwnCloudClient client = clientFactory.create(user);

View file

@ -456,7 +456,7 @@ public class FileOperationsHelper {
fileActivity.showLoadingDialog(fileActivity.getString(R.string.wait_a_moment));
final User user = currentAccount.getUser();
new Thread(() -> {
StreamMediaFileOperation sfo = new StreamMediaFileOperation(file.getRemoteId());
StreamMediaFileOperation sfo = new StreamMediaFileOperation(file.getLocalId());
RemoteOperationResult result = sfo.execute(user, fileActivity);
fileActivity.dismissLoadingDialog();

View file

@ -471,7 +471,7 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
playVideoUri(getFile().getStorageUri());
} else {
try {
new LoadStreamUrl(this, user, clientFactory).execute(getFile().getRemoteId());
new LoadStreamUrl(this, user, clientFactory).execute(getFile().getLocalId());
} catch (Exception e) {
Log_OC.e(TAG, "Loading stream url not possible: " + e);
}
@ -498,7 +498,7 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
Log_OC.e(TAG, "Fullscreen: " + isFullScreen);
}
private static class LoadStreamUrl extends AsyncTask<String, Void, Uri> {
private static class LoadStreamUrl extends AsyncTask<Long, Void, Uri> {
private final ClientFactory clientFactory;
private final User user;
@ -511,7 +511,7 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
}
@Override
protected Uri doInBackground(String... fileId) {
protected Uri doInBackground(Long... fileId) {
OwnCloudClient client;
try {
client = clientFactory.create(user);

View file

@ -64,6 +64,7 @@ import androidx.annotation.NonNull;
import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.FragmentManager;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
public class PreviewTextFileFragment extends PreviewTextFragment {
private static final String EXTRA_FILE = "FILE";
@ -228,6 +229,7 @@ public class PreviewTextFileFragment extends PreviewTextFragment {
}
@Override
@SuppressFBWarnings("STT")
protected void onPostExecute(final StringWriter stringWriter) {
final TextView textView = textViewReference.get();

View file

@ -222,6 +222,7 @@ public final class FileStorageUtils {
file.setEtag(remote.getEtag());
file.setPermissions(remote.getPermissions());
file.setRemoteId(remote.getRemoteId());
file.setLocalId(remote.getLocalId());
file.setFavorite(remote.isFavorite());
if (file.isFolder()) {
file.setEncrypted(remote.isEncrypted());

View file

@ -0,0 +1,46 @@
/*
*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* Copyright (C) 2022 Tobias Kaminsky
* Copyright (C) 2022 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.owncloud.android.datamodel
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
import org.junit.Test
class OCFileTest {
@Test
fun testLongIds() {
val sut = OCFile("/")
sut.remoteId = "12345678ocjycgrudn78"
assertEquals(12345678, sut.localId)
sut.remoteId = "00000008ocjycgrudn78"
assertEquals(8, sut.localId)
// this will fail as fileId is too large
sut.remoteId = "1234567891011ocjycgrudn78"
assertNotEquals(1234567891011L, sut.localId)
sut.localId = 1234567891011L
assertEquals(1234567891011L, sut.localId)
}
}

View file

@ -6,7 +6,7 @@ buildscript {
daggerVersion = "2.44.2"
markwonVersion = "4.6.2"
prismVersion = "2.0.0"
androidLibraryVersion = "master-SNAPSHOT"
androidLibraryVersion = "localId-SNAPSHOT"
mockitoVersion = "4.11.0"
mockitoKotlinVersion = "4.1.0"
mockkVersion = "1.13.3"