Add access to shortcuts of folders in Google Drive

Workaround for #411 ("Shared with me") #363 ("Computers") and #354 ("Shared drives")
This commit is contained in:
Julian Raufelder 2022-02-10 15:23:48 +01:00
parent b753ec4c01
commit a651b273fb
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
2 changed files with 18 additions and 7 deletions

View File

@ -38,10 +38,16 @@ internal object GoogleDriveCloudNodeFactory {
} }
fun from(parent: GoogleDriveFolder, file: File): GoogleDriveNode { fun from(parent: GoogleDriveFolder, file: File): GoogleDriveNode {
return if (isFolder(file)) { return when {
folder(parent, file) isFolder(file) -> {
} else { folder(parent, file)
file(parent, file) }
isShortcutFolder(file) -> {
folder(parent, file.name, getNodePath(parent, file.name), file.shortcutDetails.targetId)
}
else -> {
file(parent, file)
}
} }
} }
@ -49,6 +55,10 @@ internal object GoogleDriveCloudNodeFactory {
return file.mimeType == "application/vnd.google-apps.folder" return file.mimeType == "application/vnd.google-apps.folder"
} }
fun isShortcutFolder(file: File): Boolean {
return file.mimeType == "application/vnd.google-apps.shortcut" && file.shortcutDetails.targetMimeType == "application/vnd.google-apps.folder"
}
fun getNodePath(parent: GoogleDriveFolder, name: String): String { fun getNodePath(parent: GoogleDriveFolder, name: String): String {
return parent.path + "/" + name return parent.path + "/" + name
} }

View File

@ -25,7 +25,6 @@ import org.cryptomator.util.file.LruFileCacheUtil
import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache
import java.io.IOException import java.io.IOException
import java.io.OutputStream import java.io.OutputStream
import java.util.ArrayList
import timber.log.Timber import timber.log.Timber
internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCloud, idCache: GoogleDriveIdCache) { internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCloud, idCache: GoogleDriveIdCache) {
@ -57,7 +56,7 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl
@Throws(IOException::class) @Throws(IOException::class)
private fun findFile(parentDriveId: String?, name: String): File? { private fun findFile(parentDriveId: String?, name: String): File? {
val fileListQuery = client().files().list().setFields("files(id,mimeType,name,size)") val fileListQuery = client().files().list().setFields("files(id,mimeType,name,size,shortcutDetails)")
fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false" fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false"
return fileListQuery.execute().files.firstOrNull { it.name == name } return fileListQuery.execute().files.firstOrNull { it.name == name }
} }
@ -99,6 +98,8 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl
folder?.let { folder?.let {
if (GoogleDriveCloudNodeFactory.isFolder(it)) { if (GoogleDriveCloudNodeFactory.isFolder(it)) {
return idCache.cache(GoogleDriveCloudNodeFactory.folder(parent, it)) return idCache.cache(GoogleDriveCloudNodeFactory.folder(parent, it))
} else if(GoogleDriveCloudNodeFactory.isShortcutFolder(it)) {
return idCache.cache(GoogleDriveCloudNodeFactory.folder(parent, name, path, it.shortcutDetails.targetId))
} }
} }
@ -127,7 +128,7 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl
val fileListQuery = client() // val fileListQuery = client() //
.files() // .files() //
.list() // .list() //
.setFields("nextPageToken,files(id,mimeType,modifiedTime,name,size)") // .setFields("nextPageToken,files(id,mimeType,modifiedTime,name,size,shortcutDetails)") //
.setPageSize(1000) // .setPageSize(1000) //
.setPageToken(pageToken) .setPageToken(pageToken)
fileListQuery.q = "'" + folder.driveId + "' in parents and trashed = false" fileListQuery.q = "'" + folder.driveId + "' in parents and trashed = false"