diff --git a/.pullapprove.yml b/.pullapprove.yml index a74f45a25326..97232704e729 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -14,7 +14,7 @@ group_defaults: ignored: true approve_by_comment: enabled: true - approve_regex: '^(Approved|:shipit:|:\+1:|LGTM)' + approve_regex: '^(Approved|:shipit:|:\+1:|LGTM|Merge)' reject_regex: '^(Rejected|:-1:)' reset_on_push: enabled: false diff --git a/drawable_resources/folder_external.svg b/drawable_resources/folder_external.svg new file mode 100644 index 000000000000..79f546dae65b --- /dev/null +++ b/drawable_resources/folder_external.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index 91744124cf96..bd81d6840ece 100644 --- a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -37,6 +37,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; +import com.owncloud.android.lib.common.network.WebdavEntry; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation; @@ -479,6 +480,7 @@ private ContentValues createContentValueForFile(OCFile file, OCFile folder) { cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); cv.put(ProviderTableMeta.FILE_FAVORITE, file.getIsFavorite()); cv.put(ProviderTableMeta.FILE_IS_ENCRYPTED, file.isEncrypted()); + cv.put(ProviderTableMeta.FILE_MOUNT_TYPE, file.getMountType().ordinal()); return cv; } @@ -971,6 +973,8 @@ private OCFile createFileInstance(Cursor c) { if (file.isEncrypted()) { file.setFileName(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_NAME))); } + file.setMountType(WebdavEntry.MountType.values()[c.getInt( + c.getColumnIndex(ProviderTableMeta.FILE_MOUNT_TYPE))]); } return file; } diff --git a/src/main/java/com/owncloud/android/datamodel/OCFile.java b/src/main/java/com/owncloud/android/datamodel/OCFile.java index 82338405923f..944cf0386d78 100644 --- a/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -32,6 +32,7 @@ import android.support.v4.content.FileProvider; import com.owncloud.android.R; +import com.owncloud.android.lib.common.network.WebdavEntry; import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.utils.MimeType; @@ -97,6 +98,8 @@ public OCFile[] newArray(int size) { private boolean mIsEncrypted; + private WebdavEntry.MountType mMountType; + /** * URI to the local path of the file contents, if stored in the device; cached after first call * to {@link #getStorageUri()} @@ -160,6 +163,7 @@ private OCFile(Parcel source) { mIsFavorite = source.readInt() == 1; mIsEncrypted = source.readInt() == 1; mEncryptedFileName = source.readString(); + mMountType = (WebdavEntry.MountType) source.readSerializable(); } @Override @@ -189,6 +193,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mIsFavorite ? 1 : 0); dest.writeInt(mIsEncrypted ? 1 : 0); dest.writeString(mEncryptedFileName); + dest.writeSerializable(mMountType); } public boolean getIsFavorite() { @@ -517,6 +522,7 @@ private void resetData() { mIsFavorite = false; mIsEncrypted = false; mEncryptedFileName = null; + mMountType = WebdavEntry.MountType.INTERNAL; } /** @@ -780,4 +786,11 @@ public boolean canReshare() { return permissions != null && permissions.contains(PERMISSION_CAN_RESHARE); } + public WebdavEntry.MountType getMountType() { + return mMountType; + } + + public void setMountType(WebdavEntry.MountType mountType) { + mMountType = mountType; + } } diff --git a/src/main/java/com/owncloud/android/db/ProviderMeta.java b/src/main/java/com/owncloud/android/db/ProviderMeta.java index ecbbd54691f9..7fe02b943361 100644 --- a/src/main/java/com/owncloud/android/db/ProviderMeta.java +++ b/src/main/java/com/owncloud/android/db/ProviderMeta.java @@ -32,7 +32,7 @@ public class ProviderMeta { public static final String DB_NAME = "filelist"; - public static final int DB_VERSION = 30; + public static final int DB_VERSION = 31; private ProviderMeta() { } @@ -102,6 +102,7 @@ static public class ProviderTableMeta implements BaseColumns { public static final String FILE_ETAG_IN_CONFLICT = "etag_in_conflict"; public static final String FILE_FAVORITE = "favorite"; public static final String FILE_IS_ENCRYPTED = "is_encrypted"; + public static final String FILE_MOUNT_TYPE = "mount_type"; public static final String [] FILE_ALL_COLUMNS = {_ID, FILE_PARENT, FILE_NAME , FILE_CREATION, FILE_MODIFIED, diff --git a/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java b/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java index fb6d4e695312..3cfaf3ad55f1 100644 --- a/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java @@ -432,6 +432,7 @@ private void synchronizeData(ArrayList folderAndFiles) { updatedFile.setEtag(localFile.getEtag()); if (updatedFile.isFolder()) { updatedFile.setFileLength(remoteFile.getFileLength()); + updatedFile.setMountType(remoteFile.getMountType()); } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) && remoteFile.getModificationTimestamp() != localFile.getModificationTimestamp()) { diff --git a/src/main/java/com/owncloud/android/providers/FileContentProvider.java b/src/main/java/com/owncloud/android/providers/FileContentProvider.java index 3efb5d94dc41..f5533ab78334 100644 --- a/src/main/java/com/owncloud/android/providers/FileContentProvider.java +++ b/src/main/java/com/owncloud/android/providers/FileContentProvider.java @@ -741,7 +741,8 @@ private void createFilesTable(SQLiteDatabase db) { + ProviderTableMeta.FILE_FAVORITE + INTEGER // boolean + ProviderTableMeta.FILE_IS_ENCRYPTED + INTEGER // boolean + ProviderTableMeta.FILE_ETAG_IN_CONFLICT + TEXT - + ProviderTableMeta.FILE_SHARED_WITH_SHAREE + " INTEGER);" + + ProviderTableMeta.FILE_SHARED_WITH_SHAREE + INTEGER + + ProviderTableMeta.FILE_MOUNT_TYPE + "INTEGER);" ); } @@ -1666,6 +1667,24 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); } + if (oldVersion < 31 && newVersion >= 31) { + Log_OC.i(SQL, "Entering in the #31 add mount type"); + db.beginTransaction(); + try { + db.execSQL(ALTER_TABLE + ProviderTableMeta.FILE_TABLE_NAME + + ADD_COLUMN + ProviderTableMeta.FILE_MOUNT_TYPE + " INTEGER "); + + upgraded = true; + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + if (!upgraded) { + Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); + } + } @Override diff --git a/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java index 803508fe2e2b..1e382ebf6e78 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java @@ -260,7 +260,7 @@ private void setBitmap(OCFile file, ImageView fileIcon) { // Folder fileIcon.setImageDrawable( MimeTypeUtil.getFolderTypeIcon(file.isSharedWithMe() || file.isSharedWithSharee(), - file.isSharedViaLink(), file.isEncrypted())); + file.isSharedViaLink(), file.isEncrypted(), file.getMountType())); } } diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java index 3668e06f468e..0f9f5f0f9cff 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -416,7 +416,7 @@ public View getView(int position, View convertView, ViewGroup parent) { } else { // Folder fileIcon.setImageDrawable(MimeTypeUtil.getFolderTypeIcon(file.isSharedWithMe() || - file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted())); + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType())); } } return view; diff --git a/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java index 0fefbaa756a7..0baa3b010e68 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java @@ -70,17 +70,17 @@ public View getView(int position, View convertView, ViewGroup parent) { HashMap data = (HashMap) getItem(position); OCFile file = data.get("dirname"); - TextView filename = (TextView) vi.findViewById(R.id.filename); + TextView filename = vi.findViewById(R.id.filename); filename.setText(file.getFileName()); - - ImageView fileIcon = (ImageView) vi.findViewById(R.id.thumbnail); + + ImageView fileIcon = vi.findViewById(R.id.thumbnail); fileIcon.setTag(file.getFileId()); - TextView lastModV = (TextView) vi.findViewById(R.id.last_mod); + TextView lastModV = vi.findViewById(R.id.last_mod); lastModV.setText(DisplayUtils.getRelativeTimestamp(mContext, file.getModificationTimestamp())); - TextView fileSizeV = (TextView) vi.findViewById(R.id.file_size); - TextView fileSizeSeparatorV = (TextView) vi.findViewById(R.id.file_separator); + TextView fileSizeV = vi.findViewById(R.id.file_size); + TextView fileSizeSeparatorV = vi.findViewById(R.id.file_separator); if(!file.isFolder()) { fileSizeV.setVisibility(View.VISIBLE); @@ -93,7 +93,8 @@ public View getView(int position, View convertView, ViewGroup parent) { if (file.isFolder()) { fileIcon.setImageDrawable(MimeTypeUtil.getFolderTypeIcon(file.isSharedWithMe() || - file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), mAccount)); + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), mAccount, + file.getMountType())); } else { // get Thumbnail if file is image if (MimeTypeUtil.isImage(file) && file.getRemoteId() != null) { diff --git a/src/main/java/com/owncloud/android/utils/FileStorageUtils.java b/src/main/java/com/owncloud/android/utils/FileStorageUtils.java index 38c2d1786eb5..d60d915f311f 100644 --- a/src/main/java/com/owncloud/android/utils/FileStorageUtils.java +++ b/src/main/java/com/owncloud/android/utils/FileStorageUtils.java @@ -174,6 +174,7 @@ public static OCFile fillOCFile(RemoteFile remote) { if (file.isFolder()) { file.setEncrypted(remote.getIsEncrypted()); } + file.setMountType(remote.getMountType()); return file; } diff --git a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index a11c40b18064..e235cd979d1c 100644 --- a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -26,6 +26,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.network.WebdavEntry; import java.io.File; import java.util.ArrayList; @@ -128,8 +129,9 @@ public static int getFileTypeIconId(String mimetype, String filename) { * @param isSharedViaLink flag if the folder is publicly shared via link * @return Identifier of an image resource. */ - public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, boolean isEncrypted) { - return getFolderTypeIcon(isSharedViaUsers, isSharedViaLink, isEncrypted, null); + public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, boolean isEncrypted, + WebdavEntry.MountType mountType) { + return getFolderTypeIcon(isSharedViaUsers, isSharedViaLink, isEncrypted, null, mountType); } /** @@ -142,7 +144,7 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha * @return Identifier of an image resource. */ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, - boolean isEncrypted, Account account) { + boolean isEncrypted, Account account, WebdavEntry.MountType mountType) { int drawableId; if (isSharedViaLink) { @@ -151,6 +153,8 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha drawableId = R.drawable.shared_with_me_folder; } else if (isEncrypted) { drawableId = R.drawable.ic_list_encrypted_folder; + } else if (WebdavEntry.MountType.EXTERNAL.equals(mountType)) { + drawableId = R.drawable.folder_external; } else { drawableId = R.drawable.folder; } @@ -159,7 +163,7 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha } public static Drawable getDefaultFolderIcon() { - return getFolderTypeIcon(false, false, false); + return getFolderTypeIcon(false, false, false, WebdavEntry.MountType.INTERNAL); } diff --git a/src/main/res/drawable/folder_external.xml b/src/main/res/drawable/folder_external.xml new file mode 100644 index 000000000000..a881ad919ee6 --- /dev/null +++ b/src/main/res/drawable/folder_external.xml @@ -0,0 +1,9 @@ + + +